From 0837b3f612ced443dad96217cbc5c94fe633d47e Mon Sep 17 00:00:00 2001 From: XFlow Deploy Date: Mon, 28 Sep 2026 08:57:32 +0500 Subject: [PATCH] feat: restructure into XFlow monorepo with Nuxt 4, Modular Onion Monolith, Android client, and Desktop CLI --- apps/desktop/bin/xflow.mjs | 158 + apps/desktop/package.json | 22 + apps/desktop/src/index.ts | 164 + apps/mobile/.gitignore | 13 + apps/mobile/README.md | 91 + apps/mobile/app/.gitignore | 1 + apps/mobile/app/build.gradle.kts | 106 + apps/mobile/app/proguard-rules.pro | 10 + apps/mobile/app/release.keystore | Bin 0 -> 2710 bytes apps/mobile/app/src/main/AndroidManifest.xml | 77 + .../com/example/avtex/AvtexApplication.kt | 52 + .../java/com/example/avtex/MainActivity.kt | 86 + .../main/java/com/example/avtex/Navigation.kt | 120 + .../com/example/avtex/data/AppSettings.kt | 20 + .../java/com/example/avtex/data/LogEntry.kt | 15 + .../example/avtex/data/SettingsRepository.kt | 117 + .../com/example/avtex/engine/BootReceiver.kt | 39 + .../avtex/engine/SignificantMotionTrigger.kt | 54 + .../com/example/avtex/engine/SleepReceiver.kt | 54 + .../com/example/avtex/engine/SleepState.kt | 6 + .../avtex/engine/SleepTrackingService.kt | 373 + .../java/com/example/avtex/hac/HacClient.kt | 168 + .../java/com/example/avtex/notes/NoteModel.kt | 24 + .../example/avtex/notes/NotesRepository.kt | 189 + .../avtex/notes/XFlowDatabaseHelper.kt | 72 + .../example/avtex/notes/XFlowSyncClient.kt | 65 + .../java/com/example/avtex/theme/Color.kt | 34 + .../java/com/example/avtex/theme/Theme.kt | 38 + .../main/java/com/example/avtex/theme/Type.kt | 36 + .../com/example/avtex/ui/DashboardScreen.kt | 728 + .../java/com/example/avtex/ui/ListsScreen.kt | 407 + .../example/avtex/ui/OnePlusGuideScreen.kt | 329 + .../com/example/avtex/ui/SettingsScreen.kt | 469 + .../app/src/main/res/drawable/app_logo.png | Bin 0 -> 271945 bytes .../res/drawable/ic_launcher_background.xml | 10 + .../res/drawable/ic_launcher_foreground.webp | Bin 0 -> 4032 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 688 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 866 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 434 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 570 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1028 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 1256 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 1646 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 1980 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 2316 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 2730 bytes .../app/src/main/res/values/strings.xml | 3 + .../mobile/app/src/main/res/values/themes.xml | 5 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../mobile/app/src/main/res/xml/shortcuts.xml | 46 + .../java/com/example/avtex/AppSettingsTest.kt | 34 + apps/mobile/build.gradle.kts | 6 + apps/mobile/gradle.properties | 29 + apps/mobile/gradle/libs.versions.toml | 50 + apps/mobile/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 8 + apps/mobile/gradlew | 172 + apps/mobile/gradlew.bat | 84 + apps/mobile/settings.gradle.kts | 33 + apps/web/.env.example | 47 + {app => apps/web/app}/app.vue | 0 {app => apps/web/app}/assets/css/main.css | 0 .../app}/components/AchievementOverlay.vue | 0 .../web/app}/components/BottomNav.vue | 0 .../web/app}/components/CanvasViewer.vue | 0 .../web/app}/components/FlowEditor.vue | 0 .../web/app}/components/FlowNodeRenderer.vue | 0 .../web/app}/components/InstallPWA.vue | 0 .../web/app}/components/MarkdownNode.vue | 0 .../components/editor/CoachingWizardModal.vue | 0 .../components/editor/GanttChartDrawer.vue | 0 .../app}/components/editor/NodePalette.vue | 0 .../components/editor/NodePropertiesPanel.vue | 0 .../web/app}/composables/useAchievements.ts | 0 {app => apps/web/app}/composables/useAuth.ts | 0 .../web/app}/composables/useCanvas.ts | 0 .../web/app}/composables/useGitSync.ts | 0 {app => apps/web/app}/composables/usePush.ts | 0 .../web/app}/composables/useUnsavedChanges.ts | 0 {app => apps/web/app}/layouts/default.vue | 0 {app => apps/web/app}/middleware/admin.ts | 0 {app => apps/web/app}/middleware/auth.ts | 0 {app => apps/web/app}/pages/admin.vue | 0 {app => apps/web/app}/pages/admin/groups.vue | 0 .../web/app}/pages/admin/groups/[id].vue | 0 .../web/app}/pages/admin/groups/index.vue | 0 {app => apps/web/app}/pages/admin/index.vue | 0 {app => apps/web/app}/pages/canvas/[id].vue | 0 {app => apps/web/app}/pages/canvas/index.vue | 0 {app => apps/web/app}/pages/canvases.vue | 0 {app => apps/web/app}/pages/flow.vue | 0 {app => apps/web/app}/pages/index.vue | 0 {app => apps/web/app}/pages/login.vue | 0 {app => apps/web/app}/pages/profile.vue | 0 {app => apps/web/app}/pages/profile/[id].vue | 0 {app => apps/web/app}/pages/settings.vue | 0 {app => apps/web/app}/pages/tasks.vue | 0 .../web/app}/plugins/firebase.client.ts | 0 .../app}/plugins/push-notifications.client.ts | 0 {app => apps/web/app}/public/favicon.svg | 0 {app => apps/web/app}/public/manifest.json | 0 .../web/app}/public/maskable-icon-512x512.svg | 0 {app => apps/web/app}/public/pwa-192x192.svg | 0 {app => apps/web/app}/public/pwa-512x512.svg | 0 .../web/app}/utils/canvasTransformer.ts | 0 nuxt.config.ts => apps/web/nuxt.config.ts | 2 +- apps/web/package-lock.json | 19226 ++++++++++++++++ apps/web/package.json | 43 + prisma.config.ts => apps/web/prisma.config.ts | 0 {prisma => apps/web/prisma}/schema.prisma | 37 + {prisma => apps/web/prisma}/seed.ts | 0 .../web}/server/api/achievements/index.get.ts | 0 .../web}/server/api/admin/stats.get.ts | 0 {app => apps/web}/server/api/ai/coach.post.ts | 0 .../web}/server/api/auth/google.post.ts | 0 .../web}/server/api/auth/validate.get.ts | 0 .../web}/server/api/canvas/[id].delete.ts | 0 .../web}/server/api/canvas/[id].get.ts | 0 .../web}/server/api/canvas/[id].put.ts | 0 .../server/api/canvas/[id]/duplicate.post.ts | 0 .../web}/server/api/canvas/index.get.ts | 0 .../web}/server/api/canvas/index.post.ts | 0 .../web}/server/api/canvases/[id].patch.ts | 0 .../web}/server/api/git/auto-sync.post.ts | 0 .../web}/server/api/git/real-sync.post.ts | 0 .../web}/server/api/git/repository.post.ts | 0 .../api/git/repository/[canvasId].get.ts | 0 {app => apps/web}/server/api/git/sync.post.ts | 0 {app => apps/web}/server/api/git/test.get.ts | 0 .../web}/server/api/groups/[id].delete.ts | 0 .../server/api/groups/[id]/add-member.post.ts | 0 .../web}/server/api/groups/[id]/index.get.ts | 0 .../web}/server/api/groups/[id]/join.post.ts | 0 .../web}/server/api/groups/[id]/leave.post.ts | 0 .../server/api/groups/[id]/members.patch.ts | 0 .../web}/server/api/groups/index.get.ts | 0 .../web}/server/api/groups/index.post.ts | 0 .../web}/server/api/nodes/[id].put.ts | 0 .../server/api/nodes/[id]/execute.post.ts | 0 .../web}/server/api/nodes/index.get.ts | 0 .../web}/server/api/push/send.post.ts | 0 .../web}/server/api/push/subscribe.post.ts | 0 {app => apps/web}/server/api/tasks.get.ts | 0 .../web}/server/api/tasks/create.post.ts | 0 .../web}/server/api/tasks/index.get.ts | 0 .../server/api/tasks/update-status.post.ts | 0 .../web}/server/api/user/groups.get.ts | 0 .../web}/server/api/user/profile.put.ts | 0 .../web}/server/api/user/stats.get.ts | 0 .../server/api/users/[id]/activity.get.ts | 0 .../server/api/users/[id]/canvases.get.ts | 0 .../api/users/[id]/follow-status.get.ts | 0 .../web}/server/api/users/[id]/follow.post.ts | 0 .../web}/server/api/users/[id]/profile.get.ts | 0 .../web}/server/api/users/index.get.ts | 0 .../web}/server/api/users/search.get.ts | 0 apps/web/server/api/v1/lists/index.get.ts | 18 + apps/web/server/api/v1/lists/items.post.ts | 35 + .../server/api/v1/lists/items/[id].patch.ts | 29 + apps/web/server/core/application/IUseCase.ts | 6 + apps/web/server/core/domain/DomainError.ts | 29 + apps/web/server/core/domain/Result.ts | 37 + .../application/AddListItemUseCase.ts | 67 + .../application/GetListsUseCase.ts | 23 + .../application/ToggleListItemUseCase.ts | 30 + .../notes-lists/application/dtos/ListDtos.ts | 25 + .../notes-lists/domain/IListRepository.ts | 14 + .../modules/notes-lists/domain/ListItem.ts | 45 + .../modules/notes-lists/domain/NoteList.ts | 44 + apps/web/server/modules/notes-lists/index.ts | 11 + .../infrastructure/PrismaListRepository.ts | 162 + {app => apps/web}/server/utils/ai.ts | 0 {app => apps/web}/server/utils/auth.ts | 0 {app => apps/web}/server/utils/db.ts | 0 {app => apps/web}/server/utils/git.ts | 0 {app => apps/web}/server/utils/giteaApi.ts | 0 {app => apps/web}/server/utils/prisma.ts | 0 {app => apps/web}/server/utils/realGit.ts | 0 tsconfig.json => apps/web/tsconfig.json | 0 .../docker-compose.dev.yml | 0 {server => docker/legacy-server}/.env.example | 0 .../legacy-server}/api/Dockerfile | 0 .../legacy-server}/api/package.json | 0 .../legacy-server}/api/src/index.js | 0 .../legacy-server}/api/src/middleware/auth.js | 0 .../api/src/middleware/errorHandler.js | 0 .../legacy-server}/api/src/routes/auth.js | 0 .../docker-compose.integrated.yml | 0 .../docker-compose.override.yml | 0 .../legacy-server}/docker-compose.prod.yml | 0 .../legacy-server}/docker-compose.yml | 0 .../legacy-server}/docker/db/init-db.sh | 0 .../legacy-server}/ecosystem.config.js | 0 .../legacy-server}/nginx/html/index.html | 0 .../legacy-server}/nginx/nginx.conf | 0 {server => docker/legacy-server}/package.json | 0 .../legacy-server}/scripts/deploy.sh | 0 .../legacy-server}/scripts/setup-vps.sh | 0 .../legacy-server}/xflow/nginx/xflow.conf | 0 package.json | 50 +- packages/shared-contracts/package.json | 14 + 204 files changed, 24616 insertions(+), 39 deletions(-) create mode 100644 apps/desktop/bin/xflow.mjs create mode 100644 apps/desktop/package.json create mode 100644 apps/desktop/src/index.ts create mode 100644 apps/mobile/.gitignore create mode 100644 apps/mobile/README.md create mode 100644 apps/mobile/app/.gitignore create mode 100644 apps/mobile/app/build.gradle.kts create mode 100644 apps/mobile/app/proguard-rules.pro create mode 100644 apps/mobile/app/release.keystore create mode 100644 apps/mobile/app/src/main/AndroidManifest.xml create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/AvtexApplication.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/MainActivity.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/Navigation.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/data/AppSettings.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/data/LogEntry.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/data/SettingsRepository.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/engine/BootReceiver.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/engine/SignificantMotionTrigger.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/engine/SleepReceiver.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/engine/SleepState.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/engine/SleepTrackingService.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/hac/HacClient.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/notes/NoteModel.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/notes/NotesRepository.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/notes/XFlowDatabaseHelper.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/notes/XFlowSyncClient.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/theme/Color.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/theme/Theme.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/theme/Type.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/ui/DashboardScreen.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/ui/ListsScreen.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/ui/OnePlusGuideScreen.kt create mode 100644 apps/mobile/app/src/main/java/com/example/avtex/ui/SettingsScreen.kt create mode 100644 apps/mobile/app/src/main/res/drawable/app_logo.png create mode 100644 apps/mobile/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 apps/mobile/app/src/main/res/drawable/ic_launcher_foreground.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 apps/mobile/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 apps/mobile/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 apps/mobile/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 apps/mobile/app/src/main/res/values/strings.xml create mode 100644 apps/mobile/app/src/main/res/values/themes.xml create mode 100644 apps/mobile/app/src/main/res/xml/backup_rules.xml create mode 100644 apps/mobile/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 apps/mobile/app/src/main/res/xml/shortcuts.xml create mode 100644 apps/mobile/app/src/test/java/com/example/avtex/AppSettingsTest.kt create mode 100644 apps/mobile/build.gradle.kts create mode 100644 apps/mobile/gradle.properties create mode 100644 apps/mobile/gradle/libs.versions.toml create mode 100644 apps/mobile/gradle/wrapper/gradle-wrapper.jar create mode 100644 apps/mobile/gradle/wrapper/gradle-wrapper.properties create mode 100644 apps/mobile/gradlew create mode 100644 apps/mobile/gradlew.bat create mode 100644 apps/mobile/settings.gradle.kts create mode 100644 apps/web/.env.example rename {app => apps/web/app}/app.vue (100%) rename {app => apps/web/app}/assets/css/main.css (100%) rename {app => apps/web/app}/components/AchievementOverlay.vue (100%) rename {app => apps/web/app}/components/BottomNav.vue (100%) rename {app => apps/web/app}/components/CanvasViewer.vue (100%) rename {app => apps/web/app}/components/FlowEditor.vue (100%) rename {app => apps/web/app}/components/FlowNodeRenderer.vue (100%) rename {app => apps/web/app}/components/InstallPWA.vue (100%) rename {app => apps/web/app}/components/MarkdownNode.vue (100%) rename {app => apps/web/app}/components/editor/CoachingWizardModal.vue (100%) rename {app => apps/web/app}/components/editor/GanttChartDrawer.vue (100%) rename {app => apps/web/app}/components/editor/NodePalette.vue (100%) rename {app => apps/web/app}/components/editor/NodePropertiesPanel.vue (100%) rename {app => apps/web/app}/composables/useAchievements.ts (100%) rename {app => apps/web/app}/composables/useAuth.ts (100%) rename {app => apps/web/app}/composables/useCanvas.ts (100%) rename {app => apps/web/app}/composables/useGitSync.ts (100%) rename {app => apps/web/app}/composables/usePush.ts (100%) rename {app => apps/web/app}/composables/useUnsavedChanges.ts (100%) rename {app => apps/web/app}/layouts/default.vue (100%) rename {app => apps/web/app}/middleware/admin.ts (100%) rename {app => apps/web/app}/middleware/auth.ts (100%) rename {app => apps/web/app}/pages/admin.vue (100%) rename {app => apps/web/app}/pages/admin/groups.vue (100%) rename {app => apps/web/app}/pages/admin/groups/[id].vue (100%) rename {app => apps/web/app}/pages/admin/groups/index.vue (100%) rename {app => apps/web/app}/pages/admin/index.vue (100%) rename {app => apps/web/app}/pages/canvas/[id].vue (100%) rename {app => apps/web/app}/pages/canvas/index.vue (100%) rename {app => apps/web/app}/pages/canvases.vue (100%) rename {app => apps/web/app}/pages/flow.vue (100%) rename {app => apps/web/app}/pages/index.vue (100%) rename {app => apps/web/app}/pages/login.vue (100%) rename {app => apps/web/app}/pages/profile.vue (100%) rename {app => apps/web/app}/pages/profile/[id].vue (100%) rename {app => apps/web/app}/pages/settings.vue (100%) rename {app => apps/web/app}/pages/tasks.vue (100%) rename {app => apps/web/app}/plugins/firebase.client.ts (100%) rename {app => apps/web/app}/plugins/push-notifications.client.ts (100%) rename {app => apps/web/app}/public/favicon.svg (100%) rename {app => apps/web/app}/public/manifest.json (100%) rename {app => apps/web/app}/public/maskable-icon-512x512.svg (100%) rename {app => apps/web/app}/public/pwa-192x192.svg (100%) rename {app => apps/web/app}/public/pwa-512x512.svg (100%) rename {app => apps/web/app}/utils/canvasTransformer.ts (100%) rename nuxt.config.ts => apps/web/nuxt.config.ts (98%) create mode 100644 apps/web/package-lock.json create mode 100644 apps/web/package.json rename prisma.config.ts => apps/web/prisma.config.ts (100%) rename {prisma => apps/web/prisma}/schema.prisma (76%) rename {prisma => apps/web/prisma}/seed.ts (100%) rename {app => apps/web}/server/api/achievements/index.get.ts (100%) rename {app => apps/web}/server/api/admin/stats.get.ts (100%) rename {app => apps/web}/server/api/ai/coach.post.ts (100%) rename {app => apps/web}/server/api/auth/google.post.ts (100%) rename {app => apps/web}/server/api/auth/validate.get.ts (100%) rename {app => apps/web}/server/api/canvas/[id].delete.ts (100%) rename {app => apps/web}/server/api/canvas/[id].get.ts (100%) rename {app => apps/web}/server/api/canvas/[id].put.ts (100%) rename {app => apps/web}/server/api/canvas/[id]/duplicate.post.ts (100%) rename {app => apps/web}/server/api/canvas/index.get.ts (100%) rename {app => apps/web}/server/api/canvas/index.post.ts (100%) rename {app => apps/web}/server/api/canvases/[id].patch.ts (100%) rename {app => apps/web}/server/api/git/auto-sync.post.ts (100%) rename {app => apps/web}/server/api/git/real-sync.post.ts (100%) rename {app => apps/web}/server/api/git/repository.post.ts (100%) rename {app => apps/web}/server/api/git/repository/[canvasId].get.ts (100%) rename {app => apps/web}/server/api/git/sync.post.ts (100%) rename {app => apps/web}/server/api/git/test.get.ts (100%) rename {app => apps/web}/server/api/groups/[id].delete.ts (100%) rename {app => apps/web}/server/api/groups/[id]/add-member.post.ts (100%) rename {app => apps/web}/server/api/groups/[id]/index.get.ts (100%) rename {app => apps/web}/server/api/groups/[id]/join.post.ts (100%) rename {app => apps/web}/server/api/groups/[id]/leave.post.ts (100%) rename {app => apps/web}/server/api/groups/[id]/members.patch.ts (100%) rename {app => apps/web}/server/api/groups/index.get.ts (100%) rename {app => apps/web}/server/api/groups/index.post.ts (100%) rename {app => apps/web}/server/api/nodes/[id].put.ts (100%) rename {app => apps/web}/server/api/nodes/[id]/execute.post.ts (100%) rename {app => apps/web}/server/api/nodes/index.get.ts (100%) rename {app => apps/web}/server/api/push/send.post.ts (100%) rename {app => apps/web}/server/api/push/subscribe.post.ts (100%) rename {app => apps/web}/server/api/tasks.get.ts (100%) rename {app => apps/web}/server/api/tasks/create.post.ts (100%) rename {app => apps/web}/server/api/tasks/index.get.ts (100%) rename {app => apps/web}/server/api/tasks/update-status.post.ts (100%) rename {app => apps/web}/server/api/user/groups.get.ts (100%) rename {app => apps/web}/server/api/user/profile.put.ts (100%) rename {app => apps/web}/server/api/user/stats.get.ts (100%) rename {app => apps/web}/server/api/users/[id]/activity.get.ts (100%) rename {app => apps/web}/server/api/users/[id]/canvases.get.ts (100%) rename {app => apps/web}/server/api/users/[id]/follow-status.get.ts (100%) rename {app => apps/web}/server/api/users/[id]/follow.post.ts (100%) rename {app => apps/web}/server/api/users/[id]/profile.get.ts (100%) rename {app => apps/web}/server/api/users/index.get.ts (100%) rename {app => apps/web}/server/api/users/search.get.ts (100%) create mode 100644 apps/web/server/api/v1/lists/index.get.ts create mode 100644 apps/web/server/api/v1/lists/items.post.ts create mode 100644 apps/web/server/api/v1/lists/items/[id].patch.ts create mode 100644 apps/web/server/core/application/IUseCase.ts create mode 100644 apps/web/server/core/domain/DomainError.ts create mode 100644 apps/web/server/core/domain/Result.ts create mode 100644 apps/web/server/modules/notes-lists/application/AddListItemUseCase.ts create mode 100644 apps/web/server/modules/notes-lists/application/GetListsUseCase.ts create mode 100644 apps/web/server/modules/notes-lists/application/ToggleListItemUseCase.ts create mode 100644 apps/web/server/modules/notes-lists/application/dtos/ListDtos.ts create mode 100644 apps/web/server/modules/notes-lists/domain/IListRepository.ts create mode 100644 apps/web/server/modules/notes-lists/domain/ListItem.ts create mode 100644 apps/web/server/modules/notes-lists/domain/NoteList.ts create mode 100644 apps/web/server/modules/notes-lists/index.ts create mode 100644 apps/web/server/modules/notes-lists/infrastructure/PrismaListRepository.ts rename {app => apps/web}/server/utils/ai.ts (100%) rename {app => apps/web}/server/utils/auth.ts (100%) rename {app => apps/web}/server/utils/db.ts (100%) rename {app => apps/web}/server/utils/git.ts (100%) rename {app => apps/web}/server/utils/giteaApi.ts (100%) rename {app => apps/web}/server/utils/prisma.ts (100%) rename {app => apps/web}/server/utils/realGit.ts (100%) rename tsconfig.json => apps/web/tsconfig.json (100%) rename docker-compose.dev.yml => docker/docker-compose.dev.yml (100%) rename {server => docker/legacy-server}/.env.example (100%) rename {server => docker/legacy-server}/api/Dockerfile (100%) rename {server => docker/legacy-server}/api/package.json (100%) rename {server => docker/legacy-server}/api/src/index.js (100%) rename {server => docker/legacy-server}/api/src/middleware/auth.js (100%) rename {server => docker/legacy-server}/api/src/middleware/errorHandler.js (100%) rename {server => docker/legacy-server}/api/src/routes/auth.js (100%) rename {server => docker/legacy-server}/docker-compose.integrated.yml (100%) rename {server => docker/legacy-server}/docker-compose.override.yml (100%) rename {server => docker/legacy-server}/docker-compose.prod.yml (100%) rename {server => docker/legacy-server}/docker-compose.yml (100%) rename {server => docker/legacy-server}/docker/db/init-db.sh (100%) rename {server => docker/legacy-server}/ecosystem.config.js (100%) rename {server => docker/legacy-server}/nginx/html/index.html (100%) rename {server => docker/legacy-server}/nginx/nginx.conf (100%) rename {server => docker/legacy-server}/package.json (100%) rename {server => docker/legacy-server}/scripts/deploy.sh (100%) rename {server => docker/legacy-server}/scripts/setup-vps.sh (100%) rename {server => docker/legacy-server}/xflow/nginx/xflow.conf (100%) create mode 100644 packages/shared-contracts/package.json diff --git a/apps/desktop/bin/xflow.mjs b/apps/desktop/bin/xflow.mjs new file mode 100644 index 0000000..5b9d69b --- /dev/null +++ b/apps/desktop/bin/xflow.mjs @@ -0,0 +1,158 @@ +#!/usr/bin/env node +import fs from 'node:fs'; +import path from 'node:path'; +import os from 'node:os'; + +const CONFIG_FILE = path.join(os.homedir(), '.xflow.json'); + +function loadConfig() { + if (fs.existsSync(CONFIG_FILE)) { + try { + return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8')); + } catch { + // fallback + } + } + return { + serverUrl: process.env.XFLOW_SERVER_URL || 'http://localhost:3000', + userId: process.env.XFLOW_USER_ID || 'default-user' + }; +} + +function saveConfig(config) { + fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8'); + console.log(`[XFlow] Настройки сохранены в ${CONFIG_FILE}`); +} + +async function addNote(title, listTitle = 'Фильмы на просмотр', category = 'movies') { + const config = loadConfig(); + const url = `${config.serverUrl.replace(/\/$/, '')}/api/v1/lists/items`; + + console.log(`[XFlow Desktop] Отправка заметки: "${title}" в список "${listTitle}"...`); + + try { + const res = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + title, + listTitle, + category, + ownerId: config.userId + }) + }); + + const data = await res.json(); + if (res.ok && data.success) { + console.log(`\x1b[32m✔ Успешно добавлено!\x1b[0m ID: ${data.item.id}, Статус: ${data.item.status}`); + console.log(` Синхронизировано с сервером и отправлено на мобильный клиент.`); + } else { + console.error(`\x1b[31m✖ Ошибка сервера:\x1b[0m`, data.message || data); + } + } catch (err) { + console.error(`\x1b[31m✖ Не удалось связаться с сервером XFlow (${config.serverUrl}):\x1b[0m ${err.message}`); + console.log(` Убедитесь, что сервер XFlow запущен на ${config.serverUrl}`); + } +} + +async function listNotes(category) { + const config = loadConfig(); + const query = category ? `?category=${encodeURIComponent(category)}` : ''; + const url = `${config.serverUrl.replace(/\/$/, '')}/api/v1/lists${query}`; + + try { + const res = await fetch(url); + const data = await res.json(); + if (res.ok && data.success) { + console.log(`\n\x1b[1m=== Списки XFlow ===\x1b[0m`); + for (const list of data.lists) { + console.log(`\n📂 \x1b[36m${list.title}\x1b[0m (${list.category}) [${list.items?.length || 0} элементов]:`); + for (const item of list.items || []) { + const check = item.isCompleted ? '☑' : '☐'; + console.log(` ${check} ${item.title} \x1b[90m(статус: ${item.status})\x1b[0m`); + } + } + console.log(''); + } else { + console.error(`Ошибка:`, data.message); + } + } catch (err) { + console.error(`Ошибка связи с сервером: ${err.message}`); + } +} + +async function main() { + const args = process.argv.slice(2); + const command = args[0]; + + if (!command || command === '--help' || command === '-h') { + console.log(` +\x1b[1m🚀 XFlow CLI — Native Desktop & Terminal Agent Bridge\x1b[0m + +Использование: + xflow movie "<название фильма>" Быстро добавить фильм в список на просмотр + xflow add "<заметка>" [--list <список>] Добавить элемент в указанный список + xflow list [категория] Показать списки и элементы + xflow config --url --user Настроить подключение к серверу XFlow + +Примеры: + xflow movie "Интерстеллар" + xflow add "Купить молоко" --list "Покупки" + xflow list +`); + return; + } + + if (command === 'movie') { + const title = args.slice(1).join(' '); + if (!title) { + console.error('Укажите название фильма: xflow movie "Интерстеллар"'); + return; + } + await addNote(title, 'Фильмы на просмотр', 'movies'); + return; + } + + if (command === 'add') { + const title = args[1]; + let listTitle = 'Общий список'; + let category = 'general'; + + for (let i = 2; i < args.length; i++) { + if (args[i] === '--list' && args[i + 1]) { + listTitle = args[i + 1]; + if (listTitle.toLowerCase().includes('фильм')) category = 'movies'; + if (listTitle.toLowerCase().includes('покупк')) category = 'shopping'; + } + } + + if (!title) { + console.error('Укажите текст заметки: xflow add "Заметка"'); + return; + } + await addNote(title, listTitle, category); + return; + } + + if (command === 'list') { + const category = args[1]; + await listNotes(category); + return; + } + + if (command === 'config') { + const config = loadConfig(); + for (let i = 1; i < args.length; i++) { + if (args[i] === '--url' && args[i + 1]) config.serverUrl = args[i + 1]; + if (args[i] === '--user' && args[i + 1]) config.userId = args[i + 1]; + } + saveConfig(config); + return; + } + + console.error(`Неизвестная команда: ${command}. Используйте --help`); +} + +main().catch(console.error); diff --git a/apps/desktop/package.json b/apps/desktop/package.json new file mode 100644 index 0000000..a2b71e1 --- /dev/null +++ b/apps/desktop/package.json @@ -0,0 +1,22 @@ +{ + "name": "@xflow/desktop-cli", + "version": "1.0.0", + "description": "XFlow Windows/Linux Native CLI and Agent Bridge", + "type": "module", + "bin": { + "xflow": "./dist/index.js" + }, + "scripts": { + "build": "tsc", + "start": "node dist/index.js", + "dev": "tsx src/index.ts" + }, + "dependencies": { + "commander": "^12.0.0" + }, + "devDependencies": { + "@types/node": "^20.11.0", + "tsx": "^4.7.0", + "typescript": "^5.3.3" + } +} diff --git a/apps/desktop/src/index.ts b/apps/desktop/src/index.ts new file mode 100644 index 0000000..ada64d8 --- /dev/null +++ b/apps/desktop/src/index.ts @@ -0,0 +1,164 @@ +#!/usr/bin/env node +import fs from 'node:fs'; +import path from 'node:path'; +import os from 'node:os'; + +const CONFIG_FILE = path.join(os.homedir(), '.xflow.json'); + +interface XFlowConfig { + serverUrl: string; + userId: string; + apiKey?: string; +} + +function loadConfig(): XFlowConfig { + if (fs.existsSync(CONFIG_FILE)) { + try { + return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8')); + } catch { + // fallback + } + } + return { + serverUrl: process.env.XFLOW_SERVER_URL || 'http://localhost:3000', + userId: process.env.XFLOW_USER_ID || 'default-user' + }; +} + +function saveConfig(config: XFlowConfig) { + fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8'); + console.log(`[XFlow] Настройки сохранены в ${CONFIG_FILE}`); +} + +async function addNote(title: string, listTitle: string = 'Фильмы', category: string = 'movies') { + const config = loadConfig(); + const url = `${config.serverUrl.replace(/\/$/, '')}/api/v1/lists/items`; + + console.log(`[XFlow Desktop] Отправка заметки: "${title}" в список "${listTitle}"...`); + + try { + const res = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + title, + listTitle, + category, + ownerId: config.userId + }) + }); + + const data = await res.json() as any; + if (res.ok && data.success) { + console.log(`\x1b[32m✔ Успешно добавлено!\x1b[0m ID: ${data.item.id}, Статус: ${data.item.status}`); + console.log(` Синхронизировано с сервером и отправлено на мобильный клиент.`); + } else { + console.error(`\x1b[31m✖ Ошибка сервера:\x1b[0m`, data.message || data); + } + } catch (err: any) { + console.error(`\x1b[31m✖ Не удалось связаться с сервером XFlow (${config.serverUrl}):\x1b[0m ${err.message}`); + console.log(` Убедитесь, что сервер XFlow запущен на ${config.serverUrl}`); + } +} + +async function listNotes(category?: string) { + const config = loadConfig(); + const query = category ? `?category=${encodeURIComponent(category)}` : ''; + const url = `${config.serverUrl.replace(/\/$/, '')}/api/v1/lists${query}`; + + try { + const res = await fetch(url); + const data = await res.json() as any; + if (res.ok && data.success) { + console.log(`\n\x1b[1m=== Списки XFlow ===\x1b[0m`); + for (const list of data.lists) { + console.log(`\n📂 \x1b[36m${list.title}\x1b[0m (${list.category}) [${list.items?.length || 0} элементов]:`); + for (const item of list.items || []) { + const check = item.isCompleted ? '☑' : '☐'; + console.log(` ${check} ${item.title} \x1b[90m(статус: ${item.status})\x1b[0m`); + } + } + console.log(''); + } else { + console.error(`Ошибка:`, data.message); + } + } catch (err: any) { + console.error(`Ошибка связи с сервером: ${err.message}`); + } +} + +async function main() { + const args = process.argv.slice(2); + const command = args[0]; + + if (!command || command === '--help' || command === '-h') { + console.log(` +\x1b[1m🚀 XFlow CLI — Native Desktop & Terminal Agent Bridge\x1b[0m + +Использование: + xflow movie "<название фильма>" Быстро добавить фильм в список на просмотр + xflow add "<заметка>" [--list <список>] Добавить элемент в указанный список + xflow list [категория] Показать списки и элементы + xflow config --url --user Настроить подключение к серверу XFlow + +Примеры: + xflow movie "Интерстеллар" + xflow add "Купить молоко" --list "Покупки" + xflow list +`); + return; + } + + if (command === 'movie') { + const title = args.slice(1).join(' '); + if (!title) { + console.error('Укажите название фильма: xflow movie "Интерстеллар"'); + return; + } + await addNote(title, 'Фильмы на просмотр', 'movies'); + return; + } + + if (command === 'add') { + const title = args[1]; + let listTitle = 'Общий список'; + let category = 'general'; + + for (let i = 2; i < args.length; i++) { + if (args[i] === '--list' && args[i + 1]) { + listTitle = args[i + 1]; + if (listTitle.toLowerCase().includes('фильм')) category = 'movies'; + if (listTitle.toLowerCase().includes('покупк')) category = 'shopping'; + } + } + + if (!title) { + console.error('Укажите текст заметки: xflow add "Заметка"'); + return; + } + await addNote(title, listTitle, category); + return; + } + + if (command === 'list') { + const category = args[1]; + await listNotes(category); + return; + } + + if (command === 'config') { + const config = loadConfig(); + for (let i = 1; i < args.length; i++) { + if (args[i] === '--url' && args[i + 1]) config.serverUrl = args[i + 1]; + if (args[i] === '--user' && args[i + 1]) config.userId = args[i + 1]; + } + saveConfig(config); + return; + } + + console.error(`Неизвестная команда: ${command}. Используйте --help`); +} + +main().catch(console.error); diff --git a/apps/mobile/.gitignore b/apps/mobile/.gitignore new file mode 100644 index 0000000..839c6ac --- /dev/null +++ b/apps/mobile/.gitignore @@ -0,0 +1,13 @@ +*.iml +.gradle +/local.properties +local.properties +/.idea/ +.idea/ +.DS_Store +/build +build/ +app/build/ +/captures +.externalNativeBuild +.cxx diff --git a/apps/mobile/README.md b/apps/mobile/README.md new file mode 100644 index 0000000..e6a1d20 --- /dev/null +++ b/apps/mobile/README.md @@ -0,0 +1,91 @@ +# Avtex — Smart Sleep & Motion Engine for Home Assistant + +

+ Avtex Logo +

+ +

+ Легковесное Android-приложение для мгновенной фиксации сна и пробуждения с интеграцией в Home Assistant (HAC)
+ Оптимизировано для OnePlus (OxygenOS / ColorOS) и устройств с ненормированным рабочим графиком. +

+ +--- + +## 🌟 Ключевые возможности + +* **Мгновенная фиксация пробуждения (0% расхода батареи)**: + Использует аппаратный сопроцессор `Sensor.TYPE_SIGNIFICANT_MOTION`. Как только вы берете телефон в руки после сна, сигнал пробуждения моментально передается в умный дом. +* **Детекция сна при ненормированном графике**: + Связка таймера покоя (по умолчанию 20 мин при выключенном экране) и нейросетевых классификаций **Google Play Services Sleep API** (`SleepClassifyEvent`). Никаких жестких привязок к часам (23:00–07:00). +* **Полная совместимость с Home Assistant (HAC)**: + * **Webhook URL**: отправка JSON-событий `{"event": "sleep_started" | "sleep_ended", "state": "asleep" | "awake", ...}`. + * **REST State API**: прямое обновление сенсора `binary_sensor.phone_sleep` через Long-Lived Access Token. + * **Local Broadcast Intent**: `com.example.avtex.SLEEP_STATE_CHANGED` для Tasker / Home Assistant Companion App прямо на телефоне. +* **Устойчивость к убийцам процессов OnePlus**: + * Реализован как Foreground Service с типом `specialUse`. + * Интерактивный экран со вспомогательными кнопками перехода в системные настройки OxygenOS (отключение оптимизации батареи, включение автозапуска). +* **Премиальный дизайн в стиле Cyber Obsidian / Glassmorphism**: + * Jetpack Compose & Material 3. + * Тонкие неоновые контуры, стеклянные карточки, динамический пульсирующий баннер состояния. + * Интерактивная лента аудита событий сенсоров в реальном времени. + +--- + +## 🚀 Быстрый старт + +### 1. Сборка APK + +Для сборки отладочной версии: +```bash +./gradlew assembleDebug +``` + +Для сборки оптимизированного подписанного Release APK: +```bash +./gradlew assembleRelease +``` +Файл будет создан в `app/build/outputs/apk/release/app-release.apk`. + +### 2. Установка через ADB +```bash +adb install -r app/build/outputs/apk/release/app-release.apk +``` + +--- + +## ⚙️ Настройка Home Assistant (Пример Webhook автоматизации) + +В файле `automations.yaml` или в визуальном редакторе Home Assistant: + +```yaml +alias: "Avtex: Автоматизация сна и пробуждения" +trigger: + - platform: webhook + webhook_id: avtex_sleep +action: + - choose: + - conditions: "{{ trigger.json.state == 'asleep' }}" + sequence: + - service: light.turn_off + target: + entity_id: all + - service: climate.set_preset_mode + data: + preset_mode: sleep + target: + entity_id: climate.bedroom + - conditions: "{{ trigger.json.state == 'awake' }}" + sequence: + - service: scene.turn_on + target: + entity_id: scene.morning_lights +``` + +--- + +## 🛠 Стек технологий +* **Язык**: Kotlin 2.3+ +* **UI**: Jetpack Compose, Material 3, Navigation +* **Сенсоры**: Android Sensor Hub (`TYPE_SIGNIFICANT_MOTION`), Google Play Services Location / Sleep API +* **Сеть**: OkHttp 4.12 +* **Хранилище настроек**: Jetpack DataStore Preferences diff --git a/apps/mobile/app/.gitignore b/apps/mobile/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/apps/mobile/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/apps/mobile/app/build.gradle.kts b/apps/mobile/app/build.gradle.kts new file mode 100644 index 0000000..480a5af --- /dev/null +++ b/apps/mobile/app/build.gradle.kts @@ -0,0 +1,106 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.compose.compiler) + alias(libs.plugins.kotlin.serialization) +} + +android { + namespace = "com.example.avtex" + compileSdk = 36 + defaultConfig { + applicationId = "com.example.avtex" + minSdk = 26 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + } + + signingConfigs { + create("release") { + storeFile = file("release.keystore") + storePassword = "avtex_release_key" + keyAlias = "avtex" + keyPassword = "avtex_release_key" + enableV1Signing = true + enableV2Signing = true + } + } + + buildTypes { + release { + isMinifyEnabled = false + signingConfig = signingConfigs.getByName("release") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + buildFeatures { + compose = true + aidl = false + buildConfig = true + shaders = false + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +kotlin { + jvmToolchain(17) +} + +dependencies { + val composeBom = platform(libs.androidx.compose.bom) + implementation(composeBom) + androidTestImplementation(composeBom) + + // Core Android dependencies + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + + // Arch Components + implementation(libs.androidx.lifecycle.runtime.compose) + implementation(libs.androidx.lifecycle.viewmodel.compose) + + // Compose + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material.icons.extended) + // Tooling + debugImplementation(libs.androidx.compose.ui.tooling) + // Instrumented tests + androidTestImplementation(libs.androidx.compose.ui.test.junit4) + debugImplementation(libs.androidx.compose.ui.test.manifest) + + // Local tests: jUnit, coroutines, Android runner + testImplementation(libs.junit) + testImplementation(libs.kotlinx.coroutines.test) + + // Instrumented tests: jUnit rules and runners + androidTestImplementation(libs.androidx.test.core) + androidTestImplementation(libs.androidx.test.ext.junit) + androidTestImplementation(libs.androidx.test.runner) + androidTestImplementation(libs.androidx.test.espresso.core) + + // Navigation + implementation(libs.androidx.navigation3.ui) + implementation(libs.androidx.navigation3.runtime) + implementation(libs.androidx.lifecycle.viewmodel.navigation3) + + // Sleep API & Location + implementation(libs.play.services.location) + + // Home Assistant HTTP client + implementation(libs.okhttp) + + // DataStore for settings + implementation(libs.androidx.datastore.preferences) +} diff --git a/apps/mobile/app/proguard-rules.pro b/apps/mobile/app/proguard-rules.pro new file mode 100644 index 0000000..c397c31 --- /dev/null +++ b/apps/mobile/app/proguard-rules.pro @@ -0,0 +1,10 @@ +# Proguard rules for Avtex +-keep class com.google.android.gms.location.** { *; } +-dontwarn com.google.android.gms.location.** + +-keep class okhttp3.** { *; } +-dontwarn okhttp3.** + +-keep class com.example.avtex.data.** { *; } +-keep class com.example.avtex.hac.** { *; } +-keep class com.example.avtex.engine.** { *; } diff --git a/apps/mobile/app/release.keystore b/apps/mobile/app/release.keystore new file mode 100644 index 0000000000000000000000000000000000000000..9e2368ebe1cf5e14a712bd657f956673962ffd0d GIT binary patch literal 2710 zcma);c{J1w7st&Q$}kygC1VR^|0xU_A!R8`A<8;K#+IcFN!bQt%k~({*q6t?C3_}B zlcDTe)*1UwsH7e|z2|*T&w2lP-#_lT=YGETd;k2N3*e!DfI*A^9*SaSktFC6_F*q|VA4xUNl7eoQr-wq}ia34_q zXJiAUAl$Rk8v{W1$s=Ks)L7z@&sRM&Az`-CPfQ|X&zb}GWm>2*AGYgua3vytD zfFvPsR8(gBnI%(%M(D#@a(e~{f`{}Y7D$1NxwYkPZWrQ5gfaxqYtZ1bQ{k_zNv>+y zI+SLY#e*i{pAqj;2`Us(8txk2Nghj)!aWG4}MAqWD_bWO5QlmJM6VGPlvXaxszm`2QP}b+Wqvep-P1>FwxmPqsq^UyEfgZR`;C@A;QOY1ZwK% z10-|%Z;`rrc&WahE=Rnwj~A>#jL!xI@d_=%)I&>w@9#Mks%5-=bMP2S0DPHWBxRLS z9l+IX)PAZJcBP0TiZ$Z!4^yJAzHV@+QC)soaK;>n*z_n%2C*${E% zDJt<2Op9+~xs+S@fZTj~{4oN~F`#faA%UdBP!h-m|( zjs?DS^kNpy2hq!9F(>YC>3wi$(b{@HMY<&~)I#<#FC;$$9e#@6tMrQNO?e(Sxj#ih z!)KU$$)_iVf><%f=?`D~I9loL5M@_~N^t~@EVUBn2ma&x1lsbG^!cwolmdko+ZAi+zXzj{20BT@|Jw1APdCtRYyosq{L!pYffU7sC${E60 z+k8*THXYT~7Z09T#s*y(n0kRi-|(y^$&wml<;)YSR>|Frkw%AM%$Cw+Y|xqPwI9@P zTG?aVZIX|*hnyFTDc z(@#(pX+|$%yY~B}R|k~uf%-jkeB|EK3?taUrDt^b&Mj#*IWENAcZR!XDn#2+3L6gw zr&~YDme!3<1&*|>ZDP+2eu1eqh9Y9UI^p6N`f#AKlIzin#iPVvl<=_k55>0uDA7V` z7GBRTXq&NcQ9k@Srr(S>NqS9m@E+APZI0Y=40dJRL2zQ{>akOyapo#vMR4m$8^c49 z7tea^4VH^1C2DSl+|#s=_OtWI$TY#Grm7e~ccM)FQLC+6Yp4q%g<6w4zO+WBuN`bR zYM%$1fL-4X^5KRYh6kQj1QUDxmI`LF9)+oJw#ZAWUj@$oj!PD9c{Twk1BSte0mtCL;0p-qxyo!P% zfQLN#y>x;(2M@9Pg>1kehF{J69|iQkLRusyY*_2T4$}r#p&P1M>ZJr5cJluT=?@K# z=NwN~7TjGr?*sWHsvU%9r1P2TJQ|jv?1vm!auOt*tPsu|dIn~P9~i7YpB0U8Fo>>Uo6#8QJw37GAnP zg44CW{VvJuhSo?*MC38-6!R9WG&ESLMdn31M`yF;R-OL40zDs^t*ZNM_y=gY37EVc z_+1w2)fE(=7Np8QCfJAF*@>{h6>=Q!Qd+swO*y0r4(-I3Kr%hGwiY+d-7n2i_LACO zq^D*fYs+msPu(=az!#KbFuHMhS6jFl6lWZiilwxVWNZBmqZLKn7cbq?G3)1_7I+Qh zWOjN0$JEbTU8Df+n&Uo^tAYy)Ps6g})csy1o18WIoEv)W?f^2ONP9x^B!P9Sbhcns z_H>D;lq_KC8$7Y+n?Y?#=}+3=G4cGXqSL=kd{VbbG^|gcw8qChbF(?XS>nzzCO;nQ zCVnm?T7ir8dfQW{I6C1OhO8@{MzK`yZuNfqb{n#;dPfk|t?Q#0UKjp@_~SyAj;$Z# zJaDGYtS2+>nS>caO;?x^D9W!>PPW)sV-F8{d7_YT>16-JIXt!N!1R-}qeyg>wu_O0{KT{uE^X8~0tMuJyGS;QuiseWkb=Ld z6z5POmQm3ue(p5rQL2H&ToGDsR}6OYizHGSGpnOPDaIjO)Z!VN?Qyfm$q%=uWTOHT zE0^caBzm-89bBvXcnHOyJ0|{c%iA0x=@#!stfyi`PfS}Kmi938sn63* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/mobile/app/src/main/java/com/example/avtex/AvtexApplication.kt b/apps/mobile/app/src/main/java/com/example/avtex/AvtexApplication.kt new file mode 100644 index 0000000..a2dead7 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/AvtexApplication.kt @@ -0,0 +1,52 @@ +package com.example.avtex + +import android.app.Application +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.os.Build +import com.example.avtex.data.SettingsRepository +import com.example.avtex.notes.NotesRepository +import com.example.avtex.notes.XFlowSyncClient + +class AvtexApplication : Application() { + + lateinit var settingsRepository: SettingsRepository + private set + + lateinit var notesRepository: NotesRepository + private set + + lateinit var xflowSyncClient: XFlowSyncClient + private set + + override fun onCreate() { + super.onCreate() + instance = this + settingsRepository = SettingsRepository(this) + notesRepository = NotesRepository(this) + xflowSyncClient = XFlowSyncClient(this) + createNotificationChannels() + } + + private fun createNotificationChannels() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = NotificationChannel( + CHANNEL_ID_TRACKING, + "Мониторинг XFlow", + NotificationManager.IMPORTANCE_LOW + ).apply { + description = "Отображает текущий статус мониторинга и синхронизации" + setShowBadge(false) + } + val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.createNotificationChannel(channel) + } + } + + companion object { + const val CHANNEL_ID_TRACKING = "xflow_tracking_channel" + lateinit var instance: AvtexApplication + private set + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/MainActivity.kt b/apps/mobile/app/src/main/java/com/example/avtex/MainActivity.kt new file mode 100644 index 0000000..ae3c52a --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/MainActivity.kt @@ -0,0 +1,86 @@ +package com.example.avtex + +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import com.example.avtex.theme.AvtexTheme +import kotlinx.coroutines.launch + +class MainActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + handleIncomingIntent(intent) + + enableEdgeToEdge() + setContent { + AvtexTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + MainNavigation() + } + } + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + handleIncomingIntent(intent) + } + + private fun handleIncomingIntent(intent: Intent?) { + if (intent == null) return + + // 1. Обработка App Actions через Deep Link xflow://lists/add + val data = intent.data + if (data != null && data.scheme == "xflow") { + val listName = data.getQueryParameter("list_name") ?: data.getQueryParameter("name") ?: "Фильмы на просмотр" + val itemName = data.getQueryParameter("item_name") ?: data.getQueryParameter("item") + + if (!itemName.isNullOrBlank()) { + saveItemFromAssistant(itemName, listName) + return + } + } + + // 2. Обработка через Intent Extras (Google Assistant Built-in Intents) + val extras = intent.extras + if (extras != null) { + val itemName = extras.getString("itemListElement.name") ?: extras.getString("item_name") + val listName = extras.getString("itemList.name") ?: extras.getString("list_name") ?: "Фильмы на просмотр" + + if (!itemName.isNullOrBlank()) { + saveItemFromAssistant(itemName, listName) + } + } + } + + private fun saveItemFromAssistant(itemName: String, listName: String) { + lifecycleScope.launch { + val repo = AvtexApplication.instance.notesRepository + val category = if (listName.contains("фильм", ignoreCase = true)) "movies" else "general" + + repo.addNoteItem( + title = itemName, + listTitle = listName, + category = category + ) + + Toast.makeText( + this@MainActivity, + "✅ Записано в XFlow: $itemName ($listName)", + Toast.LENGTH_LONG + ).show() + } + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/Navigation.kt b/apps/mobile/app/src/main/java/com/example/avtex/Navigation.kt new file mode 100644 index 0000000..44ca1f1 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/Navigation.kt @@ -0,0 +1,120 @@ +package com.example.avtex + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Bedtime +import androidx.compose.material.icons.automirrored.filled.FormatListBulleted +import androidx.compose.material.icons.filled.Info +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.NavigationBarItemDefaults +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.avtex.theme.GlassBorder +import com.example.avtex.theme.NeonViolet +import com.example.avtex.theme.ObsidianBg +import com.example.avtex.theme.ObsidianSurfaceElevated +import com.example.avtex.theme.TextMuted +import com.example.avtex.ui.DashboardScreen +import com.example.avtex.ui.ListsScreen +import com.example.avtex.ui.OnePlusGuideScreen +import com.example.avtex.ui.SettingsScreen + +@Composable +fun MainNavigation() { + var selectedTab by rememberSaveable { mutableIntStateOf(0) } + + Scaffold( + modifier = Modifier.fillMaxSize(), + containerColor = ObsidianBg, + bottomBar = { + NavigationBar( + containerColor = ObsidianSurfaceElevated, + tonalElevation = 0.dp, + modifier = Modifier.border(1.dp, GlassBorder) + ) { + val navColors = NavigationBarItemDefaults.colors( + selectedIconColor = Color.White, + selectedTextColor = NeonViolet, + indicatorColor = NeonViolet.copy(alpha = 0.35f), + unselectedIconColor = TextMuted, + unselectedTextColor = TextMuted + ) + + NavigationBarItem( + selected = selectedTab == 0, + onClick = { selectedTab = 0 }, + icon = { Icon(Icons.Default.Bedtime, contentDescription = "Мониторинг") }, + label = { + Text( + "Сон", + fontSize = 11.sp, + fontWeight = if (selectedTab == 0) FontWeight.Bold else FontWeight.Normal + ) + }, + colors = navColors + ) + NavigationBarItem( + selected = selectedTab == 1, + onClick = { selectedTab = 1 }, + icon = { Icon(Icons.AutoMirrored.Filled.FormatListBulleted, contentDescription = "Списки") }, + label = { + Text( + "Списки", + fontSize = 11.sp, + fontWeight = if (selectedTab == 1) FontWeight.Bold else FontWeight.Normal + ) + }, + colors = navColors + ) + NavigationBarItem( + selected = selectedTab == 2, + onClick = { selectedTab = 2 }, + icon = { Icon(Icons.Default.Settings, contentDescription = "Настройки") }, + label = { + Text( + "Настройки", + fontSize = 11.sp, + fontWeight = if (selectedTab == 2) FontWeight.Bold else FontWeight.Normal + ) + }, + colors = navColors + ) + NavigationBarItem( + selected = selectedTab == 3, + onClick = { selectedTab = 3 }, + icon = { Icon(Icons.Default.Info, contentDescription = "OnePlus") }, + label = { + Text( + "OnePlus", + fontSize = 11.sp, + fontWeight = if (selectedTab == 3) FontWeight.Bold else FontWeight.Normal + ) + }, + colors = navColors + ) + } + } + ) { innerPadding -> + when (selectedTab) { + 0 -> DashboardScreen(modifier = Modifier.padding(innerPadding)) + 1 -> ListsScreen(modifier = Modifier.padding(innerPadding)) + 2 -> SettingsScreen(modifier = Modifier.padding(innerPadding)) + 3 -> OnePlusGuideScreen(modifier = Modifier.padding(innerPadding)) + } + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/data/AppSettings.kt b/apps/mobile/app/src/main/java/com/example/avtex/data/AppSettings.kt new file mode 100644 index 0000000..af65a10 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/data/AppSettings.kt @@ -0,0 +1,20 @@ +package com.example.avtex.data + +enum class HacMode { + WEBHOOK, + REST +} + +data class AppSettings( + val isTrackingActive: Boolean = false, + val currentState: String = "AWAKE", + val lastStateChangeMillis: Long = System.currentTimeMillis(), + val hacMode: HacMode = HacMode.WEBHOOK, + val hacWebhookUrl: String = "", + val hacRestUrl: String = "", + val hacToken: String = "", + val inactivityMinutes: Int = 20, + val confidenceThreshold: Int = 70, + val broadcastIntents: Boolean = true, + val lastHacStatus: String = "Готов к работе" +) diff --git a/apps/mobile/app/src/main/java/com/example/avtex/data/LogEntry.kt b/apps/mobile/app/src/main/java/com/example/avtex/data/LogEntry.kt new file mode 100644 index 0000000..6794b97 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/data/LogEntry.kt @@ -0,0 +1,15 @@ +package com.example.avtex.data + +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +data class LogEntry( + val timestamp: Long = System.currentTimeMillis(), + val tag: String, + val message: String, + val isImportant: Boolean = false +) { + val formattedTime: String + get() = SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(Date(timestamp)) +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/data/SettingsRepository.kt b/apps/mobile/app/src/main/java/com/example/avtex/data/SettingsRepository.kt new file mode 100644 index 0000000..350c2f7 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/data/SettingsRepository.kt @@ -0,0 +1,117 @@ +package com.example.avtex.data + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.intPreferencesKey +import androidx.datastore.preferences.core.longPreferencesKey +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map + +private val Context.dataStore: DataStore by preferencesDataStore(name = "avtex_settings") + +class SettingsRepository(private val context: Context) { + + private object PreferencesKeys { + val IS_TRACKING_ACTIVE = booleanPreferencesKey("is_tracking_active") + val CURRENT_STATE = stringPreferencesKey("current_state") + val LAST_STATE_CHANGE = longPreferencesKey("last_state_change") + val HAC_MODE = stringPreferencesKey("hac_mode") + val HAC_WEBHOOK_URL = stringPreferencesKey("hac_webhook_url") + val HAC_REST_URL = stringPreferencesKey("hac_rest_url") + val HAC_TOKEN = stringPreferencesKey("hac_token") + val INACTIVITY_MINUTES = intPreferencesKey("inactivity_minutes") + val CONFIDENCE_THRESHOLD = intPreferencesKey("confidence_threshold") + val BROADCAST_INTENTS = booleanPreferencesKey("broadcast_intents") + val LAST_HAC_STATUS = stringPreferencesKey("last_hac_status") + } + + private val _logsFlow = MutableStateFlow>(emptyList()) + val logsFlow: StateFlow> = _logsFlow.asStateFlow() + + fun addLog(tag: String, message: String, isImportant: Boolean = false) { + val newEntry = LogEntry(tag = tag, message = message, isImportant = isImportant) + val current = _logsFlow.value.toMutableList() + current.add(0, newEntry) + if (current.size > 100) { + current.removeAt(current.size - 1) + } + _logsFlow.value = current + } + + val settingsFlow: Flow = context.dataStore.data.map { prefs -> + val modeStr = prefs[PreferencesKeys.HAC_MODE] ?: HacMode.WEBHOOK.name + val mode = try { + HacMode.valueOf(modeStr) + } catch (_: Exception) { + HacMode.WEBHOOK + } + + AppSettings( + isTrackingActive = prefs[PreferencesKeys.IS_TRACKING_ACTIVE] ?: false, + currentState = prefs[PreferencesKeys.CURRENT_STATE] ?: "AWAKE", + lastStateChangeMillis = prefs[PreferencesKeys.LAST_STATE_CHANGE] ?: System.currentTimeMillis(), + hacMode = mode, + hacWebhookUrl = prefs[PreferencesKeys.HAC_WEBHOOK_URL] ?: "", + hacRestUrl = prefs[PreferencesKeys.HAC_REST_URL] ?: "", + hacToken = prefs[PreferencesKeys.HAC_TOKEN] ?: "", + inactivityMinutes = prefs[PreferencesKeys.INACTIVITY_MINUTES] ?: 20, + confidenceThreshold = prefs[PreferencesKeys.CONFIDENCE_THRESHOLD] ?: 70, + broadcastIntents = prefs[PreferencesKeys.BROADCAST_INTENTS] ?: true, + lastHacStatus = prefs[PreferencesKeys.LAST_HAC_STATUS] ?: "Готов к работе" + ) + } + + suspend fun getSettings(): AppSettings = settingsFlow.first() + + suspend fun updateTrackingActive(active: Boolean) { + context.dataStore.edit { it[PreferencesKeys.IS_TRACKING_ACTIVE] = active } + } + + suspend fun updateCurrentState(state: String, timestamp: Long = System.currentTimeMillis()) { + context.dataStore.edit { + it[PreferencesKeys.CURRENT_STATE] = state + it[PreferencesKeys.LAST_STATE_CHANGE] = timestamp + } + } + + suspend fun updateHacSettings( + mode: HacMode, + webhookUrl: String, + restUrl: String, + token: String + ) { + context.dataStore.edit { + it[PreferencesKeys.HAC_MODE] = mode.name + it[PreferencesKeys.HAC_WEBHOOK_URL] = webhookUrl + it[PreferencesKeys.HAC_REST_URL] = restUrl + it[PreferencesKeys.HAC_TOKEN] = token + } + } + + suspend fun updateDetectionSensitivity( + inactivityMinutes: Int, + confidenceThreshold: Int, + broadcastIntents: Boolean + ) { + context.dataStore.edit { + it[PreferencesKeys.INACTIVITY_MINUTES] = inactivityMinutes + it[PreferencesKeys.CONFIDENCE_THRESHOLD] = confidenceThreshold + it[PreferencesKeys.BROADCAST_INTENTS] = broadcastIntents + } + } + + suspend fun updateHacStatus(status: String) { + context.dataStore.edit { + it[PreferencesKeys.LAST_HAC_STATUS] = status + } + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/engine/BootReceiver.kt b/apps/mobile/app/src/main/java/com/example/avtex/engine/BootReceiver.kt new file mode 100644 index 0000000..a55db15 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/engine/BootReceiver.kt @@ -0,0 +1,39 @@ +package com.example.avtex.engine + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import android.util.Log +import com.example.avtex.AvtexApplication +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class BootReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == Intent.ACTION_BOOT_COMPLETED) { + Log.d(TAG, "Boot completed event received") + val repo = AvtexApplication.instance.settingsRepository + CoroutineScope(Dispatchers.Default).launch { + val settings = repo.getSettings() + if (settings.isTrackingActive) { + Log.d(TAG, "Restarting SleepTrackingService after reboot") + val serviceIntent = Intent(context, SleepTrackingService::class.java).apply { + action = SleepTrackingService.ACTION_START_TRACKING + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(serviceIntent) + } else { + context.startService(serviceIntent) + } + } + } + } + } + + companion object { + private const val TAG = "BootReceiver" + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/engine/SignificantMotionTrigger.kt b/apps/mobile/app/src/main/java/com/example/avtex/engine/SignificantMotionTrigger.kt new file mode 100644 index 0000000..6c5d8a3 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/engine/SignificantMotionTrigger.kt @@ -0,0 +1,54 @@ +package com.example.avtex.engine + +import android.content.Context +import android.hardware.Sensor +import android.hardware.SensorManager +import android.hardware.TriggerEvent +import android.hardware.TriggerEventListener +import android.util.Log + +class SignificantMotionTrigger( + private val context: Context, + private val onMotionDetected: () -> Unit +) { + private val sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager + private val motionSensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION) + + private var isArmed = false + + private val triggerListener = object : TriggerEventListener() { + override fun onTrigger(event: TriggerEvent?) { + Log.d(TAG, "Hardware Significant Motion Triggered!") + isArmed = false + onMotionDetected() + } + } + + val isAvailable: Boolean + get() = motionSensor != null + + fun arm(): Boolean { + if (motionSensor == null) { + Log.w(TAG, "Significant motion sensor not available") + return false + } + if (isArmed) { + sensorManager.cancelTriggerSensor(triggerListener, motionSensor) + } + isArmed = sensorManager.requestTriggerSensor(triggerListener, motionSensor) + Log.d(TAG, "Significant motion sensor armed: $isArmed") + return isArmed + } + + fun disarm() { + if (motionSensor != null && isArmed) { + sensorManager.cancelTriggerSensor(triggerListener, motionSensor) + isArmed = false + Log.d(TAG, "Significant motion sensor disarmed") + } + } + + companion object { + private const val TAG = "SignificantMotion" + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepReceiver.kt b/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepReceiver.kt new file mode 100644 index 0000000..d216b81 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepReceiver.kt @@ -0,0 +1,54 @@ +package com.example.avtex.engine + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.util.Log +import com.example.avtex.AvtexApplication +import com.google.android.gms.location.SleepClassifyEvent +import com.google.android.gms.location.SleepSegmentEvent + +class SleepReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + if (SleepClassifyEvent.hasEvents(intent)) { + val events = SleepClassifyEvent.extractEvents(intent) + for (event in events) { + val confidence = event.confidence + val motion = event.motion + val light = event.light + Log.d(TAG, "SleepClassifyEvent: confidence=$confidence, motion=$motion, light=$light") + val now = System.currentTimeMillis() + if (now - lastClassifyLogTimestamp >= MIN_CLASSIFY_LOG_INTERVAL_MS) { + lastClassifyLogTimestamp = now + AvtexApplication.instance.settingsRepository.addLog( + tag = "SleepAPI", + message = "Классификация (раз в час): уверенность $confidence%, движение $motion/6, свет $light/6" + ) + } + SleepTrackingService.onSleepClassifyReceived(context, confidence, motion, light) + } + } + + if (SleepSegmentEvent.hasEvents(intent)) { + val events = SleepSegmentEvent.extractEvents(intent) + for (event in events) { + Log.d(TAG, "SleepSegmentEvent: ${event.startTimeMillis} to ${event.endTimeMillis} (status=${event.status})") + AvtexApplication.instance.settingsRepository.addLog( + tag = "SleepSegment", + message = "Сегмент сна завершен: ${event.startTimeMillis} - ${event.endTimeMillis}", + isImportant = true + ) + SleepTrackingService.onSleepSegmentReceived(context, event.startTimeMillis, event.endTimeMillis, event.status) + } + } + } + + companion object { + private const val TAG = "SleepReceiver" + const val ACTION_SLEEP_API_EVENT = "com.example.avtex.ACTION_SLEEP_API_EVENT" + private const val MIN_CLASSIFY_LOG_INTERVAL_MS = 60 * 60 * 1000L // Минимум 1 раз в час + @Volatile + private var lastClassifyLogTimestamp: Long = 0L + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepState.kt b/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepState.kt new file mode 100644 index 0000000..5c18c76 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepState.kt @@ -0,0 +1,6 @@ +package com.example.avtex.engine + +enum class SleepState { + AWAKE, + ASLEEP +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepTrackingService.kt b/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepTrackingService.kt new file mode 100644 index 0000000..77528c7 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/engine/SleepTrackingService.kt @@ -0,0 +1,373 @@ +package com.example.avtex.engine + +import android.Manifest +import android.app.Notification +import android.app.PendingIntent +import android.app.Service +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.os.Build +import android.os.IBinder +import android.os.PowerManager +import android.util.Log +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat +import com.example.avtex.AvtexApplication +import com.example.avtex.MainActivity +import com.example.avtex.hac.HacClient +import com.google.android.gms.location.ActivityRecognition +import com.google.android.gms.location.SleepSegmentRequest +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +class SleepTrackingService : Service() { + + private val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) + private lateinit var significantMotionTrigger: SignificantMotionTrigger + private lateinit var hacClient: HacClient + + private var screenReceiver: BroadcastReceiver? = null + private var inactivityJob: Job? = null + private var sleepApiPendingIntent: PendingIntent? = null + + private var currentState: SleepState = SleepState.AWAKE + private var stateChangeTimestamp: Long = System.currentTimeMillis() + + private val settingsRepository get() = AvtexApplication.instance.settingsRepository + + override fun onCreate() { + super.onCreate() + Log.d(TAG, "SleepTrackingService onCreate") + hacClient = HacClient(this) + + significantMotionTrigger = SignificantMotionTrigger(this) { + handleWakeupDetected(source = "significant_motion") + } + + registerScreenReceiver() + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + val action = intent?.action ?: ACTION_START_TRACKING + Log.d(TAG, "onStartCommand action: $action") + + when (action) { + ACTION_START_TRACKING -> { + startForegroundServiceWithNotification() + initializeTracking() + } + ACTION_STOP_TRACKING -> { + stopTracking() + stopForeground(STOP_FOREGROUND_REMOVE) + stopSelf() + } + ACTION_MANUAL_TOGGLE -> { + val newState = if (currentState == SleepState.AWAKE) SleepState.ASLEEP else SleepState.AWAKE + transitionToState(newState, source = "manual_toggle", confidence = 100) + } + ACTION_TEST_HAC -> { + serviceScope.launch { + val settings = settingsRepository.getSettings() + val isAsleep = currentState == SleepState.ASLEEP + settingsRepository.addLog("HAC_TEST", "Отправка тестового запроса в Home Assistant...") + val result = hacClient.sendSleepEvent(settings, isAsleep, source = "manual_test") + result.onSuccess { msg -> + settingsRepository.addLog("HAC_TEST", "Тест успешен: $msg", isImportant = true) + settingsRepository.updateHacStatus("Тест успешен: $msg") + }.onFailure { err -> + settingsRepository.addLog("HAC_TEST", "Ошибка теста: ${err.localizedMessage}", isImportant = true) + settingsRepository.updateHacStatus("Ошибка: ${err.localizedMessage}") + } + } + } + } + + return START_STICKY + } + + private fun startForegroundServiceWithNotification() { + val notification = buildNotification( + title = "Avtex: Мониторинг активности", + text = "Статус: ${if (currentState == SleepState.ASLEEP) "Спит 🌙" else "Бодрствует ☀️"}" + ) + startForeground(NOTIFICATION_ID, notification) + } + + private fun initializeTracking() { + serviceScope.launch { + val settings = settingsRepository.getSettings() + currentState = if (settings.currentState == "ASLEEP") SleepState.ASLEEP else SleepState.AWAKE + stateChangeTimestamp = settings.lastStateChangeMillis + settingsRepository.updateTrackingActive(true) + settingsRepository.addLog("Engine", "Служба мониторинга сна запущена", isImportant = true) + + updateNotification() + subscribeToSleepApi() + + if (currentState == SleepState.ASLEEP) { + significantMotionTrigger.arm() + } + } + } + + private fun stopTracking() { + serviceScope.launch { + settingsRepository.updateTrackingActive(false) + settingsRepository.addLog("Engine", "Служба мониторинга остановлена", isImportant = true) + significantMotionTrigger.disarm() + unsubscribeFromSleepApi() + inactivityJob?.cancel() + } + } + + private fun registerScreenReceiver() { + screenReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + Intent.ACTION_SCREEN_OFF -> { + Log.d(TAG, "Screen OFF event received") + handleScreenOff() + } + Intent.ACTION_SCREEN_ON -> { + Log.d(TAG, "Screen ON event received") + } + Intent.ACTION_USER_PRESENT -> { + Log.d(TAG, "User unlocked device") + handleWakeupDetected(source = "screen_unlocked") + } + } + } + } + val filter = IntentFilter().apply { + addAction(Intent.ACTION_SCREEN_OFF) + addAction(Intent.ACTION_SCREEN_ON) + addAction(Intent.ACTION_USER_PRESENT) + } + registerReceiver(screenReceiver, filter) + } + + private fun handleScreenOff() { + if (currentState == SleepState.AWAKE) { + inactivityJob?.cancel() + inactivityJob = serviceScope.launch { + val settings = settingsRepository.getSettings() + val minutes = settings.inactivityMinutes + Log.d(TAG, "Starting inactivity countdown: $minutes minutes") + settingsRepository.addLog("Engine", "Экран выключен. Ожидание сна ($minutes мин)...") + delay(minutes * 60 * 1000L) + + // If still awake and not interrupted, assume sleep + if (currentState == SleepState.AWAKE) { + settingsRepository.addLog("Engine", "Время покоя истекло ($minutes мин). Переход в режим сна.", isImportant = true) + transitionToState(SleepState.ASLEEP, source = "inactivity_timer", confidence = 90) + } + } + } + } + + private fun handleWakeupDetected(source: String) { + inactivityJob?.cancel() + if (currentState == SleepState.ASLEEP) { + Log.d(TAG, "Wakeup detected from source: $source") + transitionToState(SleepState.AWAKE, source = source, confidence = 100) + } + } + + private fun transitionToState(newState: SleepState, source: String, confidence: Int) { + if (currentState == newState) return + + currentState = newState + stateChangeTimestamp = System.currentTimeMillis() + + serviceScope.launch { + val isAsleep = (newState == SleepState.ASLEEP) + val stateName = if (isAsleep) "ASLEEP" else "AWAKE" + settingsRepository.updateCurrentState(stateName, stateChangeTimestamp) + + if (isAsleep) { + // When falling asleep, arm significant motion trigger for instant wake detection + val armed = significantMotionTrigger.arm() + settingsRepository.addLog( + "Engine", + "Зафиксировано засыпание ($source). Датчик движения взведен: $armed", + isImportant = true + ) + } else { + // When waking up, disarm trigger + significantMotionTrigger.disarm() + settingsRepository.addLog( + "Engine", + "Зафиксировано пробуждение ($source).", + isImportant = true + ) + } + + updateNotification() + + // Acquire temporary WakeLock to ensure HTTP request reaches HAC on OnePlus + val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager + val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Avtex:HacTransmissionWakeLock") + wakeLock.acquire(15000L) // max 15 seconds + + try { + val settings = settingsRepository.getSettings() + val result = hacClient.sendSleepEvent(settings, isAsleep, source, confidence) + result.onSuccess { msg -> + Log.d(TAG, "HAC send success: $msg") + settingsRepository.addLog("HAC", "Отправлено в Home Assistant: $msg") + settingsRepository.updateHacStatus("Отправлено в ${formatTime(stateChangeTimestamp)}: $msg") + }.onFailure { err -> + Log.e(TAG, "HAC send error", err) + settingsRepository.addLog("HAC", "Ошибка отправки в Home Assistant: ${err.localizedMessage}", isImportant = true) + settingsRepository.updateHacStatus("Ошибка: ${err.localizedMessage}") + } + } finally { + if (wakeLock.isHeld) { + wakeLock.release() + } + } + } + } + + private fun subscribeToSleepApi() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED) { + Log.w(TAG, "ACTIVITY_RECOGNITION permission not granted for Sleep API") + settingsRepository.addLog("SleepAPI", "Нет разрешения на активность. Используются аппаратные датчики движения.") + return + } + + try { + val intent = Intent(this, SleepReceiver::class.java).apply { + action = SleepReceiver.ACTION_SLEEP_API_EVENT + } + val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE + } else { + PendingIntent.FLAG_UPDATE_CURRENT + } + sleepApiPendingIntent = PendingIntent.getBroadcast(this, REQUEST_CODE_SLEEP_API, intent, flags) + + val request = SleepSegmentRequest.getDefaultSleepSegmentRequest() + val task = ActivityRecognition.getClient(this).requestSleepSegmentUpdates(sleepApiPendingIntent!!, request) + task.addOnSuccessListener { + Log.d(TAG, "Successfully subscribed to Google Sleep API") + settingsRepository.addLog("SleepAPI", "Google Sleep API успешно подключен") + } + task.addOnFailureListener { e -> + Log.e(TAG, "Failed to subscribe to Google Sleep API", e) + settingsRepository.addLog("SleepAPI", "Не удалось подключить Google Sleep API: ${e.localizedMessage}") + } + } catch (e: Exception) { + Log.e(TAG, "Exception subscribing to Sleep API", e) + } + } + + private fun unsubscribeFromSleepApi() { + sleepApiPendingIntent?.let { pi -> + try { + ActivityRecognition.getClient(this).removeSleepSegmentUpdates(pi) + Log.d(TAG, "Unsubscribed from Sleep API") + } catch (e: Exception) { + Log.e(TAG, "Error unsubscribing from Sleep API", e) + } + } + } + + private fun buildNotification(title: String, text: String): Notification { + val openAppIntent = Intent(this, MainActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_SINGLE_TOP + } + val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + } else { + PendingIntent.FLAG_UPDATE_CURRENT + } + val pendingIntent = PendingIntent.getActivity(this, 0, openAppIntent, flags) + + return NotificationCompat.Builder(this, AvtexApplication.CHANNEL_ID_TRACKING) + .setContentTitle(title) + .setContentText(text) + .setSmallIcon(android.R.drawable.ic_lock_idle_charging) + .setContentIntent(pendingIntent) + .setOngoing(true) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setCategory(NotificationCompat.CATEGORY_SERVICE) + .build() + } + + private fun updateNotification() { + val stateText = if (currentState == SleepState.ASLEEP) "Спит 🌙" else "Бодрствует ☀️" + val timeFormatted = formatTime(stateChangeTimestamp) + val notification = buildNotification( + title = "Avtex: $stateText", + text = "Состояние с $timeFormatted" + ) + val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager + notificationManager.notify(NOTIFICATION_ID, notification) + } + + private fun formatTime(millis: Long): String { + return SimpleDateFormat("HH:mm", Locale.getDefault()).format(Date(millis)) + } + + override fun onDestroy() { + Log.d(TAG, "SleepTrackingService onDestroy") + screenReceiver?.let { + unregisterReceiver(it) + screenReceiver = null + } + significantMotionTrigger.disarm() + unsubscribeFromSleepApi() + serviceScope.cancel() + super.onDestroy() + } + + override fun onBind(intent: Intent?): IBinder? = null + + companion object { + private const val TAG = "SleepTrackingService" + private const val NOTIFICATION_ID = 1001 + private const val REQUEST_CODE_SLEEP_API = 2001 + + const val ACTION_START_TRACKING = "com.example.avtex.ACTION_START_TRACKING" + const val ACTION_STOP_TRACKING = "com.example.avtex.ACTION_STOP_TRACKING" + const val ACTION_MANUAL_TOGGLE = "com.example.avtex.ACTION_MANUAL_TOGGLE" + const val ACTION_TEST_HAC = "com.example.avtex.ACTION_TEST_HAC" + + @Volatile + private var instance: SleepTrackingService? = null + + fun onSleepClassifyReceived(context: Context, confidence: Int, motion: Int, light: Int) { + // If confidence is high and device is in stationary motion + val repo = AvtexApplication.instance.settingsRepository + CoroutineScope(Dispatchers.Default).launch { + val settings = repo.getSettings() + if (settings.isTrackingActive && settings.currentState == "AWAKE") { + if (confidence >= settings.confidenceThreshold && motion <= 2) { + Log.d(TAG, "SleepClassify indicates sleep: confidence=$confidence, motion=$motion") + // Send intent to service to transition state + val intent = Intent(context, SleepTrackingService::class.java).apply { + action = ACTION_MANUAL_TOGGLE // or specific intent + } + // Only trigger if actually confident + } + } + } + } + + fun onSleepSegmentReceived(context: Context, start: Long, end: Long, status: Int) { + Log.d(TAG, "SleepSegment completed: start=$start, end=$end, status=$status") + } + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/hac/HacClient.kt b/apps/mobile/app/src/main/java/com/example/avtex/hac/HacClient.kt new file mode 100644 index 0000000..8abb264 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/hac/HacClient.kt @@ -0,0 +1,168 @@ +package com.example.avtex.hac + +import android.content.Context +import android.content.Intent +import com.example.avtex.data.AppSettings +import com.example.avtex.data.HacMode +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.concurrent.TimeUnit + +class HacClient(private val context: Context) { + + private val httpClient = OkHttpClient.Builder() + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS) + .writeTimeout(10, TimeUnit.SECONDS) + .build() + + private val jsonMediaType = "application/json; charset=utf-8".toMediaType() + + suspend fun sendSleepEvent( + settings: AppSettings, + isAsleep: Boolean, + source: String, + confidence: Int = 100 + ): Result = withContext(Dispatchers.IO) { + val stateStr = if (isAsleep) "asleep" else "awake" + val eventStr = if (isAsleep) "sleep_started" else "sleep_ended" + val timestamp = System.currentTimeMillis() + + // 1. Send Local Broadcast if enabled + if (settings.broadcastIntents) { + val broadcastIntent = Intent(ACTION_SLEEP_STATE_CHANGED).apply { + putExtra("state", stateStr) + putExtra("event", eventStr) + putExtra("is_asleep", isAsleep) + putExtra("source", source) + putExtra("confidence", confidence) + putExtra("timestamp", timestamp) + setPackage(context.packageName) + } + context.sendBroadcast(broadcastIntent) + } + + // 2. Send HTTP Request based on configured mode + when (settings.hacMode) { + HacMode.WEBHOOK -> { + if (settings.hacWebhookUrl.isBlank()) { + return@withContext Result.failure(IllegalArgumentException("Webhook URL не задан в настройках")) + } + sendWebhook( + url = settings.hacWebhookUrl.trim(), + event = eventStr, + state = stateStr, + confidence = confidence, + source = source, + timestamp = timestamp + ) + } + HacMode.REST -> { + if (settings.hacRestUrl.isBlank()) { + return@withContext Result.failure(IllegalArgumentException("REST API URL не задан в настройках")) + } + sendRest( + url = settings.hacRestUrl.trim(), + token = settings.hacToken.trim(), + isAsleep = isAsleep, + confidence = confidence, + source = source, + timestamp = timestamp + ) + } + } + } + + private fun sendWebhook( + url: String, + event: String, + state: String, + confidence: Int, + source: String, + timestamp: Long + ): Result { + return try { + val json = JSONObject().apply { + put("event", event) + put("state", state) + put("confidence", confidence) + put("source", source) + put("timestamp", timestamp) + put("time_iso", SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.US).format(Date(timestamp))) + } + + val body = json.toString().toRequestBody(jsonMediaType) + val request = Request.Builder() + .url(url) + .post(body) + .build() + + val response = httpClient.newCall(request).execute() + response.use { + if (it.isSuccessful) { + Result.success("Webhook OK (${it.code})") + } else { + Result.failure(Exception("Ошибка сервера: HTTP ${it.code} ${it.message}")) + } + } + } catch (e: Exception) { + Result.failure(e) + } + } + + private fun sendRest( + url: String, + token: String, + isAsleep: Boolean, + confidence: Int, + source: String, + timestamp: Long + ): Result { + return try { + val binaryState = if (isAsleep) "on" else "off" + val attributes = JSONObject().apply { + put("device_class", "occupancy") + put("friendly_name", "Сон пользователя (Avtex)") + put("confidence", confidence) + put("source", source) + put("last_updated", SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.US).format(Date(timestamp))) + } + val payload = JSONObject().apply { + put("state", binaryState) + put("attributes", attributes) + } + + val body = payload.toString().toRequestBody(jsonMediaType) + val requestBuilder = Request.Builder() + .url(url) + .post(body) + + if (token.isNotBlank()) { + requestBuilder.header("Authorization", "Bearer $token") + } + + val response = httpClient.newCall(requestBuilder.build()).execute() + response.use { + if (it.isSuccessful) { + Result.success("REST OK (${it.code})") + } else { + Result.failure(Exception("Ошибка REST API: HTTP ${it.code} ${it.message}")) + } + } + } catch (e: Exception) { + Result.failure(e) + } + } + + companion object { + const val ACTION_SLEEP_STATE_CHANGED = "com.example.avtex.SLEEP_STATE_CHANGED" + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/notes/NoteModel.kt b/apps/mobile/app/src/main/java/com/example/avtex/notes/NoteModel.kt new file mode 100644 index 0000000..2dc7c47 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/notes/NoteModel.kt @@ -0,0 +1,24 @@ +package com.example.avtex.notes + +data class NoteItem( + val id: String, + val listId: String, + val title: String, + val description: String = "", + val isCompleted: Boolean = false, + val status: String = "todo", // "want_to_watch", "watched", "todo", "completed" + val priority: String = "normal", + val metadata: String = "{}", + val createdAt: Long = System.currentTimeMillis() +) + +data class NoteList( + val id: String, + val title: String, + val category: String = "general", // "movies", "shopping", "tasks", "general" + val description: String = "", + val color: String? = null, + val icon: String? = null, + val items: List = emptyList(), + val createdAt: Long = System.currentTimeMillis() +) diff --git a/apps/mobile/app/src/main/java/com/example/avtex/notes/NotesRepository.kt b/apps/mobile/app/src/main/java/com/example/avtex/notes/NotesRepository.kt new file mode 100644 index 0000000..20e081a --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/notes/NotesRepository.kt @@ -0,0 +1,189 @@ +package com.example.avtex.notes + +import android.content.ContentValues +import android.content.Context +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.util.UUID + +class NotesRepository(context: Context) { + + private val dbHelper = XFlowDatabaseHelper(context) + private val scope = CoroutineScope(Dispatchers.IO) + + private val _listsFlow = MutableStateFlow>(emptyList()) + val listsFlow: StateFlow> = _listsFlow.asStateFlow() + + init { + reload() + } + + fun reload() { + scope.launch { + val lists = loadListsFromDb() + _listsFlow.value = lists + } + } + + private suspend fun loadListsFromDb(): List = withContext(Dispatchers.IO) { + val db = dbHelper.readableDatabase + val lists = mutableListOf() + + val cursorLists = db.query( + XFlowDatabaseHelper.TABLE_LISTS, + null, null, null, null, null, "created_at DESC" + ) + + cursorLists.use { cLists -> + while (cLists.moveToNext()) { + val listId = cLists.getString(cLists.getColumnIndexOrThrow("id")) + val title = cLists.getString(cLists.getColumnIndexOrThrow("title")) + val category = cLists.getString(cLists.getColumnIndexOrThrow("category")) + val description = cLists.getString(cLists.getColumnIndexOrThrow("description")) ?: "" + val color = cLists.getString(cLists.getColumnIndexOrThrow("color")) + val icon = cLists.getString(cLists.getColumnIndexOrThrow("icon")) + val createdAt = cLists.getLong(cLists.getColumnIndexOrThrow("created_at")) + + // Загружаем элементы списка + val items = mutableListOf() + val cursorItems = db.query( + XFlowDatabaseHelper.TABLE_ITEMS, + null, "list_id = ?", arrayOf(listId), null, null, "created_at DESC" + ) + + cursorItems.use { cItems -> + while (cItems.moveToNext()) { + val itemId = cItems.getString(cItems.getColumnIndexOrThrow("id")) + val itemTitle = cItems.getString(cItems.getColumnIndexOrThrow("title")) + val itemDesc = cItems.getString(cItems.getColumnIndexOrThrow("description")) ?: "" + val isCompleted = cItems.getInt(cItems.getColumnIndexOrThrow("is_completed")) == 1 + val status = cItems.getString(cItems.getColumnIndexOrThrow("status")) + val priority = cItems.getString(cItems.getColumnIndexOrThrow("priority")) + val metadata = cItems.getString(cItems.getColumnIndexOrThrow("metadata")) ?: "{}" + val itemCreatedAt = cItems.getLong(cItems.getColumnIndexOrThrow("created_at")) + + items.add( + NoteItem( + id = itemId, + listId = listId, + title = itemTitle, + description = itemDesc, + isCompleted = isCompleted, + status = status, + priority = priority, + metadata = metadata, + createdAt = itemCreatedAt + ) + ) + } + } + + lists.add( + NoteList( + id = listId, + title = title, + category = category, + description = description, + color = color, + icon = icon, + items = items, + createdAt = createdAt + ) + ) + } + } + + lists + } + + suspend fun addNoteItem( + title: String, + listTitle: String = "Фильмы на просмотр", + category: String = "movies", + description: String = "" + ): NoteItem = withContext(Dispatchers.IO) { + val db = dbHelper.writableDatabase + + // Ищем список по названию + var targetListId: String? = null + val c = db.query( + XFlowDatabaseHelper.TABLE_LISTS, + arrayOf("id"), "LOWER(title) = LOWER(?)", arrayOf(listTitle.trim()), + null, null, null + ) + c.use { + if (it.moveToFirst()) { + targetListId = it.getString(0) + } + } + + // Если список не найден, создаем его + if (targetListId == null) { + val newListId = "list-" + UUID.randomUUID().toString() + val cvList = ContentValues().apply { + put("id", newListId) + put("title", listTitle.trim()) + put("category", category) + put("description", "Список $listTitle") + put("created_at", System.currentTimeMillis()) + } + db.insert(XFlowDatabaseHelper.TABLE_LISTS, null, cvList) + targetListId = newListId + } + + val newItemId = "item-" + UUID.randomUUID().toString() + val now = System.currentTimeMillis() + val cvItem = ContentValues().apply { + put("id", newItemId) + put("list_id", targetListId) + put("title", title.trim()) + put("description", description) + put("is_completed", 0) + put("status", if (category == "movies") "want_to_watch" else "todo") + put("priority", "normal") + put("metadata", "{}") + put("created_at", now) + } + db.insert(XFlowDatabaseHelper.TABLE_ITEMS, null, cvItem) + + reload() + + NoteItem( + id = newItemId, + listId = targetListId, + title = title.trim(), + description = description, + isCompleted = false, + status = if (category == "movies") "want_to_watch" else "todo", + createdAt = now + ) + } + + suspend fun toggleItem(item: NoteItem) = withContext(Dispatchers.IO) { + val db = dbHelper.writableDatabase + val newCompleted = !item.isCompleted + val newStatus = if (newCompleted) { + if (item.status == "want_to_watch") "watched" else "completed" + } else { + if (item.status == "watched") "want_to_watch" else "todo" + } + + val cv = ContentValues().apply { + put("is_completed", if (newCompleted) 1 else 0) + put("status", newStatus) + } + db.update(XFlowDatabaseHelper.TABLE_ITEMS, cv, "id = ?", arrayOf(item.id)) + reload() + } + + suspend fun deleteItem(itemId: String) = withContext(Dispatchers.IO) { + val db = dbHelper.writableDatabase + db.delete(XFlowDatabaseHelper.TABLE_ITEMS, "id = ?", arrayOf(itemId)) + reload() + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/notes/XFlowDatabaseHelper.kt b/apps/mobile/app/src/main/java/com/example/avtex/notes/XFlowDatabaseHelper.kt new file mode 100644 index 0000000..9fc1ad6 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/notes/XFlowDatabaseHelper.kt @@ -0,0 +1,72 @@ +package com.example.avtex.notes + +import android.content.ContentValues +import android.content.Context +import android.database.sqlite.SQLiteDatabase +import android.database.sqlite.SQLiteOpenHelper + +class XFlowDatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { + + override fun onCreate(db: SQLiteDatabase) { + db.execSQL(""" + CREATE TABLE $TABLE_LISTS ( + id TEXT PRIMARY KEY, + title TEXT NOT NULL, + category TEXT NOT NULL, + description TEXT, + color TEXT, + icon TEXT, + created_at INTEGER NOT NULL + ) + """.trimIndent()) + + db.execSQL(""" + CREATE TABLE $TABLE_ITEMS ( + id TEXT PRIMARY KEY, + list_id TEXT NOT NULL, + title TEXT NOT NULL, + description TEXT, + is_completed INTEGER NOT NULL DEFAULT 0, + status TEXT NOT NULL, + priority TEXT NOT NULL, + metadata TEXT, + created_at INTEGER NOT NULL, + FOREIGN KEY(list_id) REFERENCES $TABLE_LISTS(id) ON DELETE CASCADE + ) + """.trimIndent()) + + // Создаем дефолтные списки для удобства пользователя + val now = System.currentTimeMillis() + val cvMovies = ContentValues().apply { + put("id", "list-movies-default") + put("title", "Фильмы на просмотр") + put("category", "movies") + put("description", "Список фильмов и сериалов") + put("created_at", now) + } + db.insert(TABLE_LISTS, null, cvMovies) + + val cvShopping = ContentValues().apply { + put("id", "list-shopping-default") + put("title", "Покупки") + put("category", "shopping") + put("description", "Список покупок") + put("created_at", now) + } + db.insert(TABLE_LISTS, null, cvShopping) + } + + override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL("DROP TABLE IF EXISTS $TABLE_ITEMS") + db.execSQL("DROP TABLE IF EXISTS $TABLE_LISTS") + onCreate(db) + } + + companion object { + private const val DATABASE_NAME = "xflow_notes.db" + private const val DATABASE_VERSION = 1 + + const val TABLE_LISTS = "lists" + const val TABLE_ITEMS = "items" + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/notes/XFlowSyncClient.kt b/apps/mobile/app/src/main/java/com/example/avtex/notes/XFlowSyncClient.kt new file mode 100644 index 0000000..6fc102a --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/notes/XFlowSyncClient.kt @@ -0,0 +1,65 @@ +package com.example.avtex.notes + +import android.content.Context +import android.util.Log +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject +import java.util.concurrent.TimeUnit + +class XFlowSyncClient(private val context: Context) { + + private val httpClient = OkHttpClient.Builder() + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS) + .build() + + private val jsonMediaType = "application/json; charset=utf-8".toMediaType() + + suspend fun syncItemToServer( + serverUrl: String, + title: String, + listTitle: String, + category: String, + ownerId: String = "default-user" + ): Result = withContext(Dispatchers.IO) { + if (serverUrl.isBlank()) { + return@withContext Result.failure(IllegalArgumentException("URL сервера XFlow не указан")) + } + + try { + val endpoint = "${serverUrl.trimEnd('/')}/api/v1/lists/items" + val json = JSONObject().apply { + put("title", title) + put("listTitle", listTitle) + put("category", category) + put("ownerId", ownerId) + } + + val request = Request.Builder() + .url(endpoint) + .post(json.toString().toRequestBody(jsonMediaType)) + .build() + + val response = httpClient.newCall(request).execute() + response.use { + if (it.isSuccessful) { + Result.success("Синхронизировано с XFlow") + } else { + Result.failure(Exception("HTTP ${it.code}: ${it.message}")) + } + } + } catch (e: Exception) { + Log.e(TAG, "Sync to XFlow server failed", e) + Result.failure(e) + } + } + + companion object { + private const val TAG = "XFlowSyncClient" + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/theme/Color.kt b/apps/mobile/app/src/main/java/com/example/avtex/theme/Color.kt new file mode 100644 index 0000000..e3caf33 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/theme/Color.kt @@ -0,0 +1,34 @@ +package com.example.avtex.theme + +import androidx.compose.ui.graphics.Color + +// Obsidian & Midnight Backgrounds +val ObsidianBg = Color(0xFF090A0F) +val ObsidianSurface = Color(0xFF11131E) +val ObsidianSurfaceElevated = Color(0xFF181B2A) +val ObsidianSurfaceHigh = Color(0xFF21253A) +val GlassBorder = Color(0x1FFFFFFF) + +// Sleep Neon Accents (Night / Sleep) +val NeonViolet = Color(0xFFA855F7) +val NeonPurple = Color(0xFF8B5CF6) +val ElectricIndigo = Color(0xFF6366F1) +val DeepIndigo = Color(0xFF1E1B4B) +val LavenderGlow = Color(0xFFE9D5FF) + +// Wake Solar Accents (Day / Awake) +val SolarAmber = Color(0xFFF59E0B) +val SunsetOrange = Color(0xFFF97316) +val MorningGold = Color(0xFFFCD34D) +val DeepSolar = Color(0xFF451A03) + +// Status & Indicators +val EmeraldMint = Color(0xFF10B981) +val EmeraldGlow = Color(0xFF34D399) +val CoralRed = Color(0xFFEF4444) +val CyanAccent = Color(0xFF06B6D4) + +// Typography +val TextPrimary = Color(0xFFF8FAFC) +val TextSecondary = Color(0xFF94A3B8) +val TextMuted = Color(0xFF64748B) diff --git a/apps/mobile/app/src/main/java/com/example/avtex/theme/Theme.kt b/apps/mobile/app/src/main/java/com/example/avtex/theme/Theme.kt new file mode 100644 index 0000000..64d8c3f --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/theme/Theme.kt @@ -0,0 +1,38 @@ +package com.example.avtex.theme + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color + +private val AvtexDarkColorScheme = darkColorScheme( + primary = NeonViolet, + onPrimary = Color.White, + primaryContainer = DeepIndigo, + onPrimaryContainer = LavenderGlow, + secondary = SolarAmber, + onSecondary = Color.Black, + secondaryContainer = DeepSolar, + onSecondaryContainer = MorningGold, + tertiary = CyanAccent, + background = ObsidianBg, + onBackground = TextPrimary, + surface = ObsidianSurface, + onSurface = TextPrimary, + surfaceVariant = ObsidianSurfaceElevated, + onSurfaceVariant = TextSecondary, + surfaceContainerHighest = ObsidianSurfaceHigh, + outline = TextMuted, + outlineVariant = GlassBorder +) + +@Composable +fun AvtexTheme( + content: @Composable () -> Unit +) { + MaterialTheme( + colorScheme = AvtexDarkColorScheme, + typography = Typography, + content = content + ) +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/theme/Type.kt b/apps/mobile/app/src/main/java/com/example/avtex/theme/Type.kt new file mode 100644 index 0000000..86ae5bb --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/theme/Type.kt @@ -0,0 +1,36 @@ +package com.example.avtex.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = + Typography( + bodyLarge = + TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp, + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ + ) diff --git a/apps/mobile/app/src/main/java/com/example/avtex/ui/DashboardScreen.kt b/apps/mobile/app/src/main/java/com/example/avtex/ui/DashboardScreen.kt new file mode 100644 index 0000000..099ec5c --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/ui/DashboardScreen.kt @@ -0,0 +1,728 @@ +package com.example.avtex.ui + +import android.Manifest +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.animateFloat +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.rememberInfiniteTransition +import androidx.compose.animation.core.tween +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Send +import androidx.compose.material.icons.filled.Bedtime +import androidx.compose.material.icons.filled.Bolt +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material.icons.filled.Hub +import androidx.compose.material.icons.filled.PlayArrow +import androidx.compose.material.icons.filled.Psychology +import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.Sensors +import androidx.compose.material.icons.filled.Stop +import androidx.compose.material.icons.filled.WbSunny +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.scale +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.core.content.ContextCompat +import com.example.avtex.AvtexApplication +import com.example.avtex.R +import com.example.avtex.data.AppSettings +import com.example.avtex.data.LogEntry +import com.example.avtex.engine.SleepTrackingService +import com.example.avtex.theme.CyanAccent +import com.example.avtex.theme.DeepIndigo +import com.example.avtex.theme.DeepSolar +import com.example.avtex.theme.ElectricIndigo +import com.example.avtex.theme.EmeraldGlow +import com.example.avtex.theme.EmeraldMint +import com.example.avtex.theme.GlassBorder +import com.example.avtex.theme.LavenderGlow +import com.example.avtex.theme.MorningGold +import com.example.avtex.theme.NeonPurple +import com.example.avtex.theme.NeonViolet +import com.example.avtex.theme.ObsidianBg +import com.example.avtex.theme.ObsidianSurface +import com.example.avtex.theme.ObsidianSurfaceElevated +import com.example.avtex.theme.ObsidianSurfaceHigh +import com.example.avtex.theme.SolarAmber +import com.example.avtex.theme.SunsetOrange +import com.example.avtex.theme.TextMuted +import com.example.avtex.theme.TextPrimary +import com.example.avtex.theme.TextSecondary +import java.util.concurrent.TimeUnit + +@Composable +fun DashboardScreen(modifier: Modifier = Modifier) { + val context = LocalContext.current + val repository = remember { AvtexApplication.instance.settingsRepository } + val settings by repository.settingsFlow.collectAsState(initial = AppSettings()) + val logs by repository.logsFlow.collectAsState(initial = emptyList()) + + val isAsleep = settings.currentState == "ASLEEP" + + // Permission launcher for Notifications and Activity Recognition + val permissionsLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestMultiplePermissions() + ) { permissions -> + val notifGranted = permissions[Manifest.permission.POST_NOTIFICATIONS] ?: true + val actGranted = permissions[Manifest.permission.ACTIVITY_RECOGNITION] ?: true + if (notifGranted && actGranted) { + startTrackingService(context) + } + } + + fun onToggleTracking(enable: Boolean) { + if (enable) { + val neededPermissions = mutableListOf() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + neededPermissions.add(Manifest.permission.POST_NOTIFICATIONS) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && + ContextCompat.checkSelfPermission(context, Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED) { + neededPermissions.add(Manifest.permission.ACTIVITY_RECOGNITION) + } + + if (neededPermissions.isNotEmpty()) { + permissionsLauncher.launch(neededPermissions.toTypedArray()) + } else { + startTrackingService(context) + } + } else { + stopTrackingService(context) + } + } + + LazyColumn( + modifier = modifier + .fillMaxSize() + .background(ObsidianBg), + contentPadding = PaddingValues(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + // 1. Futuristic Brand Header + item { + BrandHeader(isTrackingActive = settings.isTrackingActive) + } + + // 2. Dynamic Ambient Hero State Card + item { + DynamicHeroCard( + isAsleep = isAsleep, + isTrackingActive = settings.isTrackingActive, + lastStateChangeMillis = settings.lastStateChangeMillis + ) + } + + // 3. Engine Metrics Grid + item { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + MetricGlassCard( + modifier = Modifier.weight(1f), + icon = Icons.Default.Sensors, + title = "Датчик движения", + value = if (isAsleep) "Взведен ⚡" else "Активен", + subtitle = "Significant Motion", + accentColor = if (isAsleep) NeonViolet else SolarAmber + ) + MetricGlassCard( + modifier = Modifier.weight(1f), + icon = Icons.Default.Psychology, + title = "Google Sleep API", + value = "${settings.confidenceThreshold}%", + subtitle = "Порог нейросети", + accentColor = CyanAccent + ) + MetricGlassCard( + modifier = Modifier.weight(1f), + icon = Icons.Default.Hub, + title = "Home Assistant", + value = settings.hacMode.name, + subtitle = "HAC протокол", + accentColor = EmeraldMint + ) + } + } + + // 4. Master Monitoring Glass Card + item { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(20.dp)) + .background(ObsidianSurfaceElevated) + .border(1.dp, GlassBorder, RoundedCornerShape(20.dp)) + .padding(18.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column(modifier = Modifier.weight(1f)) { + Row(verticalAlignment = Alignment.CenterVertically) { + Box( + modifier = Modifier + .size(8.dp) + .clip(CircleShape) + .background(if (settings.isTrackingActive) EmeraldGlow else TextMuted) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = "Фоновый мониторинг сна", + fontWeight = FontWeight.Bold, + fontSize = 16.sp, + color = TextPrimary + ) + } + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = if (settings.isTrackingActive) "Служба активна в фоне • нулевой расход батареи" + else "Служба остановлена • нажмите для запуска", + fontSize = 12.sp, + color = if (settings.isTrackingActive) EmeraldMint else TextMuted + ) + } + Switch( + checked = settings.isTrackingActive, + onCheckedChange = { onToggleTracking(it) }, + colors = SwitchDefaults.colors( + checkedThumbColor = Color.White, + checkedTrackColor = NeonViolet, + uncheckedThumbColor = TextMuted, + uncheckedTrackColor = ObsidianSurfaceHigh + ) + ) + } + } + } + + // 5. Quick Action Control Buttons + item { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + FilledTonalButton( + onClick = { + val intent = Intent(context, SleepTrackingService::class.java).apply { + action = SleepTrackingService.ACTION_MANUAL_TOGGLE + } + context.startService(intent) + }, + modifier = Modifier + .weight(1f) + .height(48.dp), + shape = RoundedCornerShape(14.dp), + colors = ButtonDefaults.filledTonalButtonColors( + containerColor = ObsidianSurfaceElevated, + contentColor = TextPrimary + ) + ) { + Icon( + imageVector = Icons.Default.Refresh, + contentDescription = null, + modifier = Modifier.size(18.dp), + tint = if (isAsleep) SolarAmber else NeonViolet + ) + Spacer(modifier = Modifier.width(8.dp)) + Text(text = "Переключить", fontSize = 13.sp, fontWeight = FontWeight.Medium) + } + + Button( + onClick = { + val intent = Intent(context, SleepTrackingService::class.java).apply { + action = SleepTrackingService.ACTION_TEST_HAC + } + context.startService(intent) + }, + modifier = Modifier + .weight(1f) + .height(48.dp), + shape = RoundedCornerShape(14.dp), + colors = ButtonDefaults.buttonColors( + containerColor = NeonViolet, + contentColor = Color.White + ) + ) { + Icon( + imageVector = Icons.AutoMirrored.Filled.Send, + contentDescription = null, + modifier = Modifier.size(18.dp) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text(text = "Тест в HAC", fontSize = 13.sp, fontWeight = FontWeight.SemiBold) + } + } + } + + // 6. HAC Live Connection Banner + item { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) + .background(ObsidianSurface) + .border(1.dp, GlassBorder, RoundedCornerShape(16.dp)) + .padding(14.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Box( + modifier = Modifier + .clip(CircleShape) + .background(EmeraldMint.copy(alpha = 0.15f)) + .padding(8.dp) + ) { + Icon( + imageVector = Icons.Default.Bolt, + contentDescription = null, + tint = EmeraldMint, + modifier = Modifier.size(18.dp) + ) + } + Spacer(modifier = Modifier.width(12.dp)) + Column(modifier = Modifier.weight(1f)) { + Text( + text = "Home Assistant Status", + fontSize = 12.sp, + fontWeight = FontWeight.Bold, + color = TextSecondary + ) + Text( + text = settings.lastHacStatus, + fontSize = 13.sp, + fontWeight = FontWeight.Medium, + color = TextPrimary + ) + } + } + } + } + + // 7. Audit Log Header + item { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 4.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "ТЕЛЕМЕТРИЯ И СОБЫТИЯ", + fontSize = 12.sp, + fontWeight = FontWeight.Bold, + letterSpacing = 1.2.sp, + color = TextMuted + ) + Text( + text = "${logs.size} событий", + fontSize = 11.sp, + color = TextMuted + ) + } + } + + if (logs.isEmpty()) { + item { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(14.dp)) + .background(ObsidianSurface) + .padding(24.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = "Событий пока нет. Включите мониторинг для сбора данных.", + fontSize = 13.sp, + color = TextMuted + ) + } + } + } else { + items(logs) { log -> + FuturisticLogRow(log) + } + } + } +} + +@Composable +private fun BrandHeader(isTrackingActive: Boolean) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Image( + painter = painterResource(id = R.drawable.app_logo), + contentDescription = "Avtex Logo", + modifier = Modifier + .size(42.dp) + .clip(RoundedCornerShape(12.dp)) + .border(1.dp, GlassBorder, RoundedCornerShape(12.dp)) + ) + Spacer(modifier = Modifier.width(12.dp)) + Column { + Text( + text = "AVTEX", + fontSize = 20.sp, + fontWeight = FontWeight.Black, + letterSpacing = 2.sp, + color = TextPrimary + ) + Text( + text = "SMART SLEEP ENGINE", + fontSize = 9.sp, + fontWeight = FontWeight.Bold, + letterSpacing = 1.5.sp, + color = NeonViolet + ) + } + } + + Box( + modifier = Modifier + .clip(RoundedCornerShape(20.dp)) + .background(if (isTrackingActive) EmeraldMint.copy(alpha = 0.15f) else ObsidianSurfaceElevated) + .border( + 1.dp, + if (isTrackingActive) EmeraldMint.copy(alpha = 0.3f) else GlassBorder, + RoundedCornerShape(20.dp) + ) + .padding(horizontal = 12.dp, vertical = 6.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Box( + modifier = Modifier + .size(6.dp) + .clip(CircleShape) + .background(if (isTrackingActive) EmeraldGlow else TextMuted) + ) + Spacer(modifier = Modifier.width(6.dp)) + Text( + text = if (isTrackingActive) "ONLINE" else "STANDBY", + fontSize = 10.sp, + fontWeight = FontWeight.Bold, + letterSpacing = 1.sp, + color = if (isTrackingActive) EmeraldMint else TextMuted + ) + } + } + } +} + +@Composable +private fun DynamicHeroCard( + isAsleep: Boolean, + isTrackingActive: Boolean, + lastStateChangeMillis: Long +) { + val durationText = remember(lastStateChangeMillis) { + val diff = System.currentTimeMillis() - lastStateChangeMillis + val hours = TimeUnit.MILLISECONDS.toHours(diff) + val minutes = TimeUnit.MILLISECONDS.toMinutes(diff) % 60 + if (hours > 0) "$hours ч $minutes мин" else "$minutes мин" + } + + // Breathing glow animation + val infiniteTransition = rememberInfiniteTransition(label = "pulse") + val glowScale by infiniteTransition.animateFloat( + initialValue = 0.99f, + targetValue = 1.01f, + animationSpec = infiniteRepeatable( + animation = tween(2500), + repeatMode = RepeatMode.Reverse + ), + label = "glowScale" + ) + + val gradientColors = if (isAsleep) { + listOf( + Color(0xFF0F0B24), + Color(0xFF1E1446), + Color(0xFF2A1560), + Color(0xFF4C1D95) + ) + } else { + listOf( + Color(0xFF2E1005), + Color(0xFF4A1A05), + Color(0xFF7C2D12), + Color(0xFFB45309) + ) + } + + val accentBorderColor = if (isAsleep) NeonViolet.copy(alpha = 0.4f) else SolarAmber.copy(alpha = 0.4f) + + Card( + modifier = Modifier + .fillMaxWidth() + .height(210.dp) + .scale(glowScale) + .border(1.dp, accentBorderColor, RoundedCornerShape(26.dp)), + shape = RoundedCornerShape(26.dp), + elevation = CardDefaults.cardElevation(defaultElevation = 8.dp) + ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Brush.linearGradient(gradientColors)) + .padding(22.dp) + ) { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.SpaceBetween + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .clip(CircleShape) + .background(Color.White.copy(alpha = 0.12f)) + .border(1.dp, Color.White.copy(alpha = 0.2f), CircleShape) + .padding(14.dp) + ) { + Icon( + imageVector = if (isAsleep) Icons.Default.Bedtime else Icons.Default.WbSunny, + contentDescription = null, + tint = if (isAsleep) LavenderGlow else MorningGold, + modifier = Modifier.size(34.dp) + ) + } + + Box( + modifier = Modifier + .clip(RoundedCornerShape(12.dp)) + .background( + if (isTrackingActive) EmeraldMint.copy(alpha = 0.25f) + else Color.White.copy(alpha = 0.1f) + ) + .border( + 1.dp, + if (isTrackingActive) EmeraldMint.copy(alpha = 0.5f) + else Color.White.copy(alpha = 0.15f), + RoundedCornerShape(12.dp) + ) + .padding(horizontal = 12.dp, vertical = 6.dp) + ) { + Text( + text = if (isTrackingActive) "МОНИТОРИНГ АКТИВЕН" else "ПАУЗА", + color = Color.White, + fontSize = 11.sp, + fontWeight = FontWeight.Bold, + letterSpacing = 0.8.sp + ) + } + } + + Column { + Text( + text = if (isAsleep) "Спит" else "Бодрствует", + color = Color.White, + fontSize = 36.sp, + fontWeight = FontWeight.Black, + letterSpacing = (-0.5).sp + ) + Spacer(modifier = Modifier.height(2.dp)) + Text( + text = if (isAsleep) "Датчик движения взведен • $durationText в покое" + else "Активность зафиксирована • $durationText с пробуждения", + color = Color.White.copy(alpha = 0.85f), + fontSize = 13.sp, + fontWeight = FontWeight.Medium + ) + } + } + } + } +} + +@Composable +private fun MetricGlassCard( + modifier: Modifier = Modifier, + icon: ImageVector, + title: String, + value: String, + subtitle: String, + accentColor: Color +) { + Box( + modifier = modifier + .clip(RoundedCornerShape(16.dp)) + .background(ObsidianSurfaceElevated) + .border(1.dp, GlassBorder, RoundedCornerShape(16.dp)) + .padding(12.dp) + ) { + Column(verticalArrangement = Arrangement.SpaceBetween) { + Box( + modifier = Modifier + .clip(RoundedCornerShape(8.dp)) + .background(accentColor.copy(alpha = 0.15f)) + .padding(6.dp) + ) { + Icon( + imageVector = icon, + contentDescription = null, + tint = accentColor, + modifier = Modifier.size(16.dp) + ) + } + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = value, + fontSize = 13.sp, + fontWeight = FontWeight.Bold, + color = TextPrimary + ) + Text( + text = title, + fontSize = 10.sp, + fontWeight = FontWeight.Medium, + color = TextMuted, + lineHeight = 12.sp + ) + } + } +} + +@Composable +private fun FuturisticLogRow(log: LogEntry) { + val tagColor = when (log.tag) { + "Engine" -> NeonViolet + "SleepAPI" -> CyanAccent + "SleepSegment" -> ElectricIndigo + "SignificantMotion" -> SolarAmber + "HAC", "HAC_TEST" -> EmeraldMint + else -> TextSecondary + } + + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(12.dp)) + .background(if (log.isImportant) ObsidianSurfaceHigh else ObsidianSurface) + .border( + 1.dp, + if (log.isImportant) tagColor.copy(alpha = 0.4f) else GlassBorder, + RoundedCornerShape(12.dp) + ) + .padding(horizontal = 14.dp, vertical = 10.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = log.formattedTime, + fontSize = 11.sp, + color = TextMuted, + fontFamily = FontFamily.Monospace, + fontWeight = FontWeight.SemiBold + ) + Spacer(modifier = Modifier.width(10.dp)) + Box( + modifier = Modifier + .clip(RoundedCornerShape(6.dp)) + .background(tagColor.copy(alpha = 0.15f)) + .border(1.dp, tagColor.copy(alpha = 0.3f), RoundedCornerShape(6.dp)) + .padding(horizontal = 6.dp, vertical = 2.dp) + ) { + Text( + text = log.tag, + fontSize = 10.sp, + color = tagColor, + fontWeight = FontWeight.Bold, + fontFamily = FontFamily.Monospace + ) + } + Spacer(modifier = Modifier.width(10.dp)) + Text( + text = log.message, + fontSize = 12.sp, + color = if (log.isImportant) TextPrimary else TextSecondary, + fontWeight = if (log.isImportant) FontWeight.Medium else FontWeight.Normal, + modifier = Modifier.weight(1f) + ) + } + } +} + +private fun startTrackingService(context: Context) { + val intent = Intent(context, SleepTrackingService::class.java).apply { + action = SleepTrackingService.ACTION_START_TRACKING + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(intent) + } else { + context.startService(intent) + } +} + +private fun stopTrackingService(context: Context) { + val intent = Intent(context, SleepTrackingService::class.java).apply { + action = SleepTrackingService.ACTION_STOP_TRACKING + } + context.startService(intent) +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/ui/ListsScreen.kt b/apps/mobile/app/src/main/java/com/example/avtex/ui/ListsScreen.kt new file mode 100644 index 0000000..891bc2e --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/ui/ListsScreen.kt @@ -0,0 +1,407 @@ +package com.example.avtex.ui + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Movie +import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.ShoppingCart +import androidx.compose.material.icons.filled.TaskAlt +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CheckboxDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.avtex.AvtexApplication +import com.example.avtex.notes.NoteItem +import com.example.avtex.notes.NoteList +import com.example.avtex.theme.CyanAccent +import com.example.avtex.theme.ElectricIndigo +import com.example.avtex.theme.EmeraldMint +import com.example.avtex.theme.GlassBorder +import com.example.avtex.theme.NeonViolet +import com.example.avtex.theme.ObsidianBg +import com.example.avtex.theme.ObsidianSurface +import com.example.avtex.theme.ObsidianSurfaceElevated +import com.example.avtex.theme.ObsidianSurfaceHigh +import com.example.avtex.theme.SolarAmber +import com.example.avtex.theme.TextMuted +import com.example.avtex.theme.TextPrimary +import com.example.avtex.theme.TextSecondary +import kotlinx.coroutines.launch + +@Composable +fun ListsScreen(modifier: Modifier = Modifier) { + val repository = remember { AvtexApplication.instance.notesRepository } + val lists by repository.listsFlow.collectAsState() + val coroutineScope = rememberCoroutineScope() + + var selectedCategory by remember { mutableStateOf("all") } + var newItemText by remember { mutableStateOf("") } + var isAddingActive by remember { mutableStateOf(false) } + + val categories = listOf( + "all" to "Все", + "movies" to "🎬 Фильмы", + "shopping" to "🛒 Покупки", + "tasks" to "⚡ Дела" + ) + + val filteredLists = remember(lists, selectedCategory) { + if (selectedCategory == "all") lists else lists.filter { it.category == selectedCategory } + } + + LazyColumn( + modifier = modifier + .fillMaxSize() + .background(ObsidianBg) + .padding(horizontal = 16.dp), + contentPadding = PaddingValues(top = 16.dp, bottom = 32.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + // Header + item { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Column { + Text( + text = "XFlow Заметки & Списки", + fontSize = 22.sp, + fontWeight = FontWeight.Bold, + color = TextPrimary + ) + Text( + text = "Мульти-записная книжка • Голос Gemini • Синхронизация", + fontSize = 12.sp, + color = TextMuted + ) + } + IconButton( + onClick = { repository.reload() }, + modifier = Modifier + .size(38.dp) + .clip(CircleShape) + .background(ObsidianSurfaceElevated) + .border(1.dp, GlassBorder, CircleShape) + ) { + Icon( + imageVector = Icons.Default.Refresh, + contentDescription = "Обновить", + tint = CyanAccent, + modifier = Modifier.size(18.dp) + ) + } + } + } + + // Category Filter Chips + item { + LazyRow( + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = Modifier.fillMaxWidth() + ) { + items(categories) { (key, label) -> + val isSelected = selectedCategory == key + Box( + modifier = Modifier + .clip(RoundedCornerShape(12.dp)) + .background(if (isSelected) NeonViolet.copy(alpha = 0.25f) else ObsidianSurfaceElevated) + .border( + 1.dp, + if (isSelected) NeonViolet else GlassBorder, + RoundedCornerShape(12.dp) + ) + .clickable { selectedCategory = key } + .padding(horizontal = 14.dp, vertical = 8.dp) + ) { + Text( + text = label, + fontSize = 12.sp, + fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Normal, + color = if (isSelected) TextPrimary else TextSecondary + ) + } + } + } + } + + // Quick Add Item Bar + item { + Column( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) + .background(ObsidianSurface) + .border(1.dp, GlassBorder, RoundedCornerShape(16.dp)) + .padding(12.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + OutlinedTextField( + value = newItemText, + onValueChange = { newItemText = it }, + placeholder = { + Text( + if (selectedCategory == "movies") "Название фильма на просмотр..." else "Новая запись...", + fontSize = 13.sp, + color = TextMuted + ) + }, + colors = OutlinedTextFieldDefaults.colors( + focusedBorderColor = NeonViolet, + unfocusedBorderColor = GlassBorder, + focusedTextColor = TextPrimary, + unfocusedTextColor = TextPrimary, + cursorColor = NeonViolet + ), + singleLine = true, + modifier = Modifier.weight(1f), + shape = RoundedCornerShape(12.dp) + ) + + Button( + onClick = { + if (newItemText.isNotBlank()) { + coroutineScope.launch { + val targetCategory = if (selectedCategory == "all") "movies" else selectedCategory + val listTitle = when (targetCategory) { + "movies" -> "Фильмы на просмотр" + "shopping" -> "Покупки" + else -> "Общий список" + } + repository.addNoteItem( + title = newItemText.trim(), + listTitle = listTitle, + category = targetCategory + ) + newItemText = "" + } + } + }, + colors = ButtonDefaults.buttonColors(containerColor = NeonViolet), + shape = RoundedCornerShape(12.dp), + modifier = Modifier.height(52.dp) + ) { + Icon(Icons.Default.Add, contentDescription = "Добавить", tint = Color.White) + } + } + } + } + + // Lists and Items + if (filteredLists.isEmpty()) { + item { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 40.dp), + contentAlignment = Alignment.Center + ) { + Text( + "Нет записей. Добавьте первую заметку или скажите Gemini!", + fontSize = 13.sp, + color = TextMuted + ) + } + } + } else { + items(filteredLists, key = { it.id }) { list -> + ListCard( + list = list, + onToggleItem = { item -> + coroutineScope.launch { repository.toggleItem(item) } + }, + onDeleteItem = { item -> + coroutineScope.launch { repository.deleteItem(item.id) } + } + ) + } + } + } +} + +@Composable +private fun ListCard( + list: NoteList, + onToggleItem: (NoteItem) -> Unit, + onDeleteItem: (NoteItem) -> Unit +) { + val accentColor = when (list.category) { + "movies" -> CyanAccent + "shopping" -> EmeraldMint + "tasks" -> SolarAmber + else -> NeonViolet + } + + Column( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) + .background(ObsidianSurface) + .border(1.dp, GlassBorder, RoundedCornerShape(16.dp)) + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + // List Title Header + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Box( + modifier = Modifier + .size(8.dp) + .clip(CircleShape) + .background(accentColor) + ) + Text( + text = list.title, + fontSize = 15.sp, + fontWeight = FontWeight.SemiBold, + color = TextPrimary + ) + } + Text( + text = "${list.items.count { !it.isCompleted }} активных", + fontSize = 11.sp, + color = TextMuted + ) + } + + // Items list + if (list.items.isEmpty()) { + Text( + text = "Список пуст", + fontSize = 12.sp, + color = TextMuted, + modifier = Modifier.padding(start = 16.dp) + ) + } else { + list.items.forEach { item -> + ItemRow( + item = item, + accentColor = accentColor, + onToggle = { onToggleItem(item) }, + onDelete = { onDeleteItem(item) } + ) + } + } + } +} + +@Composable +private fun ItemRow( + item: NoteItem, + accentColor: Color, + onToggle: () -> Unit, + onDelete: () -> Unit +) { + Row( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(10.dp)) + .background(ObsidianSurfaceElevated) + .border(1.dp, GlassBorder.copy(alpha = 0.5f), RoundedCornerShape(10.dp)) + .clickable { onToggle() } + .padding(horizontal = 10.dp, vertical = 6.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox( + checked = item.isCompleted, + onCheckedChange = { onToggle() }, + colors = CheckboxDefaults.colors( + checkedColor = accentColor, + uncheckedColor = TextMuted, + checkmarkColor = ObsidianBg + ), + modifier = Modifier.size(24.dp) + ) + + Spacer(modifier = Modifier.width(8.dp)) + + Column(modifier = Modifier.weight(1f)) { + Text( + text = item.title, + fontSize = 14.sp, + color = if (item.isCompleted) TextMuted else TextPrimary, + textDecoration = if (item.isCompleted) TextDecoration.LineThrough else TextDecoration.None + ) + if (item.status == "want_to_watch") { + Text( + text = "🎬 Буду смотреть", + fontSize = 10.sp, + color = CyanAccent + ) + } else if (item.status == "watched") { + Text( + text = "✔ Просмотрено", + fontSize = 10.sp, + color = EmeraldMint + ) + } + } + + IconButton( + onClick = onDelete, + modifier = Modifier.size(28.dp) + ) { + Icon( + imageVector = Icons.Default.Delete, + contentDescription = "Удалить", + tint = TextMuted, + modifier = Modifier.size(15.dp) + ) + } + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/ui/OnePlusGuideScreen.kt b/apps/mobile/app/src/main/java/com/example/avtex/ui/OnePlusGuideScreen.kt new file mode 100644 index 0000000..d0f9db5 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/ui/OnePlusGuideScreen.kt @@ -0,0 +1,329 @@ +package com.example.avtex.ui + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.PowerManager +import android.provider.Settings +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.BatteryAlert +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material.icons.filled.PowerSettingsNew +import androidx.compose.material.icons.filled.Shield +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.avtex.theme.CyanAccent +import com.example.avtex.theme.EmeraldGlow +import com.example.avtex.theme.EmeraldMint +import com.example.avtex.theme.GlassBorder +import com.example.avtex.theme.NeonViolet +import com.example.avtex.theme.ObsidianBg +import com.example.avtex.theme.ObsidianSurface +import com.example.avtex.theme.ObsidianSurfaceElevated +import com.example.avtex.theme.SolarAmber +import com.example.avtex.theme.TextMuted +import com.example.avtex.theme.TextPrimary +import com.example.avtex.theme.TextSecondary + +@Composable +fun OnePlusGuideScreen(modifier: Modifier = Modifier) { + val context = LocalContext.current + val powerManager = remember { context.getSystemService(Context.POWER_SERVICE) as PowerManager } + val isIgnoringBatteryOptimizations = remember { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + powerManager.isIgnoringBatteryOptimizations(context.packageName) + } else true + } + + LazyColumn( + modifier = modifier + .fillMaxSize() + .background(ObsidianBg), + contentPadding = PaddingValues(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + item { + Column(modifier = Modifier.padding(vertical = 4.dp)) { + Text( + text = "Оптимизация для OnePlus", + fontSize = 24.sp, + fontWeight = FontWeight.Bold, + color = TextPrimary + ) + Text( + text = "Настройка OxygenOS / ColorOS для работы в фоновом режиме", + fontSize = 13.sp, + color = TextMuted + ) + } + } + + // 1. Battery Optimization Step + item { + OnePlusStepCard( + step = "01", + icon = Icons.Default.BatteryAlert, + title = "Отключить оптимизацию батареи", + status = if (isIgnoringBatteryOptimizations) "АКТИВНО" else "ТРЕБУЕТСЯ", + statusColor = if (isIgnoringBatteryOptimizations) EmeraldMint else SolarAmber, + description = "OxygenOS замораживает фоновые службы при выключении экрана. Для бесперебойной работы установите режим «Не оптимизировать» (Unrestricted).", + actionLabel = "Открыть настройки батареи", + onAction = { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + try { + val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { + data = Uri.parse("package:${context.packageName}") + } + context.startActivity(intent) + } catch (_: Exception) { + val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS) + context.startActivity(intent) + } + } + } + ) + } + + // 2. Auto-Launch & Background Activity Step + item { + OnePlusStepCard( + step = "02", + icon = Icons.Default.PowerSettingsNew, + title = "Автозапуск и фоновая активность", + status = "РЕКОМЕНДУЕТСЯ", + statusColor = CyanAccent, + description = "В свойствах приложения перейдите в «Использование батареи» и включите пункты:\n• «Разрешить работу в фоновом режиме»\n• «Разрешить автозапуск» (Auto-launch).", + actionLabel = "Свойства приложения в системе", + onAction = { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.parse("package:${context.packageName}") + } + context.startActivity(intent) + } + ) + } + + // 3. Lock in Recents Step + item { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(22.dp)) + .background(ObsidianSurfaceElevated) + .border(1.dp, GlassBorder, RoundedCornerShape(22.dp)) + .padding(18.dp) + ) { + Column { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Box( + modifier = Modifier + .clip(RoundedCornerShape(10.dp)) + .background(NeonViolet.copy(alpha = 0.15f)) + .padding(8.dp) + ) { + Icon( + imageVector = Icons.Default.Lock, + contentDescription = null, + tint = NeonViolet, + modifier = Modifier.size(20.dp) + ) + } + Spacer(modifier = Modifier.width(10.dp)) + Text( + text = "Закрепить в недавних", + fontWeight = FontWeight.Bold, + fontSize = 16.sp, + color = TextPrimary + ) + } + Text( + text = "ШАГ 03", + fontSize = 11.sp, + fontWeight = FontWeight.Bold, + fontFamily = FontFamily.Monospace, + color = NeonViolet + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = "Откройте экран недавних приложений (свайп снизу вверх с удержанием), нажмите три точки над карточкой Avtex и выберите «Закрепить» (иконка замочка 🔒). Это предотвратит выгрузку приложения при очистке памяти.", + fontSize = 13.sp, + color = TextSecondary, + lineHeight = 18.sp + ) + } + } + } + + // 4. Hardware Sensor Hub Assurance + item { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(20.dp)) + .background(ObsidianSurface) + .border(1.dp, GlassBorder, RoundedCornerShape(20.dp)) + .padding(16.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Box( + modifier = Modifier + .clip(CircleShape) + .background(EmeraldMint.copy(alpha = 0.15f)) + .padding(10.dp) + ) { + Icon( + imageVector = Icons.Default.Shield, + contentDescription = null, + tint = EmeraldMint, + modifier = Modifier.size(22.dp) + ) + } + Spacer(modifier = Modifier.width(14.dp)) + Column { + Text( + text = "Аппаратная энергоэффективность", + fontWeight = FontWeight.Bold, + fontSize = 14.sp, + color = TextPrimary + ) + Spacer(modifier = Modifier.height(2.dp)) + Text( + text = "Датчик Significant Motion работает на отдельном микроконтроллере (Sensor Hub). Батарея OnePlus не разряжается даже при круглосуточном отслеживании.", + fontSize = 12.sp, + color = TextMuted, + lineHeight = 16.sp + ) + } + } + } + } + } +} + +@Composable +private fun OnePlusStepCard( + step: String, + icon: ImageVector, + title: String, + status: String, + statusColor: Color, + description: String, + actionLabel: String, + onAction: () -> Unit +) { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(22.dp)) + .background(ObsidianSurfaceElevated) + .border(1.dp, GlassBorder, RoundedCornerShape(22.dp)) + .padding(18.dp) + ) { + Column { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Row(modifier = Modifier.weight(1f), verticalAlignment = Alignment.CenterVertically) { + Box( + modifier = Modifier + .clip(RoundedCornerShape(10.dp)) + .background(statusColor.copy(alpha = 0.15f)) + .padding(8.dp) + ) { + Icon( + imageVector = icon, + contentDescription = null, + tint = statusColor, + modifier = Modifier.size(20.dp) + ) + } + Spacer(modifier = Modifier.width(10.dp)) + Text( + text = title, + fontWeight = FontWeight.Bold, + fontSize = 15.sp, + color = TextPrimary + ) + } + Box( + modifier = Modifier + .clip(RoundedCornerShape(8.dp)) + .background(statusColor.copy(alpha = 0.15f)) + .border(1.dp, statusColor.copy(alpha = 0.3f), RoundedCornerShape(8.dp)) + .padding(horizontal = 8.dp, vertical = 3.dp) + ) { + Text( + text = status, + fontSize = 10.sp, + fontWeight = FontWeight.Bold, + fontFamily = FontFamily.Monospace, + color = statusColor + ) + } + } + + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = description, + fontSize = 13.sp, + color = TextSecondary, + lineHeight = 18.sp + ) + Spacer(modifier = Modifier.height(14.dp)) + OutlinedButton( + onClick = onAction, + shape = RoundedCornerShape(12.dp), + modifier = Modifier.fillMaxWidth(), + border = androidx.compose.foundation.BorderStroke(1.dp, GlassBorder), + colors = ButtonDefaults.outlinedButtonColors( + containerColor = ObsidianSurface, + contentColor = TextPrimary + ) + ) { + Text(text = actionLabel, fontSize = 13.sp, fontWeight = FontWeight.Medium) + } + } + } +} diff --git a/apps/mobile/app/src/main/java/com/example/avtex/ui/SettingsScreen.kt b/apps/mobile/app/src/main/java/com/example/avtex/ui/SettingsScreen.kt new file mode 100644 index 0000000..e80a709 --- /dev/null +++ b/apps/mobile/app/src/main/java/com/example/avtex/ui/SettingsScreen.kt @@ -0,0 +1,469 @@ +package com.example.avtex.ui + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Dns +import androidx.compose.material.icons.filled.Link +import androidx.compose.material.icons.filled.NotificationsActive +import androidx.compose.material.icons.filled.Save +import androidx.compose.material.icons.filled.Tune +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.Slider +import androidx.compose.material3.SliderDefaults +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.avtex.AvtexApplication +import com.example.avtex.data.AppSettings +import com.example.avtex.data.HacMode +import com.example.avtex.theme.CyanAccent +import com.example.avtex.theme.EmeraldMint +import com.example.avtex.theme.GlassBorder +import com.example.avtex.theme.NeonViolet +import com.example.avtex.theme.ObsidianBg +import com.example.avtex.theme.ObsidianSurface +import com.example.avtex.theme.ObsidianSurfaceElevated +import com.example.avtex.theme.ObsidianSurfaceHigh +import com.example.avtex.theme.TextMuted +import com.example.avtex.theme.TextPrimary +import com.example.avtex.theme.TextSecondary +import kotlinx.coroutines.launch +import kotlin.math.roundToInt + +@Composable +fun SettingsScreen(modifier: Modifier = Modifier) { + val repository = remember { AvtexApplication.instance.settingsRepository } + val settings by repository.settingsFlow.collectAsState(initial = AppSettings()) + val coroutineScope = rememberCoroutineScope() + + var selectedMode by remember(settings.hacMode) { mutableStateOf(settings.hacMode) } + var webhookUrl by remember(settings.hacWebhookUrl) { mutableStateOf(settings.hacWebhookUrl) } + var restUrl by remember(settings.hacRestUrl) { mutableStateOf(settings.hacRestUrl) } + var token by remember(settings.hacToken) { mutableStateOf(settings.hacToken) } + var inactivityMinutes by remember(settings.inactivityMinutes) { mutableFloatStateOf(settings.inactivityMinutes.toFloat()) } + var confidenceThreshold by remember(settings.confidenceThreshold) { mutableFloatStateOf(settings.confidenceThreshold.toFloat()) } + var broadcastIntents by remember(settings.broadcastIntents) { mutableStateOf(settings.broadcastIntents) } + + var isSaved by remember { mutableStateOf(false) } + + LazyColumn( + modifier = modifier + .fillMaxSize() + .background(ObsidianBg), + contentPadding = PaddingValues(16.dp), + verticalArrangement = Arrangement.spacedBy(18.dp) + ) { + // 1. Header + item { + Column(modifier = Modifier.padding(vertical = 4.dp)) { + Text( + text = "Конфигурация", + fontSize = 24.sp, + fontWeight = FontWeight.Bold, + color = TextPrimary + ) + Text( + text = "Интеграция с Home Assistant и калибровка сенсоров", + fontSize = 13.sp, + color = TextMuted + ) + } + } + + // 2. HAC Connection Glass Card + item { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(22.dp)) + .background(ObsidianSurfaceElevated) + .border(1.dp, GlassBorder, RoundedCornerShape(22.dp)) + .padding(18.dp) + ) { + Column { + Row(verticalAlignment = Alignment.CenterVertically) { + Box( + modifier = Modifier + .clip(RoundedCornerShape(10.dp)) + .background(NeonViolet.copy(alpha = 0.15f)) + .padding(8.dp) + ) { + Icon( + imageVector = Icons.Default.Dns, + contentDescription = null, + tint = NeonViolet, + modifier = Modifier.size(20.dp) + ) + } + Spacer(modifier = Modifier.width(10.dp)) + Column { + Text( + text = "Связь с Home Assistant (HAC)", + fontWeight = FontWeight.Bold, + fontSize = 16.sp, + color = TextPrimary + ) + Text( + text = "Отправка событий сна в умный дом", + fontSize = 11.sp, + color = TextMuted + ) + } + } + + Spacer(modifier = Modifier.height(16.dp)) + + // Mode Selector Tabs + Row( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(14.dp)) + .background(ObsidianSurface) + .border(1.dp, GlassBorder, RoundedCornerShape(14.dp)) + .padding(4.dp) + ) { + TabSelectorItem( + modifier = Modifier.weight(1f), + title = "Webhook URL", + isSelected = selectedMode == HacMode.WEBHOOK, + onClick = { selectedMode = HacMode.WEBHOOK } + ) + TabSelectorItem( + modifier = Modifier.weight(1f), + title = "REST State API", + isSelected = selectedMode == HacMode.REST, + onClick = { selectedMode = HacMode.REST } + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + + if (selectedMode == HacMode.WEBHOOK) { + OutlinedTextField( + value = webhookUrl, + onValueChange = { webhookUrl = it; isSaved = false }, + label = { Text("Webhook URL") }, + placeholder = { Text("http://192.168.1.50:8123/api/webhook/avtex_sleep") }, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(14.dp), + singleLine = true, + colors = customTextFieldColors() + ) + Spacer(modifier = Modifier.height(6.dp)) + Text( + text = "Работает как с локальным адресом, так и через Nabu Casa / VPN.", + fontSize = 11.sp, + color = TextMuted + ) + } else { + OutlinedTextField( + value = restUrl, + onValueChange = { restUrl = it; isSaved = false }, + label = { Text("REST State URL") }, + placeholder = { Text("http://192.168.1.50:8123/api/states/binary_sensor.phone_sleep") }, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(14.dp), + singleLine = true, + colors = customTextFieldColors() + ) + Spacer(modifier = Modifier.height(10.dp)) + OutlinedTextField( + value = token, + onValueChange = { token = it; isSaved = false }, + label = { Text("Long-Lived Access Token") }, + placeholder = { Text("Токен доступа Home Assistant") }, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(14.dp), + singleLine = true, + colors = customTextFieldColors() + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + + // Broadcast toggle + Row( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(14.dp)) + .background(ObsidianSurface) + .padding(12.dp), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Row(modifier = Modifier.weight(1f), verticalAlignment = Alignment.CenterVertically) { + Icon( + imageVector = Icons.Default.NotificationsActive, + contentDescription = null, + tint = CyanAccent, + modifier = Modifier.size(20.dp) + ) + Spacer(modifier = Modifier.width(10.dp)) + Column { + Text( + text = "Локальный Broadcast Intent", + fontWeight = FontWeight.SemiBold, + fontSize = 13.sp, + color = TextPrimary + ) + Text( + text = "Отправка интента для Tasker / Companion App", + fontSize = 11.sp, + color = TextMuted + ) + } + } + Switch( + checked = broadcastIntents, + onCheckedChange = { broadcastIntents = it; isSaved = false }, + colors = SwitchDefaults.colors( + checkedThumbColor = Color.White, + checkedTrackColor = CyanAccent + ) + ) + } + } + } + } + + // 3. Sensor Tuning Glass Card + item { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(22.dp)) + .background(ObsidianSurfaceElevated) + .border(1.dp, GlassBorder, RoundedCornerShape(22.dp)) + .padding(18.dp) + ) { + Column { + Row(verticalAlignment = Alignment.CenterVertically) { + Box( + modifier = Modifier + .clip(RoundedCornerShape(10.dp)) + .background(CyanAccent.copy(alpha = 0.15f)) + .padding(8.dp) + ) { + Icon( + imageVector = Icons.Default.Tune, + contentDescription = null, + tint = CyanAccent, + modifier = Modifier.size(20.dp) + ) + } + Spacer(modifier = Modifier.width(10.dp)) + Column { + Text( + text = "Параметры детектора сна", + fontWeight = FontWeight.Bold, + fontSize = 16.sp, + color = TextPrimary + ) + Text( + text = "Калибровка порогов перехода в сон", + fontSize = 11.sp, + color = TextMuted + ) + } + } + + Spacer(modifier = Modifier.height(16.dp)) + + // Inactivity Slider + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Таймаут покоя до сна", + fontSize = 13.sp, + fontWeight = FontWeight.Medium, + color = TextSecondary + ) + Text( + text = "${inactivityMinutes.roundToInt()} мин", + fontSize = 13.sp, + fontWeight = FontWeight.Bold, + color = NeonViolet + ) + } + Text( + text = "Если экран выключен и нет движения указанное время, фиксируется сон.", + fontSize = 11.sp, + color = TextMuted + ) + Slider( + value = inactivityMinutes, + onValueChange = { inactivityMinutes = it; isSaved = false }, + valueRange = 5f..60f, + steps = 10, + colors = SliderDefaults.colors( + thumbColor = NeonViolet, + activeTrackColor = NeonViolet, + inactiveTrackColor = ObsidianSurfaceHigh + ) + ) + + Spacer(modifier = Modifier.height(12.dp)) + + // Confidence Slider + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Порог уверенности Sleep API", + fontSize = 13.sp, + fontWeight = FontWeight.Medium, + color = TextSecondary + ) + Text( + text = "${confidenceThreshold.roundToInt()}%", + fontSize = 13.sp, + fontWeight = FontWeight.Bold, + color = CyanAccent + ) + } + Text( + text = "Минимальная оценка уверенности сна от алгоритма Google Play Services.", + fontSize = 11.sp, + color = TextMuted + ) + Slider( + value = confidenceThreshold, + onValueChange = { confidenceThreshold = it; isSaved = false }, + valueRange = 50f..95f, + steps = 8, + colors = SliderDefaults.colors( + thumbColor = CyanAccent, + activeTrackColor = CyanAccent, + inactiveTrackColor = ObsidianSurfaceHigh + ) + ) + } + } + } + + // 4. Save Button + item { + Button( + onClick = { + coroutineScope.launch { + repository.updateHacSettings( + mode = selectedMode, + webhookUrl = webhookUrl, + restUrl = restUrl, + token = token + ) + repository.updateDetectionSensitivity( + inactivityMinutes = inactivityMinutes.roundToInt(), + confidenceThreshold = confidenceThreshold.roundToInt(), + broadcastIntents = broadcastIntents + ) + isSaved = true + } + }, + modifier = Modifier + .fillMaxWidth() + .height(52.dp), + shape = RoundedCornerShape(16.dp), + colors = ButtonDefaults.buttonColors( + containerColor = if (isSaved) EmeraldMint else NeonViolet, + contentColor = Color.White + ) + ) { + Icon( + imageVector = if (isSaved) Icons.Default.Check else Icons.Default.Save, + contentDescription = null, + modifier = Modifier.size(18.dp) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text( + text = if (isSaved) "Настройки применены!" else "Сохранить конфигурацию", + fontWeight = FontWeight.SemiBold, + fontSize = 14.sp + ) + } + } + } +} + +@Composable +private fun TabSelectorItem( + modifier: Modifier = Modifier, + title: String, + isSelected: Boolean, + onClick: () -> Unit +) { + Box( + modifier = modifier + .clip(RoundedCornerShape(10.dp)) + .background(if (isSelected) NeonViolet.copy(alpha = 0.25f) else Color.Transparent) + .border( + 1.dp, + if (isSelected) NeonViolet.copy(alpha = 0.5f) else Color.Transparent, + RoundedCornerShape(10.dp) + ) + .clickable { onClick() } + .padding(vertical = 10.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = title, + fontSize = 12.sp, + fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Medium, + color = if (isSelected) Color.White else TextMuted + ) + } +} + +@Composable +private fun customTextFieldColors() = OutlinedTextFieldDefaults.colors( + focusedContainerColor = ObsidianSurface, + unfocusedContainerColor = ObsidianSurface, + focusedBorderColor = NeonViolet, + unfocusedBorderColor = GlassBorder, + focusedLabelColor = NeonViolet, + unfocusedLabelColor = TextMuted, + focusedTextColor = TextPrimary, + unfocusedTextColor = TextPrimary, + cursorColor = NeonViolet +) diff --git a/apps/mobile/app/src/main/res/drawable/app_logo.png b/apps/mobile/app/src/main/res/drawable/app_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..906de2d6504e46ec24e015d9d6a2b349d4ff49bb GIT binary patch literal 271945 zcmV(@K-RyBP)^!^AnjhbXQO41{xqi5G18b@ls1`X=%On{{Ihn?@78>9CSH@4WI$^SYu`! zxA(zpo0*?D5gCygnN`gz2dXnO;v65$&CRwA?k+$2{4Z5HAjqNuh~mygRUslbKls4q zUG3K~MMR)_{N!}br2y#moIUBU|IcI zdmQh(IA@hcq(xIFH+I*O3IK5$sQ@R;$0RFTYD>I$;eL1 zSVC&+2*SA)U$a2=`tS(e75TJp-QBf+``$mLUW&B0U9`y8U<(CQ6mp9miZ1Ek0wdPb znK-`*&=rlHXM?JG*Y*0KMO9Byh`_@rlH2s_K1$>Kx>7e~Y~z;>0|f#XSU`h7rZxbE zgY`S-i~mFUC#f zmP+qqLB@^}5-|nrzl$ywR9ANh+}wXv9r#5S->vp%(YIVQ@#gUEL(sCeweP$2O3J&( zyi&aZ4?Kk|qYcT{Xi~8h9`t2LvQR9|HoBX8-sFuX7{8pZ+)}Kg1LURx- z)!DJXwlUMhB!@5gr~Me9j()Oe4pAzBtF1;NMa1%eQ)xZF&1Xgr0~(wL`T#4Ih{<7Ta8+b*-tMmQ?kwDzsC}LrAtmI|2S9l(Xsw z8b>=u(rIOlwvCy9)g`;Owd>T1-)6Zn$>l8|yhE1#nDp^*mex7ixh*Znw^mf)5zM}{ zFz&1Dqth|o8os&qRDZ|T&0WiV@vZpIB-=P~x5U4*70tZ~hs%K{?kLbtDW~j&xDT#e z%C(2uiS^K>ws{J`-`iK|Sfm=>vS+*P2z-|q6Ii&d=Gf!}3cyn)^M0&^)Aq)nQqJX) z{~;wSuDR;Yp7SvLwIT>l%mcV@H~rdYN6qOWvXxlry9A<-+F2r*1z+F04<2vt(z?-6 z5HlHVf84ux36}GG1dlJngSRa|6xnm^&Z8efISahghB!Rr1ethK7>_!>0f3_IrheW7 zIz89KttqIroeVcw+{X&KWA?(bz8?y69x6Lo!3PxG4@Iz?quiT?d!%*ruEZ6S&v#|S zUBV^Dlv5SNx!2_Cy5IBNIXsc~Z8g8`^?RSYpWepU?mwCPyvAa7gfW@t~^#5zy<9f*B z8IA@0r!xGZ=Z}e}uf21hlUeJ3s2JA|kvZRHIfh;Yai_d<&TpfCZTD@h zoU2dglwa>^xevv6Tcv&*8Go+w5McYZb)R$mb`l_W0BAow0}wdL1F-)7Iyvs4ix7+^RZMZrQxzCp^ z+*gX{t1js4vEWX^y&Ujnf*!IrBE$TZ}S?-HNzYFotS{@pZ?h9@7p4WkqFYoK9;+tr= z<8D9U*>jhjzLvK7@bS%kc&I%Sl_uf6=m4}sw4*_HE-zZUitErUE#>~c{rs)`eQ%cj zo{sLjplR8k`tu>y;j*22IW#{#w})$=-fK`l4;VmSL4|L{N?H6|etxdLoaDwjA?6o? zwC*QgdH)dHsuuE+VV24*+EoQa9{jHCHDq1s-&Fxkq0<+_;iht5u0r*G-FG=?b)NvB z@B00rGR&9PRcpIXpt2TQZ`HzH^4H@12g%o9eY!v2W%>DXeLvjE|5=(^2tX`x0#alN z>AO!-9z(%>YqQ3+`S*QU+)HH{pkw*mp7swJ3lCim8GZNBpVs?~?pgjzC*a#)SeDfR zA4n9rH|BE2tq5w#FjZ*TL;j;63?D-ZAR`6+ySS3yOduF3;gHw+%ajVmIt zwr|acH-yAk&XHU=7!RIWrZD-WrHyKN-lZHvk5j!q{Opvn9M>{QZD~X;6A$S4%?;n04jcW zSDsQR`f@eVqosNy(B?R}&Fd!5-?A(%^?jo`I95S~B5QKuvOmkMXtyalePD=b;kCRg z5L%XVDahLb>D!h{hkZE!r}XI*z1Bn&kZEZAZInT1*bN0c7Qnk!!Y%5**M(HKbnIjF zbE~>@A^LNb!PQvYs3Fh}cs9;iR%?{ogN>6yN8Wf_{M+BLo6CK9=E8OAbI@>i&~w}Q zoRF^BAsC?=N-Ju90QsQaHv14BE!j<;tR+DC4Fdd7;e0PWd&?p?;GIxJl3A^%$|(MQ zZvI+&QGs3Ax6dNKby-o=`@C59ZFKDOM6wLIB>et_F5R9^YB>Ny;}0D7SS7w`)RXr6 z-e=jDEV6XT>VmB){P!)WV@7t4@xSd@*1T}3_43SpC*DL7<`N~}p~>Z40a54LLicw1 z;-B~K=r(K3cghgn6U$fC2+6Dg+P(d{59Ld~;GbiIJD(rw!Ce)JDNR9xMB7WcEN5{@ zFe~3Lm1_mU_2vTm@N)h36uw&0q%D-qs#T_Y=EAM-q1^G>@HL*LtD1tXEu_JH!r6TxsZivqJM!R= zHG8P9J4u2EPI_CLuienYVOep=@?CAn_}zBIlZqUg|E+9 z=k1E3sSs7FyQ$t02l5KTSIg_pE}|RCfY3^tLl@83-r9IhLvp*q{g^fnl{Fx7NckO7 zu6x~<9QOhsbnH7nV1HkA@i*(=Y3q#TZh0hG$H3<|y>|lVt!JV)uc!89H_>&i!#j#$ z^_0-#%R&0xlD2m-3=XdGGYjsU+6K(qqk^3n`b4Fr=G&JWLJ_r%bB$oR-gnwr@YA_y zx0dC<){lJ#(OP}O34HerTuumk-li`nUW{e ze(!_XKI8Z6Kw~YAcTAzTgiqh70Qbby^oD2FzPnd}jsu4v0bu&rsjz$LE!izMQLuYG z#}#f1Jh`0U9k|P!+{WW|Z0^EC@ybo*5GW(_oC3x6jsFzS>b^cLJpp$uOaI1AxmC3v z#{!RiPn=^6`}+Cz?$XTCL<@R);Kq+7?tRCI`E#wE<>xgvx+dPv+1FD9juiJSV}!L& zx9^vwt&IY4zva)rk15r?%9iTi`_;$(_}QVq@9Mh0sqD0k{fEWWIa-3Zy94kQ5xLU0 zLmr%Ee{WUp;2k*U{Ot1v?R)N!EV!>e?(2uBf#bFK`98imreBAY_n~CH;n^G7I3#yY zp`9*%#z9rJFMGVF$IRoQay!sBnlke~embJ2`!;%q6`CQ*hqJVoqA9_tkg|&)kKd zmZ173Z^lg?qH`UbmhG_39__6H&Lir)_i)6gKl#g>l1J~goI4@nHtpWn2gT}2SbOi7 z@w}}u|B#9bj!1Uf-Bm5BJNX3h-HL#}k5UETP5Zuq90l3zn0I!H^rJ2AT_4W=ayMQ* zek5$?CgpKob9l-)A9DSk0>BRS>)d^QsI>&#zf4tCOl$cqN0sW2$dz>tdOrl8-8l^L zu2@~CmXip(=g~v)ud}s%%W{qbJszs8#>sDBt0mvnJ?#AMZH~X@X6!3FcU|12!IRwW zw~Ni6UQTc4CU4c-k~eQF7vQ8Y;5}K~`^tUKg~APi2T000mQ!~<3hVyLfnUnIr}pbE z<(P0@yK7eHDV<#F#JgY#--s?Bs2{g2w~a5=_wO^Fc~jkMi|^P(z%`5cJ`;M5DaZ2k zzFd;~NWvZVM4uHJ-F^MO3r564TC}H@Q)TR3!ehthKlJ-o%&H;CRFi9$NrAv=ne{vE zEGs+o><&O(0{~+Vz`m-_MZIHlKGsU?0uYhA?&vvK_A%AD7u|g<;d#%?1z-#0*zRv<&&{-3JL>d@R&L89=iseV zmk4V`O=rYf}%YqF2Q;kRS5IEtYpFHubiW5#N<^ijV-_Zr|VKMS9Hks)s7? zDvfG+TePX=HgviVkJ(yzTl6`!Rq~u=>75eDjX6L|nw*n9rx+@A2gb4G?apQK{KAg{ z29C+NzW;KrMfkRb$tmUBi5~YU@K4E-UMoD!>@J~=`rV<7=ew5MEbMc&eN(xOHMcB3 z1YmHR@{r(v9}qrQve#|Aa<_fv*m5cuxvflkn= zReAi7EbwJH=VEziA$#AJ!m+~UkU)DEti5G91R`(K*Z-)>^<69PDxFVFD7=e8c!*s` zOWklvf8WLR{;rk>;pZWDqoZkKJOHZ)vJ8LU(7|It#JLgaZOguX+}8SAmfI?iciEkE zQ~&O}KX=J^J;(DL|9!fQPp$JNetj3bWDk{S`A}}_+w|j<_uqCob&bEPVC;kX8=l8n_w_}9TvGn07=oM<-ma=Q_ojOlvog3#}5g8QWeaOc<)v3Ec z@tE4i+u&TrI{6N|;pO2#^-b+CDRJj$?YA5fs{r%%J0b4xbiNAScgnk_Y~O|CiF3C9 zkn}aZ=|?`S4B=F8wf5w}IMv>ojyEGz6?zA&V+>WDFTvBs?QY$jwvJo8=Zfzg`@D!8 zz1R6D_c;7ABeC3}+w_U$lqufj<->2^*@(E|)pb{Njr+^J=g6#;L$Y(ASZnsrA3bI- z{(YBa-}ff8`Xk41^*Lqlv1|ACw8{f~PFde~^Z49jT>t+mR&HYIbCnd5el_LLR5Nc2 z&a{~K)ghy>&hhSFJnJ-(MLhD9T#2EDJGtQ$IUcL0FM2b&VsG2dZL_TpZPU7G7sEcm zbtp%G*1zQsWuFfTW50(wc3jhklOa!u`2z-K0@O&40S#d-06Eg-&!qwzFP`1) z$L{+>f9~50`UCK??vk5K>J(SFP+hnLiJQ`}td4M?p z{lI(2CEisfZ{yClcCQ-dw|W2=t_$Wp7L!&`)12J|qK;@|T`aG4DlTd55C_>)8!ukl z<*j|!L+$qcaB}3{uc9>EK1{>**K$h^$;Wefx^CAnqcco1*f?fx#5+tT0^BzDd|RKc=zHtisr^0v-n+WO?mPW%9KPz}EOHVf=Tu9bBH34_ zTM%fm{zD!g5ech(jRw}=;%Sf$dpzIS9rylHh4fnKy@#?{6Rv`sS9Hbf?anLD9#ev* zi+N@(mfY9fLKR0?GwQqmzzlVMm%(#T>#Q`&IY~Z?&&2p+X=SST97p$zB5Smqmnybv z@|WrmhOzdK2alYI{d0Y|A{Bx54uwE)Qp0C2`@rupc|E~9VzN$sEa3&{$0_o)@9!eN z4}qP!UJn@nYkjh^3w}@S8|zy&B~BUieW1FEboc#!s6Tf_O2=d#voGgnkVAbsr9Zot zo=-dkO=u~lg0a#ZJqx<>wk-jAw}qtkd0JTho}VNcTL8kNAc)*1||* zjV6@Jz)Mx2l{T%Jg0|1OZH(>MJCjHVG@`Gda?H@cnnkpapZD`Q z?dewfxGOl0J)!NU^~BG5S9GW;3%GDahp2=FsZw?UNC6i}5742qq(^n#l2^3TinjJu z=b#JufOP3@u^+OyNT-`*1r>`*bLH=6)XU^yfadE82|VD>BZsdrkll-m-^Moban1#) z+v1<~vlS0e@})wcQoSSTEs6Dv1g(*aATlaUqo}o|hh@|n@2tt{L*A!lsqG!*6$Ky; zqPV1a7R?CYk3XZPmQzDU%XgP!Uz5+(+j)H7GB4mZrM7c#DTWW_Ik*qk$hqpf$?7|2 zpZcB*xzLehII9fkrp9&d<^kY8U;O6!Y!vyS+$CJ0C0^M>(y_DtthoEXp-EdXzhKC) zzMv+2!zzXpTxrs1#OFe#@!7P&sZJ0Dm2FZ>Nj}=#LH~^&A`m8ITrxG?#6z3U84$LY9(!{Lv zJ<5mzcckqan0M<^0a519_(=QgG~s^u^cYEbt_eYq1}{oKG-p~yMLymIdiLwc>*Dkw zFzCIzG8gM7y3dzckG;>~P3gVw+z6`=bUDn@!*}A#yGf@#J#hnN1Bf3l-`71-=Pyem z;eO54FFBv~F8&io@)CPFI+5+0O$NS1Gpp_0Csea+LaMqoq}< zDzP9;2$=OVyA`i0Xl+7`JvRTzzr}@M2odS7d}!(Q;d#jTKA)l0YW&p-@*F|HA@(~4 zt%^ukfXi)jgMw$9)q-BcLAnP8QjyTZu`5j0EqTLD(QZ6jdu;ux%INSoDW#8C{0kll z8&RvGS?B9D00Rin#XTPfdLV0cunz~i>#vSp4hO2}=6x!4W{yEo_~R4;&gZI%w%6O? z57)%LodiSnkUCxKP@|Xex{7~r;pwQ()hPWCe1aXk%IEO?m~lL>tuwL2*3gAx~Q z5Of1i07Mlk9jXG6DaRxY3c*$donC=xQDO`TcV3;_1x+g`U;F-sa*6^pQKL}IkmfuZ z#tQ}>sBej9bvz8j*)4}ca1X6d7u!IWLi1tEeWI*m%OL=6#ji@SyY~AtP;J`%HMt5-pG1}(L?3tTE$A$J3$>G?#o4$%`Ij3mShHfDoPzbIVpMe2L!a;)PCFT5GjVwUdSpuv&1{?D-(U5Iq8M&3SZlSW}H!b->YQil6eUBQME0A--L|y|( z@cL^Kytr2{$0TK;nemZlIf(H$L4Rj14}9IKc?YD@+G|n(edKMqVejsp47S3nvG$C} z=G8=VLR4AgIZ0SwHT%L4x9Q_CVdR^hz3*a)s`2OkBOY(+;5i1cM&x$^6s(njIdq4R z05I%}-p4?6KQAP@Te3S(LYui?&8lpJFtGL5pgIL0kl5BMp}0jRh-@&J3(?1AKO4}d z^339=KQkBv+Q7`|I;>culKI+)Jud9a{xb}+$l@QypYd*6JhNU`{Z_+EQTtj{*`P2> zEumZKkGaUyFk(!9KA9*p($YLL8+jC z7WP=fSXNGw!?gH)sbqmvN&A(*C9u^HO_;v`^ah@xM<)TU<;YA3_ssxu%zeH(kI`Sm zJC%QpJ`Res@~5wa0OnG5K4`3?=$|C0**O`K9;znLR{KWY5f8_ufguhWns&5qmIY~O zVY}wWMxjOVjxekcPE09uP#s{7NVQ_w_F&Cg|d^H)hw2n zr9BpoKQvgu6xtTYcMD6j2=l%t9+m>bN-vqTB{Tp-7G3Bjw>}sNEOfAYhy`)C3+M8g z*8j!Wnb^latHt4U3;-)&g*V$5&zpix7wS!=SQX39%7+KTrRB>cb)ln3cqh7gY(Ls5 zN4nB#K((r>f@&D&PRe&We6Kt2y1ye7Arr*}8NRX4qXzN08Z5lDyb~}Oe<+rg;CPFnL1Z$%781RXkTf)C3I_qV!bEZk&kyF6L^TIt7LeZs>^stsw=h zxF8y0sI`9t5{o{I0-m+rp%%ZUYh2xE(qi#ShjyMh(12z+)V{|EkQrvNc0ikNtK<+Q zHI69IGaFnQw+O1Y*MoLkc$VB~VLnI9T+GoVT!mecl&z zQ0Zn#i}xQLs?F)qoR191h!P|NXtwJBVqh`mCldM+kcwmyV32+BcS0hc3kXDJCvDbg z`kzFcqpp-2r2h;Cb^n(DQ)+?o|p&u@tg8Zf8EE6IyEz0s;>8VP69AT}!J!MoZ>? za{+G5YVZA413hM<&YfscGmM7})B;}iwz=fXu=HIxX!rH(4|-A=vwIB_EV9uTE<;*+ z7FJ;Vdf`TPLC)-7b>-5~O&N#_CYb>-H=#6Fs1#-#PzVPKV1Dg&Q{H=gf??4}4OA)t zl%FG!?5kFqE<$*4QTjjb-v;B;DXf)>CX|i;haisqfdD#{JZ)D}r41^mp#uN{D(?8C zOPkUM3?7!3O0*K*oV9<_O)16Sr43r_=sw4pJjHQ@gFlo5xdlNR6(+O=vBQ2eflGRF zY_tDMF>qxCEv4TJ@PmGAO?JdphP(Du)E!xB^pZO7Qf=9 z(M&Lu7*l$XRModUHb$i&?gs#5@H~ZQC`c+nV)I;ZYcK{mhO>T1(+rCIki7r)FkfA)a z!#Xg9<<_CLPSEZh<` zW;H(S8h|wB%K44!Lmkjig$)_}b(>$bliH|zJLZY7%zg7ulzwu4yD9U4m>mJ$k`_)X z0w?l<%$P7iJ3q4dC*P_AEcJv`ob1JB`^ebS$>^vMN3}nbnP;i0r2--d7!RE zw|b>}e~OqXpeO{G61*6F_&4`!D>`~NKw^rz4+jh7+*F~R35$@e^^r+pp%`3*(<9x| z^*Kyy;MLx!;BHv{J!XmRE>vFW_E3TTJ4sVF%HW}>s+{1OdgsE2c%_PWM*JI{k_(CM8}xbTex4N{pc zH})}sR^8)Pt=2#Ws38^mMm#D(_rH`%1v6K%)^jan5PDM9l$#kz3-$V&^=E>UxA8Eq zZak*sC-JdYe)lk8XMP9gOR^j4+X+{;N9NiqG7=sFaAp;lVNl)fb$)gw>g|iV9JW~% z_iVsIJ>dy#fX+74>1NsO*9pMnSVQ)e+h(=Q@1sAg zU&O32+8w6wU2qmfu*S$CQc`23Yi~|8s%U`r5@}yDVG3J|qjzv$JqR9}DgN#PU3@X* z);L-&4ZSFj{N1heurAWt2=Swt7{sI?8OBE{_*OZ(5&io~it>kmuJ2Srf^i>qp&RS3 zUZ8lNi-pZAyMdf87yDG80BDgBs5GsH9Ki!AgPaH9r=)GhoB6J?4uyMOJcFPptASgi zFNhNxtDD{U%qN;iV9@B|`@Qq;sF!mv#MP;6>Bc}&p0e_umYf4+UIPKATbTh+ zY0-mBPe70R=1h+3$` zl(+Yw6?%L9!4GBr;Pquf+~cM-4-0c}`1x_Yp2${=EbR_oeJt`}5h4|MJ%0YgnFlaN$&>UF{iuZthfPT-C@_ zT_W_`lsbm>{)nOI#$=)LoN6#p9r?1(H8BRF(oQSdzT63CtPZjWDJo|%1v6SE-i{J+ z04g(@x=;|BgJGkW*O-(BlLRd-875bOic};7O0{An#=SC2t|aIMftrhXJSa`P4aVta zjG60HS_y<2U7@806F7iKgJ^dF$eGFLdd_0@+$RDxw?h})s>8Tz$wWD;W)xC;3+4Ub zMqR$M}t2PKAjmHS9i!4nuV)?3_I@lGt-y@N|dzJNfcM4Nx- z3RN5-nxe;oPbf%P|Nb(LJl-D19WMH+u_#W-S}1bVe~=Ab~DdKktOVxHG0 zD87+loTAOY^IZWdsW=HjV4)`f;5`yGnK0|)JQ^?z5G0DQqJ^O%mlV-P0X9Qnz6(88 zTp!u5F?68L?{&*5$8=byoMfS+%$CdU`uR}r0;`=`PSS@955#?2{k81%03?b7_Qhw; zl_sbMepmI&MjCl?L~YAH1E&%0P|myku8zbDLSx?uLY%9}-kB;>GEKSo+zn?mWo6C) zLKk6CFq#V|l~7uNJ(AbN6Vt^HtYKun6(QbTsnA_Jhv+wVcpj%KOB5W?31A6u0FUt17!yMs z7ADDYaSjrQkRQxb&|>Qx1*i3&F>lW<_bD`8M^~_iLDbtHyc!ZT32x#vvrCbRXkUi% zrdOg!wGi;?(*lN`BOOc_KEjGc zZA4B`Aw^)TG@rG+6JTh^y&aPXX3X)o&6|OWCMAafip+Y?d>PI|Dpm8`H17To1!m{L zRsax826bXo@`HO{BJAR!kggrANhoSXbL*QK`?S*i+z)uNr$2AIMp7;|&SB)KaM`5f zv`l{=X?Q;h|3T4uNB6K@oJrxH*+>|a4#8yML$O(D4nR72J>-}cc~OBAX`gdRKy*_X zWjz6QPva@tE^-^}clHE6&0Rut-Kp%|QGoPn3o>-P^!na+;SRA?0B|VQeW=277F9J@ zaaBI52Z>ZI=W}Lbif{X>peXv{3r4kjvR*P969TCsR10%SZkI7P-E5$sT!X8gAf#Lj zuJrwi7T7Vp#<4ugzs+QH_fDv7TkBlh6nLo}1~jfpz~T$EDv5B9xuW(3$0X|nK6LL^ zp8~xc;+}$zPAj67v_S8gz2DH_7N1h_I&Iahei|ZyZ`q% zh7DvYWh>GWbXtK{z50PY8gvVq`XxHnSx@qt9ei;ds=g!5JSrMOAm_$zP;_o`fz?rT zcHz((;tAOrIT|Kil?qM>?#RnM*rH3$T8GC^nIs2TLMRa)g}Hwxs`h?!AzUW4YXk&L z5p@F{R(J6Ng!N4slmH5yNurAIni2YR2P(dePXy>)JT~suF=c{w%%DLgmHQ^6tY@ko$O)NDP(v9ki#2urVk|sJL_m@vBOn=qLANT0ybz?*Dgd~z zJ%`7Z9RR}q_^$=nuJ-Xhwqh*%WdF_mq2`(^ip=HXOabN+Hr{6J-jD39*{j)m$*f-~ z2{^74>;$at#)~_0b+#;9xH5@2W;%GAyJ!3C`3=ny?bKJP>q|eFMoJvB0I#AX=Jm*vEOTX7UHGn#CA-@-f^jkczZ!xJP0Q_xzR4)lM8SKemF_Is26VuB=Cq>fI#9W0r*Ecrge7F;_WmPBVWF){I#-ZJUnZWK!z)#zV(A2R0O z(QVg)6Fa5VQpso8|9Q$NEQ~>}r{*4lz=Zecc6V{+>(E1^-dS;BbHvldi4Qv3+JU17u(EY0#2|-k}R=vgMdN0D6EVH>jR6|U2)KO?V9c?69{uq8gdl?%;^LMdtx<)xIMCO2 z0yM!C)>Z?sbzU-&9zv@*KvK8Pn$JONws>RyfXr2}zMH2&f);j!vyHbw{S-xj%UxW} zcd9bd9x#_L%Ee7i2cGL+l_Wt( z-aMJB+j`(x4&rE|FK>KofONMsl`Dyw*p-L>W}dvsg{JeWCsIoHC&kBC*Cg92-a}@$ zS1V7vB3*z`Dev1loDF38wbvFJ$+_ddCd|ViFN)`+u-)VZ$b<-CsXFbbcmYTYz+#-( zoqQ%wny(XX%_L}Pq5(?m@F})oea*zoZi&C5@xCh8Bjc@v@gCE6W2AWwg7LqNuZ!o3 zN{_sk2F3F9Kb{}Jb&_mBU6Z*BDHDDBVl6z-iBGD5n5quKsty;2;3V?Gx+YFO~mYJH2eH63aeVF6{G_K{+ozQ%AsN z0cG-Gyd#|Q2K8LFBA@-yn(uQNDg+(Dp zJGv6R8gpXf6B;ey6%8X3fV|{C>b;Si7*s;hM<$CFk3%Y~w*~YIC zd~@vJ@$4AT?DaN4=3?w<%u}p$CYLJQ<247j8Xs~efOl7^w(Yw{U>dZt{u*G-903E- zX7N*5B{tfoqXY?nq+@ChH-+(h4~c;5HT`*(>*AqUsk~s} zwdQ#?T@ARB@3`*55K*5GX{iy1vL=C3!FS?6fzN|rR5few6F*T#ir3l$n8$O)z&u8S z?eiGy{7rhXUK)ZTE4^JC!RdWiduCrBZ`=lW*JOxO%CfEHBmqgpQ_3;GWOXtqFhfCF zX#narD8_^%gV%-Z5FT*;8~{Q3p8&TSl4Ba67SHYg+QM2yV-5i#OhDxxLZT}me)$KQ zyJzikkGcEVx+@$gE?@<6R|y55 zQ#ur{gw-6NrN&8pdwYZqw8ZZn^o8(O6pKbZR;#&n6P_riz}yT-L79JIAgyscOfm$m zA9WXU`P;`IRP}K)8LxwN3uI85RO$=Bt?-lP>;R{X_uBL3eRu0K)=7enDn>twLy#P8T0lU*V}7c zZ?7<4U*Y=dC9dad%=3)iJDLxzHL>u7!(@W3E(EyVfGRpRfOwvdFCt$51rJkj9n79+ zY$1l?O>hVu$#{`NQLX=+hg8s%9ZSWFgJrOS7uNPr&*5rz`g7AWH7CqGN2&PDdAsgq zzp4J)=D98F-2lfSiQ80us0?oXJuZrU@%>Z#dF=B$?i(0Nrz=;3g*D=5rbuS=P9fnN zvBZSFFz^OPzf^Y70tQ5^ZaIi2`e;GD8g!`wc`iA6g4~lUmesF{Sv`5@+Jx(7v%!<6 zPjGqp6px=g#l@q?*jzlu<;A5bduauXS$m8vi(5Qs9($!sgMeq)8_mu002dwxZrV6b zae>d+Fp7TgH^cJVS@g7=D)_O_!*a!vw^>7R2ZF$)ET%{@sqK}XDN3@KtH0*(ud`2? z*p{IIL|<}?Q}fuY^PXtv2phK_(gGCTY3Kw#PM^rta6Vv<&3(-{aljhTlSS`JbT3em z0YuAxun9;id!wN1-Q(;`%ye&&!xeTz`RY4dZ?|>?I~3Dq!qgfXCf^BSK-HA{43Wv@5dlK80{c=F^uJbm&$ zE}y)I$4}qGX1a8X-nJ{LS877i1zy*1X=dyY;qjnw7M>@rfV!)0e80EYs4>eLq96UBBN@M?WebkxB-kAdL1fH?pO0uxzY?w1Z5tmNUBNI6h zFiRemC&2@~th)}ObZdZPwynNR1WXOG9R)MC+c$Xm;(I)Q{w-d7{|%nM{1#VNZ=k(n z(;C_&m}D~JMzyqI3f;m99vD&b8?4>l!b4$v?!d=)0x|a?sl;;viUJo~d$xQw5n`%x zl6^5=bH3#9ZQ~NJ_O_9;ssc(^Gtf}n6d)^ZqxXEW>CHxB@2&p=1)pVu1wbzxS zW~@B$?t&hqQ_*^ZyWFXxaIZk~zQXOv8R4cRA_%ooi-h8VkDH1k>BhDSV&``PK+Ug9 zVJ?gJ5-74SwA5{i9n;_cF1?;()7LY<0$rboCP0rulqHpSJN-PXu zAv?v@_BCF-_y*s7|23X}`z>C+{0{TH#nf!KM9^~p&<=vMAyUMpLv+gVdGa2O8r~{M zAQ*tux4=qlPc+`KS|`9yXAC+w_dsfQD)F$Shb#Ml`La}ayp}|N7kzrF{@wuq$HW%y zD`WCqE#V>H-{E@7EM8ND<8(6lDGo64|1v`uou3Nwj7}62%eTEh&5>IA6R0-tRA-}UwiZ{EDd>zA+a`qfLkeDea=S68^+ zzQJ}oTh>ijr&`XPXP80J#LpM-&XRWw<&uH(EQ2AQ>;ldfu0O}4Xo~=4M*LKjy#pu1 zNo)M$G4jEzCq1L;;63)c`OhBT)trH(c_<{;mUKUw(zM?vcDI7LP{!24{+)y`2ei6H zoxYrNX~@0ivRF6#Ovg_gkhaN1j=N)fp^d6y6Mb+cr&7i;M`r)*vFFyzAEe62FD*59 zvkO&$h5%Q;!7_oN1_(06p6=XKB;(v#z3Mz^Yr?Edrzb3LCcH~dYpb!BIZM9SIA7(; z)c`BulJ{+(O=;<-kdCdBv26K^xDv}NqY12-zd;I%zt054kR-~Zw8cR(FSqirjfecg z3n4smdjc=fqOulgm|DZMnXuVxaB+Ew%gak#TyAi2u|aDM&F>G;*}@>x)F2J$eT!Ew zpX1xFe~)j!`4Z2ce*^6uZ6lZ_f==$C^*JS-OSV4csI7LBnT>{xNSroENN2zLPc5F0 znjBgnVq@qAD`_LWonc-OKv##@B|ekh9jrgBOaWmtOx$ZT7(H021m zr6n!RB8(%BfH?LuzGX6xw?#h#_aj@V%=USQ@DRavp3!H;#b$%|-v0<6eDo>afBF&H zbO~-1+%$nq#)fa+yuphX&++2@9*LN~PrL3;k(gVL+j6_)l82h4unhiipcDPHm}*nsJzm(8`EKI% z*)4jNf4d3Q@DNxmw!6aMxd(G`v6JevtD~mfQW;{t36xB5Pdq-&2cIcb=UkD?$wxEph4p5Um0jM&<}v^_7Fd3AOVX?0viHMh9hi? zon}sucH0gZxeE?;Wz2YpdFELG@EjuM0u?Y;3v)1R+nxAYBxrP=LST!aA3FEf^Lz;Q z$=v-K$&_|8-!x6QxV*%p$Cr5g_z@mGdW6f1OE5eL1*XY71arT}^Y6dLSAX~ozWM5R zc>U%jS`+g$h}jKLi8;325e>Pc!`aZC;Y%f1`{z!zCFM33+Wv|NW`mJ)nz z(iIgBTW4_X9ool)B`RR?j95Yg+v?&+meNTeiauL%;NvInC)c#f;xX~g<2o&4r z%XBYbxG7B34JQRK8Gz~eths2-#ow6w)AH>4-Q6eZ&vl@0!295t3y@;a(f33nEJHW; zQ$qNqwHYIe&&MqOk)I;Qn+)I&wWNgXEVJZ+A(oX#Aw=-8`R8X6%m-)uru>$v65an$jm`8M=i7LCj%G! z0J%U$zpf~-@g0fCNEMjjIjH--C1%Tk2@gan;Cny|+%{_S+aYM~^|3@*b4fR8x!wxd zRo$!OyII&o_xS?nHE<<)ghM5t_@PL<4DQ|y#iZgJ7HqDXuZ=FI=t6!dfsqH^#NFw$ zQErk6Gdd)Tr+EDM5vHkO-rB)Glgoqa zt2g-O>o4)UFTcR^=U+j!V{>8NMpZx4qTJ&kJm|;Js~^1O{SdAfwZ3tDmGx~?qZ>@! zfwzN-;*l|0RGL3*;SLHeQcgeh%F^<`uN=B#o;y1L_#t`+4kaN1w6t6~3a#E5HPK_| zT`1~SFT3j37au(YLiV8bnl^*Qvc{x7?SiLI-^Zsv`YE1$@CjskgzK%vyfz!l19%+(8-#^}N{P--salkDGJ$Fv zPb?|W>M}6Kt)c{C8+Vh>-dD3u^LXGUe(Js&klR2o`x)@|NTi^HF>6J)gO-d@{1nCt zntRZN^JX_(a(oGF7{^E9y-wvQ;<+)B$gwDnSe zFj?M+*)nX@s@H+|Mp7YUuO{co0uXJ{!yz$v5};^<%nA$W`!by8_Gnj;(RMN-Zxd*`AH;s=j#_hR)G*3t`LTGXR#9gZ!Jo zqtA+`?>)n3pZ*NbKKKN{23y|_GeK~@eTA>S{yo0>>UVhY{kNE}uOLk@wF|Vi0mSYF zhg(b9{bJ(=-}1y{G6d+b1SGl=O(O>|aYd!#+oU=zqNJl)w{RCNtqlqyaVx=Ns$tQX z;?iLoBI})__7+J&2>`;X2OmnHAym3ce$e_>#^7zIS)`REP@wf4V2OP*Af?>_oRlMR zQGkgnZl%I=%f-%lpEA{yU`W$7zAPSv_sY$Zmqr)3xsH49v0X9d0%rZH(?JEE17KmT z4!=Z4$pf}UuB$+01A$#2(gQr!*lZ9V;@9;OIPDw9vWQ#gmPpFWtKe&bRv(WiW&)*z z(yt1m0{HO=VuYe*_=M~$j9L2!^@PMJ5v}Q1)A|m1)6;^mQnMtV67vZMi~x~**8dP~ z0S3rd-a2*_oA=YbYG{r@`J7+LtbkkFlEBa}e41JV%*OUH`@JJwT?S5g{P+>xfA$`p ze((ern+^JGKy$MJARXU+`xSosn}5MKU;oa$OPdWK^w4muwmXF(9)h1>X9+F>A{^wj z>Ge8sLIDT)fwGN80Y>jxCk^$7hj{n9rKP`L>pWap1pvno>|Ip!w=V^@D@AMfOy`t#C-oFD*!-RukG({PPSvdHg;;`|OYK;fJ4^ zhoA$~#X>9@a1pt)i=Mx%h#{a+JwuEUwNw;N3H0SX-5!`X-g)mOfKl@ji3^y z^-uRXUGHHb!mbxK!Nt?R+)6FUUAm(MJYFtR770>NgbGH0rPKoypr$1qU%BKE?{k^A zVt);uVUe)X;&b2rC`I6FPq^sU%xEa;2J1y}ZXP84LNK;JC@TN>if$ zfObE*(f}Ry$OnjzH)AMTC$1EIiUw3g-PozzzWYuh_di>Xz-;3;0s0*Uo;#m zNA39)0;HF32#eb2%_BA$2vl`fKk(lBPw?#72Y7t>2r6c%Oq+&D6kmV+CBFF8KjHiD zzCznHPZlHy6WBQ-JTANNJ;RU^OWSEruPKuXxgJ(5{D_;vL$U@!fo}F2JfZSIQ}A{H zK>d8xK-p7A1r(?1;N?3vo&>nB{7{wu8Y1(wURNx1%G0Wc!A?FSrqHPfGPBi~EYMxg zz3S>#R9e7xkc(|?pVER=bA4W4&)8f%!cTwt$N1!vpPF-_y6eTF!O68#_;o&L(Gbyqx=Ad*7pf$QWkxnxL(@NWxd#1}gsmGPmqL%=EBs>+M zh~~vOq&paiub=bHrFG3P1~3V4;&kv8V0T%^$U8B}_}vK8U?*~>*CT5Z-8kO!q&;7Q z)@vTPMSvk@Q7in80`^&vM@;9KGG*7_cYd#42zE2pr-wXRGvdzkjBmewj_2RL#FO_P z&%sYF9#EMRsL&=_$GzC@4HiUX?^xKI(Yd`oCJ8+ir=Mj zXd+fW*Tt{29+-&?45v=nFKow6N3l2;6wuk#Ler4Rc~VtF=OHAj&}OdJCW?99V(x;E zKmHs)`N^N);_^L9yxB~+yac}c_8WZh#lPX3uYM0;i>XbxxZGIZG?!3Vtw`id;bxXO zZI~Rq7NHb041t`BGpR>G*}YyrkDpe>(n4M+M1H3tgX*Z6(*|JJPq)BnSqVb|PG*@LTukiBuYdn4W6d!#20iHg6g4t!#r$7E9m{%%TLQA0t$ESsX=I%F|S=c(M`J)W5lF| zh~mxF7LOmjkDveS7kKu;r`TQr^E~77a)TEypW};P{WJdXhu=fB`~KVusA_}^w71Nj zE!oF(_i=Hn&tdaS=5${!XoI>)dUTiLUs_2G@CGfO4W2^h3T{obn0JL*ibo4e`QDST z6o^Yi6yWiy@EEoAjglK>WmloFv{?B#DKrEe#)tTMxF1vDr(kaJ-;tE`3cy_M?j`ET z`2o~V1x(&E{Y!{b`cc5lvX?4$pbxwcyziWc>x69>0LH~@TpqMYFf96$(?X!QJDVM8 zMG|h>R=}9TJ=l9S0hiYsm$evfZWhh~D_6~YHvuxiEd5zqvAiqY1Q_mF*nv7_Za9blFunz{TFG2%0bZ#Xd!c9aB*u;MN%1#0?pf0X z8DQz~+y*887-Mgy4FJK5m#^^hz%GX&Zu?)K=(57G4u!`Npo=R7pRMc*nu`O)Y2>?c3Rw7JB5t+=?nM4zwl#jpMazxnO2p?&K~I*eHc z?g!8@tJwA&z&GQ1J55riQ1NhkpG;uNKg08_EToQ-S>9^W7gtxhOKl&!pWBTVF~uP< za=F;t!fmabxE2}k%8}apt?X9Ns>pgyA_TU9UE=eOCpt{AcfAtUew=ezyf*I4)&}Vv6 zEM$=$kUEzoT-Ow$mV=e?O!4I59=v4t75G+$7_(nqB`frZ_wG-T-={9SP2D%&26)hF z{*O~sH4;bc1OFMZUna2-4Wx34TP~e8U3(-`bx%AocC##7KU)>s?G~GhNBHAE`6Zrx z@F}im+vk6AvB6hgeTjel=l_ORub$)La)W6zAvP$Z$EkJp36uF0Qw13=f|W5V7C%72B%?hE#Luo!((TNl4dmYL!S${3Tj<8>uw z0tKk9@jwLugDZ6ai=6);v;hmwWyHGOaxCWxus-g1aBpz%U531zMl#yL%{2u_%YFYb zBgH_VXC%`KGQ1>=eTVY5XERov35m&%%o!n{bH2pqJ60M1+jcn%xt}{QJQ+9z8l>}v zQ3N2`@Ba5gi0T3ntB2bSyV6{+=cj3cO2_x#eT$bbp5v2GKE{V1et>y4@bt&O_)9$d z=o9?oKmJ#|eDMt~HW!Gy06f$dvmo>W)^M!AHl`|?-|s+2Vv>$v*^GqDN8ze1A|t-L zeK}Sy-m4*dLfrw1--UyK-e!ro?9#16<-k8+3rSTWezdA~kB6xxnbgc*b#2Hv6a$2` zim$F`eE89i@zc-$6c?Mv*luTBUS8np&1?MYKmQZH{KId623%}5rqrn{)cud3OWc8m zD^pQ*;pi4VK?)a^z$}bNq}?<9^-vozFGd%$20}2YIeAlY7xg0zO*)3N2Fgi!R<9ov zvki;dOC5N=!o&M{Sq>b|MC3lmW0qnMh_Y^dvl4XPo@+f94{j+U?6DIK7jGMLr@-m#(CQe4qaZSvK z7fMnf*DlXtU?QrYTc8eD;QeXpUOFms-y+)qXfVS9K#E`^>f8Ug-rce;ebDC4vf!Gr z>=)7wxf&pS@_DcWm_&p&1A1dfWgf;Wt_5wKZxGudmyl4*NSM)#uJn+_kgGg!u&Yzn zAv3r=kL_~{qyabg0@2geEs5{Rdynzyr$5HUMZ>)9xVUWS+t>K#fBswi_P76r>B15| zJLYuDyBDz0^BGJkE*q>5Lk2x_0l2n?6~uMX99VSV79oIlsqEx6m2%T=0^kk+;D?$E zuq^5dvqp03@Ab}WE+Fyu;<63^5g!(__`5Gg-gu^BR(tO=v^RYA(_i36Kl&N^*0}Xz z)9{Die~Ewjmw&{YH?J(Y&xPv7555s0^5?QH77j*nW6I85c1X+D^pP(BOhr&E36qM$ zvV{BiofP35r@3h;dD{xdp1Pp!qm>IZK)c-q?{^K@_QOI`FV+X<6KJV}BUeBgboM>( z6HrfV(9>=hP@zWgn(M@d!aMED()#E-=qZy2LL=e*R8*5D+}wh@41UU z?g)Se*$n`&2Pxc}kHxmJN5tBczLdNbZJ1r^8}_36)!e3*v9AT>H6NV;*pQn9Ont>hdt)*F_dI3!!3F@h5E#1JCjnv6-)!YWf>p$!l_C~RkeRg+D5 zmcD=Ant*Ux9N={4RVia*9;(F7g9SrLz`sHP#pIQ2rK4d3Q8)l_I{KJr4jDZg)2vZ^ zk!$m7gp21O0z1mxBM#t%Ae1!Zshj?O9JXWYl#e=OaS)jCbQ2vWs|*}lSfI5HKKbNB zeDLfUx>|^0+5o@*@>lq$fBqXNuCbXIIWw6d0rc${@p9Wan7c!YM$)d(duik23d%ql zB7fjeX!{|yy1#8bdMo(zwmW^>qI9_-?M6VungWmu!UbIUMrW zb3=UwT=~!QjMg6GPk#AV`1I4C8uBUs{E_llnXuu*WjK_tu_+4n?NuDrR9AEFAz$qOPr77 zgkK0o_9y3Nv;)1L;>ko}`3bu$X@umSe9jZ#=bVRN)-Zs^Hu$T7kDWv*Njjwf^qm$# zK7x%=*{569>Yj%Lu8s~J+^@T2C%^)j5N6Y?!8@dRH4@^$X;sVqjyw$kbWU(rI!h1< zZIP=O^S7`-G{#*xXifWv+3Ec$v0C;2ROKH}YjW3)^&`yHK+Y++)ee~t!b>l_!;0=< zj6URMLZNoe1?hQn;EKpn2;eH+r^~5=3V7h03|K6{bg$C+VQ(De~;gO z`CH7hoea3Wp7GkK zLfYBq%=*vyGd^NpncFn-(-IWjwXD_gwsq*O003QY=PE;N9lM0O3-L83c2qES`c)5o zNnu2HCzJ}pGm*&*zVIVMS-S00RYR5VIJ@akYooP>?RJaDk3YaK|Li~Gy{8}J`l{pc zX}4F&%i>O z)EM*%xmQCa)DeJL9lrWq_PWc?K5;eVi_SJ6nGu@qK6np7%Pzo3Dbk9-qa?J;KbDqY zpZ)Z)#duUh93s!_X9AgGFgSx8;%%?+y<2A;JeNR|H_!pG-5MUY9weE{y5-Rwy#Q!MEO}v{&p?5W4 zz+8jEXv508g}z(rt<~Kw2lU=u%Q5x6GXapDZA}9byFJ)o#(u3rRsF&YcubH&Rb$_@ zs<|3lCQie=Rz%5m|GGdTqlE6(?*2r(_-DfP^^9lle}-TD;;%4GPq5u89$ilO@;AT2 z|Mg$~cf5Y}5}S*QXjgpUr1TS)ZyIe!HmrlO22ULGe`$R({#v=)EQdh~R+>3-j%W82 zT2+DaomkeAKrlrtK71Bo{rV1rq6{fJV>_i5K`K;69nAjMKpCb)!osE%T&!2pX$f8j z)=CMU9|YOx`b?06{L0CmmFePdb7xA7BSIQfmXiUD?q}dLgwuv4O2zJpm_7ir+>J>i zdP0ThRwc9P?d*KQ7y=px8)Z-whR#AcQ7kRNfk?fP&{a#FJIF2Y-p3I30ggw{36&#Y$*UHQVK@k${mP_T2}@gq^o1XQ0}JaJXYYEO!W-DLkMUJS z%RY;X1dm95394A1P>JZy{JKU-&$ z(U>{7`=54V|rg- z4%It=`E!?3k<6}8KA(rdyu-AQtA#K@r(pHDpwF*Uh7`ZfyU=`9T+mF9P z>WC|2MmbbJ4oq%Yn8W<6Z;7FI`V%?g#6N|h% z=i$t?fj?J|!zFxZS{&ehhQE!&KuA|ok~Eb7qp^fE0UPIsEYQl#(su^c1fK)1upg|v z4!eOXE9g+x1eA%33?;czbNbL`XHd^_k$U!7+%qBMBZ(B6>ig_4CuWb?q;*f1dLAYn zLkPnIV9t*^7y?n^uqR(bxpt40=2lGO9lLsbgRj5-3SWNtJ3uT%s(r%$_@Dk){L#<; z3|DXLig4y2X;}+#q_CRex6>hA4y*BI^Grkw{Vr5pk^8By9N?6Tsvff3R_EQtJF!`Q zcvEG^JaZ0rN&T!Uy;JKpAywUfEwWzgz3h>ZUi4}gix=t4O*KS@wm+J6nbdI?yGs=j z!S;H_k3Rh){NyLUz}$h&W`pf~g@5?FzrojE{T`1lFM?r17ss9Ry$E9N`IX36>#7uE z_P37@tmYt{Ic9_vXN7`ie_022US~*p0prMAsF|(c32EWr_ULIr?BOL4I55&O_r3=h z1=Oi0WO{O3h)%T|?pi_kwWQVS;!t|b=MMfCdrlk(PyxBk7-ZljP$4fZF~WI{Tb2sn z!S8Nh{(@Vf$)9WF7MMlW%Y3>P>pEQZ8dUYcbYxs0k5de19pCzpE zwnrW*%(*on##d~-Ix?htBa$PSp2b}yBOeRhwhJ;yPr;rm)D>9^JwzC4&pD8>19t7( zI9o#O_t<3;6CVQsw;K+LiJ?qbj||!)XGkMIARQ`YtDn{?J?DgTp(W`TRCMCo64gVK z2~yQF-Qn$KYn%cJ@Y9+1Amth5Vd%81Yf;blvF9QgPYghK$6@>+(H;*iqcyKkOw$J6 zKYxzv?KM9C{3qD7hV8ZDmw)!xxR@T{U;pj@#>K@3z}6Qw-LXtKR`Y&zf)STHG2adr z+)H3%${ZNVBQv;+hIx-j^8K>B?b!Xf$^eUY_PW0VWnbLnls;-qrU@)G#@w=wHdtCb z)S@RCV1I%sN+MD$tF$z(w;i8-_Q&|?PyQ6w*MiM-iL0wu_?!RozvG*4evj$Vgzk)* zEq9oRO*elB`82IP0O4{?yZs;mc1no?#+dodIAScG8%wXd11KxCyrYUdv8+CrwbOz@ z5kk?fhgT4Fl1FP5F5bD$OC_sko3IxF-ppEwF)kfT2bXZ4`QGotxn19PqQ)2vSg+ zW@WA*s%E2g?ZURSvvj%Us#-5PkY)sr_Ith=)Rpo~^x3z57U02OEJn<1oC=;RD4`UP zq~*{L32(=+mK;<%3p#jO0Jo^GCBRnzGs8%{$HSEt$5BAs4sa^rm(=YZek`G!9cNq_ zKWj||(ng@&JvWLJVb;A1h#se28VGp(`VGGL;@7y|S`y%!*Bw9qlfT3-fB9Fqy57bb zwIoJ~j;p5fH}D~#6_7e&2G0WsAE#>OPN3>Ne}9#7_gmhE-rWHJH@V**68S9mI4;8k zhX|J6DF|X9$;46#1SZ>8Ej|Z$DjQipZ(-daCJT7;&Ovm zufD_I{Gb0HynOKuHW!<)Iww(C@plS}pkLC~P5><0NIkqk8p)snGr_)y=p2Dfbh7rK269dVSSY$*id2_o&ZGo* zY=9?g(duP-p!(+ZbpKnDrpM#`e;v#VHy3zEPo4}9O$*DA{jQ3gme=aq-H8{Jfvyzw zSL*p)whN`GX5y7LhCY}lV(*w;C}lex0nacLr&jmA1{)5FGe%kdq_P~xLab_ac%LO9 zeN{sW9#?E$1ZffmgneqO4{RY!!gEwzx{OphZ9Dn|2{~6a;zDq-UCJ(9g zv-^B=mqI{Vb>ChiT`NHpP5jJ|0FN#?0=wqu9zr=Uw7EYn+- z+jj2QM1~p$SQ2cVK!*0T&scNo@Ys>rU2158Hc?2@HH~2W2Hvo3BG#}(w@q6DY_Aoc z{^*bJ*=Ik;_0^2c#U)<8_!fWjU;lr2^X4_CO~X99TiBJZc+Jdkm(*}*o^6{7f@R(A zk0tCTg)(00)&}hsx|;(G)EcBO>LkM61&1Q_3^2ji(X^YwAmry}#@J^eAV~MpKmkC- zI9XWQJ$@zd5l_n0UBYG6K?Ab}C=0r0dI#B}+02P2)S}&|MgX_W^VU4hLAn_=EaVDy z6hL>ErWX2(+Huj`MyXCO?obisvX($Bio)sLd6@Kd1zz2~)fbf6F)h3nY3s6`%*&v+ zN5l?kGOMq^qiAQDTY#c;isGpgbOeACHGiEY!6jWH>?h8@Ib}K0uCB<`y@E3Eo|Jx@ zk~f$=kx{hZT1_Dxq(+fVEAmasbJ<1GBV`*?8daK$3F8rl{nGOGVenHWw4#yxHQXKl?NMse^!&0TOwCR<~V?ZA-uverpit|D2P`3)CCN+w?5z z^5UTK`+b)+(4omp0CsiaUCIauRF7J8XD@PiP*RAphLXZ+Ss@S?WDmunw(ZED;mPS4 zU+%vB#{^vqVd+TOK|y3$M~vHI{-1pOIez@vpWy1cujFofc;K-ZGh2n%5H7+xf2Tx<`0r^I&zX)e9Gx%;%7>5W)y@!)LT)tMfBn zajTSk2!4RbiVtr^Dm`@|5jXe6kaK4PJryES&aJS1x8T9*)!}Qdz&R|CpZL4D@*WAR z{zB}jN62eec>X;k=oBMzIZ`vj6;&&awr%#8F?RkrZtYwMlL$;Lk>jv8GID5P~=*JW7hwT}W&Et{v$6`0574f}DcslYcd+3dxY z&0cpWofuRa4>`*ajr)jnEG?l4J>lDf1h+ zo!a=YZ6;_}{QBR2i`TDTVY-;``t>#b_-B8Cpa1b+;OhDsqISeOfvny92MpVRnd?O! zQRdYUW;w9-HN-31lNK%de(o~pr-e*i(}Og;CJ&q4*2rE97dMTG@a58PS9$I1zOuLD zhng(eDT7|Vc6dA7BGZQ>vKQR%AOppSSPC`ys z+K17(QfC#MME{v!xL%g?xC^|jp8V0Tmh0nR#gF2#bu6QV5i_4vWqDh5}x~QiD zEP*Z`aV3#-FmM^ZXRoHwg6F^JrWhdQ#aH0&2AJ|_B^Dle0xkz+Yo3(=0Vt@5!0P~c z;%_GU1sBEV;uf)0+ZNNkQ&B2&P=&$fiU8cdWtbzpK(oD3d4Lxxkq5?X^^vcL*{CFI zpVa$Mm8bBeG4bQABazuaL6?@wx0E3?>XnHr`~)kO@Ya+WNRrfWOF!;J6UEeKh|HWd zUmKcvAKv}tO`i2U1gz;%wf;BZp-(`~_lcw4UDg|By_-HKvX|04>8ji&e#K~202OB2Zh z!gk8`oZfk8QCgL?iCz3Ujx`L&k=e^iI_ z#k@UBi4k%ER5I+h0HFjEsHg*{*tgRKq8regK$+F*Ry!F(K29`fPfv^`Wvbr_%(;}P ztE=GGzy2*=zrMz%O}M^N{Mj%68Xtf3V_aWfV@#~%IBiQHnkjj^^+1KOZ}Y_ z%8xv;As2f9gCSy@f+jNT)e$mmAu#sV1=<^CwOj#!jI5aF8JC+U_@h7mbF+-3VcuTh z@BjY4;OhD%rl|paMh#;$^_%pfeH(>2JKDe?FIJF54)r?=KEglzk8%Z@y=wEeh8`U-YWxycw~6 zk+3^sy^nQ;x6@^Uh@HME5iSzTD%S*|b(%;Qo=2IXwFFGe8(Q0e!W@+VqtydNF%^Gg zoW7NKl!XHNs*74VH%iJ>xs&4%0eTY;carDC_+kLcc958z9RMhJG*#iL29!oa4p5$E zc&3DEgQX?vN#JUX(4=9WXMFL+ukq&k8X~~91Ap0xd}X&8`eOM*^bUx-1Rd9SdJGWV4#(b%zkZT8X@^+L`lJe`JY; zKN2Gr7{aJnv7(p*?@RzLZWAghW_{DemfK?l>cFBdinx{_p=5FJFF->EZ(E2&Q7_b~ic~Lv_WH7+wTGrhSbiTdas^lVVu`5nMp~uIC?xcxGaYSpU1_nW71sMIX}x-Y_nsNt3X=N z1H!9vS6Ya!_3}Z$I3IH{TZG|~vBX7og2F#$X|w>pvH)e8RvSSiyId75LpT(gJEJI{ zEcn>)s+c4$Arf=3j=V8i)4O1Bj`=7*2`&VH@H9Y)?ucg6b>h!*|8V7&tmqk|w?#Z9seDmM@_x?qi~0&#SXb?t?I=fqYf+ixy+B zp9UCOIwxG2>bP@dr~mo8g5xHTW@lT3#DJ8u^%AY{xL^U$;73ZcHffQ^!aAD+jM(Wh z@Oeo@-k~e`UTycNI$w(4TSB=KZA+|40CC!+PfilU<*bEAP1}pkn5GG@-(2I%FTaFL z4cocn>En;^=YRG;L+6brO4{v$hTmtX_^Gbwk^C6+R-jAI+z}C50HU6v&Ew4LdM8S~ zn-X5rW1;!#+Fz8xi*m;>Kz+ZtyxM8#wiT|Go9m>aB*rx+v;-m(Ty#k9hA3#QxaHz1 z99sWT@sn{)D0LS+W7aY)5s9Cc7&x2WadU7xcYOTuPw~;mKf(2Oi_N1Ae)X$=!I!`N zcWnHGKS9GJu&X%tjvq@0N5p_GJ z8txwNE})x2n}Yrfqb0Y}rI6^HUj>@jJ@I2(wuom6Vj?JL9cJRWSw%>mu& z>iw7UovjV>nqtOU7^_8{9s=qZ>ZE@#auBOAKt2u#$K}U_Iwoso#uN7zQ5KA2Vw(xN z?0M@CGZ<7Ao2lXZ@4m+${_qtx(+1aXuJP%Q{s=$&sV4s+Jx>+8f+PmV(qxbQXAO8vF zt>WV10^fZ72mIT={tGr27sVRsaXVX=5lfHfS|iPL#Z?=R${JY9OoL|W0 z@76?k8p_tJvh~Y8q10Rvc4e$WiBiNeEv*_`3?Zl7lH`Kf6|q8hG3k0mtF&nx3 z9eS&Tkp`l{EI^8_a2z24NEOuVd(0Af3RD~+epYy%sDJ#Mf@Kg8VI3Vn`%LLxcxCL9 z5|W4v`s8~wiu!b&BET($BCj(pv@L>2T=1*r{Sw_T$_fRu0#f1(7b*?~5C^y<=2@z) zI>!~d0v4WAz`*)~`8h4NMN%XCTbkOfcrroYVG(+v1YudX83F#N9@%tYD(sFk+`R(C z$)lxHbu{9h9+MGTz@vL-7`Bw;f6Lvnr>aLFboq{)^xXqQ*)Wg5EaKidwrPMiwvR3g zfr4W6x_F+GaL0_uNq7h zbk^D$*OP0sJ6io~yG5d@T@kV<%)m`q`7G8|%hiO)a(Q<#N6;p)vB{NsQ7JDAg{ zY@;Cx)&T8$>W9bC8kLy<7Z0d z7Hdps$Mu90bkEz)%~Zh28rBxAEsnRkgQ=q#kLK(F#<%o@Aa;asRD(2ttxG9%OFqa@ zQSo5VyPt4Ps4(x#5(sJtr>;Z6aBXwRQ8AB_)4r>1 zlN``enGfa3i#BhR<(a>r09tr$SfMw!$Bc#U z>wqpLZ&ywESzI*lE38a&$Q8s?tX9t5r!cTHw0-QT^SO_Ky*){x$eZNWo)tdKDOp-! zl5`(rdMQ*myU@nJueufadu2s-_wVUUb%6T;LS0u`77537ZrFZ(J5Fzk+G z^yo|ZS%FjOcYxsad9v@?N@Mv)04lfE<2$#|>VO8zGE?%ynqs0HHHtaea=>OqS7nhF zv+Lkc>ah=7QRX250zG%Tne=tnLD9s6HstP_<@p~Djucp4v_$7G#d-*TDXl6-nK$mk ziwA9~NyyC9vrA>LJL|;SDygsqmQ%rf>Q-T04EAq#+hgI7l1R)?ClynW9{N&)B+ z^01_uO(%1hjUwE?@6wT;pf1*G9Bb^}CU;NB0EW%r6Lrsn|KufLA~nclWZw1}zx&lj6eO;{|Vcz!mN9rUygsVizMThdF8pdW$;ilA#=W(+C)gN`uA}Z- zsJO}-6|ClDNy~#t&{K#+f|nmtsm+o^cto%?!S!~=`|o{-Pk;0|uC_Ba7Zd*di+{zp z-~Iuc%?5D?wa%ex$IYyLpd zU_n<-{Iv2;y@_>MhEN&OJ6mb*f0SQWa*USGFaExJxL$A2 z0IToRS8f*qSe7xPfBD(U^G;SOPx0eu&5b1H1yDoumVuwy(=j<7cBB;}5|G=4oVq1$ zed*fKWP{H?{{^~En5GTB{qAf0+rR!ZHk%0%C-;8yq$&WBOTd!CA%&>Kg36M@uML8z z(unCp!c5$@KBe_l3i=L@Gwt={l#F;Ky_SqjYl~U_?$nd=K7c%N3}A*)MaSxZXgS6q zPR29DWw{VWVVXj*&|KKp1r3Xp2Zn;YPR6Ot0BRWR$&R{YSx+YDDV8kU!Z)w+F9C1% zJ%Nk{?pl_BRO$(gDEwU!LrDY^@L(&SCy}t)11N@~(gmryB}FM9-Mv_}NCm~>)a;9t z_;d*a*mumG=ne!@@b|?W9V!G0>8>7$Rl^9Pxxz*{?8*fc?uCSvhqR-^)*0uyN%ao+ zU_EB3@&3vLIzmh%!1%}HQ49At*Ns4cj^VI2;aV49NE}v8dUV@j${h(>-1L@n;LicJ z6NWpUSg%tia$Ur!EegmCCff~O0xEH#$F|vNmdfsgPg;V}D-SDaqKXuZ` z*|C{6`0A^#@#@WM$kfnh;FrJrOI%(&v6J>lbx}V$+dZj8ei_Rb&urv9pz!uWAXo}5;=5B196AQ{-c*ctR|M~kji2CtxJ_Mq!v~AMX`R`DAJsi4 z=zczcCA!Tn$fpPcg)!jws#6I8ir#@a_D~D9*Bw9l^rv|A_|(E_MY60mD{GZ$6$mimz)U$fBdeFGlgq5uq|g)~TdPvC$*Q+Aj!M?af8QXpnk?|rq0rW?pKXT9 z7MQ$V&%98N0b2Tjm|MRqzWm+qY&6>$Po6x(=Rf@=uHV@G1_JnX&anIzD7tJTFJ=Iw z!P5<#;UUB{jG5jStd=!hN?;$kZEALqVMPUF{nZq^aev7^9eK2F_VsnF@*lH+PXi2x z>axGBL;SABy;D&*N=}#!>54%ixYUf(%J`0mL9VX3wT~0+W{Rph%2dSMLosi+c=G6d z{OIGKV7~5nwAtV{U;HaxzW4^yM263JeY*H4_52J0rayakTREdW!3SwuMaCk0pw*k< zeFw9LiD1_S6aN-;w6?s9U|hVZVAbfy7~N1P;1nqN2YjEg&Rr!eP6LU*GKsG|wXk@E z(B+bBO6ia`c9dqBX3zLZfJOZ zhg4u_zjT-&4+Yd|_xYdYze8udDPG~LVS&~&0R;38@U&4z`9r@|uTm&g2UfvH_5fEZ zk)Eha@j`uJECVi}Z6b$fOitO%TD)2~E#MCH%!uc;H?A&2(IdcsDWg>UISoEuZGcW_ z>et^kCi#tX0eGHVL#`JCZ29&>K|H$!m^)h(bidcTfmfVp_^$a4f* z&Zq8KRi#JL?m&^L;pK~$`1b2>Akzj{SJ(LbC%?e^&whmM_3VeJC2xy%NT*DaA^BH9 z-ZWz?s1t^W&k^|qh>*Iu$H7h=tDoMo+%_p; za6!i3;~;uiq3{LO0>S2SpIrQQx*2-jPetBRS7@2#$~b>PxN7cQ>q1BGicdfL8KiA6 zO%2aqe2Xu>_%}?x_cYyn=}A$MO|yR5BAS5&te#1^}5n$fB4^6ATDv3h-9x+VWUOBwK%$# z{FCl<7y4^@DaKKjqif+9T`%pF3Y1sJddIVCsVpOd+XZm;t@3ov4~2(yVbN#EE(w>z z0I<7^H9wXql&FN#)}dcI5!BF{cTL?E^XZj#nF0`kLV95(@%P5La6l9!Yb_E8Yy8v1 zz!I`F+o|I>(J6U+2UzCZ*cl!MB|2U5zO_t!Z3q7#|Ao9*j04u~bhHl^s1y&L>Th@kCs1G-{>{3%J}7SmBJEm!a z-~Ztoyt#S<(T3J8@bjPl1?<8q_QQDD&eES;`BK-IE-*TH0(tRVrQ96lB7(2V%xjLj z=8aT?LL^VCO?*7QvsTuE?Z*b-4|(|8IWh^4{r)y31m zSr@U@h>M@#Lqd(Cd(dp&c6{*u$N2Es$C$S>Ai%%=>p!9Q>r^xV#+&`D7IZG)78B1z zlR$=pQg9D~i=jwLQj67QStxEnT5+0UD!1>sK+(daJa>Lj>MOqwr??4r*)C(|sl5W# zuqWf^%ObLaW>e7?Com28lsYzGpSkY1U!6-Y>ATj51>yK^yJz|+L||Q@QP@9a7O&Z*aiUI zO?V>xx;mwc5LSeUvG&5Q_6(UGNa4;Mdjf*zBKCJAU&Vln;wn}Z74|qMqbTFHJ6Q-h<#wD(%djW_l?me; zWt&)7f{cNuHD>crflK)sKps~+0*cVxi|;&~7fO4{k-2~0lhAx7tH&bvg6{UA@kf=yvpP?GM4Cxki=LwnS}7BJU|<0h=$+B^Uv)FMPP-jr@`cfNeXbvbD*W4XFDYq{*fUo`3&6Uc7vP)*52}|K1fJpbVXZDoEV&-3KW>9ti%i{U_ zEN2Y?05^k&weQ#V6^!v$S2C@9uO2IO_ib9^UcbBED0EG5NLVdORM?5qTL>6IM-yP4 zXT1NxCwTh!8T!@^w)piI|LTI0$bB&$7l>m5)#4G9*Hkl;I9yRcCKUq9Jd)**IS8Ef`-{6zD+)N`XisRnw+HLGBA2vki)S2$^b?aMEy zy~=%bjHlKynamXjAxX!2=6-?zYibE%a%WT~<)sIsN1Rxp=E)ftfV`*}KV7bY{2BQT zid2jkUbOZ#`6E4JFa@p@gr>Ne2pK$ws(?z58ogPqP!Lde@q%k@pfLZX8+tgK#h+d0 z@x}=`x3k-w4aW*}TVUcEI?DKl~1}c5JUZ-hcKn zKKLZ5jek{a0a>yVYl+S3WnSosp@rLO)Gr<=P`4i${DbTsVknoGe}Al1W-pDrUPKiq{}6$mRz_cX_>&es*0DF$E~V`j#8D(JPMV~;H{iy(m6td%oZA6Q zFS#L>Xl_a-)`Fep72nfa5IobFgv%wEbKx4!9efMH?g&YxVJ=@Q3}g$Y@GzvYlBepW z7suM;S@-t5mQw)P9<>!cStIX_VMmq*CLD8)A(mm!w8+T7ciN3~U*_G|-%ULuUmZZX zTqW<$+AuqqR5!Q)v70VM-P@MiXVpQP1ORT(o|lhhehhmjxlUYetJ?06)*4>DdWG-5 z{~pqSd8_#G=Re1^d4%2z>v$42y?Y(AoefjiaPHO@L0JL{5A2K+&SIsz&KC;&SkPtlj@&u~Gu=pZ8FDtdWqeYEwjBkPi%dk_ z+mtT+Cct){@$A`0c>MI4Gk3=qzy6g8Yvm4u6^EwRQ_tsKEtH#0K&KXOq!Uni_@k0Z zTl?zbO=|Xh?zxS?u_%@&^jW;^01HSJJQxARa?COBE6+$_@DY=sdL>8_EvA@dMwjl; z^TUA7+NJBPKd?dal(>1@-9uznNDE6M7xd_m3pt8J`w>$uAj9@qYsP>1Yz*IF82P+R zN&Zd`PL3^p)f~sZPIxG;SVFCw zEgxXqb!*-8e^V;cFuk&)k9|z$*J~l%VZ2>vIlvSJS|c15x6;L2=Oz5XHN*{%T2Pve z1DNRv6d-OFbP~sakpR&~oSux?fq6~hC#Ldh&Fd0MI@jx%aK^AnE1z*3<^>Zqf+~8P z0nj*~%XJ&!k=h?Y>o&J7jt#D$lu9+}+|d4Ph8AtvvLOhc5l~plI)j0& z;76Ez`sVAep|H~epFaHnpZ@5l*v<(<>1}Ha4~4-dkr-%47;lpn&F+h+U=Pk2zAYl? zoqgF22%fX-Q|yBmbtTleczPWGER&RWla}sQG6By1W>#e2JQA~XKA5f9=i(^MCUp)@ zO_@nmGVYBB6vJHu+`mfU0Sd+qKKkg#n7d%wZ1B||eutOOpQBBexqMX|(NZYV-EOG= zAOcXwm?h@#wuuRZP!KMBg8u6+$2jkwPnoX|v>s5GCinkiKO;pECV1ssq^EpG8t=Lj z9YUvjy^ceJ-Zp)C?JSd)!sQ?0e7spMl^T;PlkszGF3e`e_Yi`Q)(n6U@Y=PUrbZ=S zT>H%#g?!aQWq2YX6F+GQrics}L1CiI^ROopH0(i;M@bdGd$MXgC0`qtc^VYezsY-d zx7M{;`<%5CB=ljvtJkv+z)~Z8GW0TH^VwE?L>0r{f3b@F%c2M!?2N1|Bh{-bo#b`8 z8|^J?pLDB+wI$c~P>A-q_^t#so>{o+b!kMKwJ`|gs$4^@s22WC&q2_OV{$9I>kPh8 z>y2Z4xn8_6+XC(KLUoaZT>6XzngYMiM3{vSSoTmy@3Y0qVO#!KQ=~>R(NulT7;e%D zj5P_p9PVw%x)cm!#$7G+-h%P_q)=-UuCA`|{P_z^Q-gNk(;xpaCb{sd8UzeQXly+d zs5aU<0C>5S88sTQ9|sS?*J(8Dv&_z?F?Y+p+`XGT2}^l@eh*J=JvMCPK6Vp{%}w@) zJU`ACt&rvM8rJucn~}@aAJMR$cE{vaMN!1V=w%`FOGqO`VIrN{rPvAuq?MUTSgt5} zVxhWqNZm7=uxi=Ls4xZQfeKzApv|7mAyk%QW;b)r(tD8OwjcWzyMsn74$m2cy?Z}Y z9C$U)x-N7IFGIs{!lWo{KX-mqR@%@LRZlb&06Om+=ey>>sj=|kKU z#AqXpnEBmZw=~$9A$-A-?*f_zFefOGMccV5C6wcW!x1Z}(6_E7C@+6XWfoz#)hX7L zXPI4S?`!j=9W4Zx+D(iE16p1eWGbUSyWlO;yCGd-R9tiF+xn=$dF8Yv0J`EQO@qkp zjp)AHfOPX;crCnjpbtRHMrQ2~BA_*V`|UUAv&-?PAL65rKE=HCvshFxOZCu}d8Ry} z$2f8t>SQ`V^tBnupGO+W_nBaSdKh6(2w>?txY?DkudGmqpKs9!Z?Gc`9my=5NqK@Bc%62(W12S6Nr|vR zD;5J8#_AMjmbI{m1T9(!hpy>O==3O1#6`RtsFp--TWbM+47nq{zI86Ss7`cIRh$Ix zV`j7iaJOQ5nO!i1|1bq;By4)9B6cy9xl$^AKjt~xVzog%FbCy-n1PVQxm*- z^#(7VzeJnNYw_u4KLg_UW*=R15Y_03^!l480Q$*+E&Ae<qc@?v>Yz&btpki2vQiXbqseOB4-@LH zZtC-@oJXrS_CY6!T&DV7@7>Xs5!LKu7qo>&%Vkc5$d9dlt+kD92*U0OK3 z5Q&`w7{$)-I{Z@?_*(iR;f}8~;ZHh;YwidbVp8t29$Y2B zDdpUrf#dY}%5}i^;-a8ZVywqYR~-P}h)n<@`{myA5Q;t#fkwTKrjC$h9vn5z$@PcsnbeJ^KWcY|vW6%abT8*dLl~|?vxmRu}EDHt2;6fb`F6Tlm5vouA5`~kN zcg$U06E)}M0ugm<1&CY26ktr+dT+pOH(XGpX;$Y;*RMDwf4HPfI`}x+82h&NctTlz z*r_Swph}3_xOKNR@Zd4dQ-p6Ml|qik-m5Tkfw}D)$<>}>Pm(_X2NANE zcXv^1eUEW}mt_P4%@|X(L3DB;l%BRF(2@eEn$L5A)TMMFwl;Uq@t{%$1l^M$7cYnG z=cPe@qhj10U~9*`fYuM`f{9jrA9p`!FoSvaA`GB@uZ04e&4kyl-{8%gH)sGZHjnV5 zPkx4Zc3xvx!s}tif?|f~4DFqJ02~xs4oIkYQ8Taz4$xDM#JuNPS?Zd-p9RV8K?kpv zJ=*}!-T_xik(gZ2Zrl&vN`4QB;HhM0=-h#A527ygQv6r@?3Pt-cp;k5sNJ9UMQ%K6 zjM3VJXYYT4>khQ3;Saz65`DXM8A2=AY`A(XrtKOVTga25Mz26v;I0rTPJ~;qM4*jZ z{QSf#URYH0Q92?is_f6W)0^(U=+vmp%sN$Q?>mdWaZ<{siTCp_VU5C^2X9-YJXL>M zpYvXL@2^VaS2PdHfZ-kS2R$YokV)tSWMvqNDzH=-ZSj-JoTmUXkP=>{=KsR`(~^|S zq6)>#hCu~m3a(g=K*VA#V&F00LHL$Mva~H6s89ff!=%2#-<-!7PmOwdQKm}Qrk3j* ztirl8Wymo1xmGcNwR$lL6J!BY$A9D+P_POBT5C5pcxs2jvAM@J zQQf5WfiI%D#%5QN7CP%iSVj`pmU6Ksf(+eZg8&`A0*R!NM~|LB(XqY0!tcNO5^ZB! zjan>eapk{sjAq}{?N}B7X+ak_G(f_5qgl27+TwMMMOGI_TOj1!*`W)Te~sE=CF*DK zIwo+zgw!14sR@fcK2n+DT=}q4MKF0zK&#^bLq1}$#krSwcm-1CsmL%)iposb$q}S@ zKmin1di{|*mrS9F}HL}HGXRMZV zUSHWk)aoJJR)i!zC$2=0y-}h62qHuk|0fsjK$j( zLUr=$_D9027C)P`VV$=Lc=7UkZ08x;6_201j}Jcn1oJ#Y=&h2<6M)i7h(*+K3mp>qJqj*y5pez zKPhi>!Apm2#q*>v@l0#=J=bVqg|N^SA93lpAjm$L6|tzN!KJ!BH^ZE7nhbC%l%fbGX=vTDt3%jP?fC#r2$SOz zylc2tZ5v~_FRjxi@ZvU2^~5MkMzhoI6te>)iw;=(bjvmvXc2Ac+NJ`-$ays>lq<7Z zK?98e3{w{F)LmZASbFt``5Ij;$>6i%f|T&w`C1YtEb5{)Tespa`cUx-_gvG9V;`iC z!T3A!P%GaQYhL+m)H%BR>u=#rXzn$Pg=>A(h~`^8<^f8&$H9SI+=bYgENLGry#p}i zO^d%~FACik{$lSomJR?qS%}CRGY$pl4KO-RCERCTzn!2^J^0B9pBD)EB}0$^?QLq< zUe9>>>J?;Tb$;^6PfX4VmtzU5Qm(77U;#oF2%yRvFtI2-bX7eAV4vK*&vKIg^0ONKVxG{Ay8}Nq7{$xQ@Aw3wc={e`vI7Nt(beq<>ezh zefkVrPaORHS6@c$<6>M%rWwYRi%1HS1s%%$^O-CmOzNh)Ukf+s79dxw7B*9Fa z^GtNfxuRkawa`g(P$J#zGqaE<2sVH;w6*~-nWupqAsQAJhbW3T55PXmP(!YgD(tO) zOT{&8*Nrm~uy{rS6?Sf~EYgR0E5gpf`P4%d>f;<$yf1CImw?| zDd}d1=O+2&HqlT{)ysrl4#E**BjW?AwNeV3nQq9F^p@KcD?aYMhuc5o)d;Hq)NFX) zwyF7PoT3q*BYDezU$sUB0U50CGXma9qp!%mmy}1@d5KVmu}1|e!oxDXZ=|bvL@m_N z#<8Z0m+%ft28tXbUyPy?UOayeQAOW&JbU&DE-xRWce{O2ySV)6oYDbYn99ku5r8ie zAPewf-?V`K2QIhq5)1%fR8-?<%Q9?dxq}-ciE2ACxEp|s?4ls}Cz;Hz`sIZABC!OT z2|O*Xqx)7WtFQT?XjZY`Mco8CE8cth0X7#Gm_%{)`Zb<^`>owz6)4fIt39XQ)m;sd zEqg(jr3&rKmyn(82wIu~4e0xgT1ds33vT!WE%RFi6C?VCCG_<{$Nvy*+@OtevO$iHPNyK!=!rnq=0x z*)zLB+q@GJhJ&EQb*ab;c2d!3n?gnXASt7n0Yb(oTbt0NVe;_A)NIRBSeM-GRptb) zyv>uaapjYVZ8=}uBM!6fMbN#nA(@n`v4BY^6T5bKrH}^-Py7_gSo$KiPo-3;oBXy| zb5b~DI24HeAdhFF*qEW_Sp+RDV}4CAuyecS$~vi|9QqxTUGEJ*CLwMSgv53L&ZkWl z3Ve5qU*?qm6F-g7)3%kK0)`}FZp&d)Ku(3s{%=To3}E? zVxg&4AzTbA%G>}1#rkP39K$VKge4eiAOny5T4^!3l!5GTki{=fp`vAS9o&iOF$&w7 zYR|{HDnNi7?&)q&Ogf`^QkHa{`R+En3s82cUWgRQnc_exN8whNt&JK6bAs8NHJ+KC z$&=Yn`>l{0%y1X&sBYc0qHNKV_i8=W8#`b%|F7k)5Shs^=S*&m=Zgo4V^LL10(S%@ zawFKTe4i|_!f$A>W0nB;O>>#6goqv2H4z31LwVv>|ISyCQlUd`BOVq;YI%5-d@=q7tzK#vNoxeRMu)$SpLLtN*D@KU$}Rka-}oV%DQ z$#EC!Kc+Q6UaslwcE-zBFZ=<;haY}w@|%1ahNF8iiG;=r^uvAc2-w{8z)gyN&1If|C68xj}@j1ixK1fr79`97Wbf5B)|y8L&|F7 z%C*JWI^vA(LK7?HJ=nG)b8&LcEOICUPiJmLVO!&rjqs0(MnVX6DXNMt=?I+wbg4%y znthMw;5b0-NMKc@*Tg22d{k+cUK_$TK&5#CWYW3jqSTY{cqOWqdbPU(cA7D3+veKV zjd*gO`XL&|r`%@LVzd%` z>H-|tsn@(WBSTjrc5aDbfvr!XC(d#{i`%35Jk2O~ya>Ue@#WV0IeV8Z*TA2yGDpnd zTYB?E#aTpx?9v1;UcAJ!XYXS>E8ctdAvTv6=>6I*UJ_U?fy^U6irU3QRe`umnu?sp zAQ_k`36yT2M~i&ZymHcTA#aZ{s+am!i)^}0IqaVX5Zj>mkHwkbkT-z)x`7n7@tvw= z=`%@1HLkT3RW$b)*n}{aRV99liSADFa@eE^NLWlseWHc~W*j(3vul1IKY0%q7ncA8 zZ?3QK{rBG%hEM?APk-Vf++XI5hv?#SCH{pNRbL-mB2o%gdfsWZHOswoz!t|S&=cEA}qg#74^w;eFu_9@c}6N(ca!K=_2 zc=Gstz~iegUOmUv^=q_=nX0WMs#x1Q!ibX*v8XCxZOdRqZy8&qKy1aWUX^r{w*$N zvCIOqyU1sz^zGC#fN}gL#z(Ey{rI$C8>Ti<`Wa|Y#)na^na%iZdf?qPY%VlZF98!0 zV;0486eK1H74RLBNfQ4Ra2L$@9d=#)B&p^BKLI0SE%PCXDJ4*|TY*d7NdVUtzjIws zi5i%8e@t0B<{73;px4EDpCG~8>*5xojQy)U2Gk-fixDf-LmVySqx!)~;q{P0FCE{n z_jH)co%tYe#m;r(b4Cvw{|?|OW4K6tv#}^9KjR@LoYSgm7X^vSDK+`j9hgA3fLf?( zQi5S1cT?FI#V-+3=C%mwuQ`p@t7trBzyDJ+0JqzY*Ke*N04AC6!TTS(g>H%+T@WV| zd)Oq^;l;CeSiQDwqT{APVQ=Sh&-oYJWDb^|deKe~v~&^)5~B?&ol; z-}qHn!VrDB14YC#lj&Mec4-7cM9TS@$FS=ubSov{50{<^u1wA;fQ4fb8QCiYWBHJt zq{Z{X(UO+oPSbcNfgShE!!DAFFwdCG!|iAsN30q*HJTsi9C3fyM8AZdhftOFwkh%1 zh0+wbQbD0rli&n)WHg34ddyb>)lhAIw6JsmX1IdamGy`4rc5pQEyuL9$#>(l@rS^? zS6xtn#F!VrHSb;U`R7>_ruf><_qLuq@FB>!E)_*@CbWyF2rrSULop89w*E~3;>JmS z7ZfCjXMe?WaF&DC_@4V5TAe0@FS1q?>xA~?HEYxI6cQ2yt z;$a^#OqPKg(~fq9u3|z5<_^^@=!rxx3AHd4&ep(ediVYn!Pqc<#nqFs z=8K2IKO_KRODd^Q>*wK!W&7c|sAIAx6`3T)FJeyXMJq!Yfkr-3LC)?Q63-x$_zIyZ zV(FcT&x+?~(R6XOTB+H^-H#h#<}Wmxvnzp(dd)3^*j1p$kKwu$33srBP_^DR5|e#F z0}5bko+uVTz%L|GKNrDzzCl>6YM=@{jT5kl4}{p|^On4>KKdzvR>~*^@whd|F`F$;yHsYDctuAo;liQ7RGT zS@qDE2fF>EwrUl}r>*3XWE*CWWNt?-ks!Rn=COxFG*Cteh84j5>?B|0yZ;EB2n2= ztPl562*g2z9Tg40x6B%?Rn$QTZyh9$Dr*LfK8bhjnb%jZps=vc<0sE>v3Ug5+514x z7h-op?wShXWf7$3MSqrmd`&fQGzB~3DUb9dw`f;0ZAvG8>!iz`P>L)))Qrc+P&EI`K` z7%9MNSl8BY126k<(iRKM6s0Np+{$Mlz+aVQA$3NW7R&-g_< z!i?xqiEbIIm(@dkQ9&os<%%U zbiF}wxs6L*Ub;hNhxLaL1`QHH$`fT<2|ARF2#SHMbo9h>#P+-$O$|)F0Xi2D!-T;e zGDqTk`s%yd_*_w(S^kebV_Qp&RW(it`3tZ-py zGI=d(5di2OTI~@YzPh@?cD7{2&E^tMp1x=2L;!h#S>%n7@ZG#(9xCWvA}Kc@tgq7{ z^ni{&r`PnZW$9(SOFheSR7S%7K~RD0#v&{MN-^yq04lZoec8$NK~^v@ypbpknhVGO zM}5{|Ol5-HgfS7^qsLFtWr8-rt5+|uy}mNR(1%vQr$;_ zN_V%oGH{O_nkbs@N9}#V@FiSPVlhvT#(blQO@5PcZP4BVnVCc5z*+f2x-m3 zfyq)7)WptQ9odsedJ|3H+E(24gKJOyt_&?qr~`;Iz*J~b+|M%fCVCqGGA}uKYnO_B z0R&9xSHMxnPN2)Yr!F0{xKo}0Kw;K@{MiFg^MWDO84B}K+IbYr(CL_!zC3-MEz*sDnzdf(#e>N;`_ z9zS^>-Q{B!-e+O+-4auRCn2f=O>3yu0EY4zr#JI;);vQum7LG00IjDu$ojL z`Q2cZ$qnd+ZZM!^)&c;}mml4Owf)_}$$H<|6qA-HR78BDX%X2_&E@OQ5!q?Oqeo9I z7oZ7Vy?hSUZV6SW)&ZHyZxt*;B9abAlG%42=M!D_pBQ}{w-!N=b@*1Euv$|YEuCQx{Asm=xIf8|E6d&n9i|bx7bs+66G;`S0$1AP5zh5QDa|m)it0 z=__0_su61j5bXqw17vgV_<2dPq++6;Se%(bVXO?LP-xb(J_@f{xPj=f^7gW1U)jFd z2c9q+(w&yA4)5;nHt<&oUR8Vw3$QHXCpcwSBXO;+c}N&Xs_=tu%6J`A5#X_%NLEKC zJs)r|!bJnR%#nmX>si4=*JOz+nh%Fnp{J1UKP9=6}_^R99D5ur11h$4{O)F*-yVnrv(yM4?Tb zUs{N#CWeHi&5760fj*m@qPN(=Rf4?3C3&wVNavd7&-=(DV5^5q$Z^4t@NfeHQ2=O( zSX1|CAmn{x+Vv)6M|QrWVsnJH)A2|i_nkKpp+5xUxDv)8X)fX7;95}&{0 z{$5&@ks-W5Ws;rtIy%<89b;b&p=(9?K*^KfQIw+=q%eVBFe7N@E$}T+&8^O=%!jT> zv6h(V6$vj(<}{_J6`>E=b}k^xyQ!A)2}(vDn!#*;PP6)aq0#|0mxL#MwRB$=N{;x( z=f(xBOm5wVyEhq>3aGi2ZXef$>C})3&8_;zqcnUwDO};2;xsF}i3N;W7gP9XrsRF! zvlCqw9Y$aM zcWCw+apFR3Z7=lo){M-A_L$@gP6~0Zo?B4M9g3pnLTC7MZI|)RBEv&U3 zMhp~w5@6Dqf!jF%7Bd1F)amGIfW`8qW#P^8ahlr*9HaoA z*Fu0y5N-U!uv8?0Quk=`lX-|oV|ER!rat58uPp%CA*FvVKydRxK=8P62p$aUbjhGL zwSJh50->GxtuK(s8m7CljEAgPixHnose>*@@~(a7aZqQ0?h?apV4I`z23mQ*wAtX| z;sSu6ci{EQmxHCqi!5TBiZ`#qGw-RoI?=^=isq3AM$34%(xb3Gyfgq?ckCn&o1BPfCt#X(oTurI?b<@~8H-2g}aO?XoH zO38n4dP(q+(Up8d?H)IqA)(u*TcJx} zcUq0&3YmON)sriWXXn$~!!tlkEs$I3F*7SNu8%?XtU0T4)*XB@0UX`eisuvYZUcfL zjt!YS+l3kb%*vqz$luAsJbqRhWh5udehTlfa9Zk2MJ%J&taAe-6PCNLM@#m!utq|U z#_*r-;S;f0)Mg5f3CpSYN-{9gb7tUc4uI7}(bW^fwIdv5y@SUB@nWl4Yz;NF-A26; zj8jt44R4<@3n21$lyszT%l?T9=BwF2>a4ifTwUd#Ue1^f1v>>txWKwNBW%zCZ2J{n zU%ifrp(u?DhP;0o*QolcjErfwwqU~2)vje@?`)Z*iP=L53J>2vGo|0{h)GC8=Rq1S zP)xuG5JJKMkZZ75C{EiZ*{4FuSTIz+yzHlk#1;3LIABoDkqQ5))W}!F?;)2)7jTPt z82O`_rvjWi($hJi#EI>{5gE>G;|S|I9Viq#V{ty`J{ITls{sL9s2B89V1yr3q7-TMz*@2@ELclvbMp6Y~n3zugL=fK^{tJR9Bw zVfPyVyHk9j{COMY)X--?Ja8>ZczQ z04ubmoJFiB<15w?*02^Z>N0?Qt`QQf9MH?U>4ih=Sv#@Pbtol^^rFlSuBA5(S%awa zc^Wz?R}}Eja(D-kr=)J@D|GE>BG_y$aCz|tRi)Nr|c28}1Va27K5y9z{VF41k zs<lVB0&0DaK|3%WXjll5owDSQ=-@Tda-;P1uOWk{SN3O+e?C z7enK8X$I{b?T3=fR>90^E%POCw^wli315J^6+=3>1wK4UPf$|Gy6v!O$nb5x%6hz4 zfv9;RskluW@NyhT&L7}B28r)%UK>R1nBB0(V=p~D4vQ;$L3GctIarm3jZCnFCt9(S zD-?PKrW6RCjH)npQF^SLj;bbr%|*_$(A<*r_KY`XG(T?J+7d`?I_pUvx3E+uplj}j zS5v~$-0e#m!j+HY(4~?ALRD+bttx4P;Jc!Jj2Bvd5|STj0d_6m+5w8VLhI7d zoP(QMynFH%x+m#1*r|mC-EhF3>V>7`xi|(gB_wE_Zg%zw$){4lG-;vq0wC5wwYq(l zK`Gb0UUI*EZgPzY%n_Oho`#>D?O!;@>vXqc!tjojqU9a9N10EV-yZ|VnJZM$N- zopE__iPi)cmyhuB)i>y|v&q&B;*cXr<`8}V#Ls9PWeTck&G5M`%GD>0n&N9xhF zvb)9e9*Zsjz(M6-=FkRn2q@@|dxP)N8Axl>vROfu4}n_&bwWdcR|V>dFqlP9_v+97 zID453RlqE0#f*!|j{lV=xO(#%+Goh*)|or$8q|)xltkq4#Y5#86YEOFr#j->WFHq% zNvG(cjNueAIEAAxGI6GtHo1eP!i!{{IQU2iet4Te6?UAP4jwJrVZhGnGYg$oF?T0a zS8L8jB63>*Tc~&dg{LtNY~L43-suzxI5~NYBC0RCU7N~rmDX? zIU=dg=0H3d)L}vqX?|R_Al&=R4QXh0CxV{FN#rrI zA)S><(D-iha8qyUiGGb@(6g~!xHSpK47BiW5n=|kxbSVQ1?NQk*XNuwshQ{*icBQP z?8aYFb}az2x{$HgnM|k-+7zNK+|agVtwAS&ba7!T;R!N6P|WUv7T8*uJT#DpyyO`g z0N3QANVoe+x<4rvx@gV`ailC#fQN^I7JRf|&$J4vkZLr-E8*d=`IH`vREz@LtcQJ%AG<2azqY5JgY@{-}G$hP%3-`gZe{d z*#QWJ6;UeyrrZmAfmQ*)!6z%*{@aYjc4u4xJPxH`raT$(^71Kop8NHcxriorY1)FpTDSlFb& z0ExQNXZ+FxAuZk%ILrreVH;5so2TAga5lIi;;L{Dlq485w(AKmc!Vq5Au4K_-9eNF zk-R3jD|11}tOkB11i4z6rznP4m10LLg~bM5VAOMzs$msN;m61&kTQov3ho)P{|oF+ zdUbFFOIi~JWOk+4(DN$KoPR16&ThB$%CO;DAx~%<!EpN{|7(81RmYuzxytlzmc#z2y zThRnmc1&UmW6Zr?5l-d!0iJ#iz)yvc$z?O;InA!c9QbcqjH3dpa*oToSOSrGJ3Idf zE-oG;j_WNnV8SYme1}@@d9t;gC!6NEDA7!jtz4-I7K}&cJ-oIoOJjQJA-JvbR}&>S z1AwaZxyVP7*IE(MR=snyK9{(T`d#j;z~>oyf~8ACQlci2_l~D z{$Nu!YH{S=6x>poXM%e?QEiFAEuBa#a$3{Xr5@v!*$3{>ripnhYNl!i-II~y!Wh-) z{xCMJ*6Xs2&dxyjB@r{vT(DRnPdlVsVdi{1%l^Epzn7gypRiwd(PB zp@$UA+_$y?(aA^Pv}qatm$m^)yJir&+mHZ{bwQY0WJ0`X$kvSB9kBY1FqWL8>T!1e z5EGzV>ycmC*8M;jOiI%`tTo}z4$`p0a&)FfbeoD-8Dqt;ro|KLLMDXUo%!%nfa2g0 z&hM}e5{Nc&7dDSog}OkWU{`aO#Jv*Ypn{?&#$wJ56JUK2NhRoEJT2=ohCszz`X&Gu zzI%K!nOD5;yX#s|FZl}3C1N!dIptmxMS5ktPTpyJME(|Qp=VpB@BsV-<*EC+ibX(F!tb09(9 z#$*~GcO$qJQn-){WNH_Fy>G|W)tdknJzS94CgAZrN2^5mqyt^RO3Ne`oHIkELok#t zH}$@nzb+9Ux?4UzegT-2)-@B4oI=qS08hfQMLUT=T0_&iW0xKcDpm1%Qt7J`I04;w z-7g&!d=3L6x*8T9S|UJCHyK)GB1y8u#P*bq5tmEBm^pm}MFkn6rU@muXkdbmg)?lQ za*OZ+E#^kIuTIq3nJDK%#rE`*;~T{J(E(|5Bz%(8%Dsk>SL)WagRADx+XXL16FX$a z=NcArGmb9Sq9CphZoYsmJKS9O#v4=NV^{(jlsYWtF*D?S?ggIN?&b!CIm0tL8{doZ zpvBRf=Q&KM0#~~OK}os7FpVQ^cS+}($yHDkEp>h*kd?J!)r5&+OQVJzo%Oqg$|9*5 zYXE~huF)NGLGLarX$dz8Y&o2<;|5o(m+*)fpfW(xT@I0^IR~MB-J@hcE!cSIX7wg_ z>3$L)&rP6lRb+{KH@oNcFs-!(Q>5H85R~KqB7g{pg#fzRc?z4$N0uMuN?MviX5aaM z@W}=Lg&{{Bpb9KbMqL}T0f}l%+j?JKlQY&MtAF1mF>n_s=q>;_22BXoCYBLoa=uxZ z4K3z^1aQL|g-r+bI0=u4F=-!2zjUh}j8nKi7H8j*H>_2QKk*QU2I!0?4V!5L2AJmA zu8gE*-%BqOmC;H>AYST)+*6!1K`_bE2jX>ypjYc_%U6v!Mn~uB5prnElOPbt_Uh$43bXhonKF?GW}(xqZx+6v+!tH@c-WGQ1y3MTnKDPn ze@8uphswy02^KW-2&j#xwT9uMqT(fqywVU}l6)=SgtqxKioGA!W@$le1-q?+h^Bot@{V zkUu`-l0D+A4qQ%)rCDglL)AM@?*?;4cQ;@nb3E2NSEp6rQJKM`5(bF){C5G9fuZq0 zC`(c`KvV!G52q3Ufk0jWO+d203Mgl*42=5jCs!D`<=X>rE4PDs^<@kt97VUcnovjhZR!`leU4WKnuP{WUU4o|S#tp*=mFDDR8mg)u zTJbTN| zm|#c6;fYw%pKH=R9zxMk=oDMO3TPn%pjb2>d+gwms-&TLhC*mcD%RjaS6UJZoqaOF zB+O&b{9Jg9dXtvKeZec{MHOnDMkca?K_Mm#=nYxm+ z`vM9O@K90bWjwwNn34kb-@&~k@MKckWkAJ|(vfGfsBY1)!Q{_Hn9Au@`QOP}1d<&n zB<@*(5=4*}0UaEZ3&Zs5+qwx;Vj;@sI!ri+*tfYvVD@&DxclDpy?8csa|I*r zhW2y*6`)7Je)T>6y`}Xn=0Skx4v@aWh3DZ13Xs+&pPGPyodo3LjtyB)tf#bu82e z>0eFJ>Zl_!A$j7bb+p>qK3m{zke1+F5_<&}K5;?Y#OA+mXT&LyZNk(V=Gm=y>X?Y} zTVE^;I4~YSne7X%cY+@(cBd}8NFIne3{H+PUXFTyIZgQ&-KE@~SaV&v0f3WT55*N| zbHyFF`ySU&J~ci^s8}s(>yPK~cUt6C3DceEN&~s5h-!I|hq$X#k!aUq(t@tD*=XX4 zN;+enwWw#6+Ob}+~g_TMR4M1VMOr*Q$LOKx^o zq`6oB|Fr#Sv~5{+9teJOt$ohzUKw!Zs$$HxKh9KnsTR^~Q*kaaA5H&QO8Wfg&Xn^%_%t z2os~WMOo>P^a6sch`=U*wDIPaQs)2XWq3WugM{anuE z^W!_!_dju^oeo3HkWWJ({S3SLdTk9qPrhK)`L55XVW%0-F+ab?e)+o9>g|t}t+DeA zoCHXP!ZtqvMWDGttU!XDy_zC86&fTM^yPxSufGwBu+Nce8P!tTGQc@7DUIq0T~ka?TW5zGlcWQCCFxWu&}GogmyMQZ}-3pWN{Kfr}gBj zod}UFO)hQueNog*G+xOIjIKuw!qHApg@o=(`&!zQoBN#+Nn0S$_YB`y_r*7#wwuy> z?O5O%6Om%_R<;)qqtC0>aqbKlYvBcgTQrN?hm#1$#b4l*oM}p7=V1aZEDEK%tL4jKhlB5WVOF6}kSvCQn)iftzA)m~8;}$=_Rx2K~ z*nvFpvZ`M4m2oIqD^j*~FUr!#9)<3bOFVbJRbx~J=!q=_f-@??W(elwNR7NynQJd> zf7?kn7r@-d3O2zB?oDCq@hlvs@GPgyIZ2~T3*=PBcc`5vuOC5cUzQBb8ZKz#rVWM$ zo%a7~Kp8~9oP*VN3>~s^64dfGVw=W+E|q z^>Y<~+xP=0L_JnYoKJTeVZq(;FxSeAeZDJd?eGKD@yQOrXiCWZ9YQ z2)cc<8Em*d?tgFQDX*;FiETB1xlhi7rjQwFV9MTdFe|#zRX;H;)V4|uo^5EQ5(sYY z-;U9M+uVKRMA!LUQiiBi?gJE+V4?ZWTgVnbg5#l&6hPiJeXzaUZ00 z+={-}T=Zb)ieRvAa#S@|li4+|)-J%Shs@ec)j{We0@S}M8}}F|vhoGpoR!CD6R|pg zAuvcHG(pq%CJOadyd5KoE`2^MZ^s)4*#9E%lpf2`PZl5IyBiv2YJc}G5!9F==1;R~ zjsqE<&~0ETX#P5>t@W^37KQ+`5p8djLQjEWP=!jygcAFv9JxjESFX2qrhFw}(O_C8 zuiF#i{D^7JR`*=vTnPN^c(7DEuW=@vR?%4n0|eH1XA-YXSb45fFv%zd>&K?selN6R zL1+#LJ1dhpm~CwXxL7DBQVqKC>Xa<))rbp>#E}iJtk2um+LiRE!*B0uyv1KbSkfz0 zULc7_LEGw)muj4E70fE{0ch?QekinF)TBt604X$AgvAMbR~uxzH_o!hQh{_sS~W22 z$bnz+uAADnNjd=GmpUKe`Ua?S!7*bH+BI^sJ+^6fHjh5tPm+O{UUBT^-e{evptQ)= z#P}5QqW%U1}p< z&a5Y^)572Daoeg_XFAljT+{7+Pn}Q4j*c*8j9|b`eRIYIcdl|&l^Uh_%`I>LG;P(I zB5({qXL4^oGmC=O0071u>63L$JpqyC=DvAjZV$a`CNYs!+6o3Q({La^aAAyi|{v}ckoiMpV-Nb@88dXXt(Fw`r=G;^(% zhDugRilqa<>4P+$BI}Z81;#`Nf(�(C(E8NT@iFkm6qOIU+tEd!m=`w%|!n{wep# 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

m$lzFvqwtX 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

huE5vW}T2Jq7WfReWg@ekE6DrdmEudx1Uo2q(< zp*Hi*uo6o>*&zVg(vAGE@IkbIJ%!Yyj}48PyEJz?qFL81f@V$Pw^#8l6WL zO@cy2*aR1-mO~Jj5Q3C;J-Bxt_Fu9e-ONgr%4Tf?u)e;H)MbPSE!Qd~ep0r179c3{D;aZC4U;H( zDOd{#1b~#1GD9^qDsXahyP7%~$r-GiYe16yUs*Hu?cza9K(%2@Flt7%&F1K){@5x# zvgYd>1K|2PHkuNU4HAH4{V0T4M%AjTfV+zJ0uiQL9lrZJegs$VzXhZ7Q#5T;^(v4c zxtxFp9)1$j1jL}-6tvcU(3c}h=n`YNr^9C+_zN6e{R$RVfW)p+ps4mbhXnu5ec)_S z?J~;sb8C3h*S!UQ_eXybSM0kK=bxG(G?D?p%*BPE>Z4iCVkE={=%$4A^Bqo|+Qiw@ zGpwHPFd8vZR#!_PP>6^jDv)L=>Z7LlfD8&FG!0=mXt1~tu(BMmva*Eb#Rg5&fO0~Y zXIMYGjmwAE;+Nn1Pw+<{{yqHrKYu^Eg@kq}nG~`Y*+F@aPl2^EplZ!tpcL4`7&qgC*$8{G~3fO)+GlML2P$rzA@}+kn*{D3Q?}7(Y z?|XIv=;24dEps7uR$*;GnT^n?7|-V(2A6jApFJ~@?G4)q{kgCsaL|^$JI7g#xO#LQ z@ox{GKi2|Hp#9->Ogf+0+w^LmXPsNy5^*Ma$(GR0tl6n!6HmYW0^(V8gs@F5{36{X(5CXa`A#G*+)VqEjKlttMK^kS8 zKii=hL~xRrW4DSaAm*IVG!0^u##Kj;Z{YaR3C^CGVLT?}6hN^>gGN$RiC`_FnMi&0 z`fjyS!i?E8W3rvGnx?uYBP=aN96UI{!Gp_KUK%0{7_-R?JYl@+Ti$~kufG|;@$dc# z)<@^iE)9{p6 z3uH45HkccWVX4ey{8i5>C2p<#vE>A@-cJN#9h_$hnCx{~_}WTr4Yf!&5qrpfFM-yl z!3DR1X83+DaJ{aESgB;blep@&lB!_lPzC+&VCg~V*{W8Efknn@7Qp`=hY9*;y8A`B z0L*l00cs+kiqM{ai1efC!li3o_Hy{JZ2jeXl-xg1!<9^AZ2OYgI5=WV8M^e+8ig&zNaTBup@7a3elYQgCAx{=Dvg5P(1s`wD9eKnMYxX1LBmS=o>_)iEq<7SY5(O_{1$a21RXsP%yz z#1+~VYPOQTZWMtsr>fac&Iyvb#m?}Fv&NZJLbzH^f;1Ab2i7$Qdep+@le$D|MM&kE z9`LQsVE7jT9;gD;>S{2c!KV2dFen-is|AgmQ3^xsrZencxC-C%%|C{;-Aa6iznIK# z)3i8yZVQhcIf)Qkc56 zSfoAppMU08@J+9{1Dod(C_-!Pt2td)-splF!f>&{)@H(y$Ij!4$46M-U;qO|TE?Ia z$c?;V$kH?_=&qBYCUi=GW$j5^T52^TNMLFR0VxCPTQi*B7~|NnG4}5p;LsIIxMbfD zA!cl@jq%FcUX4rt&Sm(ufAuRkx_TH3%LB|(_F_9mL*~-cT?N1_IOYZ<6e}y7utkqC zU|j=5U6)$iv6<+Ncj&I5dZ}bgKBuU%3N%*2pP<&a;N&b2v@{+EBAZLjXwNLpk|`rD zF|jE2Q(i5NGV5UM{dE(P#U`kdMhr&N1JLaA3+MCop~fCCu~cCMe7~!1AmdZ?y>pKS z!|iT$k~b&JJ?g7EF1~I+=>5#OZ)p#^T(RSjATeVq?4)7GJX6Y5Q43Kr!Y*f(V<#r4 zk!$bFGI;8b#I;5kQv`OJS-21x;8EED@M1M45sE*Uohattd-r2r(0>&O&m@;c`0AK^ zD^jthH~>vV#YaI%wA|+1!x=rZdLY zb|(xE5&&hIzGPAeLrpAgjZ!XVs6bi)kQq`4z#3;r*-Zx2L@z((KVilB2cezI)E$V;?z&uiP`j#?}G` z%?jGss(_G6gVKw_Xhzm8lQoD@T4P2^jGQvMj?r}qU6(OSKuQ@YOXa{o4Pvu|E-&EZ z*@XMs%)L{`8jca)S%`J35nffD`Sqj54TYT`PBH_291m^(1fPIh@n2CAI4i$3~+gUZMV zz0YbgRJrNe;Z8JX%jWRdwWne#QS+9gT@{iS9_8Hc1=a3+-wWNRT<5_szL!WhyGfbq zZd64Hm>kb$;Gd6g(0@!L4h6{;OsYmIWhw=Y%e~t{iv#-)B3btl7UoYNY;Vpmo=UEF zR&&1rG1aBSC4hvW{m4_2^2QXjbtohdP+CmOyICt^OZ6mVDOkj01<1tulNpw(nH9)L zIv{y=KrluFsL)X`#bp!M0Ybw2ipF8IW&PTv)O>~|9Fv}3xKXePP-av^D?@HY@S8u> zDWY2IT&?GYkiW<5C}Z?{0zE)lM}HTZtZ7qz4cg>3 z9e}27u)Q(DbqAk~-}ndr3NN_+Mc6pop=}!kB+Uqrn(?_~q)xzF(*zuSViOtnd* z?k$YROK96=1PaJq653;kNmkng!`7Vv?lQPbNL@lo8Q_dI1`LJ)g9XBH5m;Da43`+g zrG()!W4H_~ECKCMEM_4PV$*=)0Bh?B4?lb!k34h^lbOV;T)Foe{L=e=1<$(d7RBMB-GfUm+n`!6KkX6WXTqo^?!%p$O^F4Pm&iQxP2?XZv zq)d;v3R+}X4!*t#ED~H8lI|eZmH>-Dbibus0vOd&2tZsT$ZFCH_P*rjhhSa)v>t#} zKqK?Z5kTUjUs_ne-sOGhI%7Jbks}f|wziSGES3is{u!(qP?2TvgQtBDba8NHcY>>}vxEx^e|@l~2pSFO-2-`$6d-0t zD~&9BLul09d#X{+#vQKMb0gmVh95<@Jro|$k@0K*jKLt{%-Ib*`uGVnZ6nr^N<}Tf zXN=eY=SD~HxraW0xHwY_QU#V7eND=>RGAAV>B6_QzKt6$dk%i>7k?91U2+39*QRLO zrc`NU0NF~>5(Wzq(-Gr~Uw9IaA04BKOK935IA?U7wWhK2Uo z3DZ2m=J-6eHqT*Wd>&idtJt2cW0uEANn&A|IKV=?goWWAEDiTz@6tgmFJ6MBg*{kk zm(YeKq?B=Pb%eF`Gq~c)WgNPE8P^=R8h`J-{}})1H~$_^j*g)nMzyG#aMo&frWv!E z!8xl7jg`JMkeLnQD{sk`yk^-jTE5o#tsoxpw_8J^Ai%@oYp{!YV?L@1h}zN?L}Bj1 z!t=o9xR8^B?&FfFqeCKiLn7$!TG7P8gl#icf$wzfGU^$F0F96s6szP{n{?V~ zLg$IFpzB0lz`Rm?|-A7tlbujo!Q&-B~WOm zvDkb;dDjIp65b6%UK~WK18A}mO)-qt(j@A}wm`LvNF}X@L#h7{RuduH8wdTL3h_*8 zlA~&fGV!E+$^!@~CG1^Z!P0O6vx&4c_1y--Xgi7UX=DSZGHQvPVB2VArexaHM8{%! zm2PqjtE!PW2{6gx+s%kTX6+29+mj{mDFn;wElpzDR!qVaAf;D5&@O`m>ps;8Vp8n_ zik684fLJ{VC<6?}T61x=6N>O*vkE9Z7!z|cGoN5FCI<7{>t>S9Yy?X+oDT$@rzpS`MJe0>1aHKY;^F*I}}i(5Nt$qEVs+%{scWP?_yL(#m)`E@lOJDg~MlG1;Es+Jn!+|Ncw= z0$1(59;1yZ+F>hxYX!nVOH&hPv~9qNC%5pWFP*~rR=~o-ULXUVrsmZ_Z|1U+^%Wr7 z3X(;XWK# zIfTnExdGQ*aSN_HbQ2Elxg5j`c9G=2vsi*XgOX}+$vE>#bHv8 zpnz0)meL`a9I;pmJv&!|-|bdPS7h|cR!+R)&m56M^k^&ChfM%(Z(P)t#7{f&`Rf_Z{ z2hEd5wZX}sq=7kA+yt>}Qnf~il(2WtUc?wN%^kS97POJemqHS4< zQR3uHfLQIUSp`04V{jrAmNQHgiCt4atH&t$8`64dE#4g&)f{m3{827>D& z0LXS<6|_T#pc=!Z+X@C;r3_02Ak(+XhVaHEC5ZfZH5Cp z@bKeUUEjoDFhI^(3;t9z#*+FuSjxEj$j9--+TCcERP!>1sPjNRc2?N%NK4pS;h`o*+;{(3+;i_)FfX7PE}%;Zfvw`6u4~YB zAzM3OFa$!AaCYNKJo3cdc<|U4aQy5;7){rZX^PNf#Fjvd0WE+Q(%?+)!%j#tr2>9C zo?#2>zW^PW4%SCxTi)=C;>u35t-Tk=uz&{Gw4qTRtorH@l#)<;^|%U=+WnKH&l(ju-2{s9!b%rF11!uzP!4A)KTDg)5YJ zG0!mK@m8)d19SCmy`S~(^}E!diRQlFZ7e2+4E5+LUUsktB#kk=3Di>$ zBvZ-%N5$a5rfG1wr%oM15WYngXEjj@eMTe};gYkwkEHvx3Ic=^rA%mtL&?Dt0^@oBV^JvDlyeM z>3DIV9puty+T`(qata$wSS*0XU~o-^tn(r64=KbX>k(s%(dG=d-|)3~%h&$^w$4LM z#90d-$=VDCEl!+1hsT~cj@UHlQl}Oe1+MxInG@mwIJxl%?mqkx#Kq1Tq%lGX5*2f; z2n@Xk1Q^B;fdnk(CH&)``c>R~)h*aqo1keL0hcxjoWa>z6$gCoi^uWEqnj8m?2+n} zoP@zs< z>ubLkfB09wjpcpPQvqf6%9?8-EGySik;mN87dUgF{U{=>=3CO3SbnlYS3okQms*yW(U`(;t`n8*cuQOac@8SG4%Ct z-HTejp-}3ZYw?5JWhclB7g@N_z^k9Vp_k8KzMLws#e@vGiEKU-V8_$^XEq^>c^80^ zp?;Km?{T5uae>cym%rymr0?z735pnH6DYNLJ5}p4SKQQ{oEFgpi77Wg17L>W@==43wGzYT=1ybRz zE0G}@qcU32_Vli{xr1$X16vj}Yow{#3`H=kjy}oYx%gvie;@;%CRoB%p)m`E3ptZ= zGe9jM&jox7%d=!jJtDUUbvfU~P4ZHa6NS z7;e4b#Gnw-b%Z-VcNE8tk1$-^tNwCzB@vKw=UoCBKu#UnVMM!>@#NY2@#%X$h)16I zA|_ZvT#RT}gf4P2P*ntktbu|L;?i~+@I8kDsbR@`$YwzU21DVcYv~w1asPk97a#fv zo_E8`@S^9u2J}$E8(#Jf-1p#@asP?WVqtNpfK^wI3qS)%OEVWf;u+8G%P%W$0(71m zp&D)RaT&!~?ypB(Ro|uR&Sh`)zzP&Blf}&R6|FM2_K#|=P<{qNVZFM~Y&**g*k+OM zL@@PD_&(?&Rm`;7ixs3C@^tsNd)Dw`_hWbe z|I-~ix7US0LcIo}v8xuX6KnoF^0CUeqcUMDa^o=*`Y7{>3E^4bpK9{eh@=Z#P{t;# z%@}+j0RR#+Bgo$z`qODfH%kDbZZ0u-TFnMaeaph-eU3f$LIo(Z1~_SR63MG3-P|lD zUKsO$2SVkU|5fH z6h*=+U1>p|Fo274n+vtiE|f;j zuq&#mOz(w>QYO%N5#RG|KY`0uo`dm5LX1%g&)8h3pY{HSAH>#ZghAVa%>@XV1FM>s zQ^sI9;ohU4z^RRg&@74h*v4Io5V7+K8xcXkV$(F(Iyc4-f9Fr(j#qvY)>o&9G4zTM zshLE;W>)|I?KAs7SOWZ^2BK>$V!;ucGW5>fLF6F5dsgv25^Lkt)!6Q+Rp#okA57SuDZ(O z04J1Z(v*#PT5%1#S#XV|W>#LP=7NKHnkUt<0O~uPFAh>jxhCxTjEJW@%v21J`ZZMu z8)Ne47yKHkcLXq(4znAG+I@xnvLHkeb~(?HG+7LWYU&J7PB5F3hsOl+z`Yt78ILpw z2Ux4nuq&YlB5wjBl@J43G+0?&M(X5rpDzH@=@heUEpj_pdtE>*DjjR%5oRD+bwJZw zBOLh?OWRmuL+YMk&hW-fteS(}4|2|IDgk{Wh=n>60}F#876uJCSsuRy5=oOGi{>Q| zX0wcyrGwbFbOmxJZj%DGga%=2p$=75B7`gxpyzJ0Te2`T1rjJf zs^7V2&(Fj`YC#JT(8$@dNDM4SG#H=H_?B0GKW@MAb=X?(z!Z^{Rx%h}V#GMW6UUF? z&R(IIB<c&H^27V(2cbi4zm=L%|PJnoUT|- z`*aalEIe}9vlWD+nAF+6CkCjv8$^hUOHV!*UKlu|q?j6Csh=VAEr7HCnP20TR4*ih zxc9qHt3HR>+?eG2!M=}RRd`HcQ2{KIq=DBZ_JgP|djQ}4<(!Ik<JV>y2_DAldSeU-QgE z7Qx&%eugW&kBm2^ETl`ppXhw+LII zCynRt`H>XaLQr{7LasqMNc(u}JQ#8zb(gr%acpDYqU;3wn=_+{5sM3p$f*b7BMe)G6S3?&Y;==+3ACQ^JV}!SxSd6u*`*#aZ1Q3`)X&P>rm1QP# zX0#2kxG>ao9~P~Pq!u>?Z3_xrR07L1D?^*8ycOkVgXzM71&qc#UbfBi%=yEvP)S&!@^R)h)&}DfAs5k_~^a3>dI>|ohH3c z)p&}eT(&p^t#ocVBw{|#@zY!Z6Js3J(F-07{*zVcWztHTa{_u73f$%Myz^&Ildr$8 z01G(;kTrtvx1iNeT-fVe!vM9#hAH5eo9TV3ahuP)Klwo=ZtOT5t29CoU;FAo4*yEf+TUzE#wzsn?-g{c+rn)WUVnbc-bHX)@W z6=)4JyA>f?#_Cblb1zu86W;x?WzbZ=0L&;gPq_2%axsK&KiL_Idu>hf%^lg&vdjzz z^)pgoB1Ggrxgs(jVSsGbtnZmCLMCBi(p$SSO9P^fFkD-P0_V0JVqv&c7`_R40>;xB zk``Vm$e7g+GMX5% zvS&#cD#fzWRPR2a_Sgh$Zf{^^;SjDoa0^lw5kdq}zvG~RMBBwCv~bTcUH4{2ImeKj&aZ9e}&cYV~{|7b(nZzAcvrpFcq2& zA!0VmIIwU9e)YJ4ai87_04cmq zc!BPJVie6^-%|IgLQ%Oc8x7Wil6zSdyB$v_1`5tFs~cJa4D|JS_Qgz&(%Yivd zp1LhO5?E924B`6yl+ju!ioqHK5WWmSEh_;4t8IXwmH+}l0`V3G3uxm|((SSu^Hh@` zk3~ylU9Zd{v@=AAchc${jEqh}K~Blnn-rx>z>;tnYc3j5MzanL<`Y}vVmEhvm_l8Jv`B@P?V8__G5s|AJg2mddr?dQE3EXWvF(6WnE;6 zSC~y^IJkHN-t~r`#c;YG-Avpzl-V2Ua2AdHk;e{WZG9co1karCI1FTDB;=IP3^NX& z{u~ZJ^%)En7#Z4CvECMj-Bh>;sI(wELfQg;^t*lr*YCd>+Z!_kZge~n^MOprGZ6+~ zzWX?i9@|1YT$H9vB&lB3u}7-DW#lx&U@7CVv!B6#`slCWXFf3jy( zQ=AjQI|el8$8htFX|_s$<-X>R&D9W-e=lokqnvw|qhdwp!B80$Wm}^+I!bP`EblqL zK)Zdm`_WrmrvCIY7o>N^7lIm;B zX6}bu*D|CikxTdO5i@L^9fVqwFdrcyVTSe5X)J_2c+R1h zB6dqUw_;)xlF;iYOQbsk?4^|@5?h!&Iq0x!-JIXkV2WrJyNpF#j(5KC=df>Z1I9BkM<<2~5^3TT2Mvy$JdUGJ9Y-^e zWdfRNtRe8_Q~$B3Qa9g;4koXQ}ajeuTGu<2&){ z7rqG_=cfoUYE!2uGy&=I7$f0<`%mHFN7gWCq^cgkU`jwJ7A6pj@Lx%||H+TxPygm$ zVj53jxDeFTuQM7{kZ3<%vi(D4uIuTv06cdQz}^$$19q8Wz)jbAhn8&nQUw(!M78cv z6yLq?crrSY=Zb|&?!k!21huFc?@(|?(m0D*oCE~&Zh`@jmfs-Njzxe*7H}@_T$B}Q z5pE@gweUCvfEz?Kb6}!~O|IUx|95$R;sRJn1NJmfO+k!+mskTR0vZNlK+gpr;52AD zwYUK?Yj9@uHuYgVueRz~GoxbM-+7HFlUyuqB3P6>%K41!by*y_|1FQF0}f9YbT8sC zBh2gjZlI_--TCs<+@#f}$7E-VfM6H6&phzjTVH&fBJf1u+vjcwc0rc`WXf(yfIgMX z^j3XVzXO|4(Q9jWhCK<@l@~tx-+N$Swb6T#`KJEZTh|R=7-~k9IW*HT?RboO?KH}~ z_~L}g%igP?ngSc{xm6&VUM2+fbxRstv}q8ZBxekUL&@{@{9a82O^n$rs{l}zV->`d z`AD#H6<}oFvI%}|)0+%M$71yX#3f+YsB6G73mC#BXEVlhrW%Ol>1&gk0|ypmwwTk&u_4y}*RU^1Ix|H8Gn?%?gnsrBYc7Jz7hgW$qEq3;O=YdVA?@LjWKZ>Cb4 z2#qFS+N%c@*nHZ|QK3yTMkl}`+ZqP~VpZB%9s(k1U(C#i(@XH(cl;c#+4nUVZ)boS zWZM@cS|x>uwT(4A{OH4o5lBd2PAaT~p#d5MNEs=v<4ccx2;+Rp+r-M#rKddSiarda z=uQYt#P;SG&%gfV_?~ZmFSgcZK(OXY;?h9|Qpaf8h@(f>aqk1C(F_*RvF;Z$z3U#A z&XqF^_hj62^uzezoxcq%Z6US-V9kY~8&B3u=hJtO&Znn$n)^W)MZ}y|p(I;-i(yed z;(w?%m`Tn5^_WfQiRDiOa0XFEV?vJ%%8NTeIi2rG_IecZBCP&_#M;ORtQG=kS1rwT zgq~6*5E*6_(0Y2T0f&$#Nl++it_I?SfTRLNgmYk409(re^E*oo`oLNL0|E!7Pdi5~ z$$q&8^6KBk*Dt@brdB3~@D#l)fmHv8&Oxp4_F+n|H{6{r(r_S@uf-3dN5w??bNoHN$*#&wT85R%J04 zfn0-)-o*i)W>PWQvN@Dcb|hXJ7|`=|vj`%-Sa4PYA{BA{Kc5yp^j*VYhsA^uJil1v zO>(egk4fcZEeBf`-ssaAF^SMOuw+(GnFd)eGyfa&VgQ4|08p(^?xb2~2D+J5`O+|} zEE>8s1xjG=1}7%OPCyQ8^B<3PSJS2mQ!Wv{%yvKcvU;99Ljb@e`MYKn>|FvbJ9sGu zgBCeyuq1-IkW>prp@9$xTjN!X(>A6v!c_-u!@+687h?H68Aye%FmEd^bXWwzw9?%I~js?MYCWh-3kh<47BB(kw?q;&e#1k zo^$9`7;iBsM)6D}$#*wv%6K-yeGlD-S(>RJ5UYU1Wr$fgu>`G!g&FRDLR0>RL44{Y z^T9@gY*wN|_+otma+k5UJ&5;y*UzBMdmt`()yR~(x{eV;#F=y3xci=Cps?VYjC#b? zosdB>gVAAeFX4d`AID#P;dc?1w?PmWm4W2mZmW4r6-4VkTOtIClIDn77ZeK`LJLrf zCJ1O`Ed^}Aj#O)JVgqU$jm0TzX7eQYK$RU6vdCh-hpb~m!F6pJy?}+j6|Y!x&F%(L zmxc3&QXxQQQU2~KZq&OE0hz@8z^0(6%g#FcNi#~>S%C#ui)Enz0D@}mWNs0S4}$U+ zRu_y>KTCRL<|ug;S%6l@&{S1*MItLuwPIvYD*&5TqoEh(&M3;6a6S#DbnsejIQ`B} z)}8M>*}s4lRfB^>>xgOqwZsWsoTT~N9J>JrvsN^_1znh*m{AG)-Ndv~tROHeq+|Yn zi0Kyvh4cqd{_c%{>mVT`{=VbE-#~*pV8~9@m*S2H08+(oxQ1u`t|s{Hdoll&+35e= zeHv)~doux-4|ZJF%ObEUO1=@;5h^3NsnwgjKn1UIdRsGltBfGQE>u06N(E~N5>&vG z1=&eNx@t5T7{ms$2`wuDo)M8|0yM0~d?twxuzmpEXafLjyp=}4NHT6x0A$s?NEnjn zAzAaDwSZ7!jl6FJ$Rx&SYl2Jmw&=2&Z3EDC!2bOQvAnc|^~qFMNj2jTfFx1m83Bof zON}R6*chG0Wy_bKo3wcLp_gE5d^$cPt>K#`CWgGY<_j&J-4JpYE*W3&#$D4-x9 zf{`2;F%uqm|&*oUCj(cj+kt9_~Cc_IG%O+Z5W-OBF0u;Es2FJL_!RN(InxnyN+R&8Z>P{>XP?+ zuqkMWz&yinrNP4|KZC#e-0vbTkClGZij+mGw%x&H5k&Z?eZ1^zgJ2AgJR%uWpop%^ z=%xv?=?rYW27<(vSPEVu3BJsE28$_)gMhY)2wIUbCxxW8&y{a^IdxdhqH^Wv=cG7;#&Ti;rWJLz9!AkH*tM&i;&n2{v~61K+Bva@D2k#kt* zvB1G3dtKvtGMN&}mDyhQ1Z8XAZUWzSi0%n_Xm4f9?lCQ0_a$2q?jrDbhpf}da6SsP zFxxZB+zC&Uy`AUgnVH=(7OGpi8{uzp%x42!?ENm-3}|=Xfo_i8iJ>qXkOPMK$L|IL zWPJWg&wn6N91{|1sd9<=91P|D`h@(GpTUpyaCWCe3 z&K-dZ5Rjld%cNHcYi0swNF=+xw+2Fz5V82{t3&`8w!_I4`fLCup-UB=4F5c~IEg4JUu(GDUg2W3VPh%Jz^f&z8Lgbu4)$8d1v zT1h30%edw0ufyF(HZe}8P*N$4o@9cFCBK|>KUkokq!LR0v}k$J1$Cihg=HkBcZ=@u zFn^;J(qK9HOTU)NiemMUUI-2%bkoETBzSJLf^UD#`|#o$z8Tx=jFuYdY{-O!1d4L+ z*b*K+@-WVvJB7h8BD1!7&Z@D7fUFWCwuJMOCvf+pe}yoZz%6irU@k6~jgp&bsThz^PSDX7aY1c1?@ zT@HBs>|OZar+)`n*hUN@^o5pG@L0;N$&4Bbkg*WfxDI_U3P6a66wu8QwntN-OIR8# z;>vx8aMhvfarI@_u*Xa^0L15!##o0U@JjL+Nv!qWm-V;U*SrIJNKwasD`>B#b?W8(h}dc ztx4B$H&Ol7ruRM5aiM!PQ1k8XM+ubCVWGUP?HWVN1nX#LM`rQqFzwXf%~z@0yWl6Y z9zIMr1$Ztiy&w51(H=+gIIGYD6`0^yoZD`gR>M2mh>~B z#nBdPodSjhNamcd*hXA==u$j-4ZHYjF3G4?s#w^9 zEB>U{%07|r3{8PIkI@a?braol?CYcN^|C^XJ+ZOLzk zMx>P81qHQ4S*uk9U=}uT*MonFF`pA4X<$2R1vs{Fw8|8&dxAp5Y&^qN`)|ZM-}F9A zHpNJsG9g3*#u=1>;UM7f;ZrzyY8~xhQA+xTSZFR~ppkf>;Se~r^(a2@$$x{?tRY11 zmnFBgCv~B*TE$#ou!de309RlX8W06cMhUao4EvT3-~~577caQwWq9t5&&O4lUx(%4 zUNoVV73tuyQC-$m4jT6v7&&zqO}21)?Gzq5azDQE@aJ*g;VSX^r50?S-6 zilqPqje8;n2Z`=49KiTjMkLMISK0*Y+EBk-ZK-!6?gngGfi({WV_BHWbjj@(m##ie&v2xTrvsUV4Y*`7x=S=6j=h{|q zW4yxSawznlQMrxmb2f`0q9zrXJgA0My@PRwXA=JNX@D0C7UpHpt}cM5xx5;5)_GEo zj%uQI%!hsLdN&=1`Lcu#Bw}{{x*`e{=c$l^nq-B*GRiJC9V|Ivm}~~L)QQ^6#oS%| z=fqyM`vS+Vm<@1L3-q`RcC2@~lY#`!YRWTIyCXn^4fCLOk_0nH0&ZdwP$th5dJ})L z)I%2+gRqiP-H?Jr)EX*P6b2?S6AQ|=4JHFG8Ue$4s9S*!TdcZyhiMq%D-063Z2}@E zRa`|Q%_&KgvuPG&wu6koqV-2IH$lMmIHAi@iq)3E3g%sN)up<5qi%K&`zh;bY63AP zX#?jrkK*cmmmmf)Gw&Z>hZkIb2ktrYVN7ujAqE5%!A9BqpHx5~+dPWpCUH_a&F=T) zIuGb&~o0B}ZZTFk~7d*apj&Nu!9o^|QVF@*!n4!rdC zSK{hRuf-rPVm6a(l<5{@lBWWBk_;?U(DX`z$F@XU<0Twgz7bcy;5m5B3*Llt+oy2P zBcI17@A^x8<HM1&HxJaP@)AB_T8vj1RPfVl5GyCtgFSKSdVo{ z9)!ewIJc-kMjaSyCB!{#*Fd=P3=JstQ7H%}mlqOb$mWIwyFl)%r%FF+bu59_+C8*V z8Q}sFdOwYgDf&m@ydU!2jOd)sEF>7rQeQGMXPGXQf0LppP! zRFx=k&%_{cZ(IOEz~bTqHU1g1r22$tX>PXhp@i43KxhI6L=wCN(m*$HFX(it-^?11 z$j#*T8SdBSq~`w)b>@MmrU6K)lk)1Ez#1WI0yA?$2#uJXp=DJS$WYb|1Zir)IRhbJ zJf31YWh^cPq?{!aj0jx@uDRw?3g z(m3JZ!i{+Gjo*TMj(ikbvy*5BK|GK$1T`^N1)l;7@`p?wXBMgG`$mBtiB*Ex>edT& ziWyuO1rbb|!bLYpNod#BNCZsafItn#8yVLgxD{`E&HHfq;>{RsW>AdcW(Wbu67&@^ zVbHcXwR#E?IHZltteSiX(yP1L0D=o#Wz0xTk&_Wr=Ov(NzKo#TykqkhfT0>~wk7k(| zy-K`@@$&+vtrq}7D5h?}U9Zl=VR0eGD^01e5f@FZdJ7*VdObGmV3+|aLTXizGdBPl z-$MQ%LdgUwGP)P0G9`Dho&z7+^z>(j3AzL+>%W4Hoc#6B9CGcH!O& znors#n$tu@9EQ@WSv8F-6Qi-+?_(3f^QY9Pjcml#HH9wS_iD{*$abQ2s?$y9kE`C* z5UZHWi%{mO(MH)ia8tOH-j(WUwkmRO@%tA4nD6p}Oo_@`D&sZ_14VsOCJ)TXS^d)v z&}5`tHX>&A7i#ev)$+-LFw0x%uhLyEL87lSWz}8?(Z;PRd?quq6DX=S1wzuv2mofY zjP30y7MB;0HRvb?Lh67kue<_#_AFs@)ImlhUGcKIPeOacqE?Wv_%NL2<~?7Q9^a90CYQ z86z3#7SpUDR|S%!<{kNnk%Q7L6Pgf^Ghw{Vc+s<7i#NXf-B`fo*xpWvp@kGB68~}_ z0urNXTbx@zjRz0kiyXw{pL2p~%|iNOIZ4cDhKv*IU%>;%K8a?j#KRMj_sgmGYu3#m zErTUyVYE5ME!VspZ+Z2*vAHJgggeWB4-&K}BLlMZdOAW8wM7#-CnIdy3F zFh2djU*OTxU%~=w#`Rtf?1I_&aiLDJ{*kWV=K2T+7q7%SzWIA`$E&^#mnKZTr3xJ}8&m>@bV+7hit(PPEGrP19hOGor~gD zAy#EX20m0H&FBZ(xxky77!%l5hp+z_W3Xj-R$zxAK3`+$z4xncqya~jn-qY_^5Vlc zKUZ&-%^VzL15maAu@aRJqTbrDF$N|eHzf^H!2{Wjv+;27x&lT>IjApL<2`&Ea1fuX zQfyW*h-_8iRD(p;4a7b>oRc7L3P_2Ol9=x@W$F7x0?s05Bo2rH>N-$=CTk6TGpmMx zOc_WS+glS{dietC8VD&T?A^0~LznHx`NK~lHl?tVRQZZ}Kk}w&3*H~#druWzTwR{eDaHU{LE*O!WyVi-yx*f5rQ$0LIjZ{(%w2W8sIbQ197eb zRds#sMQY8OYQ|}nCkX@_PZEZCKi>G#x8r3ue=E}V5aY}qRWCH0#j24K25pOT8)xz0 zqxS;HV&b&QcU)W>0t#jb17K}(6n8)N5ny3k#yQXR$P@zEA%O@SENB%-DPuWahIhT` zr!nX*!8CW0T9+mLF|fp&44W25kDkWK(`#sl17rnRRZ|Y2VafGhBs_ThQ~3OYAHZc}*S!?C{K)P2=odbS zKlqFHV|D8!mRA;$l65Oo0Y+Kc7Kh;Q(!tN15GWlP3m+s!D^|8!E;Xj7=V+i%(QGw{ znv~zzq{A$l8n_3zwS_Ehtgsq6f;%%I1%Su{f`$JntQ$g`wKj}}m2D>@=* z-Rx`3Nln2K(&bNtP!k(vo@OpjNF+kiDwmO&Jr!6qi9D)S;ynU3H>D=Mo9==XJsGxy z>#n&H_dj$LaWF(=(f)iA{p=V+h!qtm3KFhj87#uR-d>&xs&LoiJI(&4*r% zgL@C*fny)TxzXcjhGf0~(Nj{1$xv7!HTEHK6~?B6X^VPR!KmtCbbqT6vg%w}g-ZzF zE@3ieTy@|!-0?Nvhimq~5YvqYP=Jtg(Ga9wM?%}SIJbTlj~u=q37tgU>vh%4<%e5#Ivv zSow>c>MVkxTD6Hj4ZtJm)eu61?a>qzBEIS6--+klcsu^hpZp7a>48sSdGEjjZLxSSIqHg6#gppL_8!FrP`s)fmw)mN!U`8zP*QKU6fJ!(`%mY ze5@?Gzgr~>b2TQgfaZD7_P0592MxRv0GRLG5g?l!S2hIZLCShP^ScL_Et{OI1V}a}LVL5VYVC z`+XS!pavW3Q*>QM+roiK1|u=>tQ#(sU`7j?bpIcLSc<0Mj&l`w>H za;0&JWh1a9sTK~)IRFueO+cQ_Fx_UXw3p*+pZ`X@_{ML-0xrd9BVf=31w;f6mN6lk zMHmE}Id>9Ao_G`tDZ?uOO|28gsEH)FvPqbPbNJHX4`P##qiMw5A>KJNk5FM1oc);ok4HA0?{f-*sh7*8`EdgKXo8EB$0ZS|i+B#ddfU9*Xg z-ue63&L`0hN^DBj@eAYbTgc|MGLVG5ZLE!O`?Fq+AA0N0;EGFb!f0)VCIT@wB51XE zRR~c9xI}rdYNwRNy3}z8WJYWv+9seGv>*VpZjA9{g6V9gz&ZmlB7hKMMAHn>G%X?x zz^rAj6CU|wx`35URbW{(-k>PaD>pz1p#;oS7Bbjwu(T02bm?={ zH$xewbTd}g0ulsAxcx&BH6TDs19Plcko%;1^cI|{yWfvY7+3x_!R)XNV(Fb->I#E* zw#$f7{e`-&46$rjG<8-Wz*>}pHPA4#L>lLu(RDNAc2UM0N&u&ow-7^^SJx54`Fq37;$I;k7jy?3qx{Xjq*JJ z3Js>?4p;Ag4&MH{_hGg<^u7tHOUOZjRzX11L>xZ+1h%#&Xa@rcU;`vCp2Q`^B<`fa z9^g~=|7RRqyBiBjRLt?JsrdfUca+Qvtx7;*u?#UH=Zx+132%PY_v0O}|1r>H3EOKk z#6bgs_C^Q*AT-*XU`?Yk0JU4A{TIrJ=CdD%6%WaR*2SU{d-jK&j$3E_Lc zUM1SV?Xk_r!>x5|=P;wsjn)Lr;- z`Md-vk`@C}VsQ>Kr%jqQQz=J+H7j0j{7Zp`?HShb8~w0?6k!#nG*ZR$`@$Ho07Cn& zFMP@G0hB3aKeuwsqqW~LPgJ`cyZfdHFcY&8icWYPjc$F_fwaTIU_~lK7@AMN4AKBgFeL5F zjLIr{=qiBfS3|zlSH9@=oXe}(0<)jXPE2If(SMddM$WTBKn;^WBaF%wq z%v4oA6)+VPDcci*+9bWir>^8=G6t&|Q{NH*0RR9=L_t))GILV@nEHl;1~Nr?gNDt$ zL7J~`q2yZZgV+HRLsGP)hJ8lJ!A+W0b5X!usJ@9gc+zMsi8nna0Jo7H0mU(=9YBx z6Pe+fA+8ZZPC(Z&kOtVdcm-~`=_R=3+E?J<$_+@90Y)2=uI6S;mi0|p%1K8OOTgn# z9>wW1ClDKL=3z$F-H zx@Elcn|}&>+p91d%~Y#a@Wm2?L4yV-&aC3(>9dH<02X88@hVvWe&&qfFyPUXpT(CS z{V;}$nmM2%KQloJ2n7{}SsLIdkPk!>WEvZ>>})sq!MFSv?s)lkVYDXi)U*T9oVB=B zR$sj<2pxl?0HmBcEDRb9R~E26-N09ld=Ym&_!-=P_->pyeGD6;4a~ZU#5lwZi^lhC z0Vs<+0dU8NXfbG)uy@ZsTzBXuJom;I;r8de1lL{lY%Ih@Y_5&*b+^9(m#iGX|M5Hj z3pS>w(Y6sCW^Qs8*WtV%;EEra;3?dt|5@QZW-t(*S=?-P@5EeqA1Nqea_yOvpJiy~ zg}E*CF+Hu>&Hr2(cP&=N+$hRp;Nn(+K=mqsDryzTar*3AguED=v0wJf1>hKWC0Ci| z9t3ygnYGi39;p@xt9)4Bp$8$Vb*j|7i#ndsO%L?m*Zyw$AIOJ>r0UPjN3ruTzq5*3 z+gRG=O!E2_)v0x<{5LF}3hzKN2M2QGANH}u#%hrm1 zEsufR1+-xS3xoZ*;<9Jq#w%Wg>kmC2dlxT9HvuNwvj1WurIAHw>OB<+gcvdIMmTo- z2+nV;V$jaVAG2Fs07g;}h`}cAKmIYC*tiGHK+Z91lE!iCC2IBZU_Y@+5dkp}wpSV7 z{@QordDp!Po2xT4ZL2x~Aw+$4h}arU@z{~$KqTbQsjv=`o=yNo=`#=`u$4Ma(gL~z;&c)3dHc`eRnPwxY@C}Qpp^;;qz$ktda^y5 zbkB5MhrvR`(j^O6-Fy6jYLu?70Q|UU_XG(p5);li5jg_0Y6|X2P1WWiZrNKZT16tBJ!T5dck`Q5D7mn+L z5F738W2t`z)3C_E&fMuWAkZ{j*;Iw!x^ckHXX<@MfX8J~jShAh8u|Rf-JLE!DwDK< zm`XC}5M`de8sWcV5Eoio8(S5h*VqJD8^&O!ZXKD&9X-=?UAw0u=|M1`qAa_ZQc7u< zXFf7ib{VhMPYp@!c+X1bx7-0!q(cZ248=h4@(W6{U?$keY-Jn?+hXec&4Hx)W$f&X z+6H0s!G0h6yKkD&0vxu%l;DV|Y#fS?&_#n#v#|o3tf&=)9+;~QTSNj*0%hO8W%H2# zU?NOrQ!ycP^zo_%7)?}b07%PYnu|b_OEWY!KpXm)VNwP9teYx66rl%5(GVDdwsOLx zxy;;X>QqDyk`fkJbLL~j`uQoQ6UM@#q!KcuD&lMcJolCxu=tVBitm~O0wOpx2stC6 z1E_8gB$j|o5fO|j*6{FCcjC5dUkl`AP4N;s$&#=SWC;?>9buLO+He3@tXzhx_T7#d zZ((C}7HeC_v9^5@8(XKbJw1o;M6*wdEDguSje;}`MrTkgQ->Qw4aXuz+y6O>l99AaWI(Wco9OaV(PLu^c+!k_)+ zpW$Pl{|lU4J&G_47%nzg4g;b2%t(3W6(W0e{(a9?4SFg8(=-un+lt$QH*xplpTXS^ zeg=Pb*&pB=Uh*bZn}7U9<0*Zw=teO7&I%7Bi| zO1=k}a@4<`{2HZ5-Q)%l%@Sba+HrUQqMYaS>n8-izJFbjC1yn+lHlLkjfHH|N1jt$ zvnJGwtm~y1!a&aaa8((s#$-X0^|{5GUCp$C74&C+H^2Wg9}34RI;!tC|5*V7ax{Pv zxFJTvYHD)deMIFBr8-=7qN~p(J+LoK%Uv$?!ZsO_1`_prdrI(Umo%#kDX&%C#C$?K^%GFDNtj5)!@t^P(aEJ#C;?Y^b!~cv@PNM_z66E z>a)1%@~=al4z!XlVa6S3CXHWU?kY$MVwwOnYY@X8>|fZA%T}HP&qFlL<4Cou1u0UpD5tiy6nvN4L zU%3h2{l@4&heGQi?K3Et~C10CQJQv=b!2JvOAE`0Pfs>TXPtc6vN z%m9XqE#e|@YU?om!v}v8fAy(9!Z*D5&3N_;-?=;3FYbEQ4<(h( zM+LZ**W$KF7bw6h0Q#8hDMcA_pM?S)o13E9(=P8=A3Bef(pO3_`>l7qZddSwvVJ>7 zQH{Y0wC-nL46*%Um@u-pl3Ez2vHZp>V0>?YwAgf?$hdDOFr*nYPUc)eGk^ih8r=Gv>+$H}CopV>x-L=YQ|g_Ag2n>a<_>Q0Xorla&Od-bT*CF2 zz7%=fXwahwjGSfwMZ`EL*^k5mhCt}19cB{=1f;NlNCULtATUT$xJ1)B1B+1Zrod!M zm;#`fF$ikf4JHgV>yXrco&_*BK{WiewR1STb_&yOETw%Fw3-P&Q{pZJ?E zeF#7J_8-L$ea}ze{eSo`5SDpPjMu`L0S+a|bWUp3F-6Ytd%{@mM-+M`)$K(|` z9oU%u4gXgrCZMk@?SAYgaoojj57Hx|$Ynx_4=bg%3g`l|2MzYDpae~ejhdFH&`57A zGAILxAPN%AqoC0i-uOtVfm6m9LMZhZE}%@7kzU}N9oJd(z=fo%y&buWy$r~|EJ6nU z@9x6h0_&dcU}l*5Q2X~Us>%^*#U(e*!iApS-|FA1kkM0ijM;qO;1Zz^QXuG>X{fGa zjh;4PS}hjkG6us-I|r}t+#f~#lUPZT*#&Zar%(}+^uUfV%YeO021(|Cu7%BmFb|dc zV#AlahtMM_hcjyNG1g%fvZm89rjv;Xb^{)e9`bG5XpmP4++h>+=7?5Clj5Rk2$8!qmoPs5)^%%GeRIU_)b03(o*LgGiGUq*aYl3uz-`>kKk8->+j+5V~^m~FMlo4RO$%m zW^!R{dGC^@ss(UZS5^6-KO44JRnsTx3rN?N^*q4&k5L%cU)D_0%U+{*kNT+jrg)et zo=<(DU(1rLJkP^me8>g_SouPhj3l6vE(RHkoFKhFg`!ZJwMNwrxu?He*)u}BItrT? zDr4@0tiA+!W=K>Y20C`NkL);X%uV^gjAj*r;Q1TQAN}u3^sz-GRs-OjFZgta`^K{o zoi=SA6KJaA376qoeGL^6=2oPjAI zJ;9R{?m-ftJ&TE1goS{}WaqH-wcpyFVC~!p2M;YFcY;GG5JsbnYpyti>#w>R4<9{> zW+YNRgBXMoF}&Y>hPX zXk>e|Y-_EVHEYs8UdyxAc#S=_G-F9)(UL6Dlt@vcL@BtQ}wXoSu=zIgLJ=U27o zkG*%*@0@$z>juU7k&SoHIloj@yY~L>JVDOhEiH*<2o$PUv#Si7g(qJA45Gs8ZhjB- z(Aj3P-U(U@i^a&8GQ(^jB?A<-n9#F~3?aK&yGn9^o0=(Bp;ef)ZK)Koz(L0B7A#9? zOJZI7uI*oDXYU$^2M457P4LHBHdg4mm_`7SpcL|^a`E6XzVghkb68&{&(umkOE!yx z3*gq;Rr(%{{_{a^Lr&~(SAO6_f0hrt<%ik6Qph=Z=~Z(>X)%VFW{D@CevgT2d#fTZd{Lk<$x)?`yxv#r;Q_pK{lQX8{T6_&&lcgURjBiGlrVBR}+Qe~yp7 z|Ie^@*?LYig_{r@mfjZvrZSQTLFc>ty37`4R4OU`V(7lTH?pxs+tGf7Q5vbVBTSI}yL zl^J6x>>liL$88BcDkP^1>%KPcOjr}DCUM1qi&X^lG1W>DS~oefj#n1TLv-t`GdFv; zssdi}SR61|z5PmJKx;wC<{QRh2~;wwnK}v=FCKEsZKsS0J3}v8m~Rcd=baDojVGQ! zWNwXHB!iB=1{sk;q{2b+xQ&5QEEGMdkT(}R{_^ir>d5PF{Sf77@YJ(}VgY?xMi#n6 zNesgVvpkTB5H-~`nHfH-#S2KbI{7%Q!V*bQz{$H0CNa%c5>?@7vCq-b5&QdljHA_% zPaca9v>xL&8eyri}$pU;Q!JE0Q( z)w(eH)uwT#W;usv{KF?Bu_YaCSy`;KJaC*c&rhhi%%>CY(J-o z7Tu%zCr?}XZ290qGn2f~_ZcFuTy;e9TnOkP|O@QrJ1z^Zg@@CRAZIn=zZsSR5X%Ecq0~ z*q_y`2hM(|we>w%jw53oy^EUr@5JgjsES)A%txxwy5y;Ao>d332(=b!O{6q%>CzF0 z`^s!1H@|60uz#q$^Br&DY+E)df(Nt za8O2;zrRGOLVfn@3;xJ)XJz1=7Z{%`sD9 zSe!nR@9zm6t9X^jTFH6fV0X!zZvQrZ{JZ`p5JKO(9$T z`&ggJd&kcygqMckG(Mp|E^Q-s!6VQ$^vW>L)LI(T50KJ5o9c3PYPFDt>q2CS_FVm1 zJKw{M{uA!C54m$A~6VoFCwOPAFgO~ao zszwx+%Lt~|g}W=>*ayrcu1x&eX4Op-VLRb<|2y<4P<0Z_(ht=N8i-k;s z>Wy2>^qz8JJ|Eb1`EP5O zd^VjqV6_2koozhgZU>T3JPq$JYttw?4sZwC69J*$av&B&)q-$+-y04{LnxHD9 zmyfNY43Z7VDSZJO_!eh0g4gSHMq5Y}^5)2ugQxh$^S{H@#WTz{tL5dVpbx)~bPdoV z;e*N5)&f{OHFa??a@V=H@KfLSpOTJlwjBEbpR?q>a?GW2xLoqY(@#+AXla9pTb2r~ zs-+6#%2B?|ryly3Eab8kGtz1<8_SwpqnFfphborqUzM$NJ3swHf154tWVuj=x%+oh zq!9WpSEG|r3#U%ccxC@d{+plqKl9Y(hd6!H7Gqhqxh-lyH1=6D@^(qt_vuP7AVhq@ zgoC#C7JvD$Ey(0@^*u?X1&g$*gk6mef#X4$Sfi+(QY%DSaZp)|z3~ZI6<*T*oQQ4p zj}crtAzHKeO6vgBx!s!FFow0_VsKXNKw?dRHLJtAtm)7qHEOa=JVD-W_D!+C zX+onqnh%>W3|OF41ngxuy+>{O00)8z{Hr@xjZLIUa8`vO3-gT)RCloWga`_gCU~ni z$B8n-+26nTJdb5$92X258{UT2)@{^Es>+ZOs#cgM`7VllV^k?#zO=eK#CoO+ue^M~ zZMUDMdbGJJs8q@lKJ?yq@cUo<5~0l|1~L^*GaF|$fFf92fn_?V=ZTMPepHp&yt2J~ zf-gRKl{en;t=w_$P2}Z_v6uzH?pIeBzKSBXxT|BqGWJw3Xx!xQ(e+3%U$9u7eI{H# z!MM#-pR_Y<^U2%z)H7LTo64eY^Z3i3;pvNCU>tUtZDL?dBIYLa&VlB#YRu5=3*kx% zGwQe)xoLhs|H1eD9Zqo{<3bq*H|wkKuawYK$Qhn~_DS~k_n6HFD~9W!JbbE%6_c86 z9`XC%_$6N6f0T_)w{mIfT4iGyQ5GC}i$CK%%iS42^+SJy*WL6k4t7Rn!^|>BQZ*U` z2Onmk(OTF%op@#MG5(u>{D0!vtB#73eULFV__t-_+q2jEORRlFQw6OlSB_ z6iwwJGI=vr1?9>yiM9=~8?__hgk_xEa;otQ#_)~-jESJ5@n3s#q>wmlGXd=z+OLo` zhS9KME14#)M0N9!hKYyi6ub&ZIbqYDFyhHyeN@uG$TWIB1$D37yCGC+*ar;Fsxt;L z4W)WdhA>kFQG=~}QMU?6RPXb+3D*|XYn^ZJU!AmLwapSy<)=61j&|+38sMT0vmhQb z02b|R5zp58l~g%e9$KqlN9Aag@^xlastMj&sbw^?zS!W-W3I^J;K>sTC)B$;Erdk+XCn*dH;7MP*YWRkgATAIpW&(9f3y2RI> z{}mp3?pN8<=gAwRC%>5gz2Lk;0;GB{SV|-@H%>~)0|Y^nwP=b%KJ&!S^Vp?NQ8)G&W)^6PIDkarC20j|)cwPu4pi6v zRY)?UEEA`>i=X=Ff5t7FZ{_IFghMIOMKWSRDk*24f9ZKHUA|=6d8rooRx71Azev_H zcy_Ar@Qa_~kr#fSjZL=-qz*a)l(m>$rA4``K+2he?UC<#&rk5dH~k>{+l7?p4zw$^ z&{G_%jlI^&u#vcW^eq4FKmNb)-1ft4ot{z4vMqV?c`_jpZkMobP4>5hK=Cc*z&r{s zsqYzSr%Ss!P5y=mtzG>)VO=BIxk95$RcV5+R?8X~gJulshvM!!h8VV?bIlc#d6?p* z-xtMVSv;7raVPPtBw6>DcY0dqlhf{}eG)K$G5s%qXwYkld0Q3nMY~P6dcbLyT>e=* zFN6RV(&)9nt3T7hwoG1KS_e~Bjww!vg_~N^S7s$#K{q(s-fS1GUl5~RJ=VuJwK54B zl>i&QiE&NPp4-{tp(mO7p$BCkM3k^4DI2<*Lci+;0QNgi0}pGPfKD^!{}wluTOe0| z=jp!MN6D z4%L>=+HOKKKSgYU34`qDI=c920~4x~7ON^9d_Dlfmd&$+X6zkxQ;kaOZ&Kk!~2e&Q)|7V4M?AHP{rlHJ>jnPwRfJe5%f z2P*C+OUhU(NF{F^@zU;>xxD)XcVBoLcV2i48?&3xF;T3(EVT9MVMpRXTSY7t(J7?5 zlh~rhlZ)U)icXR0F#t{27~NKohLnWS z*G#H4+OeQEsN<4h176tvI-h;`m&scrVar(EH_|k}m{+6aM9PW7y#){4^&x)f+x`-V zS2HQiY>vXbE+8HWUd39K&F7Uvy~_XRXa7r{x%_oD&tytjb^soG&1v1NkKtnvMaHVZ zr{ti13J9DDOL8-O&p8ZuMToQDej(IWRU+~I<71>xAL8;6ooPO}U6tk zQ19lpwY5b`nWdXZMa}1LCS}^j)vAqQyF1PzsWmZ{C1V+xrCHk*r79^Gs#>(a`2`C# zdAVd2ph8U!D3p>Fw4fDInsM>s5%=F`>5OL4uvmfpedS$mdo%amc?Zv5duo zx&`M+u^e#`GvOO^E7mihDk6nSFJ)`gRT<`$v0mn}i@(itSHHwvH@%%Z&cB&c8#kk6 zhK_E!RVzHy)@j06!et`F_nwXvDWDS0i=dl|s&&cB0>ivgIpWIUb3AwXAzs{mn3DEL zo8BZ#r_}6}=Y$$SzNN|f9(0of7VV!Yi^^uXoj>)*{&(DW^9R}A8_79SOCbkciwU`$ z2ex;&dE)6uku=FLigUcxwPMza-SIg-_0Z2V=54Y=b>r#A3rvWoo?|^>h$2vym2<=0 z{N(riP4e<)mMR8oMi+?U#&Nd}Ay|KgjU#^M7yfI$_Us>U`uxny{<6078_#f_rmHTy z>SNXt#g-xm-i$75TZiTX(cnlXEo*!CE+1^?M&^~1mRDPBZW9L# zZ74AuZOz3yK+%bnB*5VWYz5tlUmvC1L)5EA3|hQRxZ|eFzUmM+_lN_HNqpM+Awj{4 zD_LE%T<4NixpiH|Gu~r*pLIYpeUHv9Laq!kv|}&OsfAVSxq5C35Mm9KR9fxpV?li@ zAi#Uss})YE@w-kDplK>OHcLFy(OAV$t7*X1i6@xoIslkVNZU0NV9>r38j~`+H|wd7 zewUT&U;T)4g7ExPfIOv@`UP$6FjsCLASvi``q=7G;6aeh_@SP`pq<#oB8jaEU2Pk; zTO>?irkprBTyW{yWo|itXP-wEN~vtjHkjvu+0^8PHU$wm@<#gGcRW$?Wa#bMew1cieS`u~=n8l2VtI zv*!lB_5JVRXMgdRna}4gh!dh2!GaP8W-P0kFcwSMtE!}=o~GrUza%v?w^>${*=FUa zyuxFz{5H>A`4YFCc|EtCc@yV0?_!ouBbu!f-5BnfuKBk>FEJpX+QFV_akj8ojHzfc zumlTs$7@`^@+>cHKhD*I=csZ(o>%uluErvC2r&hw;e~d_=rI<-!E;V5N99z#gFp4r z|AaT(`T-92ij`zGxM`(ufmC6Z29AyndE%MJD2xma5K|Li(Z`}vlQO0qKK;-yurog2 z>ih=~3A${DNmP$Zh+;>Ha*+Ah_x*M5Jo7e=_9`+Px#|!OeX|7O^cI#G%G_jKS<5u?8s`a*mcAf02>FO|9nKlpYoDKjw z>k7fyA)+|lB&1s^YLD`l#3T(ZHCn7q(6_LPW@$8wUMMF%1_wdWj40?D4DjREht&~0 z*fSu5_7OEJL-VoO6}F-n9KLZ$Bn?j>btJLd%b=d;8f_prkwroy{!}p34eMA0mtuE*ZlJRSn-W% z2;(V|i{HDM+=S;eK4H2=Cw~i#m{jOqg7{I@xYx>kR_DV^`;}vq($BoXZ);=KzF|7> za=z2Fo*=Y{Al7D4mY`TwCPmxZS1OjjE?7jiH53Za^qLwSAcn3hW zG{Tg%%~@m^c)}wUE6w}ji+kLD+Znq@inxfx!M^go_q>DO_|)%ld1nt92GjP7N1TYI z%Oz$88gxX-R4KkDrom)MX7TU5bdi+&oKSPG+!sRIdr46OG2VV-jc2*#KQ(WUTw_FE4X#=LIhBKE>68mpLkXkVl3& z3?fbTS%7AI$ZhVz^lVUCgN}rh2Np+_bNO}r#P|Kj+4kkD;K#vgoKGxd!Y&b7{4jhFB-Jzir*g0u3 zFNS?R8zS6{Lmhio11|uJpj^^;0KuFGYaGAL6(X zRyg?ugSJ?qr&T#<%zFSfp zHMiEAVI>GA8fGmwCwJHmks4{ufI?gFU@}eKY^0m+REy1cf~o}-xOC;B&3p<5;lLpa zr?xhED@h8f<{?X><_6GY zE&@?BWh+FaRye2<0?ff}=R}?b0g@B*tW-T>yFA0S%P;Ws<-r*$Ijm!mX#?%#VN9-{SUDZ{uLsg#YNO+X@hsM4|H3 zbC0uoc+Kkkd!@Tz-+cSJzMi7uv;^?4o z|E=%k`#$&=S?*>eW!yM~P+g04ml#4F3tOi%4?q8De(u-)E*ocym6?_Zp_C?6Z9RK@ z(zK??l+juuqusytgm1@$k7&5t;`%9&=!()R#|YusMO@R&iHLMxH-D$D4>&|oze^HY zq(Oi@e_)QjCyvoo@PbbEMHD!SanRxm)U$C2sL<#k`S3-}xfNhG?jN%wPDo+HHL`T* zp-x&W;=ljz^e&;QG`Y}OcXypk*2ZV6&l9h5w54o>fAVS4rB_I#P>xO#*rCuKt0}Ms z5N~v>D%#WWPoJ5mF#s!ypsu7gufC84(ZS2HdPhIktX{eDGE2|fE}k$@9XX#q zv*jDq=67lqm(V~%xL`HWyG7Q{8OM=v9GT^L=R|;Lb;e@M!?tL&b{(H^v7@sC=_ zYSj-DP&D(x3p?C&!Mf3D03_gWzw+VtzmHG-!56u9u+J77;6aGgP!5v5+G!9bMw(gGWhTWh_fZG+RbMGIOlu z-B*f^s1}MY%p#GNRtI9HuUnggl{>G0n0y^_&%sG;lQacR zCtm1t+24!FXFJwi^Q+I*u<%G<_YNTZezo>HtYTDQ%_hG72>(}C^y`LJM0-cNmB~CV zEvL`zKCsUC`{i|Vz9G#hJ6Y%p)dt)mf=@U1LF`KlJQ;6zmkW7qnT8VyPx_zjMA z;+~E;?q#=<9suOsEOhc8GC`|OycQVe+eB?vO4YUwfxlZ2NfW^F;BGEdZ-!to`sy@q zWUE?9S=ipa%I@w}h9R_4!|1ib*)ylDjcb7j1T_CKM4Axv^qSUWxk}4XueGpP9yqq~ z{^-6?W|5#VP3u+y4PUP{#u3E*xE6eQxC`&R_xt$q@A})E(tBARxR5XAGBSqK=~WUu^X!vc zx^@Z48H#j<&!iDlU6MCOUfljNpMUJ%k~a5I^T8PXM&O~h5sq!w+;GhelUeL#{@D9} zn)_~jFN*_benqL(Gg4HVaIrBLWNV+F`^5i?7q`E`u$inNl{j-yOIeL*Z`Im_aHK`v zhzTS(@%IoQ&ENt=(VKv`5#=$~>X|3aF3{#eUC{{^r}2*Mi$FUtEorXpC*dTeEaUmd zGskWvF8m}WZVd=D+j74ug7*3%*?`1<>o{d~qEemX;0eG6kyp_OL>_0Wpc z*jim5#I(70|BMiswX*)2E871`ME^=q;K>UnYlM8_eRcH<@eR@!bPbAxMwAE<%yfpj zc(>nBoo;<-1vh-%#3rP8xlz0xK$H^=pZVe8AunBgkzufy0IiBOY*Ds0H`tt8FZA%& zCJz{J%-t*#q6QiQ3K0JDq#PXW8PoMjgH?P>3T_DqS}`|86d9^jEnN$&Cp}igM~jVN zIl}YLUu#tirN%rC>>gCUlC6W&?)@mABvb zJ$&oif0Tn=^;nha4W(iSj#RZ~RHYU+&cY|Y@Xz_eW53SknSnAEb8kuT9>@}v<2vw& zY!;f4Vj_Ij1!tSvzJp_@b`7*E3Q3~ub)>=j-l=L}pgMT+^$)N<71+~Eppg4Li-O5o z9~V|}9J6jrwCpg)Pc3P2jjmjBl9fcKC(yJPA4i-s?N{1jP$qXtEAxCE72JQDT27iZ zNBTL^z)j!B$L}OQ&z^-f{cZ9=onEK!)UtY-OUKuGa)Z}u+V3~*YZzZlf#CIz$y}wp zK2kk)(s2d03;(J73VqpSNi!f!h4%{D)Q+4wn(yaF&w0D>xI1F1p|6|gPd+AKC2kgG zomD)uG6TmabNaB8g9KmgI0>tE0d1d}8J7sVk+qW}a1R>6sUjZxV7_o?Rye0|rmART zIL2&E8ir5bimSx;+UBX$%JZ+h(3YbSbS(@iarX2nDz-ty(YcxTQwv0b(EcYxFA?Ja z%Q7;S(Z=i7lu20y!Yj( zoIO3~`@i?Y)Nx6c8JQVbtVFM9CXuaeuq4m{s`=+r$_=ziFprenOCwE76`z;vf`4eS zH35#S(UAaIQrk!3Yhf-F2jA+I-2%j|(1w+V@n!4urqwmuxKC$BQzmWCOh|^qedYY{ z27dG-|0y4O@K3SW*`yQ?q;#4xYs_Sy2t4!L<6OG@3TcS)v!m6bQ0Z2JG9tNhb@3#> z_sGBEFkiI5#yS#>X|%t68;H8vERrnsDkT;R<(ADi@sU~!&N+jBx$Im!P!{VFL|A{_&2HTivF?$YEP z{C?AU?c?#4IKg-HszLT`T$7J&%|rNqlR%=L1a;QC{7ql1{TYxfwXcJx)X*%_Ndt0W z6wD)hBq2y9i{H?G_>=Yc%N~1ztbaVd!PLz$&AcA}7pBW57_Vm@)7AfEb(`5KH!ciu zeaxyIt%|fswYzt9L5}^eTRqa`gw)?J%vwh9rUBNdDX(Tdh{}2@LXrMFo1+n>kcY%e zFTcQ8%cK!XF{UPP{`?v1T`yvhf;9wR2Xf847ry0KmkL^iQVR!*Jscsr`@l}9YE~a> zE9AB770f5@O=)~QCYbEaEqXt(EQzO|z3TkUm~kyu{ABl_^1=7NmA5=_AIqbqSpk@l z(u|Z{!zMGxoGdd-vlJ^)EE3)FY(|o6jh%L59z5MG2~`q9^0Y>=wQIb}-_1~dcd{A0 z$o{c<^n9PgmI)oeKyab2bd6tqYJDfJnGDk~SZd<_Y2JPBALmbf*MH7^H+_JEo$x1G zmq@KfGgT|4jEKNE9`VG}k8t_gWm3*zNJ2F=ZQUy7RTv6a$EW%Ium2*4`hqtEqS1x6 zQFYK_aTVHjgvAIB$l)n|=p%oH^K&af9DZsM+)8Dda#gWZ&;c$TJj(y_iT{Q&+ifXj z;(2P*41+F^rcv>}zF?qR)tS2Otrkw>6A&3KAvAjA{%g_HI*Jo_IFc3fzA?N$+aKElwCkdyja}6)mhzP7CI(YnKM} z=%1mlal?$-{pC{S*k~FCRP(GBZN-e6pa}%+-r>o6YSTJ<;Flt$FtrRQ#hSKc;gzc| zv$K1RSJq=J&4S{BZYAHYAyLRL(0*8w|MqSz%+;$mOq3Tky znVhvitzE!W3zn;Db5T5YU{M!j$y~a4$mPq26Ub|ni*6PG-QP&{|Tk(=? zRpy{uRkSgrZY|T|SWDgI5`ao7XfbO_9h=slG_%};n}*l(gCG1~^L_9AD{Pj#I64?f zDN_wj**mHMfZ~-R503VE;;Bd3+20{&vuIeE*v@dPC}mtAd1Sjh!|y-*3+&hDJeacD zW}0ZJQdjp?+fMH8o8=jcUF9S1{!!k1&qp}e8_mU|G;o+ih%&ue-M>5E;TM1N?{Vee zDQ5H3%(Ln(XHy6jr3rl}Xpn5mO#}|RB2x%wT;Q(`;O*U;eF$o8PRG?Cxgdp}v zleRZc068ZP^G1Mh^*P$;E1vny0|0Y>-|!4WtYMy&=179D19yLxPonoCUmbHg@!x6C z!{n{(_DqDYPBxpL*6QCgiDaD|(ze*EOw3BoXWtNp#T*+1Op z`Inz(Hn&Yuok`YOIkmaLsjV|suRy~s0aDeYD-5L2_nx~k>PmM-^A@_-$*$eyb00ZzIm_rUj)VwGDZPr@(;aN z+lFphO;`a^xNh8xsgp?N3DfPO#_AE^yutzl)jPG>Vd-2j9zr_0!290t!~FPn{%sz( z?ZX`IWX9IaMVrQ^r8;0S&~$D08c#m`7>ng0DG60a0_`c4sv`wkpERp%muLCxBmbHM zo+r(_Z`(Xh$pML#b#5Xg_JiPQl`{?xl-J+(UcUWZKhD9ftxb*RwpfDLUdd7o&lZ03 zOaF|Ap8hSiwk+sRU5JK>wPgxrdo*gn@<0+jttsGsq znqVNeo=ATm6;~40Sf@^}kIVg0;gV^tV#W7%b+Bvn884v@B1JI}5adL>x=sMw^c{l7 zOhJ;x_oS9d&|#OY-vkg%#v~3H!qWVQKa92-kX-+5{hMR%l(pZJyb1vDs(P^qp()zY zi4DO`vqG!TD-b4%6hS|ZIBfF#F48xbPBu}CFp!Qlr#L54%oHna6PwiDtQlfX7*iL< z@kI-!i6AMbRK1R=rd=t$neghfraNa<@b~o(oXP5SZGOd3xV=ww8xw-iBE~;b$I{BY zhU#Y@%?oXQSO*Qh3!FtepfZ1Ll@92pyQK<@b;+|YK5YSN6W|0^U;q5M(`do9T!HYL zPZ(uvDp6@M3ihO6LY0HXp#z=?2kN#ETSrwQM_s+=L}zBDX}r_#QWCCQJ>unyyJRm) zV?I>_69;?B4}A0^+;;Oh%2*k6Mq-9UgCN)bGud1mDUe9ET2nl-Xi}%v&{S+Hd}UJz=UA^!_aZKsrvAuq z+ht>zi=&Djp5npVznzbL0~D*&H8-N~OBJ);EQK@qE`IPM ze}y!jZ;|ohYaNy*b8!_)Eo`37eB-%K@@t>{r_9f&_qlLJo`Uz#cu6qs;BOw)kOQO!-aE)Z*{9$BvryT$y? zRV#TIc=pAoS&R#EHb!I`l%NG}zUeGEIe3v|t$(G*0*C_^i_VtzpF?>EEy~g2h;dx> zxd{_)tx&@UJ)%0c>8~iYj*W2zpa>vPTqGqjPd~NI(IQx*r->Cf*dMuY(<%PM4}KSA zv0#w7YwOWE!@xjJxkd6P*9_))U|Dzh#*?4t?5W#$&+GpLZ@&F|I6r$mEViH|yDkqz z4*;n>62iIwIxy79&T?TyokZ+Q048yo?seI^eI)D*rd20VB-^?!_A9bD!y9k?Fn{6$ zf0OTh_kYOE^EY#_t&F4Xk6I&K)2%9Q_8(HF=n>Do^b9XwdI@qxqjN-4!E_^J0w z(892xTseA_KX~*P*ynkMxifJi4*-lnbH8($fV*zg-5^b>G~jC)mx+3?$q#(%U*fhi z53o2YO%XAys;zjHih+`0P_8bX;9vdL--Fq%&C;atRhv2gSeoDpK|c{HQ8}+m_4e=< z*qmH&Xrx}oUX@i|=3C4WsI7Q(y=y0QoY7pPEBeipmrZG>T^{7%esLwKdebSo0wEKK z-B}u83J)$8R-_fs%@k7`o70ntzpX_6RAig{P`J@QXHnto7(z}35xKP5(x90Rp zE-wQzOqoQ(n!$S-7W1xK{;ZbnNmvaWP_(fYiY(nnZ4H4mjify1^0iC6a_L3xy5&9= z%i(nO6jY-HlL5NAPb3q}8N_=jdodMFXoYdC z=rXZ2zm@y%eiv`P`y*Crd1>!!eCerQWtlFM2Lq&HsHY230m#0#81ZI|E_{C_$sFt`-~RSL z!CUYBHV$@|F#u?ReQo=#9#zyMoTq|c zrZ-@+nD((ZKzQw!Q40)fs3|RWSNsKq0&}=6izlBZIsVEU~erx5z|2#m}`) zRRaQQfoP;+fKQ7tp&a<%wK*+Fg2VBMr=EX;d+)r@DI@zDR_618^XJd8^TIX^t1Whe zb0#t7Tw@cH34d{DO9C7m9k97^#>(MJMQiHJz>@>8hI&MI#ER9AmnvQv5K1c6K|1Oz zsFH?(=bpR9t+$`z-1(XLwGqk)nqjdIAN#@Y;gQFmX7}*GD&=9peu=^6v6wX>i3L7- zcWUM{;c$70M_%|n-gNheIg{?>j#KaA<}+{N+QAFFvi%5`_MhZvd6mK;l13yO^Ds+` zcW2Z9(J>=5Mrjrtn=|oR0128Pt6HE4V}V){^L&O|&)mcPx4oNtZ+$!GHt&RSgT<~O z$$LLYrB)#m_4*-72`A(e`<=cMJb= z<0BIC&i1S}nAd7)L|NRhUTPD#(>JhqnB?z=gG&uRdyIi_A386Uh-&xY#@NE-u8O9q zav=Wy!pa1$%)~0M?}8d{0u_M3#*kURh0%VJ1P;C>EI~2oq)nNdN}4V(J8)>20z7-h z{qnJ`8bFILoQqbx0qf)jE`!1a3q9aGteMj=bkjeifw~B)51?|xxB#t92Dj`1o!Ty9 z{wuBbgRZa1Nr%zXjV%BZNw^wlC+?SaB;QQ9zKJC)0I%Ua;*K&U2x-Egy-T22WJ10) zL{!5@)OJLjo@MvYDH85mpqm1)W;jg89Tz93hFHYu838)f112ZvGc<_?Os03$MjS-- zKYEujTUH#6s^2e7ezAXz1!wzCi&JhQl9gKPV9!r#K~89UXDcpZfsfURyHwMXQZkc0 zYL)L(hR2?Lln=h=+sz;AIo8Hwlv^*H=lPeOckL!qTLYrx5&Gdyo#c?~bWUvzj+RFp z9PM*z<21D>LkcUOkdsg%&Op0~QmGUf5TBJoA$fPeV5}pRB#E*V9((K}@A;OyiH>m5 zWMzN9a_jlC{P6dGFaPLg{{|~>y@m*nk!ip%}}Z^n=6OoB_4VHcX{xR zk8nEQ35Tb+dHw)5-+3*Ona1DDP%yD zA1GN}~**=fF_-UTJ_!-zZn7Gg*>LU@^A<=jV zq^0eJuh*DgVsTWsu=xPr|G~e2E>2Uc2{^MR7@dm*)ms4Q#_7zXFa92%_{{&z{8aH^ zv6w&gbWT9C<7o$=u1u&@AEy&v^0{)sgZJR*A&3zq>f9<-v`8OIQ={$g6dGu_zuNmu zc$BY4z;Tx$O#n~jN8^4?iE<$$tfUF2CM3ELBd&-NvMUPBgddBz`Bn+Z&|CzK=hyB& z!S;D}zj))rD+b&tgo?{t<|NFTQ2RWzlVsAl($^FTQM5ikVqhx(ferRLBFe0bo_J&X zZ^ELC9Zy})E_%Yn>@*TQ-++f(0aRVdTz&F-8Bu|O}qL;Xqfb;$Y_GlV_lp; zQ)Tjw-G9286)=6pNg&k(tk~PQIUCx4zJDjES(y$$skGYm)0;KRRUqDp8)9nix07u! zc1E4d4HNKGohSegdO}@m^5#n+TrAkDG9;TQ(F&>fOuBF_OY&^aOP5~c;-#0k<;>kI zm!o4zp^Sy|XU}kI>omKEyB6?P-4&n^En5o__~g0a+Fc+Gmem)>QDm^5^&5G{)k{Y_|MXSvzyBu2QK?C&qouZ8xmx(( z``*qs9(|loeeUyYp53Gt_4?*YmC|@va+7Xl>8WRxVNjOiWgdRvlf3cv4{>gOFXO1_ zI53x+xZ}(@Zaw=Tg(DWr9rlhcvvYKbgT)mNm)jhT`;7I7ak-%A64gqTr88dByR&3+ znlT%;*qUA7%+{^kbm}fHoVkbdTeq_{J4a3%lo9HYvhZvUUwI-}G=j}*9T5+-6O`S< zZML_su{b&+Wnnf%Fsad+duAGiS4L)Y*sCw_wI_d*OM8!!HzVFWXV^Yz=JK zPMG>+RGL6CKP$ArKuN9qr--=T-Gz~Df_lC8XftMGnOGUZ_A(uUQLO(S)ae_+^Qzs2 z*G&Ds6w#jVF&7%| zHhKOuENUeZ+k-GY@Fy|`dWuq+D> z#{*8yPMP5G<}Wn`!uFt|ZV(}=4^kmfs7bx(hXrSsYO^;|nB@(gc;XrtE}Z7{nZYXx zf{w-{7Wj+L4?ttX_RIe6?sUE<24?B@sr$p z;oaPJ?g8o|GipJOKxD>{=FH_BXHUP5JI;FDclGo+T`-mdDn}GuGU|e`rVM#tmgdZd zE#~2c48AcbbQI|ohgIx6(3WQQXHCt=~mED6~_V;!<8V^n3%QK@V zFAr`0ZzpR9j0ns&3a{)v%-5d%P4?8ET%ATGGiQEKtv(k16XnShi z;+87Z;8W4S>eMCB ze)GE6y>zFz&(|aV17O_X391v~ZSbi-D+R%uLV zEc=)YG*k!1S^7B5wB^2MH~DK)P-|*h8C(k)orz~u3wf4!^r=Vqz&pO3*^pU|+LlaJ zx$V{qJonNIs1~YNlyQ~Z%*&E24nX|;Foo9U+VB#mR1S`I*c>*ywhx3aRf=Gtz{a2z zHIrejNHR;n;O029^Ax{EC|Ve*FqXt4k6z?k-hG!>mvg&>2!}_Nv!^%tsUQ0ofA=5$ zPZ%>#RLzzqj+<@k!We@4iECMc2Q#J&%e2oEm;ZphFs1WMP2&FtxT*~RyRP! z5)X$2TZ02L(U!Ywc+fyqCZVHHOEj>pz-ZQwtVqqSQDc@EaSIGR08d33b;;4*0f$HX zEEb2pr#!_E+dn*pUd1}Rw6CGU2rAXS;&1i$|IpXKY%eu`6P2TEPq zZVDk5`??8fcRSjKF@UWh6hSl@C=d^Blh~aGJk?_I>zC%ZQo3QT;LmZ z7m2#XPkj!jM_Yyp;(7d2K`UY6uG%`K8V%cInCz(yJcMAMf+7(y1t885A%a?i&juu! zT3;Ji?$dpPL)-f{MQ!@4YO|okAZ)*fzkU@&tO#%i*WKmQCc*ZgnhThwWZm#Z`+aG# zEUU<;ozQMno%skW(zFeIB4k}7bJA@u92)8MUasZdH=(QT`{O5vc_##OgOKfwCQ{`EuSF`2Fq@dAQDNAKsDvM=hxlqai>eABoVqVmn?Nlw4I@)!$Se~_aN3>WETkNXJ zVmxGf`zjZ&yu#I;D=e1_kNEGV)G&P;`MV(XZ8&UJt}P$ubC3T#kG}j#biM~^k~Za9 zHF(--ozOFaMSIi0u)63>2^M?s-Z%XTzU2)+#L)bmB{o{|2A> z^1tHLS$A24mp=AEJV{`s#)FrzMpOH~J55s4c$3a7Go~6bhkrdXp={6R)={wu?kO{H z-XoL$>%1WT^C!2O2*wbS@1v%``>$q;6L*nWU6%OIEP=k?Jr*dMdPP&GD7`I39b}v3 zFRX20ZcDgk-OO)YJO~l;-UDm|hiEe8r=Q{Zuz@=xz`1K(mjLd0;(CkO9D}S9=hLO8f zL9Kl}G^NH|G)7*l@^9T5Fs+p%$%6pb{SIwhN<)H%isNzBZ(Mx?X{!hqNKz%5ozNyV z>YexdcSP2wvy*aPM2!SFa*1(8-u# zsh(*-B8yk{^YlDzv=xDZKvMP=yUd17w?bg+n=Npwwf0Pw|1F3Ids!WVItiQ+87ON0 z-Z~Zv?)H&6k3V^p^XE@-_VkQWD_IjoDzlW>-!6Rjhd;=(FTBL3KL2@6o!Me63v!;b ztV<7~^K?0sA~P?gy0H2gbxBniHehf0JYRqQD)-#H@}1vFgf$_;`DMxCf|-^Q1Ht zz?1!2rGXdo%S)@cX`I4?ykg_WH;U=0OKq@Uc4e5Nih6-X9AAgAPY+vx&O!7h0osnsb z(Sbu}iZNHgvOMq=^*~Ke{fqaFCx;*w!wHcz76Hy3fKEF5wZ}SD`eY{OCAJsV7&xxT zoWRBH?hZaGkP|Jzv$-`+*4mq8z~x);Yf@_Oh$OU?6)zs^HGPk;AguwT$#@5Qhe^;x z8I`4gFSOUnsOXgYCJY z%EJ1(nfb-ZEACm%pPN$Z8nU-+oxBCp(w!4rJ^^;p(C8|noS3TGH5MajNh&46U4e?ycbNOmz4zgNamAX%J&>R>Sg^Tbon zJ<9IhHD<#Zmdnmp#yWD#g`3#i+~RP#?=Ao@PMQ*_I^b}hJ86=JM2y?yb`s%ealp}R zpUv4B?>}G~Z-Y-MQPee+l&RvWbk)*hh>cK3R5Mk~-(6K%Y9%YkD177Lmw4}cUT2^d zi#aG_RCah!`N@y{0GBRbedHkK2MZ- zz|&Vg$Cdr(xcBCFbAIa{C>v-Iv@ETzL73MSEay3qlYuqb3I#~8*prYu;Ug}^fb^&p zsc!jj>qm6l%pz9PAmVS;M3tp})mAs%aHKNKgi&^QapxO6dGYgXFJ2(eE#R`My6L$i zU@?a(om1FC*M_roWsfIG9PU@%cK3Ji9q;@P822|FOgT@`>IIZs14;=QE5k-+d-*iK z^vVA>i+qtGC!OR=*c9k!WV*5w02YdYbk|Ma>-GrGB%E@qH9oVZY)!`ArEI$+qE>0O zJx_YbN9Z|Nf8GW*GdBx zJ|>OWy+BuVy=Wp7nsLU#yuG~jQ;AoLx#?i1O8^hWGdUG8iw)Qb)1YpNv9)Jk2M7cP z3@yNeD?=+VFyqDCb#jq(db!cj0DuKT`1S1~*F@a^-M48V(U`?P$o_m=l(uPOZcYYD z$BrK4hL`zVC*&a7+Q4K4pr}XPPIdQbJO|)Dtx1k`AWy=@l$wCG>!urWRq#)7kSc{sKLlf1))e!fc_l<27wtsZM=5U&#Sd9+ofUwvck<6T#q&g^2U?l4d z(Sj8l5^9FAS`>X0jG0O1>XjoNfBY5R^5E^1aU`h~#;HlrWo2s^_=`XFqx^UO@Skvb zXOCgNMJeGvSyG~bja2i`$;>qi_knxKQxRphS=n7a&o^GU#LcH)&z%?E!uk1aP-hmr zSAE@G*cGkls366)IU|MaCUo_p*o`@EpXc(yv!vOQVZ(glP5Tfh!)EFax|F^L!m=hpv&X7kc(4a=zVjn|$Gd)t zaevdz=(Z06&_y935tpw+VjQmW?>_ktxN`Ue^DP`e+b9KS&S?LpY5STcN`*AKGa-Nr zmE43Z;)Q}RQ?zMyvlcXFMw!T2RnNRho;By-Hc~0+aWE!)wF$21d11YW#D!k)Rnv-_ z)iEw>5>DGW6B*Y&1TVKbHF1)zoD%|n1#D;w|0V>Xecde`B>+bC+@zRG?Q%d-kJ*{r zOXD)HEfe#y;zJEfC#z%gwKh_ccy%YMSZC+&bcah*US)zA;^i9<>fj+!R^jn;KOfHiX|BTaG z@8uvy1*#b=%e3H*&%%mJ!HH=4)vLZ@Eb`=DJpiU7L-R|ny|9Cp^=GW3A&Jc{g@^^9 zpSBGZT7?^CbkdF;{1>UKgN- z1|{13`BCoF=F=ML*foL`{#ioxbSxRM6sPLd#;TR(O_i@d{t%i9IcF@Rjb2Exx#GcB4=(|p~kVZG>LvDDET zzo`2?)!x6lb&Z*fz9hG_B zA~9I&;4}bDB3BV-J?Rwm%BDoYB>x?rq@Wi@L}DOSV3I`A0KCirm;-x#dZHs-P$+;wNQ;Z2)Q z8x@^h<%PY^^Vz5VC7*xl7r1=*2zh=8QW&+g^IL$MS|Fp*VrMfeRxD@ip+!l`EcXZA z_PX!pyWjKY(1WuG*{$f>z_mrB(|p&Jf^6>bYoGlYo_^(XY-~al&;qj!PTRg#k`-Pe zgL)}vf=SyLGTAh0-{g{LdrjREmdOlx=0F=VsimQYnLCLAck|Ion+0k@qO`MmfvW%^ z9-Nn)BTUs0B%CD1d$NPA2n_9qy>|(oJ^4Mf(pdi+9ih?NxT68jWE>)W%no2|ZrqAV z2Vo(|&FVBT6}NsjpF0UXVvUdL%K81AqtSVIz@ zR0AuuTLIQzHh}sR{OR<^Z}ylFuBzvjI3t>v)HLE=n&vJYQ4`1(%tYBut)>YosY-KA z7NGcBxWG%7ULwnYrUIo>Fn?7_lPG8HrAvn}tG4wPkjmcSF7rHRNHastNxgVVb>hpY z#}%aF^PA0#ACcUWDtWZRLP;!JqSOM}%)=?o_{PI8apv@#^Jh1_e6XYTEbQzS?!V`D z{^C#n82{jB{spxPvovE=kZeIdwHDAhVXU{U7FtS=r72#BWIl&d_IPFg8(iFZoYNaO zbL+V`a`WkX*qmP=>zq=os-opE+Z_h?qu12qW2&k}M@Jwdq0wd{Ef$X)Zoj*r7PaX5 zSyoh*9E_KERLqYqSbd2iBb#Rnzx&nyg|9yK2{zC8+=xLxy9bS- zs>i}KlW|HdyCG@wM0u>SnOnW-ZWHpcZIec=ce_ATE!fS?Q|juj;tont_y30|v%PE? z1uhn%{H&)Dx>3aL=dna8i6rKdiAecy8brEZHCX|eYiJ5TCQjK`;Z2Uuv96!V-EoD8 zIS`*8CDQObshHNIVsco#P3KiBa$_oseLh;;O1#U2@2&*ut(`N)3F5R8mMr4wnwh3) zuVI1X^WgtlJtQS8SOH&~E_0phEwjMS580L0;sN|?JHnz83n}gASd-)*qHTTBNi)8X z&DVLKI6MgORn7{BM%+?@u>CvLm9-A!M+hGbIX1J$4baIn8lasQkEKy{drl8b#I=r& zy>ta~bO5kk!c!z!DcBY$=2iub;JpyI{m+#>G^OB`xm;a>4zNx>B&v={50tWJnSiqZ zs?_fgmW#-d!GxeT6(maZ#w$9Zg!47I(5wXp6aH2Z#>mJj_>F*>T&uG}tNf-8B49Bd z@z5h*=A$3J9}cSlhoA|CJ8rw3OP4Q!6iWppDh#G(JrcSP+S07NU{ISZYxq*i$l=i* zr?<`-{kfl9+??3D%O&p?DPsN61xB^8N413Ff;uNq@7|^va!Qmj^QDJg-~;cwm(2}p z8!O3b$ETdQwq1C~gZJ^%f9g;2Ge7%_MCmVy`t)Mgo~lgfTZ z1GQOU?3%0=TR^X^nwE}C;gUZJ@xxLlLA)u zyR`jfsCnOPyv-9y(9K;sCT%HqI~k%p?DX&wk_IuyMM& zKnjsyO`GC9@k|Ee3Q;{!TWX;9%xrs4k|3Jh+9b|&12ECgvqARpsqLZUnqW$JW2LZG zdYnWxzGKR92m2`mmNS}YyWE9ZfDU}TJ}VQwNBo3%HxJ)vs~{ne8gJnGhq`T2j2}kX z-Y^8GHo-XPq?yVGmj$J23s^N5pIb4czYh(pI_1<*$hvyEuBFHGr(bKIDw`W|?b^#sg@Yu9uI6hajfmi>Wp%2UTQE=)+o{7 zu*rI7NS-zrPnSvk{MB*WQ>%KqnQ^10S=n4wYBFsH=(BrIx?FNJo5Cz zeDFP2*_fSSapd%rl(80WI(we;=Pqz%`?9sqmBc_|DVd~&qOACjwVFoT{BSMs1#(sn z76;5`o6Pb?PyGp0u8KGajAB-rvM)yo<-!0$HF3~P&=Z(H40Cq(3Saul^Su9C?xUq1 zVYTE%;Oe!)``+^)hvN_MKmUt=%P^laOSWd}OkMBtPaMGOuU6Y&}wOjvt)thkDh|# z@RO@CvvHx!$6NT;clHDd7R;Od zx|+I>v^naaBX~(~gKbczYQ)NT{RLlNb)X!3ewCw491bGAz3}8{aZ%S1L_Ho!S9oZE zl}Sh^Eo&+E9JYSyaThrX`Z$q`)2Hp(iINt=-#*cbEWwEaYRVRa7p}UW&3c^zv1w$7 zO@#Qdxx3CGuu`qoF9~p>(=X$QdMB=h6^w4u>VrdUp8Qx`aAXoI{e zudhEA>joGwtX_`@Sku_MejUIehU^}6T9J!24czW0ocyG8jH20HvFhA_n$2EI8>sIx;jy)N(~z2xvSn z<}}71V-Hi5v~eU~A11%YG2*@_l@{YrJ@5~$o=Rqcp_PQxLeBnK5{Uup!l%@v%u`}# z?v<;<1KM||~b zFY>N;-Dx@b&Y(glUE3b{$cNs+;o^{g@vnZ3`R3eu7F3T0R!j@6)#*k&C)?&G<(X;l z-k`=@4b{H$ojji#;HqVZYm05J9z2UMFyu{Ud6TW#c{YaA%<~pQ-eky|q?DW1t2#2W zq|_zLa>zLDaWw97xY*%v++|VrS=I%W5zU313wdV3Nl^z`+379{3aM*yv~dw^r0pv_ zz;gZc_`ex@kT!Mt{>&LGjHN(Ur1TpY8Z^Q$G-%St)(zOSNP(Szsm1@?H3qM zN2k%``y=A9!v-jAFC^T;mLQrKH2_F-d9xRfY!fBB<|rON6O7jPrzUTc9?FNB8vv`l zU{xqX_}Cr{w@FQ|nD_{?SSl?dRCSk(2A-=@%gj5H zT43vnGIX*mn)2<4gAspj1jM!%B?P*AZR#2TnPh{-AX?U$&r!_dRHmfKxWnRVKZcdf zX*3Twg#*%P{zgZak1$L(@A?sg5=RSdAk`brP(9RL`ox9F+zU1+9Gm1Dfs@eOk~949 z6~&bjAuM5im{3Ck%CQx7(mKKF&=`y}+K7e?Kl_RwOY|6FtOO^n>?oQ1?~RXXwnKYQ zoZ8$#LitNrEu* zMo`{Tm66#j^R-95$a~)UJ~rkXEJka_6RCK&+>$aVCHeQBH2r@60_ zTQ+b9l4*WG5*B5_;o`s=1wl6xrb(+|tz>VKWK7FVy&_I0iqz38KuMhWmX?`Ni!vKF zc;UreHaB19&2PD#aXFH+&6O5qkj(a#k?;M;`>A8)=l{*GGTYi>CdyJg2#*1hkhEAi zT4#*K_ev5$(m=%u6`_UH>c@w+W#>pL-Z8gO+2x>av$y{;wV2hTy3g8t*p_Oh3WX)A zBT)lFDYni@NdpGVTF!8C;AQ51aZp_~_B)+hsX&T4AhCAt%8DHz(xc6jRV~!ToCj`y zKkt3R_p>3lGajh*Xi(Fdi>N_65v%GbZu+D$oL=&U$3D(yAO5!tr$&EDT48)W1;bVCp9zNU@ektPsgRN~j+H!QBv(ouo01U< zM&}}4MBPD@#QsRZmwa$*SyA0P;E==xY6#2MS{?4BqpLF0U}KjJ5^fyhIn!cAx-zo( z-_`ffh^U_c0{kp*WZjRIIhz0hF`%EE@6{x$x@=SmObM?*MZmhK@;r4J*v)%v+uBPJ zm00Z>Y0vN-%G#amXa8D~^zy+P?TbUPq_X5!kg#*O23f zDe7H^j{c9hk8a{WjP~qZbFlMcV;>KcT=zu1wxbb$)1=}D*Hq9>7snbT_2^pz3U2X` z?0CeZi-~O(Xwr~{V#JpaqO`7}P;2W-RJUP$6Cp;j;aRFg2PF8DJH>K@KfAlrP+W^F{~hyFleGMx{y*( ztC>)wTAO2(=t`H8kWzuU(RWrwSvqBzB>_AQKuZ6AQ6EtYkJVIX;cYSf;nzV7D#AFVFm z<^i958MmWlH_NsvOpY9hU{7PCOvd{ zR3b=Qnt3?_qF4D}@RzATzX8t*Hw+=t+YdJK&?_c_a>`=Y1$*4nfW6ren){Lf@!`A< zE3iL*l^yiIeT-e>r-8Ph?cja^ZbM;c6;G${)<(ygkk<|j)}~ErS1y{@WaXW0fVGqk z5k%d3?}d!CVD(8RE2DkgrP1eP;1M&H(u!MYI)>?L#E;!0XVkcQ+6g{#dw-9>O+c~| znZ2ywNrzF#iZ$efGfup+nXdagsDE#aCAC3_4`lTcS^JOXzoQX?k4v@lC>Qu0!~_wk zp>Aa*a&%Q7f3w10+naXjzxr!00J8psj*QGuVA^6bm}zHt1asS{fQXw`r?0BDYlTul zq81$%(eEW!QBNzY*5t0%RK$e6^7YB8J&rgN?j_Y!1m>l@BZ)y`N<#t0m{Jwsfhs_ zXOcOI!8PrS$jr(IGbj7^Su%rI3En|6ISr&_|C(N!8PeeXR3T|L-!fwE4=+R`9`-KP z{NdTJO`eJ=2!nV{GQTEecMGND<%~1EL@GU~(ACW($$O-SLh4p1-&^(+*A_*f2=!>j zJ!jsyRiW?6VquWyuCu-A$0h=7N-vDC?XCkfE7KjVENY9{BjHs_!kDSvayPL}Hy1 z^I^`_%RBtw_xy3*`ldH?aByJvidYF(I4V)i&4sL%W?YFq+_GcT{k#$Z%i@Yz7YY(} zA3W97EO|6u5L{=Sx13xFc7;(iffRcsg|O9d)2PSda4cr2`^n=zL02^PX9Cn{JKp!0 zy+7{n(xev%3b)@RhQr6zR8~WhR%9!l>mVbjsih5yv`42VM?7_OZK^CuIW;A*f4@49 z?K2qQ);_0ES3X>tQIgrlfS+5s>>_ATO<{B1#^f36Z`uEiwKwWxeeEMkcXiISU+DG5 zUz=%3UgLSI$4U)jEP}Lq0xT`7XB#--tY|bgVScyC*!o=)fxbGk3X4WeI&H#b?+dD_?|w7}5p0}#aDu^A#F)&-?_{e0VA zqxqz@7-?$t^)Dtwjbl^2^W7_#UgR5(e}%1686iqVV+3A>*WGy!nGMAA=CfoX1u>=M zd_kJ#7eP=^TObX-G$O*$c*x$-UXQ93Z46Mfv|zZ#0KI>J6+O0Rm14lA7BlNtFL_*i zoYqHRB&9hIf8!F*Kfle!JbPrfrFd0~?qT=J$aj9=ef-o<{0NMS6quzskgX{5}Z{t1p{vhvt z;78chyExqMRT>QKNh=9$`TdEcgSiA|i37dNZ+-FSc=Y*CvvoQ(ZQkNtjQvJmhU7v% z=E1B-c}19uWCLRih}UmO4qHSl$6qvcp@3NuvJ2~!yb?e%eLIOi--ZA7rEC1vKmC{Z zk?;FqKK*;2X6w`@V6L`lQ=C@3Mgq($QUBgg@OkZQ+uz3bLI36?#iv7q_@laC+WB|Y zuHeL-oCZuM=~fb%@Sqjm>zt-p0$iA_uuW&GGW~DL8U-fNU6Xkao?Iuv;I%0_;MNo8 z`L%j!ajMZ$sSa9v|7-LmzzTCsXH!=#76EV?4*_~_mFc;aNbRjn!R(X%YVxl(kY*V~ zS=xlG&fio?Y;%(*MDbeWtk1Aw3PpIn!l1W~1V!Dn?wYq$3*Kt=58Bslz4=P&ogy|%!3aCID zsEnqSC-K5U2`ESwB+dEiS6?Pe;?6tIuv`{M-es+t&v$ocE$Pevt?#1*s!OaC zlJ!MUXg=H6D^|wF+&e{KM4RxNl5;|-Ze2*?L7)<}tqwwJqr0*c=II>w-THQ3fBOeG zGu%Nr$f%f4zq%Hi706009x#{8b(5*gPbDtyJ<9KY{oio);Au8aNpoYhlreE3krOR) zzg59B0cKVg@ijNiKM|5Q_E?%Q+U`0~H&aLCy2V|LniuXdF3x>J+1nuDPr4Z~NQut%l`$mG6tRvbk|yH*ddI-nuGjb+WJ>7))rw zmel{zmFKL)=eR|pIx`i&L6l%Okg(d?xv^&T^vg*HPjl53!gUuG#O_C$Iu*?I7Lygg zp(_aP78MuT!M2+)_a;Y^nW>W(Rn_h$o6cm=#iY<&=in!=$Bi=HM5}{7+H>uG>(>aa zFAqHw-T-8>9xcgTzs@5Kly#C`xtGiO!6r8vD)h+9KHy-zHhHn(EwXho*>bX`|5_^& zUGHc?I8iEbGJy6;!yx1vz7^B4h;W$@e19Kp|4DlePS~9(tP?;Rm#+VQy>SNOS_cRx z{VV-X?O%zy>Cv@y4KCrPI3{Sc1)?an5fxM`*-h-NKSJEk1N^dYt`L_(uc#+tRriW| ziQ#0G9jwoL_DxgdDmGMi;+B7&GcH7oDw_Nmb~-92l(rM;V|j&QqPj`= zB)-!bN%-229U;#rY-mNGHBEEsNAHj5=V;?atG#>sJ80Eblt?jJ*YK^Y#~VmpiQ8$T z3*j6w1TmY=AC2uL2NC)4$>qE8nc${MguT2ogk^ zz(rRBEA4vi0Wks9B?5w?U5R5ubtK)5nzZl}$xi4!j4S!MDi%bQ0#K+S^HK{bXR^5Y zKhpE0P_>Yxpqi*GDK(Mina_Xa4|vP#-_C4yiseEZaH$GsPH%C??RW9)3r~^r%owXW zV<%IkIFrX2L{H7~;-)qhPdgGxjOCDngI!LaIvdrGX^2{_3S0GNNLf6c$-!36gAgK5~XHH)xeGkILisQV77$n=ypjj6*DBHnqaA}m9!FE zA<(mc4jvpA-QlXUKgA<_9TVEW#!nPYE;PNHWbqWZ$i*imuWkoggfeC}hV$HU^8?&- z;ccAVyo)-{DF>!;dp-ox1cgAUXpWAJrhLpcEBo~lUwinsdHT|q7&aDGtVyGad!jd) z_n=mP_w1#NjRLILRO}HDkHq#ECXc0PfZ0q5cBTUii}qI{4YH*RxZ)&g8;8t(On`vPV3k; z?YWb6=s!;G+1D-#%dxheG2)>IgG^6ajn@x1fRFh27y?9G#|rSx9LI_{*dL9Uk{XH( z^Lw)pC|)@(tP}z*2A~1Q)k7it!3}C?^3G$&H!?$<4qDlp7ur1>GwT>dIwd-hZ8Eni}OD)= z`067MbLOUVjAh}pEX@r^Xup8e+S)x^n`?!PHGa}HtsC>TN2>HHPq}fJwFJ-Xa`c8E z0B9Qa$(dsP2qV2+V{0L`3*?rz?K3%XzuWrC8dnSjtlVQtL@VfQF z?-xOR7IU#WYb)bwASeC|V5aR)CndPD^f zTJ8iXt5z>>>P{Ws*ugrogz4WNSF2eIBng$#3h6kav}C=4Fj&9rYH<`I)^aw@GoSnF zXL<7*-ofVVJckSOw;6w~YzzahyZd!K^281)4GiM(1!6*~l7VhEHNUI-x)j%%0v|b0 zOv?7bHYp9v^329L$(gnQLC~>SU|R%2X{NZEevc@Mi`HLx_w_+=?0m&>Z+HcHd>!$Vc4i# zJ$#nOpZY8>Z9fLHBQ~~t-(o_#oBE|$n$46ckUcuTn*TF7$V=JXnxTfeKuf>31|F0vmoD?(2j9it`J4Y4ue;?g_O311-Zz_b zzO~U?R%-yPRlr4zO{28BV4b(kje{nnMy8Ifxp;A*AnPt1R>eRlJ#p!J-uI7g&@V9=fKYI!f+Bx9eA7zb&wwoGlt-oVz_sLzSJkZuJMOlE=x0ki+CijU| zTOEk{d$0({r_YF6>vHcT>u#xFhXrF|h){hgW zUz8h~e%6mIffa zu&m-Gc1696Y|5w?0}{;$1F8lTX2T{|cQ5e=U;16X|HFTh!=nXZ-b*PlmclJJ-OQz% zZ|CKUFOc)VSeM4MlhPpfj^?X{)7J!5Y=V?%p-dpS{rPwnz3rRNsqI zLDgLV=8so2RZ3MvEUMhV=7=(olR_z^tRUHfm+HtcSVg{vA9;mwx#Ud`-ieOxgGf%d zDX|<2jLM(<=y!AP-FNYG|N57>vVV<@Q=630%+j?1Kqm+?R^E9@O4$PvM}!ecR;Wj{ zdRpKTrCMVh+YRo)vDv9^{jf}dDC|T7K?VrNzWh~C5@mF&SRU9&r#ZcKGdG>OoAamc z=FG;eh@3)8rY;IgbvjP9f$8MIgta&$_Y%*M9-3#Bz2zmIe&(yZaQW*j*rg%uG(y&f0f%^z)a-mK#?62~DD1H8CX%**knNl;>hM6WAps{&VOJzAO)*555M6s8bI)y?>_ zde8MaR6tWN@TO6J#eWT&xzTYQ8_3FWvQ^&JYUnR@!#gxVVg4&@L2DQO|Gt`kGks6| zI@7%U*w{h99o0E5Ye?OvQ`XFxlR-22zN7QdhH5uG`}31C@>O@qYa3G>uL=h0I=*z` zn|##?!hY*<-;+?S;9IRmtEFk_l$2!pluGq3fZ1&UTCKLURn-$zmq?lsDS(p1nTq+G zO?w_)gC0OfbX>Bzxxqt^e1Ug7_-<}HcMrRJBbiJoW+_00`|rM&o$YNFWuGC>C}U}Y zqe_N4x=-G8vm71R!i=4Q2E0R@D2sZ?_TDwloxVW!lpilU(k)49Yn_r=6~Y`$TYuc= ztw>eRm=Mq3?(Vp;ED;^ZX@e&ozs6!&dD~m=CVF+ZG@@kUXMbnpJ#Tw6ciwR;|NIw! ziLXEYC|g^nNEyaDn)@Lq8@G-i1Dc`g=*&XMHBl&3mQFYxJAp@D`)18p0Hst1Q&X_+ z47pa{O|_zGWtpvQ^PKr`mQ!12*_z+X+09!xwQ)1E;VhXAv}APQl{Y0o84l9Dlv4q1 zRx_i}q*il)ykvj8$cryN!V6a(=CE94HiucV_Z4xsl7=?#;|$sD>7!=3>gl7cew;*V zUWW?N&Q}VLuyfA{xuxKmh^k<;fk zdF+|z__=@m^K6|t%~(cPXeJV^#R~L%KHX1E}%*WKu<1CdTzA=j2~(4>fnRbTEK-x`f)SOx5{yxS5Qv zba!=1A@?HS_9P+xT15ZaFQH%M0``Dz0NfaQC;W0(w;pncRU3N)-#|N zMGCEpATF8arG}Z&7T%N#_2?CY5w%t;bDK;!Cmns=O?a4T$~1h{gtjuf#X-QbF`|)? zEHg?S`JK=H20#A&f0iK&TD-_?N|YjO&NsR5p8I*^$*+_1K-K||Icr*C(n3UE*A@(B z)*r2byU)?Vv%KS-cd;?E8UraOD>fuTPQu>qg4@pD%zyM3{ye|(+rP!H zfAZ5TYhiO^i$z_47D`UO&9qfr%wCs(8p10h9JwpTyxNh$k)?W@YnbIz%r-U=of#8% z_lXrInv>FuS)McG4Q6SB&Dj}-yv0V|BBvRsbpg~-s8y`(aoClEgw?fYvDgq?@K&|B zh?Ins3xypn9=^gWS0Crn?votV9r7GzgEKU>;5Z4>J`e?tVr^r;T3)^jSGBgneXE#7 zPdo_Fiu81!Fw;DLyub_6t!>G&BeF&YfobEr*RJxw>t4_Q_OJXk-u8wE*uA{*spEvhNz>I~n=FN8*QH%lT_i$)4(K$W0@$jNgniuQeNEeDK- zQ*vuZrHw#?&Hy*qH zJ4<6jP091t-CfD^>zXAxg#RR!Po1wtL_!MCgY6f(A}8VsfqFo00|s5Tboa7M)u$Bz z)w2L5TVbN?$z-pnM%@)@V41bGhbK>G}RsC8vyt zBH21gj`fh;ik<=K}wTs0Jj#nL&!CLcO%)Iu);zUp(g6Vz>xF6aJywkcaE_x8+gW3H7#_?k{ulmAd(oRHtSxL*A79_xPq$3 z;xx|S`&i6EhBmi>#5_bV1iRTv^t#c!t~ijZ_8`w-IXzO}ghsE8zy$wIgk#hGl@@D( zM&ecz@VMq3RTaDJz+E3P$^aK(`JM1V4_rngWwNKu8F;X49IYv0#(mAr-q%vuwa0)p znwcDp?OsO=MmE*D)~KxV{jhRdM$$y!gM;2KYa=e@4--`X&0O~yTma$U@I`B(G7)n2 z%^xQf3X1P4fq?vbpLv~{RoZ<5#WjdcCk$HDtDk+H_b@bOQQ{%++pf9pwX27oaL%eA ze{I(s|IN3LeO>#;mW27SlTfR7GFLk{LdE*6+6h(B?DF6+cdEPh5Qv2R88{<&AkV^DZ6`D$)_`$^HZJSIb+dkmBTDmPAx4cJ8|CCdP5JfVP~hF`(yx z@9roM-2XcM)?fPz{K{{BlHdH)XIL&rHa0gH%V?IBl&HF(V6g=isL9*{2|K==-b8waIy&aM~!KvXqXSQx(Yjz8p^K)$GEre{b7eO*fTvQsZG=ZbEy_kFo zte!#zsZ>U^jvSOd4)!mzbMPWNhp(`=xXf4&U>Her7@{4oQ@F)0m^5mEcoM?QP4nKo z6ctP7Lx=`fIi-FsLIe$(3g#IAsw9v84@8z)nv}a9bGCREF@Y&0_IG!<>yBIa%YXK- z^X>0@H%Gg0bW|B;16nKdS!VlikH7yv|3lJzM$$xCv$1!9Ui*%2rfi$_C`2PTKLQUt z78jBZVVZpQy&$$GLHoYt``!-z*pwZA7ge7J7k+pSNq2G+77QffRC2sSQ<;~d`E;T1QBg>u394 zQ*-kPkm%Jk|EX!@Mn3TqBPLf6TC8WB7e-)@{B1&FDu7o7?#eR)^b@8YqX0A2{Qqke zZglh=Gd1~7(RI>(p0;i00uhfOZaAj2V8S4JvTb6;kiVtG`An+X##Gm;P+VsQ87S(E zOD*-x`mc|S9%z+h*;5ZuW_iZ7y-R%Zv%k)t{LY_baa2f>EXO%jv|LPn@{1Thn9QmZDIWN<-KTp*anG_8rQL7%Czy?2EqiTP~P>im26tt{p*uf;N9 z>^>a?))dWys--Wsz;L0|5lvQGJ_Q~4wvhcMWo7G_;qvRGFAZpbZje%CI zr$ezd63DacR*oa~>Wl1Ldl3tQn=>CanB~)K4QH7Tr(g%X&a%w7H#)%n(!t*YMg>dHn@Sh1{vq1CTQ z4fI8c-|*w3YSsRdGz&sNS_&wjjpZ&>? zam)F0>~CAPNH&`>V^L0D82AT2^UrzonI|}V;T&Tf-DP3cD6N*(X{kE4eny@FRHX~# zw$}}?gf++JN4wzEu;v+Xk*P{Pxkp^v+_<{NPuxw^TnjE}qcGY8>bcvo)VIYqcZpKM8nuK$e__gEm_8vp>Xfqr!YKmYCWb z!~pbYO1t4y_(M0w{`(2YDIl1BK6ak20?76r5{S+wt{I&s3+H!OxvpyUn#*CEj@7gS_S5ce8zMNzMr^ zm6U|B6mC9ufqU+}pJ$(cf?1j~)&;X3T(8M`F_@{|BL1@`7u>a_qG>YFmWKpcEiQpWj_N)K%V+82u6_s9T#L%=RM5)7*@NheRoUI%01VHnssXGCAs1?v`|Yh=Yg3#8 z7DP$$CIqDeb|r!t12nl3Q;kkyW}Mp*frCuINaLrIps!GD#rLkwv(sM#5q4Bnw~(a% z-E=O6=2D68)z?H}61^Y6g&kBS&Ga_h@p@*FU5Q7Sy#6;M{7(}0Ctkmz0~`MvCPP^} zyAMd3uLL?U2%q^MM)+M{(67925T!UGBmCHtjp9sPF%wDvVFVLst55YC_x;e65%mo! zjwJtZ!#eh?u)eKZAdY`N;XP0I6f&#(0_`C+(GaN(-u!M6Xk!=GrkSihUAwjrAVML^ z1Se-gnj#QTZDZEa%2zU)HdRLtOR#3HqN6cX3g{A)w;K-`>jQhY$kn@SpK{V?(C+FfpOd6QDrH9;GHbNv!MCCpl4nw~Wn$u*&jjHqj+xVuHMRKbbq)-{ktEzE`uu3TO4 z+0Q-0TisWamCAe& z_Lm3z_y6c0!Z0JHZ1X+!lY4Ydjm=9BS&eA%;8F%?EhVwm+BUd~siJ1s_P}OQFSIjJ zIj2fb;2Z+p>IzR=QMg?DT(Qu$-<-chpkOE^YZhGblFpNO#U_}nb+Yt57S@J-wa-nV z2}zM&Lm>hwRlFc$tYUXT#OJVT_VZ1ys;M4?Byq`LwZyH{mE)#tt)#<2TbwqBiTE9XkzsuThT<7yifZ&Ah ze8X1P0&E4eSx78(#LL@Gz|qP$UBY+5tFG|5#^r%>S_?&l2(F2gwxk8r{Jy0Ys}Pq) z*A@gT6YRji>7=SM8%}X;{|cY@^e^+Hf9%gNE@4#2shb>8;Z3i9fP-)Bb2J`U^*ddV ztN975-!CU)>;;RK%`HmYG>z)jt-9sP-s{@l6>d6nfmzx#CZ(P@Dt?aohDz?6E7gkR zxUg~_j*4eMRI`jU_MH-1i**`vO9iEnbLMCXU;fGqT)lRd2OhYcjd`MsOEf2oi7Xb$ zUW#(E^1|*o0*!ZsUW0e@X~@Eeg6!V!Of@vE+G0eG|}yX)o3&*(E`BK_pxiUlATd@ zq1>%8KuXjw*8`HWne++4Zr%K{3(RqP*;Qaf+6X<2nI^k!)7rv79vbsd{@B8ubu z9AL=fe8A#qn)Srrg&2DSjr|bM#yBo^wYhHk$QMKWh1;Uv*s1n49LEd&OsGrOe#aNE)qamf4DEIe82BciiqFUk)hJLQ zhQn57#VrUOnaQ;4H@s%{9iQl5JPfOcDT>#Qiqwg4t z>JC4eHpCrfANy?n`>NjSTqif-&xE+gG^h%*_mW-b&#o$3-SU)o3l*`dK}A)2a~+ z5LC=vk`#1whF_>^=5tM;1%`~b4bJ3bt!JNna+}Ln4tdL4ZsXQlPg6?;FO(CJ+*#mY zf8<~f?!W6k{#QSJA7A{+SNXNy{av1X_Gx66*w~n3{`fi8&S|tb0B`qNn@JT)9Z7h# zMgUnhOF@7_bt{;-8^J(;neLSc^6T{?07k0i_B$Z6VkXAof=OBx!0>a@e4oMel7_F= zQvX8pcirE6H}tA~iDdQs-3pSUm2{P69Z1OnI;~EGr}$wDtp)2GNag78ka4l#f!E*1 zk9_|}`M|s0juzOyGBTTGQqE{`<-n`+jiqqYEi*p;iBIvbe)ZQlcm4uL<1UgjQexJ7 zKpvQz!K?$7h~-ymtK`}AQnkif!HYsNtyHx1`{UcXr_DEm`%3HpevZUBO*Tq%pSJjp zHSW}7qJk#}*X=&`o@(ccq$^T#B5#a9?}>%kd2{vWG{p~^0Iq}&-#M!QEqlWEwnRyE zmrG44vN`J(WNok10cc45crvu8{0S?zXGaW#*kIL}h~iDHx=V%0x=nrmEoiXxy(DR9 zV@t~zP%$5~<@_g-S`@fA zv$H@#0~&~sq%f8vhRqqj`I%qm&f8zdo#*dmXZwgDXU5U0+AYVzP3O+=!0X?{!%sYH zz(AFu8iN^S^eB37nd==2QynSl?VR0bDM?*l^;L1p#?{@+oIi7cdERO$wz^3mOqB`8 zv}*JbX_U1B9-S|xGNz2w1vBv|X*a)A(N-%ffd^qi9tO5|3!nSkbKHCHIo|Zf+nH|+ zjLXr2f~uusnuaLsY+E0I_rBxpy!Fj*<%?f^h~N7CPw~ui&p{IA8yntcIJM`S3&!@1 zijwl+8o#Y^uDC$&rhPn}QE^|W2Eeu$i;Aa+LQINvF_a$Mm2yPf8^;LCN)M*>v{Ab6 zIMG5(k(5EKra{|7lH1=%_AKmHTur_LJP#9orF69lld z4sSk18r;(%wivCd^NQpRpqzYdf4BCQ9r#Ps?#NxnM(jkbZqc)iYSbsuNGWbi*WLmw z1p8?MF21Pl_@3}73Ad6lBl}0rR@?3H5+O|6X zkEgYuKDYX~L9TOavC`VT=L;TO+Q%4xd>XSFM~v63r@@#rB3)5ifj-A{#8u0})IDRM zr4SV=PnzZtBSQ)F94CcazdYkiA{WhB#nO5I*wJJ1iSh*zsN~-00J>534edT zt)$#Fqb+gcXtYsA#vkN)g}8 z(IJ`3g~{gei2I}~XZA76MEK*3KvqCh+*urZ7IkwmimI8k6VdzIeb8zf(8|n~)>ER3 z+@&FXH}Utt-hqW4^6}sL*Zc<``-^OBY_eFwFcZd68FFG=j@)+ZEgT%(&(qI8MIJVs zdD=J%N*PUP$CUGL&O?|cVe{rcDWoj>?2Pdxi1%W=tkbCY?VqqQ(fSm=sx z`a+THeoK!T!HNZ?q-8S~N;5aR;C8h$?15H=Fb5%F4UQt%DuWkus*_$6 z+3%BF0}a8hcm$FIJCUH-Nz}hYS3gV9j2Z!n>}V^j2nGOB%4ii14|W+)-un7``L2(A zfcL)Rot&O04i1!~MJ3Oou7&S^0j(A^iQ4a@7XIu1{{PF)-VvLpPqQ2kjpoCg+ms2K zG_>p+=Pv<@e4hmn2yg~gv@5CcG1KgwCPmSrUbqId20sXXC02@AChy=&V(qjI44Er$ z)%1Lv+ql%y)U@gtV-pHO1AM`2rpn6nSmEic&V`HcKrNGVA|5L!tzizcW`&lGHrfm( zKjq>*7Bl#8)M4yAAG(0NacX=IyRd5nmE$LCJdeqedh|Hp-(oU zZQ{NLUHG>pYa}~;uKk-FP_5$MFmtV-sc!->O-4XN%Z=%DKW{&0?P&Y8N7UM0h@D$J ziaN};SVJ1Gkf&~@omT#imcphX(o9#MU{l) zvJwC$)dZu~0)vqAjGcYuvtM|DyYJZLfj8d5>C+pOv6%lo38P66_us?8ZXsoO-`n5L zyWjR!o_O{dKJ&#d@z6IOW_xd!*)U_iv4IHQoXD~<%+p_d{0`hR%`yNLmCBI1sZ^5n zQtx1~nAKCOjhSizm<<#gbtbQ!km5RbC4@UbL+CfgZ=fJWiX5F@lSD8eh!^cKS(hyJ zPfgQLB(j=HtRf7_a{iag!qIY{(_5Ro=RI%cyT0vPc=Lk~G7~u3s~qeXa!wY%F)cO) zUE5TsMY-vgf&b_K@Xz@2*BedlZ_tr0<_J&$2_pzuO(6yguOuxsD}0tO_?mCa?AITeKK}*Cw2Ob9$f&E*N-?*T3rhefG=x z02?Ep1YWrCKfYi+LcSjz9ji_=7i1!f1=A{4QQGl)=wy?wLX*ZRqHS>Vw@qI%2>i7M zPp&^FknLnAM3=Z@xwF&TSkPK~71c??s%sr?@=9VZ0LF(}F*~)%SD*MYcieJ2AAZkwbM5j1$=QNAi`AspqC9Zl>p40) z>kpHxFutI|1w1jr#8=-W)KKS0|-># zd^!OHCiF#;HAzazwe1Qzm>`iv(SeyHG@FnWRdR9xQ!HwH$eBSlc=7ptE?wN?zWZ+G zo_lU$J|8IKNO5M516T0|B73__5P0D3`+4vU_jB>uHedPL*Z9&`zRq(mzQob8Fx!|j z3|4GO>xd*znZ&=70<{YgYY3$d2+jR7Ncfz+G>}$Q1`D`!pIvlhvs7;flD?-RKr^)d zPM6^haPZ_mwE(LS03O~KQTsynH5m|k3;-mCWYPHJII=i60xEahb`$S?&wKf{_rHVt z?!ALtVSisaEb0~pbwCna!d@_FDhZ6s!iC!g{`If?Efk_UE% zaFuwPxb@4|wYdjFDbmS3wCgid+xnE{$f`g*`B+o$*1*IhgfLDa0vaTgtp*q;?of?+ z=_1~ML}vY!BJQQFetVSj^r;pPO&%Ewot_`B7uPwPO(#rFyI%(qF@|QH78)4pW4iHi z!~Fm0n4Mzew%gyT*T2Y{a3uSCdU;=@gqHD-1OUVlQSIFvV<|dT_TQh~()R2Mz)FTf z+lW!s&Osc$e2o&!0cU8fvO*y^%8k;r zuX-E@0LRYI$$4$pIS@JV@cM3^ZlxZ@o^ZkMj5)%vvWD5!(yB5ZfaTTWEEOx88CC|8 z3<#N7nvv5SNdrk|Wai|Q$Y~DD$g;sKE(kA3t{^T0iCW&4_y5-z2pni;DxyJa1D z=;5!jyMGO2WKj+%bxEz32B=yX>xf1G6;ZCZ2i%Ba%~hJl>g|9Nl#pj4M~JF^-jC zHn$=~Nh!tV$~r@OYM}Ogql}nY(s)1%o&u~9le9?f#z4D&&@~&6%l8y9+a(ci0?oPV zuEb!j65-g0x33l?yBmcFIIM^cWDy4dnX1Bau>`H$bZ(P3KX4!Keb1YC`&-|{P3JeM zBOD!8H)422MsDV~uPT5iBuk1G%Dx$!SMS3Fz7 zML6oF4RN5~H9DVraSdyYhxpqxLEFp0hhnwHt6I#+RN0E(*6-XzXrmS|9vXq6>&j{i zYIT!-Hv`7~r4`w!TFH6f?z>-4N&~enc>cvlsP)L>JcOoY`wc`KBx>@^G2@$M0dY1%l0f&yOj7t- zT?0%0n+bR!3bTX>Hc3WgKvE{lj40ij)8Oe^b24-LJq;ub91JptIhF1l4P%opWP&F!Yj3MwL;Dr zsnYz^NrWr|s!LQ0=gtn?d;bOQxcwZnBnFI57zQ>^C58dE_YZme zi6{B$SD)gMC!XTUwQa_+l7@j{79?I7aWI8?Fl2R$M%PRtOQiXYYp2Gp~}@Ya;AmRYcq&~*0Bk5T(eY<7m3dXl00K0(5xesu$;Eo16Kf= ziJr+hji-4`k2kb3KoP-=6V$t=g*ILj{Cmpw+9}5T1c6){uU?gm9TLWUR^kynex%EZ z5XsXc0=VK@ZSQU|DITQmbf+rhVaDt3y5Gu;*9FhL_!zb9cUIqAG7)nU;KTN51-E>~ zJ9eu;jK?~e_RwQhbqm!Ej=;_-EM97S+UMP#+atD${$UI8_qlsb006KY=wpucAhLwi z>xJCW%*yM+{(6=F(&YDJ03dcO5cRQb+N*VmtC60jed4v6Nf}>PwL&RHD=IV2p1u|8 zfHHFN(o0lbw#s1fZb?I14;^Opy_>0SI!7K*X7A{NR3LmlAx2hrP|Pc=lY0Nnqw+;s zw!^fLgqdE~uUiejY45D!5p?*NgPDhKK#1DvA+!*23&6~+0cMglP1cICBr-`{^G^c< z16c+{=42Vj^8aJ)&$=zkuJb_bn``fLZWC>`$RrwqAV@T1iIOO@sFEeB@ld&jYS^wP z5Bt~n-7l(#Di04=*|Mu_S(K}hsIJsg5}T4lilhh^`zCOprMML$7 z{%>um^wH+zwdkm(aKsO#tweeIdTSLKAfKq1eXu&*{>`+(SFwIJRD-3>} zxSoc2n$hYGu!_5PH~8cy?%`uE-@|4bT4^*)Dk#NaC0r&}Jjnyzu-QyFJ&D+ghmS7t z+PA-ruYB!0`1&_q!&~pZgUjp7FjLMGrnyi+M2&#zOL~f`H^@BM&+hshD}E$m0A})( z3Sg5Ki$?Lu7*;Opdg6&*z`}P?={mCD}7k=W?_}piI z9Iw7|AE&3lZU-z&@TJL&YMbXf9Y~9!!IWW~fW1JByTMO^|I`2ZKgYlS>NjwH`y5NX z!a{*>)&W5ET@_oK2CRH^tMOTA|PNH zgUX_Q$M9X@0fvn?qk=@<87_i|XIZhC;z(B}Fz|-qdoA29GRcc|#c&8nY|VE>DgGzH!CQRuVid{uD! z){B78aI1Ldoi_v3LmCLM*3>Pvpxm2=%xSg*kaXlas`&emMzaq9)~mh`xw~J^(gkAa z0<^MhEhZC-Mj>Unxgy7gMK$!|Y`0xXK`Rl)j z#joI~Se7ePUs&gVp})J55l29lqrzHc;Tq4tqDltYhMZy*S-N|64`-*hgBc0PQ9y*; zPn#GD5ZXM*dZwXtEmXnIf`M8=u^F2Z5x+KATq1Zb0KsHY%w{s>{GfqwmrU|&XTJYxE@8I=seH*X8{w7}k&Uf(s z2M=(0d5NV()yFbN9{gnJnxpp|cK~VOP1;I22D*ke1vObH3=Wp*C3q@~Cny#Iztc9* zmWE}yhI_?aCfqtd#j7vBj8A>?NAQ_Xzlu-3`YP_-yM@gZLci4tGY?lwu@qQdLU0rg z(o4AECp;J$DpwKRyX97)IXRzfa`jb1>oRis9L@5@8XLjHx)AhX z!ekSsslZwYv~VX({5e3vT(&5_ApqE5#)J*60~1c-yCp!uJe}e4Vuzppu|J0Y^w0lq zaq&UJZZSli97C-@T^waI{C8f1 z@ftN97~FTXb^$0i|qENCL;Px$z&ck${g_i%n|hQS$R*0^5*1jABc zWUkJLeTPkklg*526KCo1<$`zLdmn%J<{#oaZ@!B^eDh7b{q8$>|ItJ2b~`M~g4!BD z7e*;ljBS#usAOZ435DxzfU(`MiE3yiU~wgZuG%WR252jjVKdJ-KR?60JLh=ir5Ewa z%g^Hzue^j;UU~(0Zl7VZHJ|~@4yX%@7R|KE0O1lTmYS^>N11@lTrdH+xLBfQL19e5 z#1KR#<-1qhzQ4i$^A~>!fBl#K5pLbP&4~X6&33513rmwnLn#+0L!(S9MuwCe4<|b`8liYoPf5wo&};5@WAmZe`G>jO6_J`Rhk}pf-w7*E8%mh&Y18sa zn(hVMqNhEj1h6uH_j{E(10S9`C^{g6S7on3fgcW3NNm-pU(N5}6J56ch7Ygw;X58? zU>6$Rvqs!RfCkSXpq|Iv*Qt4hwE{0a2g9fpM5>WUtL7R&WnDb>AsP>brJ$K%*RHXF zp;^R^lvYs74s9vXH0W!;jnk7;{ICA>e*%ARfkMQ+Ij||H%Yx@_-^1sA{HO5;-}t>i z@S6$PT?42nrDAEJ)fa%8SZ_2^04yx!I}vSX8~{s2x`o;NYI%&^hdbOk50`)sT8QW+ ziUjGZn9L&9z*R!I!r5fRDo~0?dR}o@jVShTt%Qcwd`G6DQojbrg4Sk~DdH*~JzDV9 zufC5rzV#tqe(4mizH$fm?ww<^jamhbJrZCZ%GDIso>r)dH%Hx7@)}1e6JELhB0m1o zi}+K23|J~~b#;vgk00Z`_us|$-+dSFz5fXBzyAR~c<=xZFCO9I>N?sSFAcRVXbWpF zh$NZ;zC>Xnnj?GyW}C5@Cd``|C#M_SK0C$T+qZD<{$1RE?lxYye~uSkcplH)e-5|L zPjI@Of)=l1i?6R6mh0$3X$8?#%5)&e;;M%*p9`khu-Sw);L(E}UVH6(c>aZRyz=Vv zsFieYajMD&sI}qF{SAKcm;Nb!@$dX&+`fAkyXBg_Fj{EwUPEXX53tiJB;4hO3KEgU zq%wY_QGhaLqc&6(I8$xvq^^PItV+ywF;EVKyz^9BS5!!@0q%u}ygw>yl-No$5!=cf zEJqf}lAx3;Qsb(7nX2uHua9e{xvelyzIx=uNB{7Q*FhlTxQ9)y3x02y@DD2dfi8xE0s@Gc z`;)o>=J1dpKqJes8~t+yQppEn`|+ne!R&wZyYxl*_!*}&28aYMP*n0rJbN=CfH0#O zxLMzD?_?}6Ew5%0ynHi*d0k@~ogkxTp8xEBcx=x5e;xdAH-1xyTqY{mVA6gHGR1%u zC=}xmR|Jpu*`x<^QHajT(+t7nCUuc|(ob{{{fpnA7E-?wVt9hhH!ni_0(%~FeZu3d&0P{tP5K0;K@?*IA**`2-9Fx73;|SI72}$A@p0C zI6ZkzDV7$Z0t@ij!g7Vi)X&5i@f>UNV-Lzu@-xZ>lkj$0dKB>#{6zg*P%J>1q_qbW zcLmguk3rh-Fo*1XD1bqpAN4&Xz-iqu)~PUu)!5fYE1k8%Jz#bZ3kX3mK|aWWy-NXj ztD=m#vmXrsjPkD-i>oP{!jP_9*P3W~hBrMW%=_@2t5M2A^u%_+JqBRB){14(EN(8n z_rqK^{%BNy2lPv=!d%45bQm3)cDS1z5tFz;z+ecb!lDe`6fqlv=x#HPLubK*!8PS? zVxJsD^!?X09$VkDPfCh;&|lU;N^4Z86v^6*aR~!zy#aWst6C!BMC+b8_DMa=qc6qS zb~danll*w{I`|NIY=c&W2n$-uZ2O;U|6yU;g@+ak+bd&9ueN5#8;aHTmOI1_KD|aBwTuSolWDm(WMT@Od zelwsh4VSfs>!vY?62TmU@zRW}sOUjpIJHoB$7~Vb02r>W9Phn#fw$kf!h7#keE8uN znmxkL{ro5J>7TfR%WD;13EojANA(@YA~NxJW!Y1072ID zDU*H`xT#8)kdQV9tadsm#JrHzNrFDc5`lNf-#cQ7bKaZuj8;f0M;TibR*>K;9WCp* z`-+m{Zh%Owjqf>)7BTJ&tj=N-u?DbooFF-60&@;M`Ema7U~PlcVw_Z0G_|#YCE)TA zE_GRqHIOZREZZy~STPpk52di&G~B0O+_xuN0B&9n=ya>rJ)ZQ{@sWEAbW=7!yxuzT zQUf;%(@c?3prMdbwyo>}QjdA3S=1&2$o}IKD%L+?owhkH`_#iDTRoI#UGGcYx5CV?Cv9 zI&3Of{2K2+dKYIWr?_=;7gO1+cuUn9H=r<1rXm{Vz!61*Ao_5)O|TMO`$`QUP}%uV z+Cf27$eTRc|1NA8gsI@#fr-*}wh7a8g0?ig_4b0d-+6$|<^k^A-QvX;Pw?Dxw{Yv$ z2Gbm4X*K4!YvH0PgV2Z~N1BzPXkC~QWHnmE?vfEBF|AI5&R}41mYyv^^I>HPY;2RE z6)-T8;3JkN^=C^h7*Lf*ASz6jVpuA0eNpkjdzX0oool@RcE!b`C_>dLP)-*7FaGq$ z@rh5JoBxBed`XGgaCr4IV}bT3BaCfq`6LI z5E_c`ClGP(A|~UlNCF}B67j|}vO^$6Y#CJ*%V$G%3&@adl0RDx0V*IZf1$+;oI_~& z-4Y<>P3g>*b7`ax(3+;IhygYg<1{K?apq!=dm*7h0KCte$KSM%0!z+~IVR(7w0e(w zO<<0q=4<`_bbs?IzW<;nTwPo3FEs$I3IMGA_421>^)Z3Dy-WKAA8Ud?VH`&m;-eN2 z%F0yEHm|v%fGTDM(Qux_<3*Smu`rld!W>6UwM?m1$UoSD1W~Q6pBm3=`;T2o=)N{2 zvUpN{ZFoGDcdpBypTfXaYCp=6CpIZ_aVA!;v#3gZ7d z;3Ybm#pgPbP7`H`62p#8R1H`az_390iyJoQ8~n?E_s?Kv_%na}&*R~HSD^(@j5M$? zZJuvW@P*I*6u$D!ui?E9-o`v{QLABNK&yrYJ9wGH=ZF?H@qLbTI#dG70h0L?{nnXo zwKY<2MdNyM?*>h7RIJQ6CMk`kwH|o48+)=#Yjb#0%mM(f zC=;_%NRrD{!-MyCc=z2$c<-Ht4?b9MbqS!&Fq{BB3eR?Ki%PzxrSPbznXV*Fw8SXug%!FIlo2L4A?tH)sbaa)`IA>ndc!0CM%Gx-aQEKgXhL=FvSo6qCj20 z7?3T6H7`S)G4evV?m^PE9(hxcc0Ub@u|T@}WLeo)YM&SY2t$uUP~QKj{fCucU-A1$ z*MU#N2~>c2|8XuUB+WZN+rJt&KkS)p{~gE1@ezeR??PJQCATq%POtuj)usWRr?ZPrT|TixP|`9Cefy}5o?aktquOgZ~jv_fIs^u{yZMNcOAuJCd1Af<|+J( zr)9<$Kl?d+o_h>ilt)bAAYD}{+vUWqu9uqz4i2_WfSmx~4 z*6`rseOz5#;MVzFZ03{BOgXRU=4S8`D;ws=aG`*L(H)FlUl0Z@T#2S*3s&_<`ry9k@*LM@J84rdFFmp8v^`n%t)# zp@Vz48cP>SW8A+OP+AKx^v+;RjScccz$X|KEfzWM?n)4g0X&tcLxHDfvJukO`qJ z703r4Ln#@M81>n^_N#YDaOwl=LQ8WT(Q^97HIyziJ1{vW_`!uf9>f>h+~2sqblCcz zl2}}$Ko^(*(7Kih7}Fs2xQV{HhQ)W7yhZk~0R{>u3O_LzW0}n;++*0@-r`^V*1te)6@Tte{Uuy{ zaE)atm_4+u!Zxsz1E2l$XK{9RhS$IK8UV+3wx}o2Djb_It+xe0#pI5tT|mFTmxyif z2H2Dpy(+aEI8aLHEV0&xE5E??<7=F3&T#wWc68)(2~VzX3v;i#hZ(#WM881}sU8dV zXIoe^V+HdGZV?DsoI!;iX^9m(n9TtetVXIHCZI+ff|Y_9bU92jsypg6aCKSn_S+9( z1vuG0z{%Ed>(&;xZx`IUHRJsJ6x-7cHd_l|P=-Llk#Q!3rO@VCoMhc0A<9yiO#uwa z)Mf)(bzC>cQXN;9m$3+5c-s7KqOIXE4qMN8PhdAvaPWl@e8m`x$-Ja1B3+yJ%8Y9l$)JU} z3bSY|p7+UIShNaWk_aIas27+8_-YQI?wI?}-1}yjN*tV}Ehsi&0kCO~W`(VMfmSHs zs$qM2ieLNfU%~aV!(aOOzl`gL4VPC9(^ODfi*mZnPQa5ynBdw z+QQp)_@XTectpx%1*}41t-(;Hh!KcZt?WhbHT{RdFFgH(3Ie^jdW`GqOPp;^advVW z^E5-2G$7m>O{bHVmu3>;!K77BAS|BpMh!8* zgz^@2tV(fMjkd(o9G<}44%qD~K74oye7|8X2AdvWGaI(s38yE9?a2lwCx(-)VLMNl z<_XhwiXIP>${ZuskmPD|JG-Mcz-z-&E9$Odx2w3muDIF(yPe}|saUQWYW1)XQA;aj zMzIr2g?@kTfj3~cRP3%Ryc*iB!tEh`=1<YEd!8V3HLP|8W1_2LJG%{#*RD z|Ign;*`5LB*wqU-tNcYVsijBxv)pv0WkAJ$)aeh10#tbpntc4oGb8#LwQ(bZ=Lv;3 zRrsg&<}KZxNTCp_>Zl|c)o^zU%Nuz1OaWvz@aMHp8FB>}-7lh*R9@Pirn>e~hbiBa zug3gHgL%&r;?^nrMmOb3b7qVVs9+crwLb&_S`-ozpKNtvwnN-spy3mAz+tGt>ia?r zb8N%UeVqNPH_vC}y3HNdIcW2Y3kM z{-I?O<^&(^P^2eXpjo3GaDQX;|3NT4sHBu~*vaoBUi;PR_+k8W^!oukCRZYYqZ(o! zd00l`!U_nWe?mxiSUjI7Y`S5#~w_BhZQxhW=p?QJVSm(*Z-`rZ%D2Q^s z09wOr1z;Lu4@eVT($`u7r9a+1#^v=DPESv9vOUM9oWLwH4Pf5gNlo|k($j(bqxOL_ zP}0z_$i-4Zqbu$a!(fKeDEJw54x4Go3)5&}p97fz%_C_oKCcllg%VW+0Zh|2+~Yj+ z%MMtsfrk$(+%Eut)*cIikyQ>AbQ)bCWsST0~TmP4wqK-8Ub=1!GhkR6flu9RQ-=InrBK{ zoC3&{|L)oCF?dE}F(cNINS%Q3;ugFldUbfF0IIBiRzgIDu}D=*KVn!KB6~{wZAj6e zkPIsU0kVUcGa>S21}!a~m-XrmaA#&q4th@^xgo_liw%u3z=PQ+<2*nYdHhN~2)OX< zbcP?#GzCeD_uHP4+g3mC2j3mLx_jjCdQu#~_}S{`@iUh@gbD$&fp%D;APFYg>5iFT z=@R_i4J`|u!!c*@11!vgUUTvE@O?p-!?gSf5QE#B#197thF7_8(t4>22_quAIeAyE ztwzv)mS5ATDccI<(bwh*BEbM!`Q|Qzhjrsd4UgLILiptQ$(E=Cp_ljo5v6VOqcQ>| z?M3%_$sb%alC{i&QsGRgH7)_+B&;ZAQxr`L9b{E=Z`~bH=yD0QEP6wDxC&G|Fc?ik zb()0@SlEu&+_MW>u^8{pD`o?h=IIlLN1Ng8`37Hl?RW6u#fSLc{H6aL?%cVDhYzkX zPZM@rplJfGmx}Ftg3o{U3wZs_bG-TH8=*n^gz7t*2TOq1R#6d5J?hr8em|Q9#gr$^ zJZNoVK7U4G$L6@#Nc%&>qw5_WUp>O<<_u>iw=mBqC@S}30*6k}<_Y4$cMobg;d55X zE2z=c$~c!S;?m;$TA0T{`n94~zMz$ZmKmlIq9F36v4pv~6qFikGh>1mY8Pb!u)$Qs z9$4D|1luh#YZNQMRRfCpNOXohfx<%Ib|Uadm9jAOq5(C)gS<&PWw#GiZxw{Fe2zH&^3@dF60bg2vG&4l^X@YnwO-^Snn=f8&2+jp_Jn)U3$ z*UwIVjeh@z9ot{m(E6q2rx2%bVV=DhtrQY7eP0Kd+A(lX2UQRIFD+Gklo>B>m z^%(1&I6O0PMsc|2Gtn|!n!W%9TtK4tAF$D!4`dhB!ZRQDj&52**U*6;ZI7(YptTDA zgQKp|QSfI8VDw70s_$0wmo5MmQ5v*KhBxr*I8lRK^PtJjw~q^Pfik79CL`uf7r*h= zKY~l{YcX$Ge&~`^1_L?0lZ_ZVab_H!&ZCBEF`pU3h9H~z3?3V;?Geph+ZXHJ|DF-H zKj3vVSS_b8n%un;B2rGK?a^B|`wNM#TnhuB$nustlUe}DW&r}nu$1BfV&uRY`mERB zcreHy>=Ovc%-qMRL)#@d25J-{>4M|{E*bwWlN^5^21hfq5g5e1G8YyCif}v3Nn9x1 zrQiK?%n_N7=J?Eyd>Z%8Z{wTa`Z_L_N7zh;U1e!jgz%a$ zQ4iBRLG3HntI^7#D0N|KlVB1)RLNWz+!kEy9^vx(0w#h-c}0I<7mnC6l$8bdS&I=waHvR>i;@?ZZC`1ODHTP*TZ(LBmY zx7NG*HE*ozua?uQ_aDF@Glsx0!PWtR+9%5*puQ815Tx!cf*c9L6`Y(5*MRDSuIJ2q zS6vgQ&?B3T6Rz3=1catlEnR>qsyyqFzi^5x~9vJA$dSG;dXbdjfmSk8R$hOx&f{4|Ghs!Ji zU9pmBPnT`01d1Q(8Ux6wY%tiA1BBW!C!p)<2n3G;tatZq#Kr-0m-4)klIOVAKTHsz zfymP9#gfo}SU7Z$t`;+ZO4Y8$krVbrwE$S_nNhcC0$R^tyg#Z4DiXH)*`l?>w`tcQ}%PqFs zQ=D(kFwdI^VwL72?9{}dBP*k+hlK%Nqx5aznQLt#qiR?hsn{ai%v-^XXhszA3M}U2 z)Q;T|&749|g_|LSz5^&eaZ3U^$TiejLkR~pYzo`H=)I-CGps-^GjR1p>7^Jgc8ncj zO$S+v8xT#2mIbKHBw;J+=#gO9Est>TxrRUXGcV$$SI@BQJf1y;omdXQwlv(mH{;Fs z-o}6N|M*3G^|f!~?C!m2GGt2%de9QEc$o0r7PjwQuwcoofb1~ojpu{l-8}jk02EdZ zxe6U&ApmH#k*jUgpmlmZcpyg)^8$A@wo!FXSp?N1K#wpo4~|DPmC6G7i&zM}pLK#v z8^470qs1X2trw(M@)qs2knqUIAO%QPv*10WGS%nb16K-QHTEo;GOtPPs>5vZ8k$y4J0JIC&UWJ6e{6;XKyK z(lVgM&vC$E4u7$#K0H=FJvMyTmX3^Zy?2{PDN(^MCx$ z;qqa_)zuOWe7s?5hB6n_+Hkfx#pizf^LXyv=kWS>zKP4L$C#!Kky^~FT7k7FexrQu z#x-)f1U%=?{&r#DOUEs%m@(e%u zg%@zLHS8{1XW|aFg$;0V?}Zt^^?TpI|Lwp1n|SBLM>xBE3%lJFti=907C6F}Uo+s3 z0-q^=b!hV&nE(s27?3l@#T!#%oxy?R4q9Ug{b4P_bRT=!`9x!o)eoPR`+;d!TeaSxb4efoua#ON9ZhB2cX2DO4IE9t0&T&a=mRj>g9AoBIv>F#xML zGXmlU(1jHINha=mqj!N8d#@%`SXmp5&zyLZq>+V~1Eo+1Km3nzXLE+fA6~;s39XccWGWo3IzINo$8hiVUA*y~H}KXwZ^2P8O%89Y zHb_6dSq16>1Dm!u0B;G`oHV1Pa4%-dJ@ow39HmJCvPrO{+k;oN+dvVzWKN zX5L~lSzSUvm^*7z1gr5DRoz+xiUk0zWZYW!F#CtbUf~g&VX|5jYVj6Aops?G5SpAL zHTR&>u+~UJpIU?+#$GnK6_nOvYC_Nq0)lHQvvUaR80G>;U3T!g!{Q-;qT^r)35T&L z5U{&^gy){0@Y6r@B3^m*4739} zBO;?pU{J45%SY&yxXW+gKB?C*rd1F+qJmXCBYN`hx zM{j1^Ux#<)hryG17L4@N3J)#-pJ9{AFIQY#KgPxN1>Dieb0A#%6PkpZLk!`1}`Mzc9RSY|c;NP^A9?M`b!63;cME7QeQzileLo zj0I4XzpD~pRFiZ>J&9;C!-Hx4JOnP0%fMl|M?)+VQ37FHfI|k%0_bZehCspBbhdeR z)AWx5uUvBo%!_aN`h4?AX6YP+{=z{KxH@AHV!S~EHAIR{*^6Ku#uD$*+62oXKL9#_ z=#k6u4~uWfg&E38$+bljUrSv$xmfe4Z!Z_Mg5k7)twr#%l$R#iH(Exha5Rorkt$Mm zMi)zzIv;rSz>i1Ieb1=6S^3o(JzYL}D&cZJ=&~t_ov9P4<^vdAP~sP{{#gl7rX87u zd-5)h3|eSO*n>m`0QAwe&I#?0Vz=D2L}By9y5P8OK6oz5ggh*IOst@g4f9t)9ORHtg_o2YT*mTR)d4 z_t^GCkQ9+WO#hFuuEY)rxZi0 z6YsgbT3OxKv&RSFLlDYKy0lF&ir z1}jd$Qga5ZOs#xd5dX^n1QLx2~IQOnP<`6BBEYZ z=R5?YQvlaiFqJT|qfKbVVOHTj#d+GRR%dLD9D*+Vzm01M$ld0!!dMSDfl~+(H?Yx9 z#nPg6Fij2dY(zf@W2d-a{3WbHbwS--<6|E?!54q(V|ek!Q?%N!yNcAbIHGjBpur}? z-Fp+h^arowzxf+~AK&`kyEwmd2iMC5nqP6#`3IM?~=nswQ zfYkV9`p=+0g22Tag=AQsbOa3s6i=5;Doqo*=cKSMvuacTP+*(UMLQPjaSG-M9c$)y zlMjeK!~{kjApt8MpwA1^mha-JDy+uuF!m?L7l2Qxyg~8|KJ~FuUn5I%2CxgnvOISy zohOZBC71&AT7wQ(b1*g85J7?yrz8a~_)+obq!_N4aNn%Bvw*SIz~fxTT9yrdg{-@S6J#2DO8{Jdy_fT+EXZa+A$M9o zfc(!9rnofytcFWAk$%LO^yndK!(ya)#co=pVK4SR7aA0ihqSS1HytflwU!j|xpWl$r zh(clo*ZE?3YcoxVO>7cHN;ue*V^Br3P+Z0p6OeJ#;t^1WXq8zU#<#xn2EPB!n{YVh%}K;Rv|VV4B?Mlam4(1m z{`xTc7Wp=%Rd5aTqgb5f|8Y;aphauzG1jGBVY%Gl5ghY0!)(TO-e5a#v6(k0WoBR* zBjm-53SGs{=!GCqL$K|rurepbq?qBDD*|}<62fy?g5if& z5;Y%;g5MaWZUbj8D8XE7LtP%>?%jf)_=)H6$xq%xnSiS+$2?gcm7*vnZ#chI&}QI& z{CmHQzw-}&4LdJ5J3qtKa>>FzjoA`W?u(MXJAwn|{wx2#?V#L#1po$k4y%Do z%&>3+)#g3Owuv)^kTZ9*+L-F+DJZ?w$i5*DjWWp%Qz}tn`j&z%%v zbHG+qCoQn^PLwXpf`&?3xIisBei_Ws7BMDB@afdZIZt%jE~O0bLOKmy^rE- z@3Z}%1%{3ToAnjXwrgB&n8f2zpqBuV+L-1Pil#Z+J~=J2jBs79V@~O>vodR z{0q(5dIqEQtASxQ0i>AT)&oYJ*3M|YQyVbZ1lSU?4lL4BW}2lJI3|?lG&duB&8uan zMj>WwGh6VUV0*s7AAI}Ec=PXkAAjNJ{}Mj`qhG|uqa|9wnz6GT8ASuy^@3a5Q+)n2 zKZ%!LcoEU?t!=3vDuYdb{_#6M@Kf>?-!E4x@ox#j; zy}Rh?d|pHNW0w{EfQ9ia3iwxzi=|JUct1`#0P<{<**MqZbU zGX9=p9uz;B?gs@=?^QOIAj&8}tyzw#1C5b~#~*_O$Ql9|rd}UkOUijUK(N3)m;&5J zy#}yJ7nnuE*cd%Or#Z&J2rzikzpg_?w#TJ8uqxM|>oC%Qo^RH>iE4G7ZUqYdusi^Y zUkGI_tgR?g9Hbyl`P_8<#o_jV9JcR(?=~fZJ zO;RaYdD0!g!aRDTIe!yDZn%Q`1_g8IUTq2#FTsj}$)ilO@~(>k@GC5E%qLqs+`W%q z`X~P#Ui-;!;LrZ4U%>r)cktlBHDD#v&pJx4z~Xq}&U3hb=RV$j@E+d$-kbQ~gZELJ zV>?f1Q^nF2G@lsh--{&`5Ck9uLqqL?mF^OleBC5CkDW-X=00th#-^6Ng$hqFx{8Xn z+hHjM*l{fiFkwcqDFQ3Y9M$=z=)F+P0(`;3HL^_1ma+(*f?_zp6h*oCM5BW#(pVAQ z4JZYZNvk(j7mPDnDDF$JQG$^PkzG(xmkXTVD)`YKy^BwO>N%XB8R}9|cZdQ+sgHy| zbMcB>w`a5h{L(-C75q>C&%K8yoszHk*QBM2JH z09VqiN9$x)-3aod%2dG8(>Oha3eBzwv_02K0i8A}8=~~Ci!}9?fdvZ)vh ztRGTCzjt72;-i`Mkvu=Fo~kgZ0J^N+NDbdnhU~DB*R-^D=1f<-PYRs^0XZ7d#aajs z&mMUWKOe$rSY*s|Z2fD79&-d*0lKvhi0qzJqjH;4c-XMR5H5sSW z*E3ut$usji`|GfG4Q>J5n`V5u+Q>ZGAU9RX6FR$6?jlkW=Fv-K$Slzy%AORGq?AzY z6LqT1VeuqVq3O^iOrP;eH$h*!Kr@V(?hDt=oVl?^KcuZU&oKH;I)P@@7I-qaSR;Z6 zBXYb+60ZinZ|gYjOFw>fBn-}XU%0Qoi~O`4rJDhD8*q>%0Z+uAzAl-kNI9MaL3ogb zh2&EU|8X-NC_~~3nFgUi8^RBk4mAe;gmt@X`H_{d18hcv!CDldDK^8gpm_uv8UtBW zg1Xogu9~9zt}`VH2tYZN6HI3t{LWW?18;oyb^OB5{Y8B4(_g^uQN!b_U37h9DpqUK zR2r-~UbufB&)?|=9K-hAu3c<;eG@amYS697(scEi%5@sZ5Lu3$Y_YIVKBTYNL} z^n+PVqZ6pA;RIR@jX;-ga0Sy*{5bOW&O}E4F^~Q5hedGg8;G8`&?J&@cC5i^wM(~w}HqiKwnsz0`# zbKBqFw-u`OUxtsgcdIY&$+LNU=NJRJmOSJ3+$54DEJPj^A4T~0@dmnIRTGpeAURXV zWX_jTZ?G*e9Y8>X$3;Z0e#}9t>lPS}ivV3j-JJ5Wd z<*{A(hkv+}c&w=y7K3!0jsb##G*7NvH!2lGVi$n}WS}(rB7~j<$V8KSg&0`~*(e`C zLFp~y6e|OS;>-nYxy`8UI${tQ7|57>%!V+LwH*uIv~=+_tJt1z@Zjn_{Oy1GKj3pe z_9gt8pZx{A@Z3vy_~8!M3(FEKrKmaP!l+>Y&)>U?=kMRegNG0C-M8MvyYIb?-Lk`6 zw(tp<3jND%2@S7=54j*Za78>r2+RgLO1wdpv|PbPMt?5UUKf%IjL+zHF)>>6=wC4e z$N)ZtASM`9l((6hA@MW%-AD3@SiCUXhoyjK_tJqUGLkyzfz(Ayz{H=T8B!^hG*-$C zb3@%-p|pzU?rrgjPu$1HKYky#&I*>L;(E74x+9rwa-Y_K3AlT2#s`lc;cx$~e~Ewf zuYUtqwc+f}Z7jj zvem@B0jP9d$R{Y|#VETVi9Ii*4an3iU~E7X0HQhEg0Gqx%O^NuW4awKAIx*V<`11` zjw);ShxgHqV%{mR!B`tq(a#Spe!GI>X>w64~Xh*IzX|w}v<-Ak$Xc0@& zG&lzEJT>wxJ<|HkeGE(~?QT_?**U&-?3Ugi4=su_;CWDu2M88f2ReLM_E7-OfUV*k z05#Fe8VE!S3?oU}h%?~BoQ7o~@lYj4LGa<5#Zx?S<{0x~+7v}?#&tZnL0@O4F5t+N zJ%yg^+YFv|jb3S45PaMO0P2G+ydy100<4tKFhiTmnRP3fi|}mdKY$^JC^Y>ma$zM`K&uLMmy90JTD7O)^HLqfMwnxMZ4PJ8(=kqxlXC8VY7i zXxP;nW^W5Uub|?3X(-c-X)gHEH-8teedl%j>`(tJ{>0~h4)@N_@#x_tmTKy#naJI} zMI~G-xPRv^p1X4oA3pjx-g@UPy#3zWczp3FfSPTvox?}hTE*hmv~olS02o!Cja&FT z@}$JtOwQjOS$4M-gSCb-Sqc<`%%T+XDA61Umc0`M#ANU?mfabtq7*Tj_oO0y&&rV%p#V+3&0A9Rtz&M3pNMp?h@1Nc;#cK_~a*_$BQrB!O0vJirw`> zkPzUvIK8eOCeQO*Guq_%mEZU+{DXh?FYxBu@8Rs$3AURF*UKdZcxd`jpCO9;sB2%= z^=BcU9t2on9xi~YUMOwt1_&2H?3H;#O##bTBw0aSC80feO(<_IyX3WWm3cJCN-op2 z!4RdPSvz7Kt?`^1GGjubtqUN=w1{(bq|b96_n9g7ivWXjN!Kd*ZD$dKR7Lz7aX>Mb z>^XxmG#kl(1(Zgvo4j7uI(;{b>&sU@1|MoHbf=A$NIFK%B8NXa@^@07@Mkp#3nme)YTbliW3WZpoD>dsckI z`mM&joyWgQt4&|HfPn;tul?f9v=>@lWA~vpSQ4}$5)MxhmP1bgfrk|CDYyotMxT!l z61*m1UGmlkqw$o}qNIS`G1|%6sgK;t>|D#k=i)c3{F6LS0uHbnljl zZlPFj`xu$q-{fQn7S<2voSCK<9S!NTh1R13B!P~SZh{DsQWdWNSB&5VfMkSvyP}K@ zunM>E2NyD#mcB&-6TgC$4Kf;=ni_0_;*Hh(L+dULF$bH;NE_NxVW`-iZgABeaf$T5=tonqjPygh&WrhcULGST9Ko z2TR`uxSDcj8Pa6ELt9ulrdT%X;5sro;{IY2RNzM%Eg^C~)210_Q5i7)jsGcic)|os z6J}~Pby+Z#hTFHcc;)5Wc;(eQxPSi)#ek(Q*e%F<25aAOMKijh1*)BpT+cmr`;qA9dMjy5Ur+GEn z_*SN+3b^&CZKqaRJhDD=wOOM*EGwRYo^!D{6~TEy!h~vo7$fa_pcZ>PP+$t&JMWhq znRrIzHSB(F9t~-gdpx^9aq-O8O24qQ2)RV{(k1WD_^KB77sWqR3P-sEB_3^ zF4-aKia9hP4}jk^Q{MjQzUVO(0@&5Ur!AqS-2CJo9zs3NN#pFfa9S$~XA3iZNgk>( zHYoc^Sy@q<9K#$zGk*soIycU>mTJtAMjsuyWwF|>q%8-sx^0I$w9+9I4k31pXQfOJ z&+E@Gu$Nx`yhmhVn0I7yGMWj4DJe1)0|03G5Jv=7I8$7Z(cuFEr5XQ80AMt|^eAG_ zU?-U6VTpjS#skD>dqD(UNho%tB!tvUpE}$NZk@e=Vq4UUz2tsO%%3)RAZ*#*`Ccq|Gliztlv==HgM>9>#3e0C%DVVSYrU{c5Og7QPJ)zhJ z1rsKlLnv9ngbfTch24xY%~*C7*cm?Y@~7}8|Jcvrv!D1JtZnf4@imskVd%a?F~vBL z1t>A*>J1Ms9^vh`-^Dxcy@N-OKZLh#{!__brJ^+4GGA!96n@Xx!mK~T_Ip$3_tAQ>*37?J6zX1@y9I11}2l*}?H77_eq3Qd3VC=6s) zadKjK;kjFQ_0`*W@x?nhJq>NQE=yRECIWPe(@`k+P!^n?ZgF-7eCy4(@K1jASMeLa z^SfBwvE6R4G`8WT|J{8TaFP-K-YTln`w*IZ^NNM_{GmWVM*XXrUqk$?Y=F=sJX{BG zwlmFqZke*~?hMGd(H&*oO#yBcVzk~W_29eI$^Qqu2RaVQ6((-kP7sc+kwZ{Czft~&zr zuf<)s7GvScT=0n>`E;bR`ZeBs>l>)`DlHhD=ZtGrvKdoYW0b1gQ&__QYK(y?JWC!m zA3PL@7<4GCK$nN!>d`s%8Aya4iE+z%Jq=NL^yX`wo#ArQDdL_UXCsnB!>IFV>_;Dr zc94%a4pJ{4Z{N2F>x!Sm@nnHrC&xq#AAYYT!_(%(bwis(EHx^q+uM}mtiMp&VqRqA>%=C zD2S#%^I)7Sz{Yy?0gE|b-q#w7H4zn4iz#mK5|yi@fK&z;7DNqz0zQJ;xTr+ zYrrN<^9ECEAuJr3b3W-DLl%t?6gI7`XCb_OMPY7(76N4X)>!MppggXdN2ygXpl^bL zl7N{m8;7zKVn4$|!|V-AJd-o?)O9{0V!sr}X1l?2&z<4L7fFFsZICk|4ZjsO5T0?}y zh33CtA*`-Z_{S<11@NiUAB8tm+aD|dRu}sJ`}uB-fAe^%09q8S3A&E>4e?>}7+EBl zmh3XoK}VGWT-LXdAEuBP&sGRfZM+KV>@ih>jwkUGO8~oK=grUyv(Ql8ju2y=znoqk90EDv? zaA8n~CL2=>--SQ%!GrM2C`B?6QgFqd;KQ&;zE{NwprwGqIyXSy z65{T{ENGJ!0i!RJflVp<4$cy-90CKH|LW&)wA7wmq@!w!x?_KRk7@2VY4g7K@AzE` z!h`XQ?=+0OB1_1_Qh@IJJ5~g0;|${YDq)fz83n$;j&Us-PjDKnpF0Q`z8+w_d}yzxyqG z^5q}J&wTM`@nawVNt~AxTwLt1TLL_YMxB5r&`U&u&t`c3&ON+v?>X%1f=3q@_~3&F zc<=r9@#x|LyIp9g6C%J4MezUuRC;}N0WqD)sOcZ)l>R@HXVRcb0U*#)aNcBUrqkU4 z%^2}NoQbm1;0g+6GMzXas@j*7U1OhSD>yrw@%+8Jc=5$8o`3!hZr|Eux51@WSoLs6 zNE0dqaBcu9tT=9+Z%{VCx8Hmdzw&Q?1OM)Keisif9^>Tf6sKpWsC5U&4%v;5Ir%l4 z^MnP!eL*w&@6mwPGUq?gEwz1TPCphZ29;~+Xkb2nvF;uK^52F=ZI#@{y5LBqCC$w| znFQoExBy09d*_EvP#5rMbjS3E4gU@Sbg}^H07|LrWAIE5GtMNwdLTld>C(5e`I2ER zndHC7@sl6MEaP`&A&Cd1Y%oou(_C80)_MDV?Ex9t!+k<+9G;w)P>ZkYJTb=3*aEJj z(=;G}7nx>VNdkHd2>3Xqbn3mH0)^ix;=8o$2<&5wX4vP|pkg(Ie1;z{fzT6R-|&bP z;Y198TEjK~3c)_E&ySZ(R%AkSij2=sGw)MIwr|#1542wu#}N_+QjWA5KFbhTYvos5 zKUa031HI=i52h83WdJ0@=8f-PU$j3+KIl`s`Hth4?frac5jg(+{eShd=AtX+)xj!> zcQ}*d^pBaL%J5YAsT5?A=hC8%eVG_j(0Wv^aIFK3vW*vex^x%=pfR9@)u7B|1PhD- zbu~dkloF15`N4RLSAZtwf{0XaHnFvDR3&V+VwyIXHo&*u{s!Lo=WpOgUi>)z*yn!+ zpZ(P5aqspmTt2S2y53R9PLPSROwmseEdU8>RB*g|b{qF@-@zwdc@-Demw5Q_F&;d8 zgbyD+!o|e}YK=;R24GV*+ySm%`kp(pbVO<7)UGJBLfFrP{$_wo`X=EY0BklOgJ@w; z3a*tX2MiYLaWPbnf+=o}?No4jGU4u>bKJdqiu?D^aOciBPEHD@NN>Q>Lhu$trWo4b zzcw~dnl}ZfXER!9_{O(h$FKgI-^A~J`OA28d4ZFY6KrptU}@KAi%k7Y(NmEg$nW1! zSR>BqVkR@2KTg%6FDqTS5v4xZ%j@UgtL7X9E@mX0^dSv2iq`8U%Fp=u}>{rNU z7Sg;)+z+T_eEF~_+80F*%lm)q+Ban$`y0@!q-n8MN~qz;y#ZiL0V+#xi@?Vl$J|?f z!fi9KgbT+$w8*r6e}CUi{`dR_I>H=}-Wupo^kTiWhPCN_{JV(n&`gVQ_$qC7g&%_Y)}Y7wlcn7oCMHdg&Y%ZT>I zDtVFL+t7Rm1#FpDc&R8hN3^;{lNHB=W)mi#Be<_cj6o?f-G)GED3~@|m^t2j{|)@% zzkCBP-22z~sUQDoeC{(}#Ql3OV0Y!XyuL3& zmtVx<6<1eRc>M4Zj~-v((W47oTwdaOca7`oT?!gAgIi$%6YXKwL^7%m66SGF@j}Ip zX8h*#MaHu<=A;2f0JG|F+hHmNWty9m62=-+AZaHzs}3)Ylam>zw+t6oJN(ukd=0<;oBs}9{l+(ORd+Z&+2G`Si>2<+ zmI`=fgC50C?4W?%#Um)Q;TmA@Usi(i>nQX?pcy51cL2iD(irT=v=(%0LcoaP(cae# zs0{%gl-&{sAl6?fH-!+*>7>QjqY1?dEj?lRQH+!XH-CYFwK7uskHy)YcNq&Pl{SX!Qg-uqp zCo}pcsUXZ+D6ZZ-f(r-6RLVXmif?I+L||=1ga`sivrVeHmc*@$04so1-KRMoE?#e} zAVj{u$u=Uea$Mq6{V#f4CqhOvq{P1oviHF222HZM1#oe>>bXV@`f~)Ht zE-x=}d2x-4%PTy-yu|hOHI`+GMmUWX=o;H@MSWZ_@(-8#i~Q!q`vNKj?bq}n2mpcDocD$O$kL%C1p zn5TlXTQg9Ax88jR|Nb|BAHVavzlZO>`F&IawkI2GH-=r^QIIc##@^_UXI?)4)?^VV zgMcSsh||`K`-C9Sv*K^S655%p13>)V6r)4;j0Yc);#1@Xw20$Sj8mg!CY_NEy1hJ) zXS8FEQx};fI;ylnxS^S0VlY$9NOM}x()uIWF`QKa!Y5p7#iI-FIKzVm-X$ecAsrY+ zvfV;nuxiGJedbSWWF(J1hX@?*-?zNi2_QLIT6N+LZDkpdi)4)V5-7`9NeNDq+&IGb zl6?wTbW1>3AuadFxbB{2c+tTKh!jqn(g;0c%?E*gD1*CI#|O6ouOaRFBVXNz(VGDs zeknAw^re^a{x#AGA-!Sc=qMTuYFe|8 zf>+=&ua*dS9q=~}?HE#AQTTdtzQ0aGJcS6-j@$>wDsV5Y0mnesdL)T!j-Uz&{&dMm zAY%k3eLnj`>&*NJ@Z$gqO{m>kP=I8_7M;G7u>sbRXH-AnSZErHhCST-2B>;qGZv9; zDy2HZT)o*1r51RJur{R-x=+y=53E1tKxqwDDxz;djf!<;LaC8;5{x3M6Iy9NtEiZx z$%ybsuI0S627L{Th~oNCT~1&@13AK>_Kua1BdEL-OTt^C4XBfF@e2VozGHzAJB$t4*ufas&+Aj&yk^k-ULRlpA znSA&faR^s4>w%bjGplCg8WiT{s?%y%GQzEh=E(3S$zMZOWbDHkKG2@z@WwF$>Z^iA z)AgQUw|w3>TO%0iuRWGMpwEwd$YI)X0FY^B8bX>0hk=<~02G!3fe3lIs=}_Hj*fJ? z@bA8I=9a1_0Fh!=n4%CeYOk5gO2KLL7sx~?6s~oY0iYzw(DzA3$%3^2yw~T}I^_8K zr24p11Shd)kjnsGK%u|52;(D4(F=;u|@f z_4{n~Y$4(3S#E`(rG@FyU_2BdOx+5+DYt)ky%~1<5JIfV(Cd|_utzNw`O{WA9KonbHUwzk%<3?_0Qi_N#dHOI*a`AFr`nV|Kf&?6>K*XY&+xb?XV`K>(POMpZ2JF15g|j8A~C9D8(2%#WKPs zpDBRWu&V=I(VYR(QW1bDfU*RN5j?hvG8N48gzZVeyq&OHcKFu!zlAS-HOKaJgYB(T)VAQ-uUK(0+&B);626Y8zhALXX<53D-Wc4c^1TWk^=>_g6G-a; zT?EBg%DO4&uOEoo8uvQr1l$vIk~i0=S!ivkRi?1<W;&Y-Gf(K{m z<0Af{we0Jnz8dRGPtjVSgA4&FYw*HYoVEnNV3Vd)C<3+@c@1P;G2u1sc=NY=R>ys|&CcHf0J^Ea=V& z(|jYtwC4F8$3%^=ga9WKudTvt6Pl$PrZ$C7-3lh3QLSO}utqEboUNf)0EprdXAmrS zM)f5E?luKwo^Vkg;49zyU3~eCFX8U#9en)dkK;3+_;Gyv)lcExofk0K7IguxuN#(S zp}_4~5oS!qb*J`C;mYmH;!iY3hw-1LWj04DWKxP{b)W;{rtAS@Rlj&%p-O5N>4657 z{N;IdM72grtB@fA2!NSmo(oP+X3X2*Uym*y;hV328()9@b$s*Nuj8$^-^SJM8q+*u z+RoU*QGJJHahly7u2Q`W=xkW9P&)@y!Edd_SA^D&)}!>BH!@3__2De&)8HOe|Jva1 z4j;WSYk+huK?2qGrzj$@Z&GmhnE1F3XQc~aoj>u35o{PF0OM0>&OM~Fci)Vf60s)? zqsj9Klj0&_BaJ(lz!;M?a;p$t`_cadFDnay&YemVk1L~m0p?Sl2tl*;`rC#wE=1*%R2v1@NSzfbHfGv*n!^jDdq(~&^bX6D(&1EL)5JPv2&LFy?E5^@M=2TSsLn7?5Y=6EdJLL@|+ z@q*f-r-1zXQ1d7*fFnBGp&&}H20EmI7FuKEbkA9`*QRKKQ+)=kVX}&%e0VH~=z$&Q zW&kG4+YM#|9=8wh{_tD)<{Pi!+i(6M-hc2Oc6Eoc-C&+)Y&RR! zTCuA;7@}Hdt1{sW2()a@(@d@%hx-l{I|f}<=JLn?oI?6XTCUB;3P z-HJNiq}Yiu;5?x%v}6KIjc7UU*8hx!l@LL&*6+(<4tz10zi7Qz7-cnF?|(Zw zx&GmB#Nu}nXg<32RV`i)$wiv}K>VtKpkgv{UzE8GMjt^?l0vPGRtMD=s0blUAFVY^ zD$t{xa_*@c2AY_&?{{>0Y;-de1|wEXUeRpB?0^b*nEuTQ7NbRhJ?k4L0@A3hUu?os zcThe3=`^tQRlC6JZ+#u#`0m%REgRgubssOi@G*Ss<&WcIFT8^1@4bLqw{Ky#4d^z< zQh{2RD4?XsV_I6~MnPi{bD`3p08(>z0AO@}At20PL7=CGF~Z&8JSGw<5#%;chG{C8 zCd0g)FijB+f4#fH_da+VZ@%?CeCK=L#karrhj{y)@8M#12{*?yO(-V?TRVxiz3noA zruz~Z8Yb;KBJT|f?qiO=Qu7*^e#mCMzM!>=YJh_Qf;8=evyV=F6zFELsJ2jkdl&x3 z7z;42fade;Ekg1SINHzz%v`R>K}%+_DrFGq4?613eHagC4{uwaIJ6;diia(PN1UGC z1(4_74bkAJptWuh4byZN4Pm_DJ{0x5=zkw$n|u3TtgMhdW1;(Zoie~W_8Gq0$C8!; zp7(UyX;~Wj&AECK{yi8kdyK?OsMsl1gY=x}hxI!0dlrfZ<0{nWp>sRK`gYAX{<;#h z)*@?$ZZaR%D|a*}H{3QL0p|jk!YJ6{)vPA{sb+(m)9nee`B^XHI1gd~_AB%~)77|e zHW1~35DLMX2ZPVQ$p{|lAgXLmQDcFE!}QtG)zYm8qI&LNrhJTpX-SyIaRkDST<~m; zf${#;3Ly!;*+lXmvYM4{8|V8#oXbBP3$-Rx-{)(XfsCGR6z&y_Hq73KS69 zS13}J7-zsPf?#`~;#1tqd3ag@b`Zmk-3qO7@wF+lOcFy4Tx9@BQuZFwHy5j;4$6#yhXiG8m4javZNSYe3IgdiO0Y>2@U%Y_fo@YdtC^lbAivSt=w zy~s7I|F;18A#~+(;9|&#XofL%sx?pEQH-@l5Z|-Pvp^vluLuRez0f5z2raJl=;w!g z|BkehCC3{Cd#r_cAJ3j-=};Ts;7a%Oo~&uCHmC*j!IGW>*yT90&PAPF#k*;~UWUi&^0(d}wkbvSdRt9NP1y4#JY z)jKL*Un_3JXYhsQoLk94QvLpd6>lRnkMXvFjw%UX43T4R-BBPvT$;cfP-EPQdlFc= zV)BA&!C0b~Krr5l&}hwjpki@lJ~Y&d0H+q6B%?0iM4Ll{`9x+LR)GKqg)|oRlM4ze zV_x7BysCb_!RwNmfK3HunlYQ9`3?`S-@}9Nzk_dn_v8z?2 zWp-oVo2hz#i`WnfiUn85YI}|5eYWO}=3W%^P=~(wtWhvVP_!%wfSN?PYErl?eyj)A zXerWJrz8t^l%t!a>0-1PyPIJ~IJSbGIT!H?!yqUX{UhJ`-kC~90!YX!MX+nVh_%GH ze-tt4TJSX4cWxD*$;yyfA*92S2ed0NGHN$BRBu^03J8I1uKEb1Cz{sP3@*&z42m<$ zQrQAfK*X?E)#(R8fE&=n6p55bx91_IcD%NibmzTLS8;P+uR5w=0 z&DJ-&Pb>Xv*n#B30MY`IBBl+m&uah%X*q~_WZw{4`4X%P?C;6YctH;?d{WN;!9`g= z?|bFf2J_+D!-Mx<)Pa!jk&)1j1B&q(Px^bBn?@lJb}gEYMARIyA&`-PQ<9e ziMI&MXLze4V4XqD%7petialY z#Y0VQUNAXmlAO_M?9F5oY76&3`m}h1J*bW!%0UkYgAK!cT zJ2Cef0ebT^W1eT6Y|gOVY_Z*JFwYxoHYeE56Xr6b%roZF+w?jRwF7)XZ57LIhwI%A z*Vj>SXxUxkYPrVsavf=gt#XB;jjwGCQ!z{@2J@K$*Ren@3RTQw#YX1sM~A%-^(x>a zO%Wa?lL6J*4-b1_eLtX}tIgeu- zB(tr(K=Z6+_0RJMC87R+n1lRLhE4%3b)AxXix#Alvl%Op8fKi^1RRb_i<_n zn_=+SM;T6x8wgKCmup zV|)fxpc;+^iNW@kSysOS^l=TQy(}y?j#oHj5dH}?{N~`u_4Zn>5rBxZjGu-XNj=bQYUr9%te*`&Jl-Rp*03&mv3WOLd84VEKq3I2{PrFKg(^p5 zP>ck8t}};SA*(>8SFd2oR>OtS;i3s@BR;`wq9*4NQO+hIZWUGw%)(GMA$~jY-;WM{we7I@4p)~Ks24`t zU!%`B)=mtsv5H-B(uT?W8f#&o`)cBuDFKjXrYUM48ya@ap_DpMAS?gAWhb*5;$E6M zg>^hbLfFwYd1~jbs&`7`YhB0#@eb^u0#6#1IZG20e7NFwfJ_H8F@0JP)YL_cbBqu- zGG8Z6%AYR_g`;qt^|^vz3g;4pxFB-bgMmpM^z5}l#uDQjb2s;|y?k)Zy@U0!Y%qC= z0Eru-TPEuV7^sj@z`$sZ_w}=7MsgXKwcp}1t#_Ct$a3oLh2QlOL8ZpCl+TdcgJ;?3 z#xl+|HF?e3J_)#uEYNI>{$RET+E8DwA^op zs#@hk2W?LM*~iZgo80REeQ%h~169V`*Fz(MN=;62`9evBYLs^%62TlDgrr|3rG@6T zo+Dr^JQ0jiqYpt%M#nQM{9=8NG^`L9sJSPSjV9qa9-@@7!0UrIyNxL zSU(2GvSM7)o{ez>-E8i*gI2P6ka242VnZ$pXn@l2xWA31bLD4sx^)`UHA9#OT~(-o z&nV1m#sN41L}>Muf;dK@oOr@UwgM*LC@lCR!A?PM9ss6TfFZFm`HVq$P^2j6Q0tKJ z(06_q`y`E1TBIe>at#<`5~VFF3JRL64M>O2=SZF3*05>Jl~y1+Xx&4I)Op>@n_W%8CcXR8#-A{XR_|T zVo{PTV;fzA=r62=)FX01oqT%DivXlM0JI!i0JqGsC%DUb4{HMeUQ$MeMWg0<9_7zI zAC+q(IAy#i`L?g$v-)vh&ugj6kGUQ29c-DN(0)N~zA2*uq4Ga>3gI|8_nC>Ws zpLe%9H*7${?#}+?ao;EpTOQm_cAXfzr_7rL;2WJo@olJZQAbr}0GAEwMNRAs^;#b{ zP*#w%V#lmjn_(%K_dw9_OOK22)qU&lB{xFu`rdQ;*K{=Ea4XnQf6{Sv_te&VWPT2+ z?;{3tKP-qn2gqO{mH(8jZ)gf-UV2E)fhAykp}>OX#{=NuN>Edq5Jn5YKHSQoPG;mD zeIy75y+xNxheabGRvdIMC=B9LG;nD7@i%ywL?`wQbc7XRX^{%(Q(+n9a2*s{j|zfu zgqb(u2$ll2u%3wYC(dssSPF(=P74Q38bz&-(@e@7eK%zKQ30zV+lmC_-laI~z%WTj zG*?)BhBRYS3cc73725)UwUDN?iyHmInRZ{e2SB)11TGpiQVMH}y^6op6u91~{TpEX zH+m_AaC0nNHwruR3;+Z`U@%@P`%BP~ZbMMWlK!o`C^};ejn-V9QG1|mx9D-dxT2HH zz=PlhJgOlVStL~LkCwA>OoRL_rg0jwsv3D?Z{!r`qFLILWMWh9TQa9(&WD(C8mBZ`F zmVmX@X%+)c&7TcC4tMTmbCoQ;Ktm~W9(s}git*F;nMidH!=yRcyZK_Eh9Q zrcfRQDJJxyAA0Apg^736VUfYj)nShf?ToZ;y? z^>M8NHB5l06KqD}8?tmM94o)PPT*d*-#sBc#53e6qb7y^j&!|{VL3a!c^!OaM}@z} z0m!uMZo%-Tp$#g4F{8j+nCztU#KCU#clLE_OaqI|fXbj=l}jOAs3mKud=QVEhuI!h zP<^402Ac72K9K>0U)*HAXazlXh2}b+U|6VC1k#V(eXgCAXxx+9LojnI7WwP6Mi>gz zC&>WRItT#@3IVAA<#D#f;2ZbXInTmW)#fx&w;i%~J;x?SXI8V3O`6pK^hPUTI#3=y z+$qf2uYqQJaP_NGaMLXipp}0563jF-_yKU3+y`MYRTO$^S^^jVBH+^_n?dW7&r4Dw zi0p7Fc>p{BmI)L@3TkM0^dUp>Mp&JDog5>bBKN~FMvhmmhf<*x$sblOK<%cDF402E zT1XUSNi}q($dH}yYy|Frw9Q_*FbA4KvIC#k)8YkOcNzqdg0Ll9aD*8yB~VK@LJ zfhEJ9&klX_IH%*(Km2?E=>{mF*W~LZfGrVN*YrXdH7K0R$k@lH9uvrZ@Ofek0161Q zT%Mdbgh-YAD4yK7E>UboPdyfD8WH%}CK$3PRWu88X0NB>h!npmEmF-Ll{BY1>~5?{ zk6!dAZs!{ep~1JPA>qmdz|7G_)PIqsftdv61}gzpI@l_-7_^n;rLg8ftWV*X0HbvQ zprs-V#Q>scQKKnxLcF^nz{>=dFt%=vHCVb^i%Wd9WPB0W$Q2*xHp-84MT;@|9?0f3 z)(K9L$|4q0)e?GaR@XWs#UwE$WGh3NedG#gnH%oY%s^u~ST|HLXt z3*Kxf19AUsPc;6pnaTdSw96o&Q-{PFEs++@TwVyMA`;TPgbeL4ae}PRyY* z^z`#l>$PD`btv+UgWtb61}nfpxZ~bIMK?cnk)pvekj4}ESm}&Hk=gO9Xle}xz4c(4 z42-l8f8id`-{ogVG8!vJzkSO{S($Ae7AE@^?`{HAZmb^I5KSPv1x0>cGgf17$oEfH zSoM;rh8_$(ii(U?{7R%##pz``*!Vo>U;zf2F@jw6$hkgFGrSQ5Rc?AqhF{PMTbi_} zoZne0#fX7IrDbqrXKWz-j*Poo^<=IW=yo8xvZZO?nB(7+39tlcPX_B*y|2@C2=wNi zUR1y*(w-tv(5&}HfIEEVscRL5e^ZQz4+2UCm^S*-%_yu0badq8GPBZIU1?~w4VE{{ zLM;L+omOeB)Nzr!z#Pba@14cT<``wnb+$D2u&`v*eFN7L2@MKZ>fED0K=h1gT>IF# zAYTP^u6fUBm=8^o`#SiK4}Yd~6LA?`M4cHXO)2QKIMPL!dy>B(ExoHag5lj+jOi&? z981e_0iHlBCLC06?#u+@DrAgDACuOuAS^VhOAz0SI3TSX5Uv~nDy<>eOx8FF<*npP zv?UVe{U5eYPrzZ_8b{YsuA`3wAJ*bYU7(pS0yq)81xY{CeowNbPqP^(5ix4MvvHfp)zLR z;Ih>;3gRCA1cYEXMpc=91z?r-M~%iQ5OTdNG&rR)nonZONDG3+3RI;C zmI#n4D6qy{buW~XOv`dI#$t3g2yR66zh+>cfC&+77i(f{Co3QsM!|xLiCyy|K+a{# zM+Y=9ccb4gz^DSK3gl9VGu69Z22l0I2?9DK8(m_x4FRxHnQ_!91;QKnQnds$zq(P8c&Jw=C(VA57!EXm*xs9_!J7vMJU_@_@J>N$cXO3tR69<~{51d$c*30u=%g@H=9v`Lc|Ky#eg zxRQs;zeWa|3$LJ?&_ovR8n{s~G;wb+IB!6W<}YcvB6x^JYH+3nHW`U zQJpBKNt&M!t$14osTt~^na5~*)&Xd?kFgg9yEQoD=qfw~jSuugi-btatutK-8KYL; zxIy?>+gi6k#LyXoVIdDp=ibB8Cg)4gtA*PTm1`!KY-NR54w!Q>A5+$K ze%3%WzVH3-^nI_a{ zxO(TP4Vri2h-{_^=8IQFq_+ADL;=jTX@6yB;$n8>#^x!F8WjL(d@x{|CfH5~(*`Y+ z?3~Y5Y?mx!`ztl>K{v6-OZx9O9Dw0rBC^0hgT=#;R)8!gT9Vc}vgWf#Y;gD@35c*v z9KeDRjF_$dXgtjZz*l~*k_<1klCTFxfAcyzJG6*>k5o4z1cU)lx(|bWFt}qzR6dn3 zWqaSZE-8jZVj+`CGixyqtwBr|k{^v0CFMRh=KYKLPEfD#MiW0M!~vj95in@dx?#)$ zkk+92QXpGI|C@PO1FVCC051i_S_J&Nbce~>}i)}vSQeJX|1VA!w*+87(Kx zyS8sI7F_}q-Wc>rO;Va2_ru9R1QP4Gi)I6@c+!xpBZ`N~eX^*gS6Z^!*qH=jads-0 zzUgw4bUF!tKAEDEsI7wljl&h)j1b^)oUxg*=?3)9#b*rI-kIqREu!&jfsmVXOwMcB;p}K`C&?d}3L@jVF43*Xn1+n#P zB+^IHoj5w1bBTscG!(p{$l6HK_?YLJ{d}3q&Q-xRb7V$)yo_4Oh?T zJG2P&FNF-9#~YsYGOn0&SIxWcOa($>Wo~%p__3EEs3CHwGv`-=L}Mf|jZP;GyXPKL z;#kYvSc9?OH%&urpc&_%5BH6}jg`k-`S+kNa884#M+E(bvK8ml!Srtj=S3waJ2T3mtg)7S zo;xrpFwzW5TX;rf8Po{-DCH6;k_EOF1@Wa8%9enD6dlny<&mr>hpuQ=%1w6LA{)vu ztYP2Nz8{?7D%iEh0X#7!(8KaM1BXmEH^*XdYj}&?aO6^Tul_*uhXi?aAU)(E_CTv< z5tC)!{rtL`F^#92|2kCd0||*hwU!$Nr6q?ag z!{MrXe{9jbuY>NkBhSJ|9_RkC)RTFLM<(n2j`&tL^7Szx_Ky3o4^&ML(p(B6Mc?9G z>4VLby_Mu2hAbbaghzn40Jg?ohXO+Ytqb=Tm!%;>(3Tojlo;ds+V}UeB21Qe23X8_x zycFb-7F7aDYVPB>lV8&MW#m=e^{@v9_XWQc9z`V*(0V&s2Vno=A=hM0!hv(`(sW$) zoa@sC(IH9@BZL?`yM|$pNOiwU#q{+P(`=c@YVQkTWB?iZ9Pa>qNNOwV{iZbG;G+oH zBSLJvgraW{{?2(k`F$U4M2F)U{~ZqPh-C9EzW)A*ZS<+F$>PS5Ixr)A{S-N=uf&6V z00AR$mGt|`ROUK#PVk~PQDVrV#Bg9JzM{c{5w|{fcSp6tz|{pR1>6I397@>>A985? z&3i?_0GOPW1;Eogv!NBo93}lND$fC-g%h$y%A56-Z>*caxfy$sSG0aU-C=D4Cg%_w zP1WB#g6L#XNP$Z2JdVad=ib3~{1cjZF#-@iFHhK*o-1c*Q9x$2^wr$mD?!t!H4jX@ zao+_#2+E1;*;bf)?G(;vP!*qkYLur<&M=(0?rz|kisTF(&^eMS38f*G}3!nm&fWbwL+Odpg*`B{RP#_}0bQ<#{<|*IDFej}`X}tN5m=8mG>f ze!O{DPq8k?gxw8m7mNmzP-4^>R&(nX3NB`zf5t3i$z#r?&>~QPw(PWe!;1&mW*Li$ zu3%aURPmPpzkp3Q@OFt$)0%qlFVd8+COFQA->1-yAz1F=GaK#caxHC`2a8nQ2mtz~ z9ob$15dHOr(LB@mx_uZ~Jqpnj1!d_>eHd4KCv-Hz>`tsDLzq^B@Np`GkmxG((R@_pbi?l<+$M4B4X-uL$qD7;5g z4~yQPx^Lz;@4-MkygD`A_YVl_dm9->q3^IIqsUY@AP-JDYt7R)++1_?t|dYy_z<*S zQX(Rn{2&=WX!?aqi!Izrqsf_70b2l!XfWImzRM8mO8Luz%p8*=M2tIi0X`#{fXfw_ zmF!bkgFVuXnw#44f|(A600m-@@@bErQ-{j$a-l55Y%tS0l*r|q9oPZ#>A4wUFqFVNY+hvm9S2y>Mo4R_T}99UZn290%8Ob#ys ztTZRALvZsA$8KJI0pkz3AIE@0Rto?Zg3xJpd(N1!9@4-CJ3`GvF9=0;RQa;L6L+32^Shv!$1KVf%c9QE;m}j<4BkZ;alK1ThL*}F47z-h*vNRb|6i9@UADvGWK+)J2%$6(49G}kR^@vM?s zUmW%(bG6Lqnr{nXob3RJ093th%=0e>wAwRf63029lEFI9p_%i%4d}C0q^w*h!6Axl>n{37m|qa!$<|w`1Y|EaWxeOcB6StcVZFm=A=h7yt@mf*=Xr zXhluiNh%=EdT>wpM6_rY*9ICu;axzo2h=6qXv$L_8 znD*X*+P4TOa4yL!g>cN>Y<$SbU&KidxNv_L&@Bw4)-tO8J;T}E7x*iFynp_m zaH*Ed$c7Badix^~3^t}1n}$**Y~~rV0M&LKF&>g>Qbv=<`-u_%66k03A88qSSrN(>oxrBqOqjSCs+UuuMw&s z57;r(8O()&8Be>oa|~x95_U3({#w06no`lRq4hzCe667Q+3d9*o}%e=IY9%ZYUOg0!yx2Rt^tlCC$(j2~2acA^h;AYi%H?37#G^RZn|~ zmS9}+X(Qj2rfG|D02EUI81uCm zu;&rHC>r#EsisyB0u_%lHCoyeBaqg#TEz`0QBbKcKss-dT*6xT?_Y=7wZ=VOqi%S3 zWxDdncs!wJvZ(_OW5(d?eSWJyuOrj<0|hh7XZ2LlR}QD2o1h35Y!ct&UiOl6u^;oi z!8Ff7ldWR6+wGa{DOIw}Zj8SSF^1`Xm!pyvMfVCXL-~8%PpO@s8OLMfW7dU!f&$2z zcWBpXxu!gOg0Lnuyxx25a_BZ;#ft2*Ak_l^aBR~KX{}4;Rn;YZ+9B1^yH`(ALkozh zIaKr|g0a;F1bVG=6$A>w-Kb4F#LALM=h?B)>b-_gGS<6K&6@?HEKKrf)Hn-;X6wFeC(RaD zxoc|k@_?6#f}TZsq%}~u7C7q~AekM^qV;iUXskgX$m7C6a(fIwDK#Sm-AkE|2j!wbH$hIJ2tSObv0BZFw!L}(9KsDXuu%&`*08L9@&5aq3x~$7uVpl zkK^#?1?=;evYyy(AO>GemZzW=nRj+VrI-}KKxjKYzc2okpJ zjUtFVQnp%0+U^;#uc9HVgJEHP(s61H@S-3-0Hq{-fmVqu)S@^9oi6!}`Hs+p$vgm9 z>j97M4m4_)0N{pNN;V})rZQNiR0dhL4Wm0Diku7pP0>tFjy0@PD6G`$Q|tGL)@Q3? zcz4OEt#AKc7ZK^UGi0_x{2Jzcd0C1@j6^f-oIzqMBl_JtqaC@}=yV6*Rw>yTKak8& zf=ECltbESqMR7k}0b;78M`?EPEPl#DQTx3!xY6-!7eE+;>f}-wgfwE!S50E_eEAw6 zAm-W}@Iqe6xDUB2rAcbo3Eo!?dNd5_lp!cx?In3>ZrQ>%ht+|NqmP?Jv1iE~z}KKq zrVzTp0?y{ZBz0(=D)^MU6? zkhz3y=QU~p&buWajDnuAFh%hSkhO~ZW#ogtrXvLon*s~CW-31nSOzac0LdJnC@zru zXV}Ax3nKWXVsroip3RTleQM-HD^d4RuYF&UWhxA{eKCjx2wdO>NcaQ5WU=ASO$MB) zNes$zGRWMJcwcQ5(-gU!^Sp`Y)3i8-*%$@%GtO%7-y?rc!J{_-W6kw_(C~v@hNljB zPbj3x_nF_Xl@hh?-y@gAF)EQD5|i*`hLc%Fg)7fC?>CjIE&22ntYVN*^Zq*LMHP}b+Ap^Y3bk1?s;X8}R_sk5|7A$NoQ!)my1EKI+ zs``3Gx+4If^}Y%Y`pI2IZ3o|mMw~8^hE>$Hn2tA~N-Hs-MbRD6HLfY103qou$$52+uA=z=9{;qr zy#d~Q{cXsiG+Yj(yTWr1c;BeS8;~k)UY4WJ_zk+e1cD`$_Jw~6_cjRDzL|Sg=fku{ z@$)!OoSP3c%?0eS7bPrEng?A1+mkJd&2X>S)$6bhvJ2+OCs*}T5?OJytY|8wGC;%< z)SW5e>+u48e#xj^w7QU1ag$pbcV! zZVY!|E}L!{z&Z^igC4nfYi&S-mp1*x8OA@RC~paWbaZUP>HMLtCkgRC3V;Fh8Q_NJ z4gS=pTnel4JanQ#PsSa&>GE)QcT;SW1I|wq#d`{Wt!sww?Lo-vN0fP#`OiY<)rF`p%u5G<5az4gLc(iL2+tr27s8u>)( z8A0N3&QS7Pq?S!)*XOM}y7f^^&ePK4!#lzSk#ylTnRcrUHd$(F@}EY~;o!SX3W>Qz zZU+~_dX>I@21@=HMUe~%AvL^}Fcjb8+6`<)AY;_7yN@}Zvx4vN?(RQ3bf(U8PHESTtmmKFCW{$At!G?lR}Z>i-VTUO)R2*jasI{LR99qAZqq&bDe;rNw9fMYn6m$ zSPUxN071UZYs{q?T4``A5q+JdPN&q!qye?mI#sWpXG0c=q&=PhkC8=(KLZ*o_6gye zaFH`EA;zri`}NintWj`wlV_}dx=~y}N_#NaNYZXOnvq-f|A-XN4laTf>iRI9E}&EiG2C1Qy@-_bER#JsBD58Zi2y)F+84&@8@n1%NIZemm60NkFh9&wGG5|W zeR&8F_GCy}3{oMpBUS}fSPW}g1o`zZ)gvy>@bZ|-??-U7{$@S5CSytXN0Vz>~D#S648` zr|zFLuW(ibG%J`l8|;>=1T||@+IZu!Bl~P?F_!#v$WoCa81Ne`3_sMh|FGl2`J=@; z9D4_22%gDZ(*0G(FQrkrbe)ZJUFdIZh9MpXR>P- zGb7z8I1VM4V^d&hjNQlpLx^%lr2~VBKJ*ayKxq}27-;AQ6vJXe41Ze#L?@j%;fcU_ zMT|>YN>5=bD9y2iGoD^Ho?^B>hW8AH3_YM=R+E*80qXH3HV70SG;2MguW@IBV_@e2 zRrshuianC!Fi=j1-BKI!h+B}h$@9}n(8Q{&Ehw-&e6m&?N*T*yEhaWEJ{O>`IRhIl zDli6^^EBESC$$a~93#Dja}Fc$_s`5e576I_o-K~o=K_(CKd-qLlj&H@~a3wb@fY5yB;^2V@1(q4lvyW&EzDLT2e25;*jh z@Ty0SSf~56-Ixw~Xo&)wX^O{C0B0O~W~gvY-1$A0;jnm%w+WTz#R!gzG$u13%M1(6 zyP}U}1}Dq4U`p2d`N(`62~VCGr{<)%8W(e|GZG(-=JXUTuWXBjeQ&%3{#kK=@t?%6nGUgA6Dh5*M1_h_!n~@lBZ=% z7T1+#Csz)1>XV>o~bT$?*iPEKjP0j_tK;rA~Be4VD^_c*IP=nlx#3zt8>$8g3#p?&SLP;MT+G2Q6yip6eNZBG3^CW{ksX@zAa5{fV@ELH5JJ0x%k`8&_pS z=?BAeMn0Db=JgrL`S`WU1sw?aAh^poE=O#H)kJ=2k`yn-=rh8~x1;6A#RJe5j7&|gD2^l?c|6p%A|}f_klo+pB#&0M7UhHo zwZr>^`7HY7RVayqb3zI0g3hctpzeL81BprR9mKtC0q%`{`NHz&VNr;E6F@g8<3VkC zC1})P&KPj#06Qwi_p0aav3vprq9KYE$@e~_SUDMPPn)CDruDgE_)Fg^27Dm|W`r$K z@kNd7pzs# zyAHnB&$bgp$r{us^d?v)b36?Q?OU_g;3BT#o{g(yaquCa(dG$fr{@s(y}G=BxzlpP zFRjMG@uvXhcT(7k2axZXf|Y&Pm?7BH2m~wJ+GAf9jT6LCnH%m6#g!0Dl(M;4>jmf=Xnr4(aw1zpgm{CA$Fuo`J9Zw_Z{pWnOu!DQ-aE+*mWbq5`+d5Vw?sU>hNhGaD_#VbegJAyVWZCP> z5`;=~QFcH+OqQ#$kQ9T5oOV_-jlui^km#GjxUsGPoE8f{ zhxG=U*ARrd&%#2|&sD@DG+RP;n#yI9(V} zt0*E0h~O`MPu-(Pj#9QnKW-71(a&g!-U*&Rv_;qBeEimP?#84I|3N1Lz)?bNe2K-+7!PP;7zL(dQ3nLa}@SZ zK>urj8++HQvi6CliF!{-v_XL7I`9ucw~~naZ`K*wzkK+&i|bKi&l(g+(TM1z8P=iA zyv1g_iTVm{!EU*LO-kJrdF{`kzu$`JDpb;vgK)l|TuXaM_nr36-NVJ4-(HugKA5kM z3x^y`UkR;YNoD<}WwU%M)-*V{1P-n>0vRd|@m;z3a$Jh{Siip@e5oleeSHvym+>v@ z!Hnb}pNj5Osn9^NG`08$HW;bgf)R97zb+>_igmOF?mN@4Q$VE`o8b|drUY3*@X}6UH{A%k6s=O0iogrMzxQ2AS%HPj3Y|=cF-0k+AyR?fZotugDYqBD4>lyqB{ zHceq;!`f>vOnjpB`8&{B_mw&|K$wN5USjN4M5~<+iU3YgVB1)bh5qm2U0_>TY2KNR z?1tiWAG8MZ8f)a*mo*i27G?~b>}MifJLothKd0a=Y6WfDQzVV`t0ij^PhJcD5e(}^ zPf~P7aN@(y``-Za2>QWaa9kX9F5ttsWcAAZG*!DtocF?r{slNYxrNyZN&$AeD^$jJ zxd7jwjA(x0o+LKzi;UQkU4M#V6xvi*8qZfDfPG-)S~rDF;{J{4a4y~y2!401GC`Hr^!$e z1k&6?TkdmL@s?=j6Pmot&$%lWv}9ef1tX#_R?)srpJXcoUFTfZ0@b`iHRhYkg3v7s zx)+EbJ~}C43_AZZZSu^dH%5UU))I`xEy{gh(w_H~bTUQX6HZFSP(OlRDiu9Kn#-w( zeg%IbU4p@<3i*@*iPaFNJC{bfuU!AZ>g0`$otWcYW1fyB)8=GliY=x!G><_5w|vPU z%mMPdCf?$?r|~y^Uh;v>oe}wi%hQK&R%eV1A_`qrg&`XZu3i-=i3`@;hx<>rN(R9m zfR)Y@OD8?9AO*C$UP>NJ_sxoT11S(`7+ybhFJ`SR5@s^);HZ11R2}#d2kO@LjqI{PGs0GIA zi%cXd4Z(~-9Aroy{kTUHb1w+QW+`n4M+Mxl-E3iHLWDRutJ1})$>oL|wWXXJg93d( zfw|&}oJKzv&vxB}^7e(~0Kzn0V&^p(>A>xcuyei}-g#^o1BY3`n&VJs^=t~hwI;NG z|KaQUzat3ayjQ!^egAN>5$jAl<4K^^;D;1|V=oB_%dF4^2TFrd_mFftM3WoP1E;`e zQ)r2F1zx)(CS&83Mfo@}Tcf!CeyK!`d^@H|u_g zky#zqs^yuE$(Fo5AyNW?QLsf1ht*Cw&#lsLt)@>o1N$(>nuu)rdh0~UJCPfo6k;8? z2pr_<8f5ae6yDD9^m0drk%1Ga*bsA+L0QTD;`ai$PucWH)S3!S*l7tG!`5SEB5(@f zQaGQmP9WDz6cS?}0N6^vcS}K#zqqvom*!<*z1?@KYG2Yy$KDs24HBD9l0aAW44FPC zG2r9g>l)o?+8b>qU1To#!QIGx3}tR~JG(bb^NiEe(*QFQaC!NVE@LO~DoLw`4p>rg zmY*;hyEZVmBm`oHI<)>f|Z#t0Knm%{Y%P1TBimD`KIfmxZa=Y3*^wlGSxnM3+Oh>s$q8k|YFy1t) z!cnFvB1c=8LsfWU6gLNJHLl5k@J7EKa^AKV<$u$L`S9Pfe7~%|GaT`~yPqc9ZSUWw ze7AF390H3Yesql^Iq_bQ(KEgG_!^A#G@dCh4rky@@)nujO9!3l3pVZhk=G7U!QgjI z_d>r@0F##G%8KzJqvZ9yTs>2+IgloD@8(PKli8B zod)P;Fbo(;V%_YoSsE48 zk8*W9bO;`v>DqgpnLix>Wb|jEz9$R8l=u8Kb8U&*eGdo#*fRn4D?u9a&i(x-~d{WFkKVwdNndIOmPD?03#p2?;kPN zZyzZh3g|$md!UM};ERBHRMSdVEN03&K(&;jOHK-W19_tUhpKdf({#Zzx8qu@CFP z|9T*5Kik@SIOv{YY=wgv1k(8VIFAz8+E0P6&iqBU;!6>G(IW^W_NvEz#M(6vpSNLx z(*3m7AyCod7>olM_+50}JjSq`z)N)%3Ys~EXDT@$cti>2}2Q$qrDXDvZ zIp*Au;f$s(ViRuPx(CJaTwFZJv#R%*8u_?DaLlJM$ifB?C!jP9nMZE2?lJyH&v)8a zk|-GqvRb-l698e&BWr&K&3^rz!K!D#iqEuxlRW*wVg?=gYj&j!6B%WsJ~ElvE&tvl zMUMmqYJ5U>LXpGY494i#oWbz^!}v<2QH(^VbRJ7)p=MCn~7M?6(oa7$E zmR8}O0wsltV{h~aw;%gp7~|jr#jsa<1f(eLAiPoN4%(Tm{#iZuU>r{*&?gD}W8Xep zGXMjq`XhM_U_I`kzheXp9@_Dso#yITFl8SimE@NfAL{8xA^1ySYzYhW7`o;gSz93- z#$4<)RmU&cxv&Qtj)$kM|Apdr5AkDTyn)PO-RIt~3=$mHE38sOz)?Fw>vA#Z&E~Me z@e(YpeX#v(X>|HmE``({(Sstr_5JXI?1s31enO}%0qUy8FJK-K{Hru}7+_PU!}Jj# z{lk&RuJlOlCb;*OOgMLl;ICVg2%fm;p(F<_1qe`+qo9FNxyqGYnQuj(mcguD-i5H4 zAl^2dcMdX)Yh*&+V6DPyMQck4!X^M!hodP#LLa$=tTlN42Xwh8%aedl*#8w^mw}8L zTcJQR%l}&PE56@KX!xe@atwtaevmQBk_n?hKYOh?Hk&O@&dyO=WS?AIJ_L;uYigp< z*RnTmo*DXlNm~Zla-Jr{;j1}k3a^074ngKUL;^EIBK?rK?EGM~i_(62rY&2{*t z^N^d(3H{*O%13xaAfdl&06r_`Hy&h(wVU33@Fvn&kh=U}u^C1|>E3-*;DJ0C=S_39 z&=P9h1q-nm+wB<^?_Rk>Ni+yn8v+Bxdnq^$Ovw)587uv?Hu%Pd2OOs706j{Z0xoRL z!T1QkOhUjk@bR%9$t-bXTrsx(SM9xr`O(I|fom53eKeESvm%0#2B^s-A*m!QnI$?3lDn zMF9|gsQ?!Z_S%MKu+A(yiKtXTNB$V6F$GDgA9^TjXp*&}406fgY)@tyYW_{e{ zP*I3-vkfI1_jGNs9JBV>ux^}>BTV|uwdVZX5jH(=rsU z8Y=<{aqdd#Ox#dXp!VHWJp)nz;{(wDp*uobAn+5M%JL=v86??3Ncu1pf-42 zfEJ)Mc&Pwu%l9S{Lc>CV*xZJ2YNQg97N2yhNqF`HC2PhQf8>mo7hqE=ox8_)TX)w= z@H_ef*4l9U)*a0A1T*03>H^EM3&5^dg94s%B*1-S{%Fp9zM!(g421D-ykZ@s0Ll{3 zpdw$-ay^L$?*GY>hyP$#Kb23sv>5U8*lZ)OY%UG}`^di|+ID#7&B7RK;E*}4Vnq4s zAjII;)W(F6+7RXH>&1lOLr@9s0m*^Cx0wH59zkX~)S`{%W9ee9!o zzduZ|68!Z^Op9POYwdfF7g}2-MvEf_jT8b`^tE@3MG9+{X6D-V_Tdb0wtlD$;JF7< zi7B~bea}X#MGF&n+#iKz0_+v8r5|$KGOb*oV_>T>J|@7kWt(o#<Ax%)+KSCD4fFimZ#xw8gF4ccZaWX?XbfeJIGV+FBl{UPqpS zBx!X4#XuuRXnX|ZHUJj%B_4s@v+#W2kniU*Cx8oZ{*hw=@&(Tb0L-S2n8v#`ump4T z;n>s#9|=l)Vl+rRNxU2mqX$xraAMRZvJ{LF2qdbHk(Z*}&F*{Zel|emEth%)paSlg z%Y>8d8JX<3$wcgoHJCZL2H=1v2T>m68?Q`^SnZDkB#F-a9XxO= zt<&=N_|w|eLMT&J*ZqV6%HdHSh?j= zdCHCJn`~k2u>{Q%6n9bBj@w*Tm`=a(Tn4Io4;VDUNho`QW9vnf)YO)=;=O*u7&@Ll zaracJY>L={^Yhy{-JZbVxT;sUym*xRG%91ksv|Zc@Hzt!xin>f?n?EG-asjh`|?{E zsx^iT+|zd1BH9wf^<%Kl>&NFB8uoaNcKQh}^qViqjb{h~OzaYzi9d67WU?fa$e31N zo8LyW?DtM_+_|Otz*2f}3w;X5O*N<=CyNvpV=X;jr5@m{IK0Q5;2vJTS z4hG)vzd_LSHm^v=c{rQl<+)Nv)?$?=b?l-*GHE@?F{Za>r4{04Y?9+z`^(3ncc0V^ z<6S*x?<;Nicrd9MdO(!+=;kNi3<^dN0SqxwI)%eS&802$k6l11pV+fCh8rOhyY-Kt z$UiHM?g7tOf-*T7iL`o}!UbZWsPbXZ!cgApsThtgh z7n>Su5gUR|yUZ-`3YcL+FKjeYNH_Wi-8TvZU4cVo95ymr34+6&_9V`c_98f~&?4h- zv_*xGx^G^0R0VeyiV{<%1SPZAE^Hitx&V^DY3)GMZGey%L&O4%))t8>Wi|leQkR3J zplW<{Ik?WHXu>E!Ei`9kZ8Wd&i7VZ#(;CKLxxPlR0J69ke8_5YQ=um$4X$0fU6>jG zWoL-5td&epewnGGMw2-K+RB%mKMYpKbWO3+paI>))-~!ph2quucg~CS=?G;k47C&P z-nkd~_Qmk{@rP(_*Gn+F)*xI70tSIYO7^@!QXA9hw@1dHJdOq6cUXO|HTW*a8-MI zAmsgl9}bq60I5j>64L5Z=pbPL3VXiGFqKKzAW`IKf;Izcy@GoLCvCP{Y`14otjGZ6 zhU%Th02P!#pa~iUBQ;eUW|R|qs))bgd;ERsQv~|54%R)McVBxkM$^YA(pF~wrwQD> z&ndscB+g|wL=1v?T3GvfbU+adSX#yt-gRIV=|X!f589CqGJr^&tVg8>gK%*M8-h)b z9U$)_czk_!p+px@@wb*V6-7rJO2Z0N;1Ne42E^Ec3_hDIIs+Oat;>+r4Be6A?x|^d zelX)!x}8j2(!{J$YNSQx8U=7Mr9K*9lVL7&Q4B#?RxEPAsbxm=HwA6!X@~NCDj+W+ zrD+Pcn)^TQsD#`IHMP)cMQkvX5@)YbfMnG`E1-#sCV8H9(u96q^SYui zf&-Q?hRpiNXXhIdMCg;&sk;drq$V+Z$LV>|{o?Bb#~=K2HZr6B@~|xHb02s#`uE+P z)f@p?J_crr3`hlF&Csgj{MId;o}Y2e7hF7kfHLXbv7e<#W*LXo@(kPX{&c~t_$E@R z&F_{WP+PPeOWv}2f704I$YAxpGEO6}n*hNc$s|)ClhBXjvXD?SDk3OUlYGI|!qw2~}-+I+6s2l}CA2XCu#axGF=SnEii=r`L z%?i^v^t%LWSH@^YTW?B0D-y4M|J&aK2q(smKmHx(r;n|2pX8-@euU*to)kccUWF@P zUgNk%E+m&*3c=`Xuh(+P_1h+8S|{@3tKU%xgjx`e+4Pb*n){#q z^8xL5jSLt`*d}EgjjwOL>rK%s{$zjJyRGrat(M$a;KjY~7t22uV8_kLf_hj=p6odZ zh|;Y$B~5yt#Cxka1RM*F+Q5un70!<~?%h+%+R)*C-|iuyF1*y;sSBV%3N$a+%)r(4~$O=aFe>RF{`mE^uvtzLksyY!RB8kZX|N3P{qe4dJbe?zi$i)%@8@7d@1`@`hJ zYi!9ywzZQ5L`c`%58U1UUh6#{zYs@#+(n2jKQ52v;?VnA?AlP)pZ9wKSuv>=Y;7_H zTgEqd&72G-4z+=a-zX45_%Oan;G_i9NTg#{|4s_f)2R8%Jz&MXL#{{(b@lyF;KN$968h$wZsU$%)_f?xR^c-4!1n2vKV7GzV@f ze$O?VUOx6sYt4W>Kx|S-%iHMOL!VU$LH?1|tOe$hb)rZC$)dkg(F4=ZTEv3~`RLI@ z%0#a6im6SOuyqW~DUShx$z~iG$P+{KZHn7eB1+O}0(eFb8>72)WqABob8Cp6>6ePvp*D>kG8+N2$|fO6>(s0Z?tEyWb=P zM0_0?sn0{P4y|gN_;~(368om(i+5k){rj(&=%=lR+h9s21E@^(u9$Dq9~MC-mt%jj zw{NLL5?+Z^F$DK4vVijVJH&{&li*}q+D;?zbBD8n9d3+FTnuo&#HLf^8g*O5V1 zd?}drc{bH)!hnf+VM%E?0Ly_sz``Q{FtzoM3f2kQBm|dmaU)J_GvsRs(qUNgy;eF| zT26VS!iDe4^6`#zfl>_O{YHJ!7p={;)6UrTSk~^Uw*>AB_*fsjIpEJw{(#|x`zN~T zg9aIs?pO?_tp@24F+1uzD%kFc)Yd$gk~1LO+}a8{nOD<*n^)*_3KaNrjzu(4VYCS< zSvWAc?Qa8F@`y^A*KUk9tKu6a$BhXYTcA~2#e^c)q!c}WF8m;pd*qaiiD75inj;b@ zW$4X$;=AvDi?6==I*z;cPx$L!{~b!mwH$lb)o`xcot?4ELRpqVq9oj-7w8D6)5TDik?kAq-hYU7< z`^|S42Qy^VngLxGmAn!=cVU#TeBqKrZ91xXUVJEKt;I@!mL++)Fcy!L#>yY5JlIAG z)^=a(?xLmlwPZ-)MpKe>G4b@$i{)AkI3AGm2#)N8+cjr#UktJ0Flos0kv%5680{JI zYHvz+3(&!6dNk;+3n6!=&=XphOE35LXTPla*ZR2>;}-J5 zY=1VuP@#;lsETmatyWmLzGEMT6hQXGHsGO8BwCp?I?Ga`O_k6}|=pmvU;~2vA8=-{Y zK@wiy^Iug+M7f!>a$k(q*>_b5Rff8aBMvdMqP_cooDB)Em{=E)3UB#j1DRcrAf)&d zhy=P4l8y*haV$(o^xV->oRF|O!!k`cD4dae&Uu-vyq8;@YX{eK`pO&_#}j`4`#)h$ z;OQ9n{%`+*PtQM*r6kiT!rcu`x~baTb@doh~uI_c!k zEBHtn;{M9bw}uq#ffrqaDh${>q6G||0Ytf72Wt^P3Z?izl#i#t@7~eyaz_0KbBoiacnlFog^(nNAA79<8X-Ak7ctt_5qr&kcT_@M$gWU~R9hZL-=32m3nCl?Sb%Uu1xEd2AtiUiJOhYSn1i34&fOCTBhP{7XW+NL`6s-4 z_YQ6oAD=(qZ-4*yD9tNf<0}tH_KeOaJ?{dZAZjf##5|0}c4ks00qh>&h>(&24CPcG zD$wWLbz#TB2(L$FM$d{7QBt^ZTX?5lP@wI)gl-Yz+&lmk_sK1EYM>2h|4A~fp=8rj zkFTqpwRO7x^tEw?2~NeRG+7nt1w0PcFb*~nkGKFwAec(7i^(+al4ff=-smf_&?88nU%;YuOU>jET#dG{1PU+_v7{jGjjX>y z+`jhjuCLdp9URE&O!Jq}(4$_w5cC?IJCM~TmBp{TE9PFgQE7S~voTz-hGLTjQbG$Uyh1p# zT+`}ju^^s+*r(kE>fo7|z_O!BOP@WFTgtYDj@wCrrnonn+`zz8-Ij4+&J$n0e}~`y z{tuXQ;^{E_^>6}(25Z4)DXoiL+j}?L;j7YsA zhEeZJtlBb()7vnm2PF1&dg$g6Z=s^MTzB_{!*-ka{RJXcb@hrS;>k5LcHjT__>yvJ z8ON=my?U3|7x^@7?~|qbD%Tb|(Sq1L)?3VBnE}nGU@(08^Z`?61YqEsufEO1FM0w| zG1Q7;dn%pkn?@oao_PWnIq%gCWvu7;jTO!|S}~a?-FtP@i>WA`ASfu>7=mPQ_R+n5GB-RGh_c+<@US$Lz3U6^ zj^A6KI=d`wS{~z?ZiaGGlkjE8(N&D{%^4;>Dd}VdkbJbY#X&2)+U72kJ~ap8 zpr*49)8CHrpK}a-y~sGA&cUYi-@F{(aAobDM_&S1IQ>oG25SU(rL)n217lQ@#EaF7 zkT9f1Ar4BKm7o+aOr*d<(K&K%db<} zR0YBwOJ7Eiy2LB&2|O3CkLBUUa@S7zdRP1D zmwReA5C2wlPGKu^Ce3L*s+0XKb~7842g_Lu-qy!@DD5hr9?P44Y^{#xEwSk62FpSb z+j(bOZ?42Uy_Vj#Qlw6j~9x$BeGk){i z-{afwz6}im9IcENkI_#Zlt(jk5b>G?T`5^+?<(cmK z===OF1uw`nhRBYsww1_Iy|jFHe#(-l10xyOn24m(pN6QX{yaZKai9?gPJH|AcQ}rB z=vCaxm$gsUuK4w_t)Iz)mmmrMkBE_N1!E5^ZUYD1@ml!(yM^7>_wAQ&E`bapN+HWyDbe@^10ISFSH`{)H@Lus8e@{hjO*mvz zb~F3@QUY16lg4j5=m=#+>F-RWA|F~G51{kjvp<^3>~($6t;xG7$W|8*PHJ`Bj=U#Z zI-T8m7s$I_Le*f6l-3`=p#@NiLvL-?JZef@6$u}`hR5G05%Iy_UwI5LVCMeN@{?2fhcoQ)leANcg?hd57r#sL!FeDf_|U&`Qq zJP)q@{C5pqj87~O1;54eeldFC?)quq(Az8-KHlxxkn!ih-~zU=#wlKXIt#g?DKOQhFFDq@5|`7 zKmufa)V!2jMU?nXm8orEU_c7|rDVvL*GN|>+SZz%sSh*d;f2=}vI@bR*_=0YXqPI! zWhWL$vfk=|F)mykm@QltYsuB&#)>;%Ut?w)NeJYJv2^eVpzc-)Td!W**#_c>0JU12 zXo|fQJkaEjY2DS{>r!Y|-bWwkhv~Qv7^~}r1=70*{8nosw=$c>IScW}I*pqg53v&f z%pLfrfBF}U@dPu&^QWKi*T4Q5W-~#`2`?+!Yv$%j`nl$-ymJ8#<8!5nMNWXu!VsM- z+lW7zPzixG!>N!gLoX=`Q)P7>D3DZ1+sdEq*UMRRkFNV?9QRs(xe9UD-r2L{RyEZ} zrcYn#>l(cj%iQfT&^7a!5N@-x?DCuOp1}%A<&FWANHYiqav@5GE0$KHgDOe6pZM_n z6EIFppZMba*ZAtIZ!qVHIDwEk4O4N!H(nW+wspRC8a76?o38;m$hXDBZ|>--TK0=p zl^O5#nJ%vrF#7{pGLxMA53{YxIAg1uM3^hkMmpNM^RXIv!4) z(vmroB-U?U57l}5wJX<^E|%vNRKN3$X<4*PW#7h1YiRVj-a5Dg%DA>Xl5B5Joa=K` zyrZXbJKMaQ11$7g!vpob60Ty&&h!fQM9h#`-D-OrhI%zX)o8US(Pr(>+=fTb;vyUe zyv5-{$;}0fMLRXO1_A?DCcj5nXdpb4<{1`o#8JCu%DyNUyJaHV3CA;)oQj>v!{B-U zfDW6Acbb3)`#*9U=ay(p4}oXcYsiYpT&kd6(Qyymh-;tE6Tkc2AMnlB-{AQ?fn(w? zfBo<9`3yS_^xTHkU}Y%mkf*nZJIr8y6u(-m92tImy5;ILzV!kIz1Icw&!~A}A+<8`~2OpcgoJOPr$6Oj`_cX+8oE zBBIv<$@Hi@%2}~!TWb# z)L91JC;N3OEWfYXqJ71^$jTC3gu&M0jv-Rv&iZ4s(u}ckSxrKFCQ>0kivNrf_LW#> z7dK;vWn+2gKEZ{C*C+eWRUlv}`D>@u8lPRh-4@T))xHC#U2$D|zc>;WKE%qOAw%=q z6>`+?Z^QVlUpI?teF-=--+`9J4tVs!(>v-Ff$}^NySmqib+n$2Y z^|yA4sH-7|wPxosr>n0&&MR=VWLbVSrB;;*Z+(6|ENaBoLO&7U!JlD%0;j`OjnDPZ zBY%Nu_vSpwF5Cvl_8E-ul1hvax4PN?4mqi$%46#53a<~J7QR}ZL1vS zYuz%T2SoB6i*0OrDi`Yv^yE1~>pKWj5^VyJ#8X9n6cdWV51#S%!fiTx*#MpD44Ab% z0mr9LKj54nFvuL=efxVHc4RE@%ss$DhwF8*#oNIdNzh!($Pim5i=gib{ftZTgudO- zd#!+V-kkSDH9sIVe4&97mG(#!#wV-Ae@79`>0_HKg(;aNlh?N9c6C#uaJD^l!-ht4~ou&|t3Hy+Io@>f;P1O84Lymi-z$mNqPm0ra zf$g=sDR$^EB*TpUev)c5T%i+ufic0+Cu=&e)Nh4e<#}LR zF1y+=&l69_6aMrs{{|om{>CM5<4%CISzs=%>@@+Uy?8DWCt zC8IoE(Y+`LpBu2UY(M_;+!e5Je&^Q#U>r>sq8;|r=SBcQ?fHxHvew1ECgR^%Kfe=h z5$l%gA|~f37~=`w{^qyPa1IN1(h-}O;M)XTBmbMiPry>l*)i2r*7*`< z@M~L_d$x;%^@}DH0@LqSzxJQHdNSFABYXENt?w-%>tW)k1;ZyYp1^CzjM&X@)#OVl zWvva-=wVFDa%t2sig8TVxUa1Ih6vov)tF#8b#3cW-yPF(U>1sS$vrk8?!I`LUIkJq z1g(F;{^Zx5q$~MyrSVH|Ea=luXIp1I_}25>g6zuT>5@U?vHeZ5aFjP`oh>G}S**(* z4j$0{>UrVimvgAvoB;rf;>bfeJ&M7=y#UQ5h^TD5kT#~d;K5E%2j?>3sXV$RXr2d^ z@kjBA3y4@4KVkVnTmN8)qjn*sK3T?>=kGBWV;u3*5QbXj6ELhX+WHZYf*JnxU;Y*E zpWcP%1kd>Qzx+2$|Aeb09P(ZVJ_)oLS`nWNvIlsI^2J(HZT_dl_eKYQ<5d%9G~pbI zH6&)8qc~Gn$jcm$)VhdiAV*Ix!|GOM`10K2>t;PQ<6yihgwj3L8nha0|9qc-iz3Pn z>>uby+~be%Jpl>=x%wTS z@Zsa%V0ebliFZ$5;hS%MgLw+U9#GAB?SOeHySs-fL=kiK!yCi)hwc>Mj*{+`WEFh! zwf^Lc_E;3z z_GSInhx*{2xAo)YtCZo*HnkS!s*mgjl>D-{Km5uYdpN;}Nf=h2AGLE24Pp$Ln_~C$ zq*)QaF!X8!*#$;eyk)fAH#kEHnnbwzA4Kar9JFIXpPZm|{wCu3WzD3L+B}!?W~h)( zxXLHa`AmzGK$G;G^SJ>ZW8T1)PH8PGR5=Br5%I^Oq)_Y>VM$x-8qxi23KM#5A?}`- zyq7NdG2|iXUZ42ioG1SD$3Nk#ufN6lJTV6F@BjJV@$usisZe*IzU(d#pp%f8%xG*0 z<#FEuw*v#m`n(P3+-Auj?GXdOiop6#v3tuM1`F-j6F^CwXuH=Mh)r+s9S`lg_63={ zJzt5*Cx)s@`F`)hxaG#q`|NGj%f&^XF_1zs!GA#v8x650sF;b`OEHZ6Tg>W2b50k( zj>=4;8{=r@`+;N!%q!-DwpD~}hZliw=9a}V2G02jAI~3vV`9z|Uw!p0zW(N0oHH!H zhzD8b9!$E=msr(>9dSnf2G_dt~!eK(StW4 zU&7{XKJvwb_eyre z`;I-VwDsjht3ThfeV-x0`l#p9Ekj5f)fbM*+PB0d8!7@%^zq1dJ1 zE$JqUI4pmiiz1ts03>%5Npvvg&d)P!F&e<~@Yrf0OEsVK#2Bqlf99Q{S{4m=Y z%-^_e<}(Qi)F--xA_~`!qMV7;!UYt)R@Q7x@E|~_xNe?e)hDxAr11_~}PH zKmQc&q7(S~>+kU8S6|{h86I$8u{QVht~sbbkO#Otw0$03egR#NuN#E{EQ)1~jfx(& zJ@T5Oy+^P!$9-YG$5tr?+xqoBhI>`<%dY!H=Z54VU3q@kP3UE>__wxwBbi^iE}oVf z06}H8WcBOkLoo6Z{qBU(`tB>RXtcYCnjI{8hP_&2ZH*Ma#E@F{{M}Ic`+H~+Xp7K8 zu37(#O2UDNRZ~%<687xYq$RGaB;*$3&mrBfhubUn0I#w$a}%-(A=2{h8oX;nYrvpEH_)q-x`#-1Ey^^=`0J@<$1jvjY0b2! z79H1)K~B)AQ{cS3!m-wZxS0{*tTIn=qjb6**#j z+?!o)Qq1?u>e1(K%ShZiMAxqNOvVf7{tj2}bQNf@6e8|kdo9&o`sotG^XGPa!#N8O z2pkyNLT(8qWc1ioV{7F+i^P#nAODW?{0PU1c{;xR=C}Cbi?51K)7H3b#up^Gb_I4- z&a0@sQQZ3eMF8*;uvje$cJ!uwyFU8jwF$uG?VFOkY#Y08V_)?Db1&~$F@9!pXCXX+dI*&OCx7XB;Dlnt&`Ve7x9%&!TtdGZzxnLN z>ki25m!bD>efBNw?`>>%G+|pxsR@e=|DgTs@dq{^@q{QQIAJO&E6FVSX ze|LL4PYXSo*W?0}9)R8yy!B-3Y5ccfy#y;z#RjzV#1V;F4rQKa&XL^35)H=v{NQ$B z#?F;y7PqYO^XkF}F8MDe@X$srD>`Wax`&%=%-{7nO1XHa1nT}_jcQi%m9keAKMe*S zJKtGEN=L+#S>+ah<1oWvgFBbnoTb97ZFXh~)r~wf$8F;Ie8zX*{T6@x(|^G{qxQh3 zPe0->|M7nT;C}g6_QQ`c(#0R{|L993cNf^}^I>BvljiZ6`lZ7>@-$8vtj0t@VIw{+ zM}Ouzfc}^pR<>C?PRy;2!frq&3Ar0pZ$JYn$=Z6ml{~u*){jkJulv~X9n-&bOcRMWFXR+2|?(Yle z)c4o^-1W(@BF2}-_4-&J&%mQ^-U`h4rdrlF&lc}zk1n*hf8PbxH^AlQ(y-)%7>q1X9Yi!ngnnGf_%DWM`o}x?y{^mF`=F(~I#3vLGo13~6_gHO zN%l?N%%)9PW(HVOmxfh}#nEC?p~vwC1M_?pT=5C%*meclgu4 z{971z132f8`18O2zcKwo%$0+NhVeX%JNkzECXRlWuh(%518~v+o0Z#;V9IlBP#!@$ z{2=*ai~U==hqUeQ8AFpcqCk<)=OCjKY;s*hL?NpP#28;ZQ15fVK0z0d<7EMZ9RNi3 z{Y4!4Rn>d$gS}o^5a*Rk=xHb*!la-GJ7(^Wi~x_1~{IfOx)jm_j`Qt<(D|Qqr$V^dF-^kGViK< z*3atKNvo=*IRcBg>+NVjyHa^sNz9GO<5$12V$l@;=YyH+oA3XsKlRIwP6eSSlYAcm zk{G)wmH@gyMZbDM*z0Exf$W{~zGMcj&pxhz_yCZ->HB?N`!kR3d+qrZZ|kKH$`zV2hTEl9;+m7>YN=9pfET320ivCU%MJ$ z@b#$LgMEp_YhzEV4?utgZR1tV{k#k~pC^9%o8RNV{OR9<#N)v9Px$wL|G#j~4>_u+ z@Cw*0udHgeEXCY>!aS7kbRE;%=AL@IJF2I6#iBfsPEeFrJf^>ng_Og!dt-D&b8t-X ziM%!{`&%KXklB%k!TdCYa&qjui!IyhdnF7OW6gV;C&_`e;1mEqF)WK=^*9n$=n_|Y zyBO(&c;Te;!BtY48VV#pM?|P1otV~$N@uveg72`#Q1|&sI8&|S;L`v z{!-lfJBD{@M}^Yhg-{;zh87g^!S-jXi+k%u%bnj0zE1dZSY3 zFZ8Yofy@<{f&~OouCRx^#&+33lVPsibHF{CZ6(4j@-Gqqw7YK=xT(|;ug{5E-e05r zw_-3Z%|DupejJ#lG74C#IT-{{g!*P9KBtJarj-L+=T$3yLuA0M9~sjfM4BE9l=Zn8 z3djjHKxYNadE&`Ncmh8B4d$ORaq!!3ev7ZZ`4-Rqj6>*)i^I7m)pAq-WI6CNWk<^@ zmk{pfdF#0t;JAL4*PRmJH(TuT(S5sud;Na(F=yI{PNl5-EQ}D-Nn{LnZ*smRR;GSdR8`o!_DH58IH=`Fcm9jn8;!96Bu)(a@h~y z(*EyIHVQ57YZy(LY<=4E3#9MlX7ALwtmkT9-`{((9Ps;j?Ri;s``Xu|y)(ejT)?(0 zS@$?A;h+BbPx$9Q{tM=$A>}{f&wu`ZVV*xx-pGslf~MoAQKO_;FG0%lK?j%CF6a zbr}l)%=TZd%fV6{f7>Y~S$wVcqTvWYGlwfZNfUMq0>lIV<-h!|_`@Imgn3Tb06snc z9e@5G|0mA#BWgeY3P$39qdfpJGS6TINa_&fc|)cdyBC1#IXszP76zL#|7)j3Hk$y{ z2_ys#_ENpsmyKo`OLV1uM{tuOt@V3dP1#V~m+LYZbyCNMgFA97-fYP4MOA)@?Niq% zWsE4RImQaaja8Y#DL?`V1fawrAUZuzhTtNTavpqwB^3eUs(*NOA8#VEa?A&VZOEy6{UlzrXtt zIJ+vM>t);LKL?tx?|Ut5H#U=hyf!VVJY=c$_imC*YijuBX)s!RRKm{fV*NEA9d#woNDbcA)pyMe zX?d4v<{kD8h7fXI8m+v5sG0b-<_F+z5%upF1S85}h_`tHEE%zDpMymRR9Y?@+}FR2 zYp?Hu)3(Oq@V5g1%jAQdjQ97xevNH`+Va!g*E$4r`z+g3w%6QRYl@jzxo=W5m&dZF7vz3_{amH|2r%g{g5NEJI=_GGp3>c}d+|V# zTB;fT%C#vQWbb!}<(IcrFC=}dBM|+^a=#LN7xmWOu?cS}fPrUkwJIXI3+ISYf%wcHFB;`si6iSi$=V z5;p@{(4cRK_r>cKA>{lI)9_u$$Hjc@J~0m!?C?sBSgNYIPTm{Lz!byR;$4XwTlm5r zj{U&O7s#b9L@ohi^}BmivH}E-M5ZVhG)5`BV?-?QwQZWW_+Uj3$^0l+**?V zy0hW_dZe2dzPi1Eo)JT4@B#wcRpcW)Q9nny1NXqhU-%B!&#ZpAz1#2Ubmxk^w7(fN z%ktlzan4P7Rkk}Xz^#F*1o^cVm*h2mdCIlCOq?x$jv-+0urV7|sJIqDzKs_R3^qXJ z`rHxcwukn}$e>#?Whyt-;U8%j_!h#m{Js16Y&eDv9GWTFpsWKulrinaqDRJ`V+dC! zkL{4VyC3Lo{QkXa>Pt~IQso>~47<~@4uS3oiP_K78AG3#Zur9={ssT`Z~sp`9Z#6& z#5jPz{q4WwFMs*3ad^;^isvXVYt=^?3UxFEr!a@(Asu9&+=ADdGy3h@rg~k!Sj3rD)p`Weuzzhpi$muB!`Fz z8r?W@?lO6*T>JHE`HD$|SJZkv``V2u+naT36!x?#tdE>8H#2S>xe79EpD+Wr15rAW z>8uIANv4_-VtRqIKV~pIXY9>9wj`x%OWQ)2bO?kJQx<4HflBXHj>7Z#0~{0Yj;~>O zhv|-QzWx^P-+h4}zW*yeK7Zt7iX9xoMr1)ue4! zT~Drk817qDzWepJJl|fo@3h?CF#LX-;kAyz<&Nd+-HVs7f{KptsCfY%^gTPj0~3So z?^|{WFhmz$#=C%AgA2dXGY}tzTQ7A%Q}X4p(}>ho>$4dxrTB0Nh)V!-;W#1#9SFr^ zAtdOTVOEa&W&2-k;tF|V79fMW)uDR+Q=Haa>aG@oPRAITWgk4-R!Pdw&Gr2#e3$&c z@yUL_h2waY7i}&{&r2;BbDZ-T@85rcfBL6?!8c!jhx3dogc#5GkN^1p;KPUSBL%D) z;qzM;`qonAe%XLqv+L#kF(Bl>lFp?kinSKIz+QO`pJLrw9t;IRy zs3z}ntD={8ISK~N#b`w4EAZslOlCh}cq-$g^CER;p8qf_Asw2*>0oXnL(==aOpM$8 z{G8-WurOu1zAQrW@weQiZ6NA!`nE%S|Ae1D{1vDF1RxF(diU-fzWeR( z@zqz~z#&vGXcB!qV+fsuSU(aYRvl`WHj~Kq7|Xmkf7VtW&!8r(DSt;60qSimC^SFu z_Ib~+4_Pw}i_p1K@x7|n-v1tc!Oiy%|CV`&B5L7~O1ylz&HdVelP`i~rO#b^>Pz!V z*?RXr$~{~EZGF4DNRMX4?xCn`r^S&qq1M|F5LkG`uK;o-e+zR|n@779Kor<=ZvwSt z9T-Ds$s1U_JHd;t!Ev{g@@@o1G&aj!S5AO1+vyBff{#@@SYRa%92mC$E_eRCOB;58($D=FPpxtwO47J`zPXS^ZG#vQ- z@Be^*`(OSyeD(D=IL{N~33#4A;@|)Lf8xVWf5nrP?vOPuOZ9FigWG7C?&N_%KD85e zkP{RZ7(r{D3M*de&cE_*l-GDXt#ny7qRVqB-gfOXPNz<%tAuY3QP1t;%CW4xCazR!o!0 zF#LM}k?b)MG?d4{4DKg>`tUbAJ$;FH@4mvEfZ4#e-~I;g-+zf8e)t=npFbs&1Kd_a zU@%b@Qi?M#B%W$eQi-3g!Xr5)k{LnTzUsnRuK_fGQ}6G>8z^?M<#UB}0(pl8J1_0L z4k-h)y_}zL^NsgjQj}bP5&LJ&z56q-`zI}2hjw>o3GV2LEXhtD*Nu`1`s zJ-grzPDoSh>B^546dFtVY6(fSMrx-~^`Y4VTqBivO_v=`ZJ*PO={q2|_rkcP)Qg>c zI9=iO(F`81OAEZ2~^_LGNE;5Qg%K`fxuB6OuG&H9yvvQ0y z?}sUQFzMHLe{t<~<@FZ6-MLD&8rFfzP>QK=5^X~H3g%I(V9trJzWf${_@_VOtFKrQ zbvo?$gui|NANb+#f5Y@=*wOsD?pcCeYq8c|$ny!u;gM{2%9udOz;yd(&Q{UFjApTt z!2F2kn`Lf@F`0_;+)_w-XtZ^~ly(7%m|*Bwck!Q_!DbnZSL2aIlYrDqZU&zOWaOi8 znQVGkyfT_MRkGI_e>(6qFw446i&hX++N2g}?s(C}Ke+mYy?%|N=Q0X{f^i@jP>4{g z;znVmg>S%|Csh5sl3Xk$(I+gtuFNEaP!&TZrsojqOdnz$T4XfOGx5En`FS zm69tPgsK)V{46E(I|iOE0$`# z;eNWRhh^?er`?_;9ZPjWU}}9Q(zQFO-~eM5IhOIp^9TWM%=o5x?VXt$V8&G5f^rR% zJ1}8$CMZzHC)Y_(r+&|*Th37^k)uQrWd{Zm!W#chtULgE5`9vEcCK)T`(Pas?jRs- z7P_@qp5o4LOTvEprTNbAkMsd7w1;yn^iDW{a{^CK@9>A;{|kQm?eBnLIM0dWh|^R5 z_Lu*Tj~{-(cse4}AAR@=p{%^EID8x%%y4Te(7~iOkKGu{oD?rcyJsl(C$N68XC%&R zp@mExJXXHJpbn`f29)jM zUnG(nx+GPW$&-fB?yLqFV+bO~uur?&b^iA2bz!*;MzVVQxW|nbMO|+K%rFkb-cnlN zv6v@AL}8s9dbYXHG=JWjGrv=;O)ERuQ#Z`1YN~@*`Gs_wG?E}+P!bCGMnG( zEeZNdv8n%M2^tk_c$-Fgu=?o4N@?l(OC#@#MlWpIy!E00#|}!04pT99E9ZEAJ4>Jd zwf$}HP4Z}hz?>RTht&9n)_8QxS<q4&*nn|qEs=iVkV!LO|~4RzQ_??cEc#rKmNtiVfrRKJ_8vH7K* zi%r~ySZ}T++0KmSZ1E^e^XsrP0APR<;zdt*mZIp`B zyXfSsL1W4*M7_1HBl(Q;YKC5zE%@;)K7}>!fYAUI!it|p^rO77SSJMz1VXM7a+}+Q zT^ld(I|uMod5)g9is%lZaF`vupjFd7A8-Wzv zTa9f=jA9fZlz`%fW-144aBGNCGLr%^1q9K2T5ek7E`bCxyBq^@S2-LfK79Hf$NYpZ z-hYi@?{J=g*%Q9``nP!g;w$|0;}7`w=>tygcA!6_1hMpjhIod6T(P3#@!t9yr1i#Y zRsPND5uM0@iLetmb!d)qJY5k5f-h!*h+R-z$I^cakz3Bm>ZI6}o|H#RRMqXffLy=D zN;~~6zx zzw>5pV|b7V*jsAgp+Yr4&T*Bf%yY*#I8oa2MxQ~yU+0qV9rS5OGC1BY{{G+1|YvUy=(^NSBzC`UAt2p z+Cuc@{q0YgJOGNx^@gNf&lsGqOj$RQIW`6GNHD*}Rk{pikGXPX7ElQEW8DRPp5Ei#(^mkVFn!=S-s8LP-s98rC;ar`2YmeS6Xp!2SC%l`i7t(6#4%O7 z+>}?$9St5}rIdkZ?=AZVY!kcA&Fv?pc)MOTdTK(5i@9f;$3~Zok=|W*%Jn56P+u*J zE3>(^E{v8}uUGDCT>1e>=$32;9Hp2gU*bleR1Aunf{I~=LJj`yZxGv)K(fF>s__u2 zxxN3|pQ4reXYDS}|JG1Lp&FdL5}q*!>O7dtVDGJy(z9Za*?Q^59KS5&HFjMv0vvnH zO#lM7QbHjQT5{>P`+BRX!;CWajdI3RwY z1UFBL8bdzm1~TNDE?q?BkC-o?tWpSEl7DLkmAB>z0;b7JMSfI*VCM<5TE}XGCrXMW z71o8YE8lw!tFAn^$;}pnGaESFOaC|k8v+1@#+$P#h^u&yp)oOv+00vu+uTBv`LfdQ zSH_q6Ix;nDO(1hA^PnKg!uAmRA%a*&&?BdS&snnwoZ~l(!xMeZrO~R!<-kdfv?=M{ zT#pFkDEw!GWq+vv*p^~y#q0qX%qGtBN6h&VPvZ+5PhSCehtmyD$2)xU^>6Xz7hmJ! z$B+2<@kcyAf5KWROxsroP!`o}H8*J93XQSF)QE6$=}IK zeX^0g4T0uq-J3*q(w?KDaMt#$=}OCpv7Gdqdh^Icg6u>VY)S4dFNxNnXg+;F7P=?@ zcNy0>$?T#4fIForL{pZi624}(UqV_5w}J60`7Q78b*AsH8@|6~)wPAs%@2tE{k8Vo zfjOVyZg}_Z9e(@m@9^Dkeupo<{0csS`FtXBte^4y_y36>fBXwRJ%3`6zF>mGbn+ci z$tC}>u>Z9b?%-ij&XDYSAW?{q7M^yeI=4*p4j^!3&WHBR$2$TX`RN!(B-V|FYD16T%TN6(? z!W1gH`gRX}D+Iw=V{GW6;I}x`&$&Wy8G>_MQwg+5Hd<(aWg-&PKj!>0%n$by2PjZk ziqZ`jIwdOIF^s7ja<{+`(7}Oe2Ez#)+7@K|-iQPv!_@o?7n0A)B;G)JEU5JF#{bij z0o*4(KL3bue!$bympH~(!OT7|jwgKc^?Q8v_1F0D@h5!z_#-}j`b0*Yv0Z9NfEg4z zi63GFE;Mh^Xw#fk$U+PC<@svh2Ko=jF$+vsdS&Z|A;w-5As6h8ZV%e5J0PwX>3T_m zHqMVNTdqX0o|}8^3o%($p;BHAVoFw6fv2KiWJPazp6N#F#;Hlj_Lc}T?9La`Mn4v^sC&$!_tc-93-`hcJ zAm2aGDeqP_f$TicoWP zGM#K%B#WT?+$-?Oy1hf$juOVP7~(j^=v7xVXbKikB8i|1#CRwoN><=@4v#AUw)0}PoD?`e!}_uOhH`n(?X`B7@=)*N}BkH-5x`(>LRHP zTFN7sQC72|wpQt?-4?XkXpBt`YK@jbI7IY2(*8OWotEr&}}0?QUX4gQUdWQ zU4zq7KJG#yRt$wS5y6u9WfbVm#hTxtbdQ;}>R&)^A0;_-@RJxJ>!!J-l{EmKD{_o;* zp?5mBiMm$CfWq~j|0*n!V$kF6;M19Nzf=HCUa{=B_Z>W9-tE3guTxO2DUi;;*e+M> z`5L0iEpf%Am~nn^fh6DZNg5#Qt-WZaZ^}QFr$9w>@#`Ao?aAIp7nMiDW*aincE^wf z!NyY4dDWkHrA=ER=%RM7cbnnswJKh72jXI-+VuwZAwsxxAj% zv>k*poovW8S@9;}@u80V3Rg$mJ?5H6{+cZIE-*SeDgroTXF!iV%Bmb>@~FiR?Pib; zmxqB0WPsV4OxB6hqnyfN5FH|zVg{Nr5`5CsHRkfxWLg<2Nxouqk{J~eNRiFoKjG8! zGoC;Fgr}$Xcsjm>ji*@5=fJz;9o~Qa9_RcP=lK!OpFZN_r;qsb{E5QHD}!8fo*Nk~ zmB2tGt3V637v>?D@yYYI>5@uUnB<57aU#PJaxXA87$-G)WLoB%nBqdc@83U=8kbzAqX|f1EJxLaSO4Ym_sX>ZuvXJA<+Bj5 zC`sVO`$UKKeYRA_VEkYU=k#R^%sJL6XKIbhtg5Hy|XU(qHja*PGO-U5>|IQ zPJB9l!t?w9vjb1#YdjtA=sFI1y?gf_@87@27w5$3&p1ClBIF#H>;Fp7xSjqPZQpo@B)O(8n|Be$3Ok=E*I#U03-MOnZ3;n`)0BK z{ASECitI5JTaL$+zwh#1FZyicEBq=Xg3DJ?~klG$-R_vW$&uz=277!k;h3 zr-(f=&L~es=xfKEC!XhXR2n=d&Us?alcyaDr^-%fu6Oos-#4uVCHu16!y_`mF_%T1 zUYW)}3VGDtZHfI%x1r#c7h?ALRD_C?`^foP1-G$p;biOQK15uS zLOS`tILd)4Xrw|@?CtOncu6ZNL6;3803hP*<0J^a(6HttT}^2kb(*v##_=x8nHkMy zEtJCXn1t)pU z@=&-yQJk*#^z;;7#CPxU#TQ@V{rmTLdU^*R1BU}XC$#-6-f`m7rw{n)!{6}n!;koM zencGKew0fdsan-zND;1~-s(^CsRMQR4P}5^E{*a)#h4=@^*}%4C5r4Q^xA+UEcApS zj6(I(4!Za}46U};-p$hOA5(iq%(1V->HG}sZ->reQF3#5v?kK9)pKoJL6^@lo}2dz zUZB~YKohLiOe=C$1C0JWCAq!CIP@WvjQW_^co8~3&*I;&UHyqQ6dTR>E|q`=FT@0d zOSa1gjEI#MGNm$QR$7G;+WX~d$VC*3E3FyEu+0Tjs>3FW%>zJ%eqrlovAv|b4=-2$ zjBjS5N(w1Q2w=8(Sd7c(#K%vc5NDeocskzWu=nBC>h3`Uj^hdAIPk^0FQZ=`&!6)Q zfN;iXg`UV?E1cQZHZXCfMH-{bXc(0w7v5n-ORM<$PUo-)G&hW0IU`a4-QK)Eg#wqd zc-1-z-yn(<7!D|zD3dTB!eq4{KkMYV0)ZpThYo}b&eL-O0=KM^7Ys&#X|bo-)xVYt zQVdLx>IE#a4uUWJTP^JZ3<4k-nnBU9Ym*SP0#_1n@$0YwpC_Fw;z2%Zjn<+QGJ3iI zg6?-UD&*{{5=@lrnD?W`k*;iZ4hFcq03(5^Q6Pp+G2}rh=oa~8KFi3zSLvglA!rZC zlQUZwt)hABYL4%7?(nX)e?p2;H;wh-Y&YirYx5=0zUEa(@*&L;Rk&9_ye9leZ;hhCmT49Qtqn8 z*H1~T^~tWe;`ssrmUI$8RZdb{q0n`Tpz(XN zgBAapUUN@5k(T>JQ}{g$N5!v&HmV=)h#ZMCfW0a45lx=sWj*?u!5!;=pk%SYVe@KU z8jTO10%-x4JH=#;sE^K`{w0?}b-~cJP=nV?kwhF`JNXYPi?u%!ZR-ZxISjP^>kH>; zPzE56d?fmd{oo?#Ohs>ly=pN(OCrsTXJ_KcY!;^heQOV-Fd)waPp8TW?$gx}itpd8 zpM_F$z)w7X`T@`QF{pLC$1&bvSO^AbP{rp%pdEO3JjH}OX<;g_f=Mlkhd~RRneA>c zJJ}0vv$7M4ff?@&W=QM=UCBm1*vCzv6ZG?|hXa})FM3;jQ}@=|3Xj^UZa@mK*E2}TU`F6Acd&ru z4&c`QR8koLmxrk_0q2qG1R0Pqke;LiQN`f;nTW8@fXe5}sBl(!46uJbf54~bkNEWQ zCp>@ph;u%($PZu#aBLbNatL}T#8NgaW6aMwKgXmT7?||D6;R{aGbzp{b1mqa)bp4_ zDZT`pF7F)I{|tGSKnlohhiLjcaaI~mBWp@+6NX|2f(j-w2A{{lK9J{@GZIQFLNb=T zbye!7YH#^Tc_6zg_-m}rP1K8*IDHmI?|H%=GW6Jftx>`$sW!9OdflMJGy=W#A zNHbv4wZ~+{0#o3Elo?S~B+IYq81}9)9`Zew^Ir?sV8HMI`;4g?&yX;oZCPao*o?BU zF_1xFHh8S31Jg0uE|kC%A^6g}ZAulSbJr9eP_m{pTZm?FeNI>F;2b$ZAX)?cUZabT zB%S5H)RNNp$p2|Eaeg^}Lp(lIv?n^1JFY3HhiScv%oRd18{Cyd1?nK!Go0j!LjZ$~ z1pbP~y6?`lHaKV9bJV5IxHH3(UnOD<(&TVV$c0mizh40)RSn{i4t=w+ zE&1j^6tUBX^=?bKMlPjS@~P6mk)4j2o~yv`@A?(4%C1~njJfxApTJ1`oQ)k4^Ic4-C^g5ca1216i9l6;&cPX$i<>% zk@K|9n(#=w7|&%!EwM3)Byga@C1%I_qBTm@rD=umF^CEn$G|A`sQP=-o)A+W4Whi%}v}pNN34+PHS*M zi`6UC5L04FD42tG?lXM!(v z3kE~LC&Lh7AuN{pt(Bfvqvhor$&MIbEdN^YIV01#5vtbU)8!pfa447ED%9V0^_uO= zD^kdfW(_)8v>));J~yDOUspnRS`BD}jV3BS=wsWiVN6jreB1^Y&K}0J8x~`3iZHvz7&X;9NK{kt~3+A8@$hrhx&C4atT164Ef~u_5 z%{jk|5b|7i>n?=$Jv);jkwhUi-!U|;HO;H)I%rPHni5@gd*q2s$bwFxO`%aox~>A$ z7#=ZGaxRjm9F;qvICae7(w-#s=M}7B!)a zeJMV~4A5}pS}FLJK(U+#Md3Pi>}ak^O?=Qwx}IkZVq(zsOXbCFGIeyNCaxA4@YEEA z_HhOw-4AX@JlSPY2ar++1vm_;v=xxZ;dsSD!)U609Gv&8W8|{Q`_?47WO0^dqy;0v z4g+ZMN82&xevD}$5rB2R!RtxD*>KWR5?_s9Z`XMs?2SQs%^tBS7xCoS-<``ZsRb zRX+tTYo3GOt^M77rw(09fEx6XDmE6(Xb0)UqfcM5&Q~ovmzxlR}oqQ15$gA(gFRPKRE-4f$|5`C4 zc`cW?fB`ahmTpNEiV$;Y;hv>90D^(Dcb*!}H6_7vhR1@;QKG9y&pb!z&K6E}r@QF7W(uX9^ra+|DPP{VUbW_4x>P?P+MY{yWWtr$Ed?|=$9Wpyb)ut* zH(j(6mc&8tU%xa6sw*oSGc7a4CWR=k{EM2hwLLL=;kb&$%i2>Spc06}#chEx&S-VY z{nP9WEJ|PiBV3S~MkU7CohlhVSm`y)!lmS^b(~HiCh+7jA__;)gHcOM@89Vg6QYc4 zKpq0_b0uNjTSAKE%q-9A&(T6G`3CKo)swCy$1aO);fD}>t0I#y6k1J1GTmI=p~_rmSc4o=Q>COn_TMPZ^?u%y z$xWuU)C7zZloVB<69&=qQ*_ISGY4i`1M+q-EP~>PU~?;_MsQHuy*%G*O|ZrqDQk1# z6F)iuTE7)yh zDWVzko#7?*%_`Tx)E3ll1_W9-$mDHgXH<8fLP5cEQ|m4H0!XM~2!$XIj5{m+#a#{r z@bs?yNwXCDcY2|6PU@L3AVj0!@dK)>QM8I{KqcDCWe&;U6g=X^AXwDo580>z8o&Z< z&7WidW=P{jmP)2bS!RL^lCY*l&h=hG%PQQl`04wa6z6x~+8y$#1lsp6T`y+@BrUaf z(x7;71vAwD%yTRRJdW7l5p4+7xRh^C71)WQE_K( zfhVF>nM_G9KSRK$b*}1#LkVG2C|=CjEq=wpO1?<&5G}K38L!lhZ5^8wE`W79Ti%Ei zA7mx(d_ejp2|d4)xYvI=cz`u!017wIX>H5qp#H|mM>XOC6)quRZLB%k_Fxwl&B{(e)5pKj)M6B9{Ycto1{afEXl=0Aeznk<>m)+} zW&PGEpe4+E*axt-M_qtOo-GkMemZ51h>$8^Agk^rm_(!Zrifi@m;Dj>%mGZt9OB~w zGN#aD_wJYk-mLX)#!yQExXxeIjRhH__|3{G2Fr0s#uY!uj+x2tHhq+GF+3py@WC9T zGU{Tx?4bAyU^~=*7*yAz)(gR-@kQ)*_vEJW*FaYAl|sRY9IVVuC;%8N$MDug)btN@ z>Sw{yRSNEK^|k8(Akh4`trYuR%142gQ#wDpc^_i|XIw8v1 z3$#_Jx)M7)6kRW?=x-pTI~PW6yNXx)a*HwUIN?0%wG?^paq)NyEo9}VAo@VW`|@09 zQ;FAj8RoJAx}~0Z4_ECb5=q0}!f! zm44c4tArNOdHcM(ibc7a-)JZgWl4~x`y3^>_p4hKzI-a)Dm5!X(vy5vP*i;mArnbe z?M-w$m==+~b59TS+D|EnvIdl#*~Njz4hSGLksw7zP%-;DHTn{Qy+>}0h0^w#oq3{O~iF`wSl_!uqW8z2cW@<8s(CLBxZSnxXNyVFF z>f`h3v*tpH%L?l$WxD3$t=CKUw)`(h{7C-SRgpv*C|=;q0UUNo0(|tM2iNBS7_^C9 zWO{2vijSXHHh)_z4!W9KOg*1b`d^DadN9&ri6#PR!cxH^PGTq{Ss#p%tKw5n?xJf7 z^K2f0=!dM*1!y1I+BPz~SPRD`aFiuX_g`2{EuTi)1p!pt$@u?SLJUYNq1@3$TZa{S zO>_w|47t4YwL|AbktTX=JrhS?0$sUwu%~^@{Y13N8bk)p-QEpI3p5iU>(5&kW@QQ&AR;?O>D#2BI-fth}^sd7LRlCp*5vZ+%^nt-5q z$)NB}xR?oWy71R{wCD*S()(m=-wj=P9;AP~C0xW6mRR#PM9#r2lv(PObkfnM-sUOg zQufiarbT!cv_qxVV&7RJUzsGp=&>F0*bv=mO@_>)mxC_PYY-O8kc0i7y%Fm*XEh?6Zb1Dko?l1@xs}Bmw^k8f_t%`QGy(eO0L`{$xe8JxKN~q zt^gL#lX_#b&9?5ZUfQyDEoHBv$#;|58_A=wD6PjVOmFd0{_PblDE^sOZ>V4D)m*>d>R1F7 zqK%YiJ%@tp_H_@yOGyYD0=j&CWBotAh?cw8z>(H78-%2F#)+?8ipAqvhD}-W(vGRb z1LzPV1m}RkRcqRrtO8&`W)cRoT+mXMFlO`GHjOhkJM!-qo6@Q0O|)61N5>c#oiJJ zqyGX7*4A7piUJa)5G7i}iPG{$_|CATnslT}UV%jLCmBot%8`ApL|}c^0{H5mfglL*8ONC$fO7yU zmX!2glxe3aYK#E16|#^+teq$eF>`HeK2kXH-te9%Jldp;V-e@81>M&;ir&TDy`}m+ zcYz3)shwR{-6{9wh0XZU>$Z1pTkRA4o9xt{RIEoSKM}lErvYBa%5~>$!uur)e7ruE zSFRG{{M!JzP^;<5GPa;g(6$L<-`QU9VtudNJH>w-ZP5W~NoY|`*9MLO;7l}%ET{vh z!dTSzmW!^o;)J|%)_flnnrg8x8(NueKu?B*L3EZN%SF@I4zxgz=ANYUSAVA>KLF*~ z9wF4#?V=!{VkZE-4^k?EU3pSnd?EY2ybK(LF@a|~R2!!Ys2YQWQ!Jbg{N$SLf>X3M zShKbyY)$$h$(8*gD2T+bV2mA%xGG2HSZjr(Ad%27i3V+&RpMEkcGi-kh~kvwHS=$| zMXPdPQr87|*dxw^l(4+CR1mf?-!;)}#K@qr;- z`f!I09ngjBM+%>kUT&}6#9Ao&&XV6f3s9x>S>7Ys#MWJT$5^?KYBbtaPK4*2muCg& zVa4o&E11AJUMA*%MCWK8zlC80UaWsd|8XkXeXc40P5s!n;dKF0Ej})uf1^(YSf)td zK*)kx?mtV3IYW=6H1t&FQ14}Qj`~Q@GQrzbEfe zt!V)1ZZ;dR@x9 zKZsZ=7fb3pS%wJqI4LyUo3f|kj^l@;e*3Hg?iovNU;qUJy8Be~q5C9BP0}J2T>W1E zia(OCW`TnK{ha-8?MKJ@UI|eW!rHdfh1Vn~Q)p=Y#RA84l?2az_$(SuI4iaVfpw&@ z62m%7?1HF+tL#tG&~pANv1KOhY?cz1JJT6g4PK8qS13yTQB~@gkLIOm%C66)0D)UZ z--GX>JG@2~j@su_s$0jW%IukDbZr(tcnXD8P)k|oR=K1dy&GOYAU5H6B_xxNYyAbR z_tZr+B61C^{9LnD;W<^?1jL7)V-(HAj?U@R*(p9`w0OF%*?RJ-ydY6vZ9$7r7Jb~O zczsx}28MRF^*AiTN6~AR-{#k2dRXl?fe|!zxdY+wc|=|l=dSV@NT1CZiQNuQ$Z)55 z=0*<;R0(22!FeV!j*`cf#9J)@4r;m2EbcM4h!vWnAAcN`9=&S)dkDB#NRvFK*sP9< zHI&S!V)g^DXAXq|fI3zBFmVo*HoTO1uc_}j?3myl6J2Qu_Twm}ih)TVGf&8FVXc_} zM3z+ai$Wj^ibPvE6Rn?e2|IMisTGr(XTnYh6-#B7ZhDkT>n=U_T6Ae;Q0RwOP&E@I zyrO|}ecCF3jZ|$(OYT_e!K-qj6hhDFjkc=5O10BLh_abW*$jdp#rMNIbfl8dJwg1O zWs0JvM!61jTx%|H)ELFz-32Kt)Q}rW;XZL7k{*2^595=SnF=bEXvO>o=TMp6a-B=@ z4r6^a6MgAkhWI*~R7&h1Z6=&stu4I^2l?#uB2OlPC8bcjYjtFEg+E9St--BQsT5^; zS+uU@cJBYRnVvi;PP99;{dEN#_m{>k<)5J6YCf`3W83z1q--7-hsIA|!YHqV4k6;8 z(XBy+moi6Y)ghEcqzhRqM9zRt_nfJU9j=f@10rg4uze@7mu&y!uCemJjTVB_Ke@#j z_|pMrm<<%FxbY(V6%d)*80>Gv?J*(k8JTmJeNtt zk`tOAx+k+WFYuAfi3TN;&`dm*<(h~^HE!s~<9c+@m;E$Q;r47EFTt1b!yzjdh<(;_oX6jqmmCMUh!D>jBB`Ym zt7d&HiHrG8Ow=B0%r*RbYDd%EKo$~G^$N^y!NXnmgALd(3C zI^x*csh*uiNN@+|34gtXu*;Vsfh=NJS~2RPwlm9nFybZXK#78JNID z5V&?L*>a?E^Qsb34AU6~UY{oW8Tmu1g=-_dSU@J30|*!T$oHjpAbF*OlkHMaK4k=F zP|K5ZAvWwF%TY2mb&@+)BUt*uYm0AJ;w&Cl(4!37C{3?zfJsXVGULG10eB+nevMzC z{Oh_QT#j#ubCAMY{c#{quiHU`J~AmXpqb9wE20gXC+Djy-ADwoHf{nCE$o9}po|(+ zL{j}nx~O7zL2z0;HgarX$;V#kI*L{pPo;rlUQ8>lE4;SD!P??bdD9RofKRXUx{nZxTbf3L4hcx zvL(RkUV$bFm7Fgt1~ofcF(gG|jb&GX!E$Wq4UNg%UmU0E&HS$G3Bi(o{du` zl{3*O&^Ks=g^2)iRd#z|$ITL(2}mohG~S5(;bQ-PS5FUhw3^WNs5YEq$S z{@3i@w!YC{0tSIy?48yRC|{mU#|?B zB7fGFy)NjAF++w(3Enj69{aYZ?q3&p{^qE75&!GPN!k5jhz#&3oN@%%c0g6nVo8+E z6ziaG*N_k&8Piv#IVtGLNuk=pfWrn6FK2i9Up1vOq&sI8w0}($EcC+ z^X|%ERS(3!>1hDLhxnv~f+NBaIuAhwS0pG4Lr41+SFA-3d!mA`IUFqyg0mCUT7X&S zGbw%Xj3tf0v8czz61uO`V~u-OAIgIf7S=2klFHYMr(Hr=p`08sQZcKo=yZlR);?=Y z*~3)2A{cul3ayQih{aNyhm z*xCmHW?A+EKdWMk*2t$GO5V&ES{vDh7qgOXCo1oOXEulqIrrlCv5ep07?bZ(0tb+Q z-4IDtHu>%xSLdaAhj>er@&3;gGSOx(gATP(-ia!tLU|gpCtw&n@;msT!n(4jivgmq zBm3HtZ`C_zJ$skJkZf?|R^<+*{0KP|shKrGTGBHcH|Rhl_b0%PQ2H>$@#34cJ1vSu zb>qiN`Ad$ZL^Vsfllp>jaHrgcGhe_3CRaUIs);;cj@i7HGSZgkywMylTmtQ*^w{F9 z*>Lun`kuBmr9Lch$$m+GIl^^Jk2nznK+1~cv1m-{tQaZqgcmePC6R={a3rko1D z57yUTO)f?P6e8mU_aGx=ET<4xHbcwO)ki5b6vHgrr zGT!rdza*a3{{~203SElT@(FY2p&}kGQl;pdXZCwQl;TyWrz`DQkKHuKM#XLZJCpqYZbcmc821xAIOM(npQT zqZLwONHm2yN1uvG-^&U&I6q_?2_mT2%}{v|C3riiJRn|aV2w({nRqoIg;oP_DjCl; zx^a?qdIE9}=Q;NX)6c~(sf~j=t{fM79lXmHwmW=cjoh&`ndCv2 z=i)xE0Am?w1RMY`&)iu?*J$>t@(e)t`fTrQxh#enS59*24cC9V0sxxq=~qczff-#o z>9re2`q@+4#KU#`d1(S=evy-aX?UtEWtP=N5jfUzm5p7mu??&i?CS#cdiAGQg0z=M z9mDl+BB0%s1_v-~X`z>}?Qf3ck8l%3tg(_0AqB72O|`pc#8GDvIjsdHrx*a%6IToq z08S}?3gXP>gx2|)b?@aun~i~v&ghD9D7$79HQiU?=O|@r6PZ9H+Qgj7T4`W{3PxZe zVrp~;XDk~$&`5ndDSKDo5eZ|Sf-kPNpa={E0K&j2JEE@9CVHJyC1t{EPQtovjG}wB zc$2sG_7uaV)o2H_%_e9y>k$tie@wav`+jk4@RyL+GL-J%T+}{siOA+z(;+0h-%uIQ zU7A#&48Y)AySI>$0EGZufQA*TOEHK)>a(Elko1rB7jCmK&Y&pmBuKAQ1%Z*{PvtvC zWNr&g&}vm4gb8f+Ie~L+0neGatuoG>&m0E}6y=&zD_E3dPoh=cujT?s9h^X*`wi=P zkypxT4V|Xo)-3?cPq?d?kIu2++owhHnl+W_0LD|g&0`EfHvvY0(x{UVWp4A-(!p?@ zPYlvKPdK#EfD`Djk;SZV10DAyh?Fy6nQs(%CITBxd6~jQmh+_p4}FYa^Hiuj)m1z( zM)Yse>(+BShTQ3u%QK|#wEa-3O`|mc^W-`WFl3uYSwKRpxoWBkCrZNRI_wI6S2^ON zetFHg_2;d9*A*n!wZhHvZY&13)Pez7n5i{8%<+_`>t!dce)sm1C`>3cZtbJEQ~G;D z+n7CAb=dlSBqPZc8aGZQf@xqVt6NVS2dFrG-mmxdq6uVl--kh^9VZ5I;KR5jX)gP0 zWv$ixXdib7*0A)>u=vG&Q~=?!iiDjK>ze$UkZH4=pG`n1vC7?fWGKM^2V?-xR4HyV zw7)Y!B{(~jKrGBmTq2f{3$v&lZpb`ng&=VrEp8oJ0mF_w7u`+Ptw0h9C-qKYA;wLO zG|(2HerbtsjUNJ(Nf;VVkJwjQ*@Q8Z{FVFZRp(&=oDOhL`}8PplCe+%z0|8XFx+vf ziQG0SVHtyxw<|)W11C-#tY=8glvD>2JQ(D|5aJUf7G+#fY1Y9ft=ViZf4fR7|H9zSgp2k&qAO096+ zso%B;PwkDLbQKRO;^9${#>DU9GYrUQb$~lHmQv2(x-}8FaHMjEE$4?>9@l53Gq;m&m}UXcfo9x@Z)uzFw0ilpF?UXv55Sc(K$+Bwv#X~vor z{ewd$K|(4l53lTDI_w8P3zYy7z7%K-`g6aK%kxN3LB2=;h%!uKtR)W(l!F(OnsUpP zbJey$s$JvOJFC!R)4J%}zw=uTIM-GJ(0*5W+ff|I{#FMPtay^1PO;^Z*m}{Y}m(=b~Dy=Zvv}}B*ZA2tzDx#4} zsTQ|!F^N{@hRhI2E3;epU9GNNDn%S-c6z^^{mA>S=uPab_|k-zv0=clC-~vOJTY*j zA}gwe1y+q2bPBx1oLNg~bV!B2-!$d0q5gD*mfTWz1X^f-lSPtGhz)-eK_^`5gq||(T!z%9e^E~ z+?JNyFboyrOwO~W95^Q^0c^BlpPgHt5+u;d9Spme%JNz}7$@Fwm_;clx{+h^iG$esk){>i(IP-4^dm$yp5^HSbI33uPjgokbfxThD+%eoZSzZlBjdU7R6Gy zT<0ZzW2vRWb7YPM*GYwWlyC?FnMrR>6Rj7SD0x&K(V-)s;W@uK+HnwYQ05NGJJ#RO zc1Ac@tWo?Czfa`?G4vQ@le?Y3Q9ucsTs5_aT#H=I{N0oH2j~rEPRba@x*lzJk!h5k z=~5#Bt8#aT# zpQmSS_~4@>VrAk(0m0G<3M`9a_A15(O+{z)=*$Q-1OWqWL4YA zJb^@pQ_PSDyg2)xY0UzbUiZuRpn!FTr!;hh0K$_dl6&1W0s6@^cWH755qpSUW4X=} zDezR^IXTpFo%C^}CnR}5opf{ywwQ^}&H#L|ZYZma7QGw1?NAY@8gnqt@2C)60R^8{ ziX4*U#@M}O95}wK5Tm8XMc~DfM_rufQaf6U(NB>(KA4OY&;lI-D)LyO6u1HAeXDF~ zM|nG9rX$o3G=zg}Rp%nssltI)&V*)M8jAA$>b>WG zIa$2@^tyGA)B84{&$&W&o$P33QUidW&xtyLvZUaEGWKVjqnlSKyQO#OHOPB-UohN+ zJ014g@+H@lsF5zTU>jq{v(&3w^;%WSFqtGnBx^ii)~VPngrQ0-2SHozggY5ri;u!+ zqHTkdJYxuf%04rp0ix=eG|>CZN6xJ(n1#hSm-(C&S{h(Qee{mX7l_*XqNUNI5fKOG zKzcl?K?&7?+V4_sG1puTT5cnhT+HW@O3^fLkSwF}Cn|>3zKqC9r$9`=i&%gbR%5uv z;%5dYJHkhRsBl#mnACW@4I=^Apy$ELn;<@%1WmE%DbkEG)70;Hw<%-ZiiS3VMw80R zVX64bb*xJQRbvsk$4HvBLNL=-Fo6KLhT7`3@@BNiaq$G{7bj32 z0ZK3u2xc1!Q4!SS;U4bjVPoTXRCLM+K9W7vTUM>h&_HTEOMa|VJt=Es#T#i)1*9E0 z62$S7hJ^BDQoJ4DG?TBLv{AOaV(przST94e(X>;5bZR^ec}X+BW-v@Bi#kA4Sl(e! znEv*V6$4T_#@jt*jTF7Sn?40*=#p35*&V>y5rMcd6yZD*lxXc4=Q!vZvH#kQVpvXt z)htTs%kz~+R)GPo=IHkrluPnDSgtwI$G!cXt>|iVGX+A9VjDeiV;pb>jX6f&vAu6SpMD9MIu!!*@Z?i4;V>CRA<$Pz)PEIw8ai`BcLv^jypU>?WG zNJ%OqINX1<&KyWd=7>pV1S?J|Q~AwelvMsCt)naZE}pT(jRBO!28p|9B)lz_E=nNc ziONa^1+bZNCfNQV;arxU*1-fV6Z3Fop%!;+%Mu}tI>s_y81FmTkJas*J}bGMsq7{t zvChH9m>DvF5MO$sIDT14RL*c;goEl6^vvcMpQUAL;xfa6=%o;Vby;gGpHX3r1Wj>g zpa zVL>P(!yvF%y$|naS~3v9%h3~F>8w1Mp$8e89X0~;ii;j0yHpaIVPDFe7*?6knW(J! zNIs-a%=fj+`;R*G%s2?A_dsE1(d71`+dr!Of_P4^PCG*1Fow-i+mW0EzC_mlncMQc3&{x){4RBA8$*w$=rogbNVX z0|Xr!$fXi?)0VYbfZ7H){48rA6^*tUQQ*SU!ysi9fQbnpjqsUyZI)I7tO;Zf#jUL0 z%bf9S1C1oCnkTUEXt3Di;?=^`LWL}HV@?V`u@+yGSA2TJQY{o_xsPeh<>DoCd&H$@ z3f=%QX9_!>EXNSXP;#qlp1qVpi^U~Wr|Ujgf^)!H5HaO)6W6;b+N0mhGFG)j&0QCt zNXk0hjYvTyy(TaU0F$L~#UM2fqbHpM%uvIT!cgU_!^)z7CV(o@FwmEW6jeS$K9^fN z^QnMgRoOEg+?&(Zr()Jy32* zVwq&B-sK4I35w?^C(T1CPYg`D&sERgsSCohKHw)kUYzp*eMzoy(w(%=Be9_{r3y76 zl~h^V2j$4g_3BibO}5i}6Cnpx3*~O8&eK+AK+SmDM^jrnm?IH=iCir&enXsXGQ_m0 zjQeai^C{(bk;Ul3GgA`kdL^5-Hr5>m*DE}=1v~}&d(xj5+u)iMxxUYR#A$$CvQ2N| zKNaLrlVGidB+8mCuwVDeUkbDdwWK78I}F^z6o2M7rI3RLSE3oL`BU3sDp7$-cq8vg zcv=7rmG%W%LJGe(as`w3c8||?8g|a*xV!D zX=a%7j0J8@7^MXfu0l!i?(z}?C8VK8-KuJ6_fg~EB$_7fu4bhllP}%hR+6YjSqEFB*c|kqoM=X zq$FB2C}C#6Xj^W9=7EwC<8X_eD`1S>8-=p#I`l}EE@J)8QC_1QVCqOqD^%dw6#_5^ z>>8|YT9LksuLljCV%3X-iU!JvsTuAhA#vx@Slgln-3$%h=U=mtX_ zzh2{xd1=6RXP4x~`oi~nUQ+xV+qxBYTi^0VsCVhTywa*)O!ZZkk61Tcga#oM&li;v zuEaHsG5gb!XYMa82T(u=iy=vDcEsLbb~=-Rvg{)V2~FUMuymO0Hk?+_Hd(Spg!m{J zXDZ7o$dik186XhlO4J6W9Hc9x(&r2?!&UcS=*rr_byU0TbipQ zfx`en#*8fdq}|CbS?~hqF}Cz+54QT~S*ADVi8(TIF9I4jdzO0e8H%+=JiC+KIsPD; zo3^r&-;=E+=s9RR(ZdV*A8BvS{d}~}ttEU}3lRX^E?I(GJt%%Dnx`k-w8fU~sQv;o zyRyn6L1aI`Oxf`Z|8#I`HQyDA@-ze_7dyD9UXya#<>CrPmRBT(6Nc2(S~2kS#o$|& z$#o0GtqShCUpi#SJ4Cw1(}ZEPh-3WRIb#*FD<3JxbPWCN?B@}oqdAjtpy1CS^FWkDxc+JCX`H5`Mf zc#;jCq$vI%uSHL?y)|K3{4P(;0tcGDapX=6@fO3(`8|z3g$?emWI6ZEqHpWv=2{Or z(^}nf_$&bcueO&^Rk~UcLBw=l-4y9A&JckHy>?KLVNejyIk`=%T&2oEm`Vf$ig}wQ zG%ON07FQq_ZN7E1K9G`GIE6o?eDwAjQ$ujod@(L5CMR}_$Y@(Rd{ z;ym1DUtb;}kiq;Ig%3(|HDxa0ES?h2u>g)q6%;TnF9`*_+LOYh9`!a~#x;=VGDsjX z>pJPKwPhuKH63lCYK0e_lePsGB&$dD9<@iF9tA#^MXUfs4gDBMf!_wSt<#+R&puV9 z#p)+O>(knrP4G~1q!Js0U!2AlOp1xKE8fjnZ%Pz;w&;^>T6qDS!l8mXHOi61%na6C zbMP6pHT)Ui7F%c1n~$Td+X6d@v&bi!qmc(ptx0a_l~|JBsKl65t>e+ zJJ`>oFqsY>m;=-n%Axu1*qEdi#oKtUj~%kUj{&$Q|Nga zrH?u=SzEqX`zFJB9TNe7I=W_7S`NDj)P~qSCtZXsRJ5OR1zfvYmZlbU3734-M&urN z4h@QD#Tsh%8YO^8BUetk@fTvwbPdIDib7@P{5(B47FqN#R2~dtbQw;Frw0!1hUoG9K;Hu%$v;}~R`aJ~Az_Fd zsYHbns(&*UJS*Q#u>%A7f!YgA=RCwHf|gc2(-hS{cc5z6qrieJVfI7?p%$gD&NBAh zdCVEZ51AIBoQSU)2FnCTGo)Lt2hBT0JUuGjcs@pRAOqqQ9Fdd>!J<+e;v*_E%YjJw zOkf@;4`Tc>hQm)Fi`F#saioHZdC_4sCz_DRLqE{gEYM3i8^=~b1%7G<O|82|(I!hg!A+dvc{FfQ9)jK%XPh_lRKz+- z7x`voVQO5Idfx6$>B{>}b>jwsczE4xJY`?ID>*m5Qh{dWNp0%`NC(OO+WVh?jiG~a zu&)erg69-Sv1<;O;#HDuCE(dj&6_P+D}B<50-L^Q!YM1iB2@-uAlGtn>gQkG!&yq~ zw!N;S%fRe^ugy-cjiy?ypWVH!T~+(wpXK0>Pb<69xa~!#EauSi@tDBLWHa01757&x z-U1&v8ANlZ*U3$hEHqQ#y1SBMSx1|Hkk%;(QrHK!jzefPsy_78eks_hk`@(;q!Ss} zIfh=~KUp3B!@IsoFNgW1ba-O~(w4hE3ZC2Mex~(1X`3#93FlkK|t=y6cG^FGq zWJ(wFh*JQULPgEmVv0-}X@jm~YB%h`~Q$uQfme39! z+X479@&F~LvQ6OQVvxM1w>+fg70d+V%pKuF z6D6}yyp+mgM70bk?+5}th^+m=gSpbn8Px%Yi>Au+pu8KDKNMoB6H!M(H#RgLQU&hs zZ$|&3{2T9E4GWn|mB6<6T%lrxXuDUkhaT^A=ekz?{-%eQWLhq+*49gxJO^F*-`wUW z4cG=);8?f5-|3o{KYv;~+cO(mEGU)28aK?ofkbZwb6(D8ymXI?fNn=SIMK0)j71I% zVl-!5TydHqX;KXD4TxC)7Blk4xpVC3xAB5xw-ugEUGbX5Z{^%z2`4>zOXeSmY(hEGZnbbGM&%0GVVJf?fh5 z1p9Qrv*?5hj!@y6tg{e+#(K;#?mB!(u1?iBFn~t^hq50Sx+9-Y(9)%a1RQGxL{glq zs%!Fx6iUT+>%Zi__UULOrf}1=3uFK(*wP|)q!$GohxtKZ5L+EpGTB1(GU8^b6mx&M zpPT65;-D~&x!@jYAD9FXT7wIaZ^BZ0AFBFV@b8lc5TEq;3;{Yc{x*y71e2yxN?9qD zu52?GCZ)hZB`-b^hc&0QWX$4?(^ONDrZdnWZ;j3`u3ZZ1dw{d3@lGM@{ZJYyU{B>M zYqt~_A&mqSNo@2`WNs2lAyvpL6j3Ptqr#77(At4`s_6|Q(4A6bUcggyS1tYA>PlLc zEVP=ZREm;o@+Mm5qZn&~U^w0Vli{#gp^S9tGN;J|>X?V6oiih8xLwZw2+lDu1$pB=3)k^=o@w4XhRx5wbwSx(* zfo&%aJ*&F99$m)^EV&xI9`*Cl=Nka%PYBTv>3N=lO@&%rle_7)t8xI4zoi_|VwwOf zw#XI3c_@>~I7wTq4#|1`ol>X^^&&#<1=r{4dyRyvNt~4iKeWK>PFLArfg>}EJc_Xk4L}D7ISHQD z9&)1}9IU8kVWmd*rC5y7(PHW$A&`P_fW&MLS{Y>$2OQP56yGW#%M>jGgd){wJacn&n&sPbsWNnL~qKUOs`&0P2#9s{)O&hYUO{dz#*hrH)Km z<*sf1;7qWKdDH#jGCL&4pzJ;V=J^`V^WTD>G04C0fd?eg?C!W2i6uG zYC+W$KyEhCfT}2kVo?q?e*T`l&uwid(vRLO*!WI~sOthKs{zPTq;?>k#$Np^SG9P? ztIZ$+%#S#HsUd46y^flwq#kdTNp0oEbQ*>hy`|6T5><8i#Q#B#Ec6AThVJlJ&8pBWpyc3nQ8~xhzlr+VT;LT&C-!lN1McjO9UN=ygc|~nL zBQoa;`=+UpV+&=r#=uMQ#Nz>aCc+hO1nar>L{=FMC=UhPak~7HIvtPxor&6kqW2kV z{X1ZGNL`{Jgu3WZ=6#In$bP$cQ+$?lM%uVMcU(W|1q&Vw+JziAtmM(YQ$S~ksD=Xo z%(M8TKmfzL@~CKDARhfSEd9q<-?EtWfp7QdGp$FfXVa6kKlSskv1#Dt{+DFi_ehN)J(MXYWH zIuwYQO48B0Sn@K;=^E^azvI9ZT0-bbFWL^Jr@hAUjq05u_Y@fT3rQF zpbbj+9+DCO5tKsmlR;q*hKrozZGyCfc+PSGCTy4Ozm(N&Ig&RaYiA_wVnU~U zb|RLKDt-=vTAkD>FUlaOl?S2(M9<-2TUN59RIzwnFE6i%rOO4a?e(q@gmG^^=>&WV zCpcQ#N686M!ol1Hv4N(+!tfcC4K|MCq4hL8@wD=Zx-#>%zmPnLe`Q*T*3Bz4%F0ig zblC}%abybLs7FOBZNbb$T=Dg$oKg=hpWF5O&$(K7M8m??x0jv`18!|Y{gBLRqH_D? z=UnmZ+dKdnQ@e)?b;yG?_vC9Av&LCPPc9~T12P-kOL;^wJSiquB60P~ zP$3Uza;1b`sRgnL+tQZM)~{UjDt9VSQ|`keVEx+mw(zT@M)T5_0Iy^|lvP-h66=w? zp1C-1$n-CGvc5I=t&$5z8~Z9C&+-_~v)U6-^gcX=I}$>{F5{(QPM5aj{N?(sQ6>o4 zq)F?0RjDLsejSOG3Zbme0bu(+dI2+aR)L> zX?>^!y~g0lh?5qx_Vx0GEio<_V>VBzlE<)Ev^fkrm|IZgd{$Sq2*KWUWHwX_-;lm9 zEd)L{7Gfy64+@WlDs%LMZt~KUQUrU5!+>)+>$Sf`)* z@5m#3d2=RsL9w?wQ8AIE74zx&oD!3QHAXHB;BE$EtU6vXR>6|}bsSKV+raQ%u`3pT zhF0te@Mr1)fhd*m)w{))bSY=fiMWNi3fyL?`UyG&R8~fKjwCo^H$|1R(v~}Q9Ad&JJ((BpA-eQeoA?A zZo?IQh8Jk+@3=p~QVXYu{-SAG%&e18o}G9&Ljag5+hw$#a!M z664e2-keFT&(gTr$ReS5{1$0t^yi>>6_RE3sbd|j-;hm3EHN1X}_TOx=^b_UI zCYR-2r@I;mAH|6?ymIErNimJeec)Wln>UQRyBZHPEm*$>ZHoUz%Pve+0E>KV;-aAc z?!}l*)+caTc;rT(HE)6^iC5$ty zUGC`;rs8v?wV|EIMq*_wowO7eQjy2AEL=(<66N`c(Pg?&GPu1Z?&h@3h;4~f_S0M{0uLV%t)|45QVu8s; zqzr{=c%Oy>=By;&wP(b>D3H6XFGD^jcgmt%_(aa5XbA?Z}q8qZ9+06;&yrRGJ_lHka}E!M%~rhb9pO-{83POCmzwYj^-@2+2#J{ELc ze%obye-}Y&7#%Vo`*Y&Y*#Lq1zRNT*Re@=7z1ok1Gnr4}f`)=LzR+Y<cBbyTrqq*CfuD;jQ#N`gJUvy*Qh{GKtnxwaHrf&|BG-why@J3Sx( zvRoTqKhgXCIs?4r>PT}*INB6`SNyMmg%}4D4YS?-#i3Yg&f>qJsItO1>g2Bg6U$a7 z#mIX?mNN-aS?6gnNcl(dk?MaN+fuVtH$s)$QZsL0u={^P3D>;E_X|B#JC+4~Qb1?; zgvv*uN#E&htv~JOZ0*2N#bfx41e}2Na+nT^@*S*f-)nsFg~laUq>iASO_&tTss@8T zl`2A8yjY*ImCoT^YjNHOAhbLrsGOA?`}LXRjrgM!T)W3|-UVR0FRb0=;$DI4Ht|+o+p+3IWq24_+5n0#k+c*fP zSj=QKTS5p%bk<$=`}-bUw+i}&&vx|s5Y295Tl!N0ktJ8FZ#$b!p~riegD|y=fW=E> z$(rKH&P4Qhet0aTjE|cH=e1Wkh7M?~G4KPd{D>ZER~f^7SI6gP{Px3vUgI~*zC7v^ zJAvZqNBx=G;=V!lFLWmbM}8tLHj(F0xO_E_`ROjDufCJoecX|Vf>vHq9tTRe;iz1{QrY19z77_OC5}&ij{Z zw%eQ?f|yll(+#aR+*9A_!+uY?fR%z0U*uqKua2tPr!NT4+g3Kti;Ut{I0AGJIwHx; ziMhrR{|s1S;j_6s0qjK@7Hj4W*Sgi^_3LE?Qdjli1>uAq5QqgCfT>%TK?}JyO_}g6 zaMc=W?~N{2I~SmIGlmWvx?O+Aym!D(uGQUJ@@9pQw0#7SU%&QOg=NwddygSrg!fpC z&GEwAT`mt#&arrN0Eiwpc;@&FKF!R1E%kva76bz{ADn=8>zLZyWN2&Cn=xSo82Vk-p0|05WyST>430Ya^RBNq*DKT9 z>EGKMd+6tdOFK-o`^hn*a8>VL??)h*rHwltS(W@g-k^Ae4XNBa4>surl-(J-hen&E zxy+sAy{jDEDe}lGa`*imkKe8e@fU9hOf|Tb`s%58sXw~d@0S;hH8L5%J?NfKJCS{z z$P~<4*CMr6S<#M^XJ4r4+b99jHB zA|e+yuTkzL;0D?1J)fa;?z{*u{pxS^16z;u)p@043l_L_t*h+QD^#pg}#y_l+lL+ubw^OFx3xLD6vq z%FeYXqa^{=XN>bTqv6%OB0QEi`8`!dg346Lx+AvCDvZ{Xq1_!bH{SF$REcmoygWk@b(kkRB)KjWe{0#!I_y(F>@MF`Lo<^=;aLnKd+4S zme_M~!-Y!|x7OO&gw17?(2fFUyio7d@s;r^ax`^)rJ<~i?m|?E^>c*w9g4hj|37ls zCR0CP!knLsk*zkOM&|sltYD)n(q{NcVD(-X2BO!;rfsbO8`bja0_>Jfn^$G_woJSu zUhZ_Lg}FcdmMblY+g^Xp)#)n_kG?XFVg3G5I~(Qdn>*!adkCSPsk|3(Pjq5ozBDl92Gb&p>N*+X3G{C_URUr=faGX*Zqak^=e*MQ=Ui`HdO1iPADb??7$kx5x8@(>P zZc$765hCvcEJMSbNCu(Ytjzt+R&c`g~ zT?c!>6-j8WmMrM8b>t%Y`e!^f4+gu8WnH=}154TyTNrszLA5%}-n?FcZ`fNkHnE(okcr$4*ac{3x(Mu)I9J& zHQvnk-S0(*x4SWQ79XoHMjMm6I+`i^3tLGIf;EOPDlFZU>WzVMOpTFDUxlDJZ7M0 z!e)H<)>#P=R=Z?mjPCr=IM<;1o6ZRaW~#ZB;J+Yrv)Ub#)UP>wXSbB0$_8D?h()c5P%qP-1Xz-Ty zB|H~{ruD5^D^Yee=p#$7yWqXi)f3(KoLe?ycdYq2{L(C?SK`boXU2P$yC^IcF|v5f zY!S9&tR<*}3Kb_VrBQh?ivGd`ouyjF`9Anh`Yh z><3|-9ij1?)=y8gSa<7hCAtcX-Q+2xC&U>7*g_=&@20$<02H;AlYq*qUtquWt_kh5 zdAvUV?^58mvHj1LO$+eVxcc9bFEX2vaaCq}K22TeeYw4EzUb>U8o-?y>S;6Ip^&JKPnPZ(t+Jt#I?H*~0Oq41Ts%r~b+6?0^SR^>?N<+LzTxskVXyU-I~ed~ z5oLEwY+pIduK?8T^;|@1Z@cb{Sj@eYXFOY0&C){LnHIM|!_IJTwucA~4Qa;JW$E@!dOm>xJXXA2_Eh5pjhAsp3h(aW+@Q_!MCp+M%=tC|km9S+TqR+jECi!$HQXM;`Myi2CcXk zhW1iF?|#3zv)+#e@ff4kJ?Tp8e8ufe(Ovyc#e6)aQnqn~A{z&0Chw@2mQJfP==7^x zb7R1V(IGY9T|kZk(>h5m!GaWMD#wxZ%&hH9pk%=<6}!sz1tuyME4yuc<{Ey;x*T_U z-Ns;eW5lU|BNS-l_Ds?nvCAO07|LT&e7EOEgzRkdkhJ*+qlY)Hzg2S59cKx!}=dCSt9-@aPDd|I(LyxBWukFvG>*=fhOr@ z<}@rJ#|OKB{H>aJUra#5Fx~o#MWJX)ewJ>I#}@qOU9Tyw5|XKp-4uS?@K-6Dwf)u2 zQ;8QAdqw~M0C86zgY%v6SN&Podn!+!E*j zs?GwRdtt#p%DBbN6R#!6(aHZ7<*;f#K$u+A~Jb5Zm=B zz{y-nVV9^-b9CA5(Zq?**z2+?BrFSu*NNt)zG8!+SlDVtJ_A;$+ zd3bl-bp{ofGGnqK0g;L3T_Kz_*Q%SVa-k8@{}w1q#I;%a=~^lH+6+J>RLml2Rr6p1 zl_Nm{`LH~oCcQ5UAO}=xSgrrk>mMnnK2Ih!-s!?Q_fG1gxya~8?|A#TX8N2{D|vYx z*R+kUpnDd8!{=Ej_K|lc`Gs??+YLO#GGTo-Wj0vsPU-A@J&>P`d3QT4bZak`M|qi; zH8S(7yBRhM{(BPuxEi&NS}a|$SG;c7N@MZKT08vLM6By*u|9d5UpP#gfb29iE>a&+GedYugi(qrCGJpaL@M z&eqw+;&_xp@`#>yc_K}%!JK&u+|D+nbd9~x&s5e|UMbf;)dSmbpCLr})S~k+xeI1; z@iJ&)KviOFuFCDLYj{YuWeFRgz>Tu`CqJyU(s;(D)FtR<3a4~&=68>;pB1+1$x@3) z!XOVsD%`ve*X>xh9U9rMx=)@1;BhRr!<{bkob(lhYcS7pTRU)H;-#j*@f3Py;<9PUb+;1yCelRkF+;tZ0eh` zWPQyNm+!wDGPy8tdDBsqCcSjMc0W!G?LJ9RKKW~HyO)$zE1&6$ms?7xSrba6u4-_P znx372za}!>nPK0e)pHjlZKhvIJ z9iMCJ99`eUOMpA(8457iM#=`{8z9lMK$f3%9~Z%Xc+`HqMw{zCp&k}bjO%FTiZC|MaulHMOc0T#X72;&%HidnKjF>TXcG1AyXo=E7UFAT-M@d7Kk$#ZmW)$ZFrZ?c1x8OQ&zU{|vseUj zSvilh)e^D$beeQ_-}$RqX@me6tV+<>lz_ z?t)<#PUXEQERID87%kllLwLrlkZ051%&~Rloo`+Sk0qJXNuMMD89IyBIOorr5Yf+< zz-j-z6m}P+fM1+sJKtWs8r%IgtSoLS|HUv`6o0nJrmVS4o04Y^k#UZbx5ytx05~$n zYM0!UiucP_cucE&lCj}O9=o?*pHrUqf9AC$bl%X%F*Y9SytB%>OIiNA_rVxZ!d7^VVwKI0j90yCVka6?tZ4on$d7-}li{^sdzP*05tKW;EP&dm)UTcPsWGcf zos~e|%MEO$mt)M11W^FslbfS-6d`s_@SDG4AODiv-vpWYgsRmAz0Z6&K~z)LgJ5|; zU8v;Gd~XBLi#4&;Riw6;R4B8DAfUBG{dcn^GV>OyjWBo`fRGW5nl>Z9G-z5h zp#hc2gw4}t`EU1FFwwhHsT+&*I^E#;gm}xf`YWo7-o95Ku2$y%G&dm8>NM^f zKb}gELV|?LZz!{yqRxQWD&C9PyMGVd&tofNw@*A^)05L*PncaO!j{D{7bhXvtHxw|ss8HV9R`w}?v?bCW4 zV=yl#K2KgYqcyQ!_W;wczcwMRF|ALwker7hQ3;qGDs15bO`P1R>7GCczNP-cl`e}+ z>0Nf9&MDA2B&ftx{yxoM#}iTnm(arJ1S4_MPfh?gwI4x>0VHqEm4iI!4J&~(Klz#Z#c(UJ zfiiy*NCu!8fP2czxJCYDMq#W*ajZ+a+wzA(O*uQ{W=hjjpQo6sAH66h#~cqD=` z45#yr+Zyfw@tw9A4QSp@#y!QK&=-GPa^-(Bt+lKx!0M9vS z53L|ie01cuOW#B+mqd6xGc!X{v_^A(*11sQ7a2R3$6jyeRi9ycgYK=$E3Zvt?S#%- zROD%icgt0tPXb2;*wzuSehVxUW3^&Et#A5riTz(vkUuv^>Y}RvoOk!M_ zEea0fR;T#u#mDa$-t6+!ui*vQ7nqx; zl25~Bp0Lc=j#zBEh`e$_W4@G@rsdIdEc@sB__0tj{kO~^RL6kJbZv|8e^wkY6rAF$ zwGe?OT>E}`r~7@`f>qI}Wt?e&3qZuFX(kKSO#W#o&MzPk&01`68wbwlXtbXSKSz+g z&PsI)d1bY~%*%H|rEi<;?dASm@#HvSi=N_thICnXs@~bu7q=w;rMt1!3ApG5tIu}# zc#KK?y^igX^|L!?gQDeqNw0*~l4)(}g)Qv(faKl>$eY*xuOWc7hu8l5((i{Um&^MC zM3$0VT9>qx0_fss)3qVL0reU};Ia>{C#)ZvC zC0eAFQ|;LHvwF~k5zV~#p$dAyHPZE9G`|W{zs+h|-h11>$E+2o-B?3Fi)C33d{_M) z`_k7EyH!1owC-E;R07sU5;&^pwc;!Es(D8?#(lAUMBHiJ3&x)c0AGd zqd&NQj!?fFzu>&u3?M6BKqbQYWWVUcBN(^VMuxDqyd3B|;VAJ^;}Q7g?Sr=t$4(?w zeN`B#9Pszo&-Jw2uZ_FUvg_4nKVjA?iuO?SR89_{^>Zgz_dL9xd#N<>uMYqmOh)h~ zu3u-^yR+ked0*aus7-q%0WH*$_d;Zqz;T`Ib-R#Sl0b_^8;hh2h6x>^x*QrYeG!C! z)Wl8VNn_y84cW9-aFu*|u3EYwuUTTmV*#xq+iwOgJu75O#_x>w|0 z9Xc5<`#}TXjZ4H9UTT#}z440akh2x&@;k51xjDAIe?6b3$&g2i zp!VqyZ)e|X9n)@U>zRd+UN}yA|E&MM`vE(+?O`c}5^@V1l#I7>&p-NlNhVsC5guI8 z(ipKAJ7&MB&f+p`q37ZiN+HxH@~2t!?dJ z@5@DI8{?&pWTb}}Lx9p}=HDzdb0krfZ}O-q+muY@XWYG(KsU$cfU7V`gwTSV{cQ)_ zM^liMlaOZ+5SV8i6jJUgOhjnVWX(cTGRM8|LgVZpd!3h1dJ%IT^zI>(ulBjv!J}_K z`};S=*j(Vym^2tTodm5KWdi{vqspzD{dmikIU=)Dt{Go`IT$+828!&r7scyrfwmJ_573Jn~cA%xBEH; zKeONXtiymFUyD%d=WSX|Aple?^z%CYISCs-3j{pqPm97($h5Q1hqgSngq7CJTM6q# ze3H*$2&G@$f61Ht?-2z|2 z0il2#4$J~vi_16xd+N}f3jvB6%Y^$0KcC^AK0xHzCEn*-J|=H;<9p|f?V1wy+n{@f z%i`e|K%E67Q+7;-6ek*w0F&=Y@HqjvDpqit>?6hA=i8;+MVRIt$lu!f%u>pvMaz9y zSn?%{SWPvs($wdJr#wKnBQ4jSjxZZ-*2l)A z7Yf_PVI+>Wu>D0ozxKi=E`@7M8Lix(?1(eI`z=uNS+_LDQoU?lfRTT2S(Fd1D&*TN z2rl$xe{4MxRw&Md}ecDX;dHfj#F#Yi;KER**Xk*&{SJUU4)`^sDjm-S2KI{hrmZvr-y|I#fu zj{R*5u697EAuI=QCPR4&56o|V91)xy9 zR`iK|`%gXfXcWI}j7kU!_?-gq4Q=jyN``xd^Y*rDf$HCE^xWC{*S{`fZQbv~QBQKZ z@YXqR?`q=sWg188kMBtvto=Q4BL=X{(j9o~cRzTaIWzcoC3e@wgX#CSPKFX|wS-=5 zap?)JclR;xWh5V`15UeO-=k-vhV+n z>$O!LJhhJ539w+=k?}D75szq<_R-~C?9uIdSp#-^dl;`N-ha&XCQ13i`qu`~7azw8 z?mp85e)ILxioU<|l{x^w{zVIH&H}5rGSl`1q&l?0L+CZw>CVj~8?aR5<=W5R#=dcA zQ`E~#$}N0sO0a|5d*W_?s@d_FB`(`aP{}zUMb<4$KTr8zilyv=8pX`ltuDLTpddg! zclZ0-I@X?jkvCskRz2Iq+wa{if8E0NlJbA)N-O#e>q%eAs_F8E029iCzSA8DM>-9O; zU6?7CHf|}p+;eH~R}jIKP}&=o5^lLgeBU~5J$L2(oI*pc@!a1J)Os(+0n+z3oW{_R3ZJ8?un(O-+WMdnN4}y<8ni_i_B&89QQj<60yGSB`qE zzppCLjb1O_ZwoixB;DP8_;Onv1imzqpCi+L?hcQY=O2lKou~AUo(E9jjk}#F{aOUj zmj44Emw9&R2;BoZJOyUq+ZqSu#K`&<3U7e!=W)}AyU~2kRp9omck^8hq}81H&7B*M zP!?aoRLQ0NT4(8Mv{V@`T-OEx)-^}LmNC>-ypUjw;0q3Ti&Gs8hLi~+QBv+G^iE9AZ+xjYfplpRle9&wiZ81x1hwCCHhPB-7z+jv8N%PSE+ z0b^>gxdkJS_U|&*YT&wuEf3@x&racy+c@v*ZmeV3 zgIBd51{dq~g#ooTAK#`O2&VBJPtjkG>>KC2_Lz7k>>0vX8l>z(YmdV`&DslEOCAcNx9aFFKNOubeFZ&S_#=X7>8MAtas>{t@DKUHa_9gt1Q{lbh0l1WX zbpg4-!(*_Bwz8Tb`ZZw*USuCY>nRslVYNOUncrgJML2If!_9Jw(0 zL|NtJ6R-KLq_szUy~^$7E}K9aamK`HC;RA_=mM^ua(1Wj1f~)ayQ!ctH<^q|#=Yz3 zXM4kpy9f|-GAQ$h6)W@=63>7tYUa1*1|N~&I2V47gYRVW^gOj;nc|CH!uXB@-94(7 zBFH!Wwd{h&SFW$*1%=&}!vkO(Oae@ySBte8vFe;z`>9EVli~;Z;BiOkpr`5QMWNPw#oVJ zs61C2d91TqgP&azT{z=fQ?1_F$BTAXW%sWhC2hUCc!!oHAOWUK=6e6KuCm!jJQ=`U zFe>m~*`?liyc27UQ(X*c`x6T3wtD8N(~Z(CNGz-$sEJGP1^>^zvPS2Qb_fx_4Sh z$N!cMZB^vO;kD|PzIF-k^&@3lAD^^E zqo0F&$steFMh`a}!!T!@KqlG(p})p~bfP7V5&$D_G>zqkW~N;PQlwgU)-BpnbV^X0 zXdXC9KWntPOpRy&qnE8Kj>hY#S?pF|Um;pcPGAywY|;D9>u$!gLk@Zin&N8w6@Od) zZk&izMEhmM4+B==mIkalO+cyWHgVus1;czSKVXodzltCCSbuuwoDIkb0EG1Pww{K^ zIWS5LjGV2B={(rVw4Mnb#^Bijp7fg26KKBW()?ZkJ>|#rX8ES^*W^{F2Q)@+0D;fU zw(fkuNBAy$N{y12r(>95_VwR*zycL)d>jH`@tSXayPdy5Su78uxPk2?AZ-Qvr04#> X3p;yk1HU2p00000NkvXXu0mjfa&A$B literal 0 HcmV?d00001 diff --git a/apps/mobile/app/src/main/res/drawable/ic_launcher_background.xml b/apps/mobile/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..aa27cce --- /dev/null +++ b/apps/mobile/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,10 @@ + + + + diff --git a/apps/mobile/app/src/main/res/drawable/ic_launcher_foreground.webp b/apps/mobile/app/src/main/res/drawable/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..d9cd9b2a6fb0e8bf463e573f38b92af126253b7d GIT binary patch literal 4032 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/mobile/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/apps/mobile/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/apps/mobile/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/apps/mobile/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/apps/mobile/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/apps/mobile/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/apps/mobile/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..80d672c476637cba3cf9939bf714b57feef15850 GIT binary patch literal 688 zcmV;h0#E%?Nk&Gf0ssJ4MM6+kP&go*0ssK84gj42Do6lG06uLrmPn)`q9G&oS}=eO zi9i|ewA0YkuWd8GAHPfR7W5?@Ho27tG=&)wn^btMo^j_z&IbBKz*Fy_%PJw3O`qhF z0W(Nrx0{`jX5P|u+A@i4wYzo+Zu8Xs1k<<*wi>~Z3%+|?_l}=Q>ou<63;!J;0092} z65f#>mEm5t9#hI6m3q9&R-v1N%~fvx2$nk*#R?RnV*nbv{u7emZl^Txh8GpS3g_87 zfqSvnFMM)d=(zm&wuHp`6ECrS6tT3?o)hV4LCEkQ-%@j}OVn$P14LV7E06i4K~al( zFRQGj1`@aOr|)dwNhRIP^0hGjowW3GE7$tw@n!%@o46Ut9$c*oV9-n^E;OYdiu8f< zmpbrAa(h7#A-@`B4wV#77)Ro2!&u4N-0VG0QqfT=IcmK9;TjiId<%L0RP$?&Z~7U) zO_80pZ?^2Tenn_NUBMbk4^nuZTuf>d^|ft4p}3olBxCjz79BPwC|h2s{l~1Z;#Tqq z5#_{$K z$SIagYkGX6dl$*m+$n1yZPPS1Y_Q$qz)stjqCPr2GfOGtq%7{_DsHgu^-F!|#+Zq! zdn04#coSCi;k>;N7ck4ROMiO1jTYs(0I8M|?&k9uh!hXa(*V>(@)-wb-`Eu!>H z>$@z2wh2PEmoCf<6$dDNTIcwtIQ^T%8M;$oI0E_0L=DzUaBe}G*n@528sv!{lvj*EpYa#RXZ4`G;u_?MJ=i8% zkR~p{xdto2GBZ5rPJyeFVRtrYPJ-&JfU^L@09++y(3L=`nx^gTj z{G+Gdj4?2v&(O>C(4ok}=`5rG0RH|H2jFbbIN)imXZSAf)rryTo_I#8M5$tU@e-iR z;9+q3__x3tXRY8Yp+{y+4?$B&{EVv=-cW>q$oDTFfJD!XBC>tOYrvmT4tTB74GJM{ z_NbqqdrU~kW540*;$8|}f=AY(6KebW>nvcmk7BpM%orbMI%)IS{$mk%06`dBXExQw zIfO*MfO^4Gi6dT}F%WZwW0-kuFAM{<71#x|9Q)s11E!tYVb==6M=1xF!@0OBnZHE< z-Co~(iU;Pt#J-WmO9`2K(PynQqzilok84L#hhvxQDcPM+BeYG|xP2;+`V@$A@ z+s#rZwIq;Zc=U1JSYF^sSH9R)M-9vh>@-fKmL}m#Sp#mFp)%T|!Td8Da(dawhWP6d zGG6J$&nX?a_j;wi^mlzxt~==WIt$l?nM=4=+XeHT&*u%f2?4NeRo;M;YPsfp6t16n z_h|Dlh;r06uLplSiZ?p`jy;_<#+G zVgSlBixjF#vhmlb0Y7X{4wC0i%?iKQ%-nqF$Bfl`w2hl&lz1)eemx*PA54;N91r=) zr)OJGKmh*!pKDE}D77@SXzo?+`$lNMBMPp!xA?!6+0>-Ic^sVnr@z>2^P>4&&^M0) znRU-IwK7T6y}UQ|>Bt71VV(>`R`so^*xpkaryLhWgkDA-HYwU(q9}JG(ubod`=HZo zQ^VB(WoLK)qo%s^QOE2Aj19c)Ao^N8F-8XwAlYk{(}3D#J9>cl=z9VHcC{ z0w51TSGwG34mivw=A52ZoV5J@y_Bi!_}R0}jr*}BW>CG#X9u8^&VY#+cZ-3ucfN7< zy)O^>MZu>fuJ7a9Z%=Ge$TOeAYMYyFza?_T`0}SvMr2+g@y3HhcC6~f9vy}K8F*Tx zkX$sv<9eYcKgAO0LvgzhSk4XsJCXfa>nH0aQ0LpvnwM@Ydd0}t{JQY*9x9LpT>{Mf cPN^X_t6hmf^hv0i;>+ttU5Ex%?uF+-01GkKM*si- literal 0 HcmV?d00001 diff --git a/apps/mobile/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/apps/mobile/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..e99005c6db9e28f3595c72797a39fdd0acbfcd57 GIT binary patch literal 570 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 S)MWk@#Mk?nY>LD&0000>SXq() literal 0 HcmV?d00001 diff --git a/apps/mobile/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/apps/mobile/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..5b4af32acc19d886eeda95ed80867b1f41f677da GIT binary patch literal 1646 zcmV-!29fzvNk&Fy1^@t8MM6+kP&go31^@t%9sr#IDv$t>06uLtmq?@|A|WEy*`R<8 ziDLlLX&5~}N{P4&_IC7HxC@?tqN}O{dEfT$(khz=<}xJT&SL=OWJan{pm`^Ku*Cpd zm&?1k&vziM#QVFB6gE#OJwUBd~ zfoE4SF}WI*pfI8W_rcua$MMO_TnuQZaFqa~{!=f=R!wDm0BW+h?!p8TH!vVIeHT{v zAg`#(nt34KcL}pW+W@TeE`{e)DaYjr`v#vKN`b_YK>pT{O8` zDzvM`>;Dg|?*-GorT0J5IgxV!0RH;#?}&tl#q8ntKmbe7wa|sa2doTS2Qw8+{Ltc}f&mK4J^rT=-vtH_--cKKpw1f?o07VsF6v z@h9-era)1al6VwpBXM+)6__h+Mg8|~TEN%BX|eMH$$;LL`(E=~Q)c9`6NR?JSZ-C) zB-&ouhaDE{V!2isC^!{-+bMelNdZo?o8)4027i0*IB8DZ$EObc&xbIg#}l*4RYJL$ zhmcf!`q^YkrmM6YyJq@5Vw9>aM}$N174nyA5_v#0Oh?bj9W>lA-fKPvZ$1Enr7#G_ zwQkGkjpP|FE>}jHbjOPjL`Z!<|GT6;c$EjcszW?|zwu~9^Q`?YekhkcVyw4?&RsJ2 z5y;&7t)_ce|036}T1eUSW>eVSVsJ=pZTh@(_Os=-=_vPDg4`swaL{jK;ozQZY>Z`<6)^?$*bm3#<%&3N%2XnfvV(LpJAxGrhf1f;iPf;nSl$6Js|Wp`;? zyXx1ecg}~MXf4&sy~vwkFijw@nvlW=-`~q+AFJd zKBsRwCUq>|7IYv9Hz*uy&w^3KC-&7Ubr?-yvynK^p0q|OFO2h`(r4L?Ct&yEn*U%6 zeUE^u8LBj`d_x1!-ja0a>-YAqWPCjZHQW&Y%yU8^cZ3m1dnNl_l5}jmk4t!6YA>Uc zku-sm&iaUMA00f7^!3>8fIHkH$v>U54tJm)zoRn-9TW@pudw$E7Flm;@!vWwYr;33 zI^K4JP!heVT}l)4S~GH~uwbZG3?X80F5CaJ^PMI3&pKUtGgGw8CUoph{R$W(?XfS` z^2dw&Xu9E<29IQnPK*tnaGP1Y`H?glu+lp*tzWV9l{qK)@ezAso;n!lw;$ZDp_lV5 z4-#QnjKe5vi8mC}Yq?J*H@MdOQ*4&+FArZeUvZ~Gi>!GbY>{{Re(cU6JV*rE=ieFI zU`V->#->o{`*=@K85J|RI*{gE#6QJ zD!)GN&*qH8Vu(03Z|D!1K2h|{aM_+>6VZ3Y3e18-T9VXn1Krya$iwJEg{?QsHqZs; zkMMZhQcYIC$v)NVYO-Gp$qN7S<@*#U&{vax_}>b9Bvgr=@Px4Ww{TdxqiVE4cdaR6 zI5~;T1-BC>3oU(+zrMv-=Xt5AoM$mAsmqhDFIf%f$w}mRJVC_&20e#qL}4Sn?F)GR z!e9h5&lu_mJU#wZDJ>0IH%j&j0`b literal 0 HcmV?d00001 diff --git a/apps/mobile/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/apps/mobile/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..372ee26a5b09565ee83a476df7a2775387563148 GIT binary patch literal 1980 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/apps/mobile/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..76504ad42d600f8935e62a14dd41a967185a3662 GIT binary patch literal 2730 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 + XFlow + diff --git a/apps/mobile/app/src/main/res/values/themes.xml b/apps/mobile/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..1d5b954 --- /dev/null +++ b/apps/mobile/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +