From de9dd05308d0c1638bd09001eb4c811f73356892 Mon Sep 17 00:00:00 2001 From: jeezft Date: Tue, 23 Jun 2026 12:04:01 +0300 Subject: [PATCH] Track client and server sources Co-authored-by: Cursor --- messenger-client | 1 - messenger-client/.gitignore | 27 + messenger-client/LICENSE | 201 + messenger-client/app/build.gradle.kts | 142 + messenger-client/app/proguard-rules.pro | 27 + .../app/src/main/AndroidManifest.xml | 76 + .../app/src/main/assets/folder_closed.json | 1 + .../app/src/main/assets/folders.json | 1 + .../app/src/main/assets/key_gold.json | 1 + .../app/src/main/assets/key_iron.json | 1 + .../app/src/main/assets/key_lock.json | 1 + .../app/src/main/assets/phone_apple.json | 1 + .../app/src/main/assets/search_out.json | 1 + .../com/aiwazian/messenger/Application.kt | 15 + .../com/aiwazian/messenger/LoginActivity.kt | 25 + .../com/aiwazian/messenger/MainActivity.kt | 190 + .../aiwazian/messenger/api/AuthInterceptor.kt | 42 + .../messenger/api/ProgressInterceptor.kt | 25 + .../messenger/api/RetrofitInstance.kt | 85 + .../aiwazian/messenger/data/ApiResponse.kt | 14 + .../com/aiwazian/messenger/data/Attachment.kt | 34 + .../aiwazian/messenger/data/AuthRequest.kt | 12 + .../aiwazian/messenger/data/AuthResponse.kt | 9 + .../data/ChangeCloudPasswordRequest.kt | 5 + .../aiwazian/messenger/data/ChannelInfo.kt | 30 + .../com/aiwazian/messenger/data/ChatInfo.kt | 16 + .../aiwazian/messenger/data/CustomColors.kt | 16 + .../messenger/data/DeleteChatPayload.kt | 8 + .../messenger/data/DeleteMessagePayload.kt | 9 + .../aiwazian/messenger/data/DownloadItem.kt | 15 + .../messenger/data/DropdownMenuAction.kt | 9 + .../com/aiwazian/messenger/data/FolderInfo.kt | 10 + .../com/aiwazian/messenger/data/GroupInfo.kt | 20 + .../messenger/data/HistoryClearPayload.kt | 8 + .../com/aiwazian/messenger/data/Kanban.kt | 60 + .../aiwazian/messenger/data/LocalAccount.kt | 3 + .../messenger/data/LoginAvailability.kt | 8 + .../com/aiwazian/messenger/data/Message.kt | 58 + .../aiwazian/messenger/data/NavigationIcon.kt | 8 + .../aiwazian/messenger/data/Notification.kt | 7 + .../messenger/data/NotificationChannelInfo.kt | 7 + .../data/NotificationTokenRequest.kt | 8 + .../messenger/data/PrivacySettings.kt | 13 + .../messenger/data/ReadMessagePayload.kt | 9 + .../messenger/data/RegisterRequest.kt | 11 + .../aiwazian/messenger/data/ScreenEntry.kt | 8 + .../com/aiwazian/messenger/data/SearchInfo.kt | 10 + .../aiwazian/messenger/data/SessionInfo.kt | 12 + .../aiwazian/messenger/data/TopBarAction.kt | 9 + .../com/aiwazian/messenger/data/UserInfo.kt | 29 + .../messenger/data/WebSocketMessage.kt | 13 + .../messenger/database/AppDatabase.kt | 40 + .../messenger/database/DatabaseModule.kt | 67 + .../messenger/database/dao/AccountDao.kt | 23 + .../messenger/database/dao/ChannelDao.kt | 28 + .../messenger/database/dao/ChatDao.kt | 18 + .../messenger/database/dao/FolderChatDao.kt | 33 + .../messenger/database/dao/FolderDao.kt | 23 + .../messenger/database/dao/GroupDao.kt | 27 + .../messenger/database/dao/UserDao.kt | 20 + .../database/entity/AccountEntity.kt | 7 + .../database/entity/AttachmentEntity.kt | 13 + .../database/entity/ChannelEntity.kt | 17 + .../database/entity/FolderChatEntity.kt | 13 + .../messenger/database/entity/FolderEntity.kt | 10 + .../messenger/database/entity/GroupEntity.kt | 13 + .../database/entity/MessageEntity.kt | 14 + .../messenger/database/entity/UserEntity.kt | 14 + .../database/mappers/AccountMappers.kt | 18 + .../database/mappers/AttachmentMappers.kt | 24 + .../database/mappers/ChannelMappers.kt | 32 + .../database/mappers/FolderChatMappers.kt | 26 + .../database/mappers/FolderMappers.kt | 17 + .../database/mappers/GroupMappers.kt | 24 + .../database/mappers/MessageMappers.kt | 26 + .../messenger/database/mappers/UserMappers.kt | 26 + .../database/repository/AccountRepository.kt | 12 + .../database/repository/ChannelRepository.kt | 179 + .../database/repository/ChatRepository.kt | 166 + .../database/repository/FolderRepository.kt | 110 + .../database/repository/GroupRepository.kt | 78 + .../database/repository/UserRepository.kt | 88 + .../aiwazian/messenger/enums/ChannelType.kt | 12 + .../com/aiwazian/messenger/enums/ChatType.kt | 26 + .../messenger/enums/DownloadStatus.kt | 7 + .../com/aiwazian/messenger/enums/FileType.kt | 48 + .../messenger/enums/PrimaryColorOption.kt | 20 + .../aiwazian/messenger/enums/PrivacyLevel.kt | 12 + .../aiwazian/messenger/enums/ThemeOption.kt | 18 + .../messenger/enums/WebSocketAction.kt | 29 + .../messenger/interfaces/ApiService.kt | 311 + .../interfaces/NotificationService.kt | 10 + .../aiwazian/messenger/interfaces/Profile.kt | 8 + .../messenger/interfaces/QrCodeService.kt | 5 + .../messenger/services/AppLockService.kt | 64 + .../messenger/services/AuthService.kt | 34 + .../messenger/services/ChannelService.kt | 60 + .../messenger/services/ChatService.kt | 135 + .../messenger/services/ClipboardHelper.kt | 16 + .../messenger/services/DataStoreManager.kt | 126 + .../messenger/services/DeviceHelper.kt | 22 + .../messenger/services/DialogController.kt | 19 + .../messenger/services/FolderService.kt | 26 + .../messenger/services/GroupService.kt | 56 + .../messenger/services/NotificationService.kt | 201 + .../messenger/services/PrivacyService.kt | 13 + .../messenger/services/QrCodeService.kt | 43 + .../messenger/services/SearchService.kt | 13 + .../messenger/services/SessionService.kt | 28 + .../messenger/services/ThemeService.kt | 62 + .../messenger/services/TokenManager.kt | 46 + .../messenger/services/UserManager.kt | 32 + .../messenger/services/UserService.kt | 40 + .../messenger/services/VibrateService.kt | 23 + .../com/aiwazian/messenger/types/EntityId.kt | 3 + .../aiwazian/messenger/ui/ArchiveScreen.kt | 185 + .../com/aiwazian/messenger/ui/ChatScreen.kt | 1396 ++ .../com/aiwazian/messenger/ui/KanbanScreen.kt | 188 + .../com/aiwazian/messenger/ui/LockScreen.kt | 97 + .../com/aiwazian/messenger/ui/LogoutScreen.kt | 154 + .../com/aiwazian/messenger/ui/MainScreen.kt | 875 + .../aiwazian/messenger/ui/NewMessageScreen.kt | 76 + .../aiwazian/messenger/ui/ProfileScreen.kt | 526 + .../com/aiwazian/messenger/ui/QRCodeScreen.kt | 116 + .../com/aiwazian/messenger/ui/QrCodeScaner.kt | 8 + .../com/aiwazian/messenger/ui/SearchScreen.kt | 232 + .../ui/channel/ChannelBlackListScreen.kt | 40 + .../ui/channel/ChannelInviteLinksScreen.kt | 53 + .../ui/channel/ChannelSettingsScreen.kt | 187 + .../ui/channel/ChannelSubscribersScreen.kt | 79 + .../ui/channel/ChannelTypeSettingsScreen.kt | 336 + .../ui/channel/CreateChannelScreen.kt | 195 + .../ui/element/AnimatedIntroSection.kt | 82 + .../aiwazian/messenger/ui/element/ChatCard.kt | 211 + .../messenger/ui/element/CodeBlocks.kt | 125 + .../messenger/ui/element/CustomDialog.kt | 76 + .../messenger/ui/element/CustomNumberBoard.kt | 106 + .../messenger/ui/element/CustomSwitch.kt | 18 + .../messenger/ui/element/InputField.kt | 35 + .../messenger/ui/element/MessageFile.kt | 144 + .../messenger/ui/element/MinimizeChatCard.kt | 77 + .../ui/element/NavigationController.kt | 148 + .../messenger/ui/element/PageTopBar.kt | 74 + .../ui/element/SectionCkeckBoxItem.kt | 55 + .../messenger/ui/element/SectionContainer.kt | 24 + .../ui/element/SectionDescription.kt | 20 + .../messenger/ui/element/SectionHeader.kt | 31 + .../messenger/ui/element/SectionItem.kt | 96 + .../messenger/ui/element/SectionRadioItem.kt | 69 + .../messenger/ui/element/SectionToggleItem.kt | 80 + .../messenger/ui/element/SwipeableChatCard.kt | 101 + .../messenger/ui/group/AddMemberScreen.kt | 164 + .../messenger/ui/group/CreateGroupScreen.kt | 181 + .../messenger/ui/group/GroupMembersScreen.kt | 199 + .../messenger/ui/group/GroupSettingsScreen.kt | 120 + .../aiwazian/messenger/ui/login/AuthScreen.kt | 72 + .../messenger/ui/login/LoginScreen.kt | 226 + .../messenger/ui/login/PasswordScreen.kt | 286 + .../ui/login/VerificationCodeScreen.kt | 63 + .../settings/SettingsDataAndStorageScreen.kt | 170 + .../settings/SettingsNotificationsScreen.kt | 77 + .../messenger/ui/settings/SettingsScreen.kt | 156 + .../ui/settings/chat/SettingsChatScreen.kt | 296 + .../settings/chat/SettingsDarkThemeScreen.kt | 103 + .../chatFolder/SettingsChatFoldersScreen.kt | 142 + .../chatFolder/SettingsChatInFolderScreen.kt | 147 + .../chatFolder/SettingsFolderScreen.kt | 181 + .../ui/settings/privacy/SettingsBioScreen.kt | 127 + .../privacy/SettingsDateOfBirthScreen.kt | 127 + .../privacy/SettingsLastSeenScreen.kt | 69 + .../settings/privacy/SettingsPrivacyScreen.kt | 166 + .../profile/SettingsProfileColorScreen.kt | 39 + .../settings/profile/SettingsProfileScreen.kt | 245 + .../profile/SettingsUsernameScreen.kt | 129 + .../SettingsChangeCloudPasswordScreen.kt | 135 + .../security/SettingsCloudPasswordSceen.kt | 109 + .../security/SettingsDevicesScreen.kt | 410 + .../security/SettingsPasscodeScreen.kt | 474 + .../security/SettingsSecurityScreen.kt | 123 + .../com/aiwazian/messenger/ui/theme/Theme.kt | 93 + .../com/aiwazian/messenger/utils/ChatState.kt | 18 + .../com/aiwazian/messenger/utils/Constants.kt | 9 + .../messenger/utils/DownloadManager.kt | 9 + .../aiwazian/messenger/utils/Downloader.kt | 136 + .../aiwazian/messenger/utils/FileHelper.kt | 31 + .../messenger/utils/LottieAnimation.kt | 11 + .../utils/NotificationChannelConstants.kt | 11 + .../messenger/utils/ProgressResponseBody.kt | 54 + .../com/aiwazian/messenger/utils/Route.kt | 71 + .../com/aiwazian/messenger/utils/Shape.kt | 15 + .../messenger/utils/ShortcutHelper.kt | 66 + .../messenger/utils/VibrationPattern.kt | 7 + .../messenger/utils/WebSocketManager.kt | 165 + .../messenger/viewModels/ArchiveViewModel.kt | 9 + .../messenger/viewModels/AuthViewModel.kt | 166 + .../messenger/viewModels/ChannelViewModel.kt | 101 + .../messenger/viewModels/ChatViewModel.kt | 722 + .../viewModels/CloudPasswordViewModel.kt | 63 + .../viewModels/DataUsageViewModel.kt | 82 + .../messenger/viewModels/DevicesViewModel.kt | 116 + .../messenger/viewModels/FolderViewModel.kt | 116 + .../messenger/viewModels/GroupViewModel.kt | 43 + .../messenger/viewModels/KanbanViewModel.kt | 47 + .../viewModels/LockScreenViewModel.kt | 49 + .../messenger/viewModels/LogoutViewModel.kt | 38 + .../messenger/viewModels/MainViewModel.kt | 531 + .../viewModels/NavigationViewModel.kt | 80 + .../viewModels/PasscodeLockViewModel.kt | 49 + .../messenger/viewModels/ProfileViewModel.kt | 72 + .../messenger/viewModels/SearchViewModel.kt | 66 + .../viewModels/SettingsBioViewModel.kt | 63 + .../SettingsDateOfBirthViewModel.kt | 63 + .../viewModels/SettingsDesignViewModel.kt | 31 + .../viewModels/SettingsPrivacyViewModel.kt | 57 + .../viewModels/SettingsProfileViewModel.kt | 54 + .../viewModels/SettingsSecurityViewModel.kt | 41 + .../viewModels/SettingsUsernameViewModel.kt | 115 + .../app/src/main/new_app_icon-playstore.png | Bin 0 -> 17828 bytes .../res/drawable/ic_launcher_background.xml | 170 + .../res/drawable/ic_launcher_foreground.xml | 30 + .../res/mipmap-anydpi-v26/new_app_icon.xml | 5 + .../mipmap-anydpi-v26/new_app_icon_round.xml | 5 + .../main/res/mipmap-hdpi/new_app_icon.webp | Bin 0 -> 1014 bytes .../mipmap-hdpi/new_app_icon_foreground.webp | Bin 0 -> 1054 bytes .../res/mipmap-hdpi/new_app_icon_round.webp | Bin 0 -> 2462 bytes .../main/res/mipmap-mdpi/new_app_icon.webp | Bin 0 -> 888 bytes .../mipmap-mdpi/new_app_icon_foreground.webp | Bin 0 -> 692 bytes .../res/mipmap-mdpi/new_app_icon_round.webp | Bin 0 -> 1724 bytes .../main/res/mipmap-xhdpi/new_app_icon.webp | Bin 0 -> 1396 bytes .../mipmap-xhdpi/new_app_icon_foreground.webp | Bin 0 -> 1432 bytes .../res/mipmap-xhdpi/new_app_icon_round.webp | Bin 0 -> 3350 bytes .../main/res/mipmap-xxhdpi/new_app_icon.webp | Bin 0 -> 2610 bytes .../new_app_icon_foreground.webp | Bin 0 -> 2340 bytes .../res/mipmap-xxhdpi/new_app_icon_round.webp | Bin 0 -> 5920 bytes .../main/res/mipmap-xxxhdpi/new_app_icon.webp | Bin 0 -> 3358 bytes .../new_app_icon_foreground.webp | Bin 0 -> 3258 bytes .../mipmap-xxxhdpi/new_app_icon_round.webp | Bin 0 -> 8210 bytes .../res/values/new_app_icon_background.xml | 4 + .../app/src/main/res/values/strings.xml | 118 + .../app/src/main/res/values/themes.xml | 4 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../app/src/main/res/xml/file_paths.xml | 6 + .../main/res/xml/network_security_config.xml | 3 + messenger-client/build.gradle.kts | 9 + messenger-client/gradle.properties | 17 + messenger-client/gradle/libs.versions.toml | 94 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + messenger-client/gradlew | 185 + messenger-client/gradlew.bat | 89 + messenger-client/settings.gradle.kts | 26 + messenger-server | 1 - messenger-server/.env.example | 19 + messenger-server/.prettierrc | 7 + messenger-server/LICENSE.txt | 201 + messenger-server/ecosystem.config.js | 14 + messenger-server/eslint.config.mjs | 35 + messenger-server/nest-cli.json | 8 + messenger-server/package-lock.json | 18054 ++++++++++++++++ messenger-server/package.json | 105 + messenger-server/prisma.config.ts | 12 + .../20260622120000_add_kanban/migration.sql | 44 + messenger-server/prisma/schema.prisma | 355 + messenger-server/public/Messenger.apk | Bin 0 -> 11245128 bytes messenger-server/public/android.html | 226 + messenger-server/public/app-ads.txt | 555 + messenger-server/public/icon.webp | Bin 0 -> 8210 bytes messenger-server/public/index.html | 119 + messenger-server/public/style.css | 310 + messenger-server/src/app.controller.ts | 7 + messenger-server/src/app.module.ts | 62 + messenger-server/src/app.service.ts | 4 + .../src/common/constants/db.constants.ts | 2 + .../src/common/constants/param.constants.ts | 8 + .../common/decorators/omit-null.decorator.ts | 5 + .../src/common/decorators/trim.decorator.ts | 10 + .../common/decorators/user-id.decorator.ts | 9 + .../common/decorators/user-token.decorator.ts | 10 + .../src/common/enums/chat-type.enum.ts | 6 + .../common/filters/all-exceptions.filter.ts | 38 + .../src/common/guards/auth.guard.ts | 47 + .../common/guards/can-delete-message.guard.ts | 61 + .../src/common/guards/can-read-chat.guard.ts | 29 + .../common/guards/can-send-message.guard.ts | 57 + .../src/common/guards/channel-exists.guard.ts | 21 + .../src/common/guards/channel-owner.guard.ts | 21 + .../src/common/guards/group-exists.guard.ts | 21 + .../src/common/guards/group-owner.guard.ts | 21 + .../src/common/guards/privacy.guard.ts | 48 + .../src/common/guards/session-owner.guard.ts | 22 + .../src/common/guards/user-exists.guard.ts | 21 + .../interceptors/big-int.interceptor.ts | 32 + .../src/common/middlewares/auth.middleware.ts | 27 + .../src/common/pipes/parse-channel-id.pipe.ts | 21 + .../src/common/pipes/parse-chat-id.pipe.ts | 21 + .../src/common/pipes/parse-group-id.pipe.ts | 21 + .../src/common/pipes/parse-user-id.pipe.ts | 21 + .../src/common/socket/socket-events.ts | 20 + messenger-server/src/common/types/brand.ts | 1 + .../src/common/types/channel-id.type.ts | 11 + .../src/common/types/chat-id.type.ts | 11 + .../src/common/types/group-id.type.ts | 11 + .../src/common/types/session-id.type.ts | 11 + .../src/common/types/token-payload.type.ts | 5 + .../src/common/types/user-id.type.ts | 11 + .../src/common/utils/detect-chat-type.util.ts | 21 + .../src/common/utils/id-generator.util.ts | 36 + .../src/common/utils/password.util.ts | 14 + messenger-server/src/main.ts | 40 + .../src/modules/auth/auth.controller.ts | 42 + .../src/modules/auth/auth.module.ts | 12 + .../src/modules/auth/auth.service.ts | 99 + .../modules/auth/dto/auth-credentials.dto.ts | 25 + .../src/modules/auth/dto/auth-response.dto.ts | 4 + .../src/modules/auth/dto/check-login.dto.ts | 3 + .../src/modules/auth/dto/signin.dto.ts | 20 + .../src/modules/auth/dto/signup.dto.ts | 17 + .../modules/channels/channels.controller.ts | 96 + .../src/modules/channels/channels.module.ts | 14 + .../src/modules/channels/channels.service.ts | 326 + .../src/modules/channels/dto/channel.dto.ts | 45 + .../channels/dto/create-channel.dto.ts | 29 + .../channels/dto/update-channel.dto.ts | 4 + .../src/modules/chats/chats.controller.ts | 60 + .../src/modules/chats/chats.module.ts | 14 + .../src/modules/chats/chats.service.ts | 614 + .../modules/chats/dto/chat-response.dto.ts | 19 + .../chats/dto/create-invite-link.dto.ts | 17 + .../chats/dto/invite-link-response.dto.ts | 33 + .../src/modules/chats/invite-links.service.ts | 162 + .../modules/groups/dto/create-group.dto.ts | 29 + .../modules/groups/dto/group-response.dto.ts | 38 + .../modules/groups/dto/update-group.dto.ts | 4 + .../src/modules/groups/groups.controller.ts | 117 + .../src/modules/groups/groups.module.ts | 14 + .../src/modules/groups/groups.service.ts | 278 + .../src/modules/kanban/kanban.controller.ts | 51 + .../src/modules/kanban/kanban.module.ts | 12 + .../src/modules/kanban/kanban.service.ts | 188 + .../modules/messages/dto/file-confirm.dto.ts | 10 + .../src/modules/messages/dto/file-init.dto.ts | 12 + .../modules/messages/dto/media-message.dto.ts | 11 + .../messages/dto/message-response.dto.ts | 20 + .../modules/messages/dto/text-message.dto.ts | 18 + .../modules/messages/messages.controller.ts | 127 + .../src/modules/messages/messages.module.ts | 16 + .../src/modules/messages/messages.service.ts | 489 + .../push/providers/firebase-push.provider.ts | 62 + .../src/modules/push/push.module.ts | 16 + .../src/modules/push/push.service.ts | 32 + .../src/modules/push/push.types.ts | 11 + .../src/modules/realtime/realtime.gateway.ts | 263 + .../src/modules/realtime/realtime.module.ts | 12 + .../src/modules/realtime/realtime.service.ts | 4 + .../modules/search/dto/search-query.dto.ts | 9 + .../modules/search/dto/search-response.dto.ts | 14 + .../src/modules/search/search.controller.ts | 21 + .../src/modules/search/search.module.ts | 13 + .../src/modules/search/search.service.ts | 75 + .../src/modules/security/jwt.module.ts | 20 + .../src/modules/security/jwt.service.ts | 55 + .../sessions/dto/create-session.dto.ts | 10 + .../sessions/dto/session-response.dto.ts | 22 + .../modules/sessions/sessions.controller.ts | 30 + .../src/modules/sessions/sessions.module.ts | 13 + .../src/modules/sessions/sessions.service.ts | 114 + .../src/modules/storage/dto/file.dto.ts | 7 + .../modules/storage/dto/init-upload.dto.ts | 4 + .../src/modules/storage/storage.module.ts | 11 + .../src/modules/storage/storage.service.ts | 116 + .../modules/users/dto/change-password.dto.ts | 11 + .../modules/users/dto/privacy-settings.dto.ts | 18 + .../users/dto/update-privacy-settings.dto.ts | 33 + .../src/modules/users/dto/update-user.dto.ts | 34 + .../modules/users/dto/update-username.dto.ts | 12 + .../modules/users/dto/user-response.dto.ts | 28 + .../src/modules/users/users.controller.ts | 77 + .../src/modules/users/users.module.ts | 14 + .../src/modules/users/users.service.ts | 130 + .../src/providers/prisma/prisma.module.ts | 9 + .../src/providers/prisma/prisma.service.ts | 12 + messenger-server/tsconfig.build.json | 4 + messenger-server/tsconfig.json | 19 + 383 files changed, 44782 insertions(+), 2 deletions(-) delete mode 160000 messenger-client create mode 100644 messenger-client/.gitignore create mode 100644 messenger-client/LICENSE create mode 100644 messenger-client/app/build.gradle.kts create mode 100644 messenger-client/app/proguard-rules.pro create mode 100644 messenger-client/app/src/main/AndroidManifest.xml create mode 100644 messenger-client/app/src/main/assets/folder_closed.json create mode 100644 messenger-client/app/src/main/assets/folders.json create mode 100644 messenger-client/app/src/main/assets/key_gold.json create mode 100644 messenger-client/app/src/main/assets/key_iron.json create mode 100644 messenger-client/app/src/main/assets/key_lock.json create mode 100644 messenger-client/app/src/main/assets/phone_apple.json create mode 100644 messenger-client/app/src/main/assets/search_out.json create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/Application.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/LoginActivity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/MainActivity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/api/AuthInterceptor.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/api/ProgressInterceptor.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/api/RetrofitInstance.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/ApiResponse.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/Attachment.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/AuthRequest.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/AuthResponse.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChangeCloudPasswordRequest.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChannelInfo.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChatInfo.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/CustomColors.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/DeleteChatPayload.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/DeleteMessagePayload.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/DownloadItem.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/DropdownMenuAction.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/FolderInfo.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/GroupInfo.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/HistoryClearPayload.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/Kanban.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/LocalAccount.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/LoginAvailability.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/Message.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/NavigationIcon.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/Notification.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/NotificationChannelInfo.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/NotificationTokenRequest.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/PrivacySettings.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/ReadMessagePayload.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/RegisterRequest.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/ScreenEntry.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/SearchInfo.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/SessionInfo.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/TopBarAction.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/UserInfo.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/data/WebSocketMessage.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/AppDatabase.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/DatabaseModule.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/AccountDao.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/ChannelDao.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/ChatDao.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/FolderChatDao.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/FolderDao.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/GroupDao.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/UserDao.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/AccountEntity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/AttachmentEntity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/ChannelEntity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/FolderChatEntity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/FolderEntity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/GroupEntity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/MessageEntity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/UserEntity.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/AccountMappers.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/AttachmentMappers.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/ChannelMappers.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/FolderChatMappers.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/FolderMappers.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/GroupMappers.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/MessageMappers.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/UserMappers.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/AccountRepository.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/ChannelRepository.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/ChatRepository.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/FolderRepository.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/GroupRepository.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/UserRepository.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ChannelType.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ChatType.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/enums/DownloadStatus.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/enums/FileType.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/enums/PrimaryColorOption.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/enums/PrivacyLevel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ThemeOption.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/enums/WebSocketAction.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/ApiService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/NotificationService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/Profile.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/QrCodeService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/AppLockService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/AuthService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/ChannelService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/ChatService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/ClipboardHelper.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/DataStoreManager.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/DeviceHelper.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/DialogController.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/FolderService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/GroupService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/NotificationService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/PrivacyService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/QrCodeService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/SearchService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/SessionService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/ThemeService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/TokenManager.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/UserManager.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/UserService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/services/VibrateService.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/types/EntityId.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ArchiveScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ChatScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/KanbanScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/LockScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/LogoutScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/MainScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/NewMessageScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ProfileScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/QRCodeScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/QrCodeScaner.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/SearchScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelBlackListScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelInviteLinksScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelSettingsScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelSubscribersScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelTypeSettingsScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/CreateChannelScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/AnimatedIntroSection.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/ChatCard.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CodeBlocks.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomDialog.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomNumberBoard.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomSwitch.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/InputField.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/MessageFile.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/MinimizeChatCard.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/NavigationController.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/PageTopBar.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionCkeckBoxItem.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionContainer.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionDescription.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionHeader.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionItem.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionRadioItem.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionToggleItem.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SwipeableChatCard.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/AddMemberScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/CreateGroupScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/GroupMembersScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/GroupSettingsScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/AuthScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/LoginScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/PasswordScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/VerificationCodeScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsDataAndStorageScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsNotificationsScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chat/SettingsChatScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chat/SettingsDarkThemeScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsChatFoldersScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsChatInFolderScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsFolderScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsBioScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsDateOfBirthScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsLastSeenScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsPrivacyScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsProfileColorScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsProfileScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsUsernameScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsChangeCloudPasswordScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsCloudPasswordSceen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsDevicesScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsPasscodeScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsSecurityScreen.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/ui/theme/Theme.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ChatState.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Constants.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/DownloadManager.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Downloader.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/FileHelper.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/LottieAnimation.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/NotificationChannelConstants.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ProgressResponseBody.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Route.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Shape.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ShortcutHelper.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/VibrationPattern.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/utils/WebSocketManager.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ArchiveViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/AuthViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ChannelViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ChatViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/CloudPasswordViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/DataUsageViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/DevicesViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/FolderViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/GroupViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/KanbanViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/LockScreenViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/LogoutViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/MainViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/NavigationViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/PasscodeLockViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ProfileViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SearchViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsBioViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsDateOfBirthViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsDesignViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsPrivacyViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsProfileViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsSecurityViewModel.kt create mode 100644 messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsUsernameViewModel.kt create mode 100644 messenger-client/app/src/main/new_app_icon-playstore.png create mode 100644 messenger-client/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 messenger-client/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 messenger-client/app/src/main/res/mipmap-anydpi-v26/new_app_icon.xml create mode 100644 messenger-client/app/src/main/res/mipmap-anydpi-v26/new_app_icon_round.xml create mode 100644 messenger-client/app/src/main/res/mipmap-hdpi/new_app_icon.webp create mode 100644 messenger-client/app/src/main/res/mipmap-hdpi/new_app_icon_foreground.webp create mode 100644 messenger-client/app/src/main/res/mipmap-hdpi/new_app_icon_round.webp create mode 100644 messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon.webp create mode 100644 messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon_foreground.webp create mode 100644 messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon_round.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xhdpi/new_app_icon.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xhdpi/new_app_icon_foreground.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xhdpi/new_app_icon_round.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xxhdpi/new_app_icon.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xxhdpi/new_app_icon_foreground.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xxhdpi/new_app_icon_round.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xxxhdpi/new_app_icon.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xxxhdpi/new_app_icon_foreground.webp create mode 100644 messenger-client/app/src/main/res/mipmap-xxxhdpi/new_app_icon_round.webp create mode 100644 messenger-client/app/src/main/res/values/new_app_icon_background.xml create mode 100644 messenger-client/app/src/main/res/values/strings.xml create mode 100644 messenger-client/app/src/main/res/values/themes.xml create mode 100644 messenger-client/app/src/main/res/xml/backup_rules.xml create mode 100644 messenger-client/app/src/main/res/xml/file_paths.xml create mode 100644 messenger-client/app/src/main/res/xml/network_security_config.xml create mode 100644 messenger-client/build.gradle.kts create mode 100644 messenger-client/gradle.properties create mode 100644 messenger-client/gradle/libs.versions.toml create mode 100644 messenger-client/gradle/wrapper/gradle-wrapper.jar create mode 100644 messenger-client/gradle/wrapper/gradle-wrapper.properties create mode 100755 messenger-client/gradlew create mode 100644 messenger-client/gradlew.bat create mode 100644 messenger-client/settings.gradle.kts delete mode 160000 messenger-server create mode 100644 messenger-server/.env.example create mode 100644 messenger-server/.prettierrc create mode 100644 messenger-server/LICENSE.txt create mode 100644 messenger-server/ecosystem.config.js create mode 100644 messenger-server/eslint.config.mjs create mode 100644 messenger-server/nest-cli.json create mode 100644 messenger-server/package-lock.json create mode 100644 messenger-server/package.json create mode 100644 messenger-server/prisma.config.ts create mode 100644 messenger-server/prisma/migrations/20260622120000_add_kanban/migration.sql create mode 100644 messenger-server/prisma/schema.prisma create mode 100644 messenger-server/public/Messenger.apk create mode 100644 messenger-server/public/android.html create mode 100644 messenger-server/public/app-ads.txt create mode 100644 messenger-server/public/icon.webp create mode 100644 messenger-server/public/index.html create mode 100644 messenger-server/public/style.css create mode 100644 messenger-server/src/app.controller.ts create mode 100644 messenger-server/src/app.module.ts create mode 100644 messenger-server/src/app.service.ts create mode 100644 messenger-server/src/common/constants/db.constants.ts create mode 100644 messenger-server/src/common/constants/param.constants.ts create mode 100644 messenger-server/src/common/decorators/omit-null.decorator.ts create mode 100644 messenger-server/src/common/decorators/trim.decorator.ts create mode 100644 messenger-server/src/common/decorators/user-id.decorator.ts create mode 100644 messenger-server/src/common/decorators/user-token.decorator.ts create mode 100644 messenger-server/src/common/enums/chat-type.enum.ts create mode 100644 messenger-server/src/common/filters/all-exceptions.filter.ts create mode 100644 messenger-server/src/common/guards/auth.guard.ts create mode 100644 messenger-server/src/common/guards/can-delete-message.guard.ts create mode 100644 messenger-server/src/common/guards/can-read-chat.guard.ts create mode 100644 messenger-server/src/common/guards/can-send-message.guard.ts create mode 100644 messenger-server/src/common/guards/channel-exists.guard.ts create mode 100644 messenger-server/src/common/guards/channel-owner.guard.ts create mode 100644 messenger-server/src/common/guards/group-exists.guard.ts create mode 100644 messenger-server/src/common/guards/group-owner.guard.ts create mode 100644 messenger-server/src/common/guards/privacy.guard.ts create mode 100644 messenger-server/src/common/guards/session-owner.guard.ts create mode 100644 messenger-server/src/common/guards/user-exists.guard.ts create mode 100644 messenger-server/src/common/interceptors/big-int.interceptor.ts create mode 100644 messenger-server/src/common/middlewares/auth.middleware.ts create mode 100644 messenger-server/src/common/pipes/parse-channel-id.pipe.ts create mode 100644 messenger-server/src/common/pipes/parse-chat-id.pipe.ts create mode 100644 messenger-server/src/common/pipes/parse-group-id.pipe.ts create mode 100644 messenger-server/src/common/pipes/parse-user-id.pipe.ts create mode 100644 messenger-server/src/common/socket/socket-events.ts create mode 100644 messenger-server/src/common/types/brand.ts create mode 100644 messenger-server/src/common/types/channel-id.type.ts create mode 100644 messenger-server/src/common/types/chat-id.type.ts create mode 100644 messenger-server/src/common/types/group-id.type.ts create mode 100644 messenger-server/src/common/types/session-id.type.ts create mode 100644 messenger-server/src/common/types/token-payload.type.ts create mode 100644 messenger-server/src/common/types/user-id.type.ts create mode 100644 messenger-server/src/common/utils/detect-chat-type.util.ts create mode 100644 messenger-server/src/common/utils/id-generator.util.ts create mode 100644 messenger-server/src/common/utils/password.util.ts create mode 100644 messenger-server/src/main.ts create mode 100644 messenger-server/src/modules/auth/auth.controller.ts create mode 100644 messenger-server/src/modules/auth/auth.module.ts create mode 100644 messenger-server/src/modules/auth/auth.service.ts create mode 100644 messenger-server/src/modules/auth/dto/auth-credentials.dto.ts create mode 100644 messenger-server/src/modules/auth/dto/auth-response.dto.ts create mode 100644 messenger-server/src/modules/auth/dto/check-login.dto.ts create mode 100644 messenger-server/src/modules/auth/dto/signin.dto.ts create mode 100644 messenger-server/src/modules/auth/dto/signup.dto.ts create mode 100644 messenger-server/src/modules/channels/channels.controller.ts create mode 100644 messenger-server/src/modules/channels/channels.module.ts create mode 100644 messenger-server/src/modules/channels/channels.service.ts create mode 100644 messenger-server/src/modules/channels/dto/channel.dto.ts create mode 100644 messenger-server/src/modules/channels/dto/create-channel.dto.ts create mode 100644 messenger-server/src/modules/channels/dto/update-channel.dto.ts create mode 100644 messenger-server/src/modules/chats/chats.controller.ts create mode 100644 messenger-server/src/modules/chats/chats.module.ts create mode 100644 messenger-server/src/modules/chats/chats.service.ts create mode 100644 messenger-server/src/modules/chats/dto/chat-response.dto.ts create mode 100644 messenger-server/src/modules/chats/dto/create-invite-link.dto.ts create mode 100644 messenger-server/src/modules/chats/dto/invite-link-response.dto.ts create mode 100644 messenger-server/src/modules/chats/invite-links.service.ts create mode 100644 messenger-server/src/modules/groups/dto/create-group.dto.ts create mode 100644 messenger-server/src/modules/groups/dto/group-response.dto.ts create mode 100644 messenger-server/src/modules/groups/dto/update-group.dto.ts create mode 100644 messenger-server/src/modules/groups/groups.controller.ts create mode 100644 messenger-server/src/modules/groups/groups.module.ts create mode 100644 messenger-server/src/modules/groups/groups.service.ts create mode 100644 messenger-server/src/modules/kanban/kanban.controller.ts create mode 100644 messenger-server/src/modules/kanban/kanban.module.ts create mode 100644 messenger-server/src/modules/kanban/kanban.service.ts create mode 100644 messenger-server/src/modules/messages/dto/file-confirm.dto.ts create mode 100644 messenger-server/src/modules/messages/dto/file-init.dto.ts create mode 100644 messenger-server/src/modules/messages/dto/media-message.dto.ts create mode 100644 messenger-server/src/modules/messages/dto/message-response.dto.ts create mode 100644 messenger-server/src/modules/messages/dto/text-message.dto.ts create mode 100644 messenger-server/src/modules/messages/messages.controller.ts create mode 100644 messenger-server/src/modules/messages/messages.module.ts create mode 100644 messenger-server/src/modules/messages/messages.service.ts create mode 100644 messenger-server/src/modules/push/providers/firebase-push.provider.ts create mode 100644 messenger-server/src/modules/push/push.module.ts create mode 100644 messenger-server/src/modules/push/push.service.ts create mode 100644 messenger-server/src/modules/push/push.types.ts create mode 100644 messenger-server/src/modules/realtime/realtime.gateway.ts create mode 100644 messenger-server/src/modules/realtime/realtime.module.ts create mode 100644 messenger-server/src/modules/realtime/realtime.service.ts create mode 100644 messenger-server/src/modules/search/dto/search-query.dto.ts create mode 100644 messenger-server/src/modules/search/dto/search-response.dto.ts create mode 100644 messenger-server/src/modules/search/search.controller.ts create mode 100644 messenger-server/src/modules/search/search.module.ts create mode 100644 messenger-server/src/modules/search/search.service.ts create mode 100644 messenger-server/src/modules/security/jwt.module.ts create mode 100644 messenger-server/src/modules/security/jwt.service.ts create mode 100644 messenger-server/src/modules/sessions/dto/create-session.dto.ts create mode 100644 messenger-server/src/modules/sessions/dto/session-response.dto.ts create mode 100644 messenger-server/src/modules/sessions/sessions.controller.ts create mode 100644 messenger-server/src/modules/sessions/sessions.module.ts create mode 100644 messenger-server/src/modules/sessions/sessions.service.ts create mode 100644 messenger-server/src/modules/storage/dto/file.dto.ts create mode 100644 messenger-server/src/modules/storage/dto/init-upload.dto.ts create mode 100644 messenger-server/src/modules/storage/storage.module.ts create mode 100644 messenger-server/src/modules/storage/storage.service.ts create mode 100644 messenger-server/src/modules/users/dto/change-password.dto.ts create mode 100644 messenger-server/src/modules/users/dto/privacy-settings.dto.ts create mode 100644 messenger-server/src/modules/users/dto/update-privacy-settings.dto.ts create mode 100644 messenger-server/src/modules/users/dto/update-user.dto.ts create mode 100644 messenger-server/src/modules/users/dto/update-username.dto.ts create mode 100644 messenger-server/src/modules/users/dto/user-response.dto.ts create mode 100644 messenger-server/src/modules/users/users.controller.ts create mode 100644 messenger-server/src/modules/users/users.module.ts create mode 100644 messenger-server/src/modules/users/users.service.ts create mode 100644 messenger-server/src/providers/prisma/prisma.module.ts create mode 100644 messenger-server/src/providers/prisma/prisma.service.ts create mode 100644 messenger-server/tsconfig.build.json create mode 100644 messenger-server/tsconfig.json diff --git a/messenger-client b/messenger-client deleted file mode 160000 index 003168a..0000000 --- a/messenger-client +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 003168a95e5af4f27d22ee1770356483dda11fd4 diff --git a/messenger-client/.gitignore b/messenger-client/.gitignore new file mode 100644 index 0000000..e6da055 --- /dev/null +++ b/messenger-client/.gitignore @@ -0,0 +1,27 @@ +# Android Studio +.idea/ +.gradle/ +build/ +app/build/ +app/release/ +local.properties +.DS_Store +Thumbs.db +*.iml +*.iws +*.ipr +*.bak + +# Firebase +app/google-services.json + +# Keystore files +*.jks +*.keystore + +app/.cxx/ + +captures/ + +# Additional files +*.log \ No newline at end of file diff --git a/messenger-client/LICENSE b/messenger-client/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/messenger-client/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/messenger-client/app/build.gradle.kts b/messenger-client/app/build.gradle.kts new file mode 100644 index 0000000..3630845 --- /dev/null +++ b/messenger-client/app/build.gradle.kts @@ -0,0 +1,142 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +fun String.asBuildConfigString(): String { + return "\"${replace("\\", "\\\\").replace("\"", "\\\"")}\"" +} + +val serverUrl = providers.gradleProperty("SERVER_URL") + .orElse(providers.environmentVariable("SERVER_URL")) + .orElse("https://msgr.jeezft.xyz") + .get() + .trimEnd('/') + "/" + +val webSocketUrl = providers.gradleProperty("WEB_SOCKET_URL") + .orElse(providers.environmentVariable("WEB_SOCKET_URL")) + .orElse("wss://msgr.jeezft.xyz") + .get() + .trimEnd('/') + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) + alias(libs.plugins.gms) + + id("org.jetbrains.kotlin.plugin.serialization") version "2.2.21" + + id("com.google.dagger.hilt.android") + id("com.google.devtools.ksp") +} + +android { + namespace = "com.aiwazian.messenger" + compileSdk = 36 + + defaultConfig { + applicationId = "com.aiwazian.messenger" + minSdk = 28 + targetSdk = 36 + versionCode = 15 + versionName = "1.7.0" + + buildConfigField("String", "SERVER_URL", serverUrl.asBuildConfigString()) + buildConfigField("String", "WEB_SOCKET_URL", webSocketUrl.asBuildConfigString()) + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + + "proguard-rules.pro" + ) + signingConfig = signingConfigs.getByName("debug") + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + buildFeatures { + compose = true + viewBinding = true + buildConfig = true + } + buildToolsVersion = "36.0.0" + dependenciesInfo { + includeInApk = false + includeInBundle = false + } + kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_17 + } + } +} + +dependencies { + // Firebase + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.messaging) + implementation(libs.firebase.analytics) + + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.navigation.compose) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.animation) + implementation(libs.androidx.material3) + implementation(libs.androidx.material.icons.extended.android) + implementation(libs.androidx.foundation) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) + + // DataStore + implementation(libs.androidx.datastore.preferences) + + implementation(libs.accompanist.systemuicontroller) + implementation(libs.accompanist.navigation.material) + implementation(libs.accompanist.navigation.animation) + + implementation(libs.protobuf.javalite) + + implementation(libs.retrofit) + implementation(libs.converter.gson) + implementation(libs.kotlinx.serialization.json) + + // Ktor + implementation(libs.ktor.client.core) + implementation(libs.ktor.client.okhttp) + implementation(libs.ktor.client.websockets) + + implementation(libs.coil.compose) + + // Lottie animation + implementation(libs.lottie.compose) + + implementation(libs.zxing.android.embedded) + + implementation(libs.okhttp) + implementation(libs.socket.io.client) + + // Dagger Hilt + implementation(libs.hilt.android) + implementation(libs.androidx.graphics.shapes) + debugImplementation(libs.androidx.compose.ui.tooling) + ksp(libs.hilt.compiler) + implementation(libs.androidx.hilt.navigation.compose) + + // Room database + implementation(libs.androidx.room.runtime) + ksp(libs.androidx.room.compiler) + implementation(libs.androidx.room.ktx) + + implementation(libs.material.icons.extended) +} diff --git a/messenger-client/app/proguard-rules.pro b/messenger-client/app/proguard-rules.pro new file mode 100644 index 0000000..08f8b4d --- /dev/null +++ b/messenger-client/app/proguard-rules.pro @@ -0,0 +1,27 @@ +-keepattributes Signature + +# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items). +-keep,allowobfuscation,allowshrinking interface retrofit2.Call +-keep,allowobfuscation,allowshrinking class retrofit2.Response + +# With R8 full mode generic signatures are stripped for classes that are not +# kept. Suspend functions are wrapped in continuations where the type argument +# is used. +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation + +# R8 full mode strips generic signatures from return types if not kept. +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> + +# With R8 full mode generic signatures are stripped for classes that are not kept. +-keep,allowobfuscation,allowshrinking class retrofit2.Response + +# Deleting all calls Log.v, Log.d, Log.i, Log.w, Log.e, Log.wtf +-assumenosideeffects class android.util.Log { + public static *** d(...); + public static *** e(...); + public static *** i(...); + public static *** v(...); + public static *** w(...); + public static *** wtf(...); +} diff --git a/messenger-client/app/src/main/AndroidManifest.xml b/messenger-client/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9ea3213 --- /dev/null +++ b/messenger-client/app/src/main/AndroidManifest.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/messenger-client/app/src/main/assets/folder_closed.json b/messenger-client/app/src/main/assets/folder_closed.json new file mode 100644 index 0000000..dc1171d --- /dev/null +++ b/messenger-client/app/src/main/assets/folder_closed.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":120,"w":512,"h":512,"nm":"13_FOLDER_EMOJI_closed","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[244.941,205.599,0]},"a":{"a":0,"k":[60,60,0]}},"ao":0,"ip":0,"op":85,"st":5,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 64","parent":1,"sr":1,"ks":{"r":{"a":0,"k":77.3},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":5,"s":[56.544,13.819,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":25,"s":[76.544,73.819,0],"to":[0,0,0],"ti":[-2.515,-0.112,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":45,"s":[76.544,73.819,0],"to":[1.015,-117.388,0],"ti":[0,0,0]},{"t":73,"s":[59.552,234.809,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"t":73,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-58.067,139.083],[-58.067,-165.374],[102.41,-129.09]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.403921568627,0.462745098039,0.513725490196,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[20]},{"t":25,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.462745127958,0.513725490196,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":5,"op":69,"st":5,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 63","parent":1,"sr":1,"ks":{"r":{"a":0,"k":77.3},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[49.949,0.843,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":28,"s":[59.96,60.851,0],"to":[0,0,0],"ti":[-2.515,-0.112,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":56,"s":[59.96,60.851,0],"to":[1.015,-117.388,0],"ti":[0,0,0]},{"t":84,"s":[60.923,235.808,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":28,"s":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"t":76,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-58.067,139.083],[-58.067,-165.374],[102.41,-129.09]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.403921568627,0.462745098039,0.513725490196,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[20]},{"t":28,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.462745127958,0.513725490196,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":80,"st":8,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 62","parent":1,"sr":1,"ks":{"r":{"a":0,"k":77.3},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":11,"s":[33.63,-13.14,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[53.676,46.687,0],"to":[0,0,0],"ti":[-2.515,-0.112,0]},{"t":41,"s":[43.676,47.169,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":61,"s":[43.676,47.169,0],"to":[1.015,-117.388,0],"ti":[0,0,0]},{"t":89,"s":[61.423,235.808,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":11,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":31,"s":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":41,"s":[100,100,100]},{"t":79,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-58.067,139.083],[-58.067,-165.374],[102.41,-129.09]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":41,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-58.067,139.083],[-58.067,-165.374],[102.41,-129.09]],"c":true}]},{"i":{"x":0.715,"y":0.702},"o":{"x":1,"y":0},"t":61,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-58.067,139.083],[-58.067,-165.374],[102.41,-129.09]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.174},"t":76,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-39.143,143.347],[-39.143,-161.109],[102.41,-129.09]],"c":true}]},{"t":89,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-136.159,121.714],[-136.159,-182.742],[102.41,-129.09]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.403921568627,0.462745098039,0.513725490196,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":11,"s":[20]},{"t":31,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.403921598547,0.462745127958,0.513725490196,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":3,"op":85,"st":11,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 48","parent":2,"sr":1,"ks":{"p":{"a":0,"k":[-0.691,0.492,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.163,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-2.182,42.422],[4.413,-1.098],[0,0],[2.126,-8.116],[-0.161,-50.934],[11.242,-3.498],[0,0],[-0.633,7.945]],"o":[[0.407,-7.916],[0,0],[-9.908,2.181],[-3.809,14.544],[0.239,75.331],[0,0],[7.725,-1.963],[5.48,-68.814]],"v":[[436.556,187.086],[427.403,178.357],[134.665,242.788],[111.874,260.616],[109.261,390.419],[98.758,502.748],[407.551,424.311],[421.71,407.822]],"c":true}]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":40,"s":[{"i":[[-24.961,37.768],[7.741,-1.702],[0,0],[5.867,-8.277],[6.179,-33.41],[14.688,-5.293],[0,0],[-0.782,7.932]],"o":[[4.37,-6.613],[0,0],[-9.908,2.181],[-12.684,17.892],[-13.064,70.634],[0,0],[7.725,-1.963],[6.775,-68.707]],"v":[[478.123,232.836],[468.903,219.357],[176.165,283.788],[153.374,301.616],[115.511,390.419],[98.758,502.748],[407.551,424.311],[421.711,407.822]],"c":true}]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[{"i":[[1.26,40.797],[4.413,-1.098],[0,0],[1.086,-8.319],[-4.321,-69.16],[6.933,-2.99],[0,0],[-0.201,7.968]],"o":[[-0.245,-7.922],[0,0],[-9.908,2.181],[-1.684,12.892],[4.392,70.299],[0,0],[7.725,-1.963],[1.98,-78.314]],"v":[[413.431,180.211],[404.278,171.482],[114.665,235.288],[91.874,253.116],[99.261,385.419],[98.758,502.748],[409.301,423.561],[417.21,401.322]],"c":true}]},{"t":120,"s":[{"i":[[-2.182,42.422],[4.413,-1.098],[0,0],[2.126,-8.116],[-0.161,-50.934],[11.242,-3.498],[0,0],[-0.633,7.945]],"o":[[0.407,-7.916],[0,0],[-9.908,2.181],[-3.809,14.544],[0.239,75.331],[0,0],[7.725,-1.963],[5.48,-68.814]],"v":[[436.556,187.086],[427.403,178.357],[134.665,242.788],[111.874,260.616],[109.261,390.419],[98.758,502.748],[407.551,424.311],[421.71,407.822]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 47","parent":39,"sr":1,"ks":{"p":{"a":0,"k":[42.742,39.17,0]},"a":{"a":0,"k":[284.188,355.943,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[433,204.5]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666666667,0.486274539723,0.294117647059,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.163,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-177.869,1.216],[-31.5,-31],[114.869,-63.216]],"c":false}]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":40,"s":[{"i":[[-5.295,2.647],[0,0],[0,0]],"o":[[5.295,-2.647],[0,0],[0,0]],"v":[[-143.119,44.466],[-122.747,39.134],[156.369,-22.216]],"c":false}]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[{"i":[[-2.587,8.5],[0,0],[0,0]],"o":[[3.545,-11.647],[0,0],[0,0]],"v":[[-216.369,7.216],[-197.497,-6.366],[94.869,-70.716]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-177.869,1.216],[-31.5,-31],[114.869,-63.216]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[313.824,247.432]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.163,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[156.65,-39.791],[-156.65,39.791]],"c":false}]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":40,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[156.65,-39.791],[-156.65,39.791]],"c":false}]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[151.65,-39.291],[-159.4,40.291]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[156.65,-39.791],[-156.65,39.791]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.929411768913,0.933333337307,0.945098042488,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[262.449,454.978]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.163,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[-0.117,2.624],[-0.436,26.693],[-5.511,17.741],[-8.212,1.808],[0,0]],"o":[[0.118,-2.391],[0.781,-17.567],[0.617,-37.781],[2.471,-7.955],[0,0],[0,0]],"v":[[-172.883,127.709],[-172.537,120.187],[-172.873,48.383],[-170.048,-79.666],[-151.354,-94.277],[141.383,-158.709]],"c":false}]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":40,"s":[{"i":[[0,0],[-0.117,2.624],[-4.814,30.119],[-10.636,21.678],[-8.212,1.808],[0,0]],"o":[[0.118,-2.391],[0.781,-17.567],[5.964,-37.312],[3.669,-7.479],[0,0],[0,0]],"v":[[-172.883,127.709],[-172.537,120.187],[-165.873,48.441],[-128.548,-38.666],[-109.854,-53.277],[182.883,-117.709]],"c":false}]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[{"i":[[0,0],[-0.117,2.624],[1.314,24.693],[-0.511,15.491],[-8.212,1.808],[0,0]],"o":[[0.118,-2.391],[0.781,-17.567],[-2.009,-37.733],[0.275,-8.325],[0,0],[0,0]],"v":[[-179.633,122.646],[-179.287,115.125],[-182.873,43.383],[-190.048,-87.166],[-171.354,-101.777],[121.383,-166.209]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-0.117,2.624],[-0.436,26.693],[-5.511,17.741],[-8.212,1.808],[0,0]],"o":[[0.118,-2.391],[0.781,-17.567],[0.617,-37.781],[2.471,-7.955],[0,0],[0,0]],"v":[[-172.883,127.709],[-172.537,120.187],[-172.873,48.383],[-170.048,-79.666],[-151.354,-94.277],[141.383,-158.709]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.900359509038,0.900359509038,0.904794730392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[287.309,342.925]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.163,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[4.321,-1.557],[0,0],[-1.467,7.009],[0,0],[0,0]],"o":[[-1.309,6.993],[0,0],[7.055,-1.793],[0,0],[0,0],[0,0]],"v":[[-153.798,36.65],[-161.674,49.427],[147.119,-29.01],[160.954,-43.472],[161.674,-49.427],[-152.905,30.234]],"c":true}]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":40,"s":[{"i":[[0,0],[4.321,-1.557],[0,0],[-1.467,7.009],[0,0],[0,0]],"o":[[-1.309,6.993],[0,0],[7.055,-1.793],[0,0],[0,0],[0,0]],"v":[[-153.798,36.65],[-161.674,49.427],[147.119,-29.01],[160.954,-43.472],[161.674,-49.427],[-152.905,30.234]],"c":true}]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[{"i":[[0,0],[4.321,-1.557],[0,0],[-1.467,7.009],[0,0],[0,0]],"o":[[-1.309,6.993],[0,0],[7.055,-1.793],[0,0],[0,0],[0,0]],"v":[[-157.548,34.15],[-161.674,49.427],[149.494,-30.51],[156.454,-49.972],[156.674,-50.677],[-157.155,29.234]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[4.321,-1.557],[0,0],[-1.467,7.009],[0,0],[0,0]],"o":[[-1.309,6.993],[0,0],[7.055,-1.793],[0,0],[0,0],[0,0]],"v":[[-153.798,36.65],[-161.674,49.427],[147.119,-29.01],[160.954,-43.472],[161.674,-49.427],[-152.905,30.234]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[260.432,453.321]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":20},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.163,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-2.182,42.422],[4.413,-1.098],[0,0],[2.126,-8.116],[-0.161,-50.934],[11.242,-3.498],[0,0],[-0.633,7.945]],"o":[[0.407,-7.916],[0,0],[-9.908,2.181],[-3.809,14.544],[0.239,75.331],[0,0],[7.725,-1.963],[5.48,-68.814]],"v":[[152.367,-168.857],[143.214,-177.586],[-149.524,-113.155],[-172.314,-95.327],[-174.927,34.476],[-185.431,146.805],[123.363,68.368],[137.522,51.88]],"c":true}]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":40,"s":[{"i":[[-24.961,37.768],[7.741,-1.702],[0,0],[5.867,-8.277],[6.179,-33.41],[14.688,-5.293],[0,0],[-0.782,7.932]],"o":[[4.37,-6.613],[0,0],[-9.908,2.181],[-12.684,17.892],[-13.064,70.634],[0,0],[7.725,-1.963],[6.775,-68.707]],"v":[[193.935,-123.107],[184.714,-136.586],[-108.024,-72.155],[-130.814,-54.327],[-168.677,34.476],[-185.431,146.805],[123.363,68.368],[137.522,51.88]],"c":true}]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[{"i":[[1.26,40.797],[4.413,-1.098],[0,0],[1.086,-8.319],[-4.321,-69.16],[6.933,-2.99],[0,0],[-0.201,7.968]],"o":[[-0.245,-7.922],[0,0],[-9.908,2.181],[-1.684,12.892],[4.392,70.299],[0,0],[7.725,-1.963],[1.98,-78.314]],"v":[[129.242,-175.732],[120.089,-184.461],[-169.524,-120.655],[-192.314,-102.827],[-184.927,29.476],[-185.431,146.805],[125.113,67.618],[133.022,45.38]],"c":true}]},{"t":120,"s":[{"i":[[-2.182,42.422],[4.413,-1.098],[0,0],[2.126,-8.116],[-0.161,-50.934],[11.242,-3.498],[0,0],[-0.633,7.945]],"o":[[0.407,-7.916],[0,0],[-9.908,2.181],[-3.809,14.544],[0.239,75.331],[0,0],[7.725,-1.963],[5.48,-68.814]],"v":[[152.367,-168.857],[143.214,-177.586],[-149.524,-113.155],[-172.314,-95.327],[-174.927,34.476],[-185.431,146.805],[123.363,68.368],[137.522,51.88]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.808,0.808,0.82,0.5,0.869,0.871,0.882,1,0.929,0.933,0.945]}},"s":{"a":0,"k":[-6.189,-17.943]},"e":{"a":0,"k":[23.15,93.055]},"t":1,"nm":"gr1","hd":false},{"ty":"tr","p":{"a":0,"k":[284.189,355.943]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[284.189,355.943]},"a":{"a":0,"k":[284.189,355.943]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 18","parent":10,"sr":1,"ks":{"p":{"a":0,"k":[8.495,-103.329,0]},"a":{"a":0,"k":[-118.75,-113.365,0]},"s":{"a":0,"k":[100.066,100.066,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-197.651,-119.273],[-98.468,-96.704]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-130.739,-76.795],[-86.967,-66.859]],"c":false}},"nm":"Path 2","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-85.976,-93.598],[-69.013,-89.703]],"c":false}},"nm":"Path 4","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-197.553,-153.061],[-169.918,-146.519]],"c":false}},"nm":"Path 5","hd":false},{"ind":4,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-158.063,-144.19],[-142.115,-140.339]],"c":false}},"nm":"Path 6","hd":false},{"ind":5,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-198.365,-92.046],[-142.739,-79.388]],"c":false}},"nm":"Path 3","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[0]},{"t":32,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 17","parent":10,"sr":1,"ks":{"p":{"a":0,"k":[-7.676,-53.727,0]},"a":{"a":0,"k":[-134.851,-63.744,0]},"s":{"a":0,"k":[100.554,100.554,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-199.035,-64.993],[-164.637,-57.166]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-152.965,-54.551],[-99.241,-42.008]],"c":false}},"nm":"Path 2","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-70.097,-35.502],[-87.166,-39.046]],"c":false}},"nm":"Path 3","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[0]},{"t":33,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 16","parent":10,"sr":1,"ks":{"p":{"a":0,"k":[59.195,1.838,0]},"a":{"a":0,"k":[-69.217,-2.818,0]},"s":{"a":0,"k":[101.431,101.431,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-149.992,-2.801],[-130.224,1.697]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-118.266,4.406],[-61.984,17.29]],"c":false}},"nm":"Path 3","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-196.825,-13.458],[-163.525,-5.88]],"c":false}},"nm":"Path 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"t":34,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 15","parent":10,"sr":1,"ks":{"p":{"a":0,"k":[9.798,35.695,0]},"a":{"a":0,"k":[-118.75,31.037,0]},"s":{"a":0,"k":[102.593,102.593,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-116.556,31.536],[-85.45,38.614]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-198.61,12.808],[-128.548,28.807]],"c":false}},"nm":"Path 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":18,"s":[0]},{"t":36,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 14","parent":10,"sr":1,"ks":{"p":{"a":0,"k":[58.348,103.598,0]},"a":{"a":0,"k":[-69.96,99.113,0]},"s":{"a":0,"k":[103.936,103.936,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-193.145,44.222],[-66.91,72.947]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-136.87,85.82],[-67.558,101.592]],"c":false}},"nm":"Path 2","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-193.793,72.866],[-160.626,80.414]],"c":false}},"nm":"Path 3","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-194.087,97.608],[-130.97,111.971]],"c":false}},"nm":"Path 4","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[0]},{"t":38,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 46","parent":10,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-90.992,120.841],[-91.798,-159.461]],"c":false}]},{"t":20,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-95.972,124.393],[-96.542,-165.204]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[20]},{"t":20,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 45","parent":10,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[97.781,163.499],[-90.55,120.941]],"c":false}]},{"t":20,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[96.779,167.947],[-95.972,124.393]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.960784373564,0.956862804936,0.921568687289,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[20]},{"t":20,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 4","sr":1,"ks":{"r":{"a":0,"k":77.3},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[255.079,83.533,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":20,"s":[276.879,203.433,0],"to":[0,0,0],"ti":[-2.741,-0.122,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":40,"s":[276.879,203.433,0],"to":[1.106,-127.953,0],"ti":[0,0,0]},{"t":68,"s":[258.357,304.412,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[119.9,119.9,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":30,"s":[109,109,100]},{"t":68,"s":[109,109,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-102.41,129.09],[-102.41,-175.367],[13.512,-149.175],[102.41,-73.516]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.741176486015,0.713725507259,0.611764729023,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[20]},{"t":20,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.879,0.867,0.787,0.5,0.928,0.922,0.87,1,0.976,0.976,0.953]}},"s":{"a":0,"k":[86.456,2.068]},"e":{"a":0,"k":[-81.267,-33.093]},"t":1,"nm":"gr4","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Layer 60","sr":1,"ks":{"o":{"a":0,"k":40},"r":{"a":0,"k":77.3},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[255.079,83.533,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":20,"s":[270.339,199.073,0],"to":[0,0,0],"ti":[-2.741,-0.122,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":40,"s":[270.339,199.073,0],"to":[1.106,-127.953,0],"ti":[0,0,0]},{"t":68,"s":[251.817,300.052,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[119.9,119.9,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":30,"s":[109,109,100]},{"t":68,"s":[109,109,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[96.472,168.849],[-96.862,125.16],[-96.581,-172.104],[96.753,-128.416]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[90.925,172.779],[-102.41,129.09],[-102.129,-168.174],[91.205,-124.486]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[93.363,173.328],[-102.41,129.09],[-102.129,-168.174],[93.644,-123.936]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":1,"y":0},"t":40,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.412,172.888],[-102.41,129.09],[-102.387,-163.62],[91.435,-119.821]],"c":true}]},{"t":52,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.412,172.888],[-95.093,130.738],[-95.07,-161.971],[91.435,-119.821]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.741176486015,0.713725507259,0.611764729023,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[20]},{"t":20,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741176470588,0.713725490196,0.611764705882,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":64,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 1","parent":13,"sr":1,"ks":{"r":{"a":0,"k":-77.3},"p":{"a":0,"k":[178.713,-41.935,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-6.561,1.072],[-0.037,-8.4],[6.561,-1.072],[0.037,8.4]],"o":[[6.561,-1.072],[0.037,8.4],[-6.561,1.072],[-0.037,-8.4]],"v":[[2.364,-10.864],[14.311,2.403],[2.498,19.554],[-9.448,6.287]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411764706,0.941176470588,0.972549019608,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[88.456,-102.634]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 34","parent":17,"sr":1,"ks":{"p":{"a":0,"k":[-88.559,61.757,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[6.969,-6.098],[0,0],[0,0],[7.933,13.239],[6.573,-4.904],[0,0],[4.521,8.17]],"o":[[-12.223,10.694],[0,0],[0,0],[-4.454,-7.433],[-4.236,3.16],[0,0],[-6.581,-11.893]],"v":[[54.556,-138.999],[18.71,-106],[134.767,-80.26],[111.622,-116.743],[97.519,-119.838],[86.398,-111.393],[73.105,-136.05]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.41568627451,0.556862745098,0.713725490196,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.506,-194.983],[18.463,-105.872],[132.113,-80.26],[131.131,-169.151]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.643137254902,0.752941176471,0.870588235294,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[75.989,-128.127]},"a":{"a":0,"k":[75.989,-128.127]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[131.57,-52.059],[100.455,-59.14]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[43.898,-45.114],[19.622,-50.704]],"c":false}},"nm":"Path 4","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[77.406,-64.385],[19.826,-77.474]],"c":false}},"nm":"Path 2","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[129.151,-25.782],[76.189,-37.834],[62.774,-40.996]],"c":false}},"nm":"Path 3","hd":false},{"ty":"st","c":{"a":0,"k":[0.229365808824,0.229365808824,0.229365808824,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":75,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Layer 31","parent":17,"sr":1,"ks":{"p":{"a":0,"k":[-86.594,3.002,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[129.842,67.39],[103.128,61.025]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[91.806,58.773],[19.471,41.638]],"c":false}},"nm":"Path 6","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[149.073,99.904],[127.811,95.066]],"c":false}},"nm":"Path 2","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.432,78.863],[19.051,70.501]],"c":false}},"nm":"Path 5","hd":false},{"ind":4,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[106.797,90.284],[67.485,81.303]],"c":false}},"nm":"Path 3","hd":false},{"ind":5,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[57.925,111.513],[19.084,102.608]],"c":false}},"nm":"Path 4","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":75,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 51","parent":17,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":8,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-90.992,120.841],[-91.798,-159.461]],"c":false}]},{"t":23,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-95.972,124.393],[-96.542,-165.204]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[20]},{"t":23,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":75,"st":3,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Layer 50","parent":17,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":8,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[97.781,163.499],[-90.55,120.941]],"c":false}]},{"t":23,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[96.779,167.947],[-95.972,124.393]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.921568687289,0.937031525257,0.960784373564,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[20]},{"t":23,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":75,"st":3,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Layer 49","sr":1,"ks":{"r":{"a":0,"k":77.3},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[247.89,69.389,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[258.802,189.298,0],"to":[0,0,0],"ti":[-2.741,-0.122,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":51,"s":[258.802,189.298,0],"to":[-0.394,-91.453,0],"ti":[0,0,0]},{"t":79,"s":[259.851,305.501,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[119.9,119.9,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":33,"s":[109,109,100]},{"t":71,"s":[109,109,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-102.41,129.09],[-102.41,-175.367],[102.41,-129.09]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.6,0.686274509804,0.800000059838,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[20]},{"t":23,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.001,0.788,0.824,0.878,0.5,0.871,0.893,0.927,1,0.953,0.963,0.976]}},"s":{"a":0,"k":[86.456,2.068]},"e":{"a":0,"k":[-81.267,-33.093]},"t":1,"nm":"gr7","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":75,"st":3,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Layer 61","sr":1,"ks":{"o":{"a":0,"k":40},"r":{"a":0,"k":77.3},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[242.44,65.574,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[253.352,185.483,0],"to":[0,0,0],"ti":[-2.741,-0.122,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":51,"s":[253.352,185.483,0],"to":[1.606,-93.453,0],"ti":[0,0,0]},{"t":79,"s":[254.401,301.686,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[119.9,119.9,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":33,"s":[109,109,100]},{"t":71,"s":[109,109,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[95.059,162.515],[-96.457,119.236],[-96.295,-173.535],[95.221,-130.256]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[76.302,158.288],[-96.457,119.236],[-96.295,-173.535],[76.464,-134.483]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":23,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[89.107,172.369],[-102.41,129.09],[-102.247,-163.681],[89.269,-120.402]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.546,172.919],[-102.41,129.09],[-103.051,-166.938],[90.904,-123.109]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":1,"y":0},"t":51,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.546,172.919],[-102.41,129.09],[-103.051,-166.938],[90.904,-123.109]],"c":true}]},{"t":64,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.546,172.918],[-95.093,130.738],[-95.734,-165.289],[90.904,-123.109]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.741176486015,0.713725507259,0.611764729023,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[20]},{"t":23,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741176470588,0.713725490196,0.611764705882,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":75,"st":3,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Layer 67","parent":28,"sr":1,"ks":{"r":{"a":0,"k":180},"p":{"a":0,"k":[4.547,-123.569,0]},"a":{"a":0,"k":[4.375,-163.721,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[37.675,-156.144],[17.388,-160.76]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-28.925,-171.299],[7.395,-163.034]],"c":false}},"nm":"Path 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[19.511,4.397]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":80,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Layer 66","parent":28,"sr":1,"ks":{"r":{"a":0,"k":180},"p":{"a":0,"k":[38.023,-74.437,0]},"a":{"a":0,"k":[83.735,-60.578,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[148.224,-45.978],[112.308,-54.151]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[85.702,-60.206],[19.246,-75.179]],"c":false}},"nm":"Path 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[19.511,4.397]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":80,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Layer 68","parent":28,"sr":1,"ks":{"p":{"a":0,"k":[-94.853,6.949,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[19.511,4.397]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":80,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Layer 69","parent":28,"sr":1,"ks":{"p":{"a":0,"k":[-89.975,8.049,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[11.506,-112.142],[-1.453,-100.806],[-8.125,-109.485]],"c":false}},"nm":"Path 5","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.919,1.797],[-3.041,13.132],[-9.713,4.454]],"c":false}},"nm":"Path 6","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[10.119,-156.02],[-2.841,-144.685],[-9.512,-153.363]],"c":false}},"nm":"Path 7","hd":false},{"ty":"st","c":{"a":0,"k":[0.831862745098,0.533829573089,0.533829573089,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[19.511,4.397]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":80,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Layer 65","parent":28,"sr":1,"ks":{"p":{"a":0,"k":[-85.098,9.148,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[131.57,-52.059],[100.455,-59.14]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[43.898,-45.114],[19.622,-50.704]],"c":false}},"nm":"Path 4","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[77.406,-64.385],[19.826,-77.474]],"c":false}},"nm":"Path 2","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[129.151,-25.782],[76.189,-37.834],[62.774,-40.996]],"c":false}},"nm":"Path 3","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[19.511,4.397]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":80,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"Layer 63","parent":28,"sr":1,"ks":{"p":{"a":0,"k":[8.961,32.654,0]},"a":{"a":0,"k":[92.361,28.762,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[165.159,45.294],[124.787,36.046]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[110.532,32.802],[19.563,12.23]],"c":false}},"nm":"Path 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[19.511,4.397]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":80,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Layer 62","parent":28,"sr":1,"ks":{"p":{"a":0,"k":[-83.401,3.892,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[129.842,67.39],[103.128,61.025]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[91.806,58.773],[19.471,41.638]],"c":false}},"nm":"Path 6","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[149.073,99.904],[127.811,95.066]],"c":false}},"nm":"Path 2","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.432,78.863],[19.051,70.501]],"c":false}},"nm":"Path 5","hd":false},{"ind":4,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[106.797,90.284],[67.485,81.303]],"c":false}},"nm":"Path 3","hd":false},{"ind":5,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[57.925,111.513],[19.084,102.608]],"c":false}},"nm":"Path 4","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450980392,0.227450980392,0.227450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[19.511,4.397]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":20,"op":80,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Layer 54","parent":28,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-90.992,120.841],[-91.798,-159.461]],"c":false}]},{"t":26,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-95.972,124.393],[-96.542,-165.204]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":6,"s":[20]},{"t":26,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":80,"st":6,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"Layer 53","parent":28,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[97.781,163.499],[-90.55,120.941]],"c":false}]},{"t":26,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[96.779,167.947],[-95.972,124.393]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.960784373564,0.921568687289,0.921568687289,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":6,"s":[20]},{"t":26,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":80,"st":6,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"Layer 52","sr":1,"ks":{"r":{"a":0,"k":77.3},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[230.102,54.148,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":26,"s":[241.052,173.86,0],"to":[0,0,0],"ti":[-2.741,-0.122,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":56,"s":[241.052,174.385,0],"to":[-2.439,-87.778,0],"ti":[0,0,0]},{"t":84,"s":[260.396,305.501,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":26,"s":[119.9,119.9,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[1,1,1],"y":[0,0,0]},"t":36,"s":[109,109,100]},{"t":74,"s":[109,109,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[102.41,175.367],[-102.41,129.09],[-102.41,-175.367],[102.41,-129.09]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.859941789216,0.652359667011,0.652359667011,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":6,"s":[20]},{"t":26,"s":[6]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.851,0.772,0.772,0.354,0.914,0.863,0.863,1,0.976,0.953,0.953]}},"s":{"a":0,"k":[86.456,2.068]},"e":{"a":0,"k":[-81.267,-33.093]},"t":1,"nm":"gr10","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":80,"st":6,"bm":0},{"ddd":0,"ind":29,"ty":0,"nm":"Pre-comp 2","parent":39,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":40},"p":{"a":0,"k":[22.553,-31.924,0]},"a":{"a":0,"k":[256,256,0]}},"ao":0,"w":512,"h":512,"ip":0,"op":80,"st":-5,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"p_str","parent":39,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.258,6.055],[0,0],[6.31,-1.446],[0,0],[-0.073,5.112],[0,0],[6.333,-1.453],[0,0],[-0.058,-6.533],[0,0],[-7.065,-16.479],[-5.052,1.289]],"o":[[6.051,-1.378],[0,0],[0.28,-6.551],[0,0],[-4.812,1.103],[0,0],[0.093,-6.574],[0,0],[-6.323,1.45],[0,0],[0.043,4.885],[7.129,16.628],[0,0]],"v":[[144.859,112.603],[156.283,99.152],[166.7,-176.707],[155.78,-185.961],[-9.063,-148.178],[-18.293,-155.977],[-18.097,-169.807],[-29.394,-179.09],[-155.367,-149.84],[-166.711,-135.375],[-164.411,125.639],[-158.249,172.856],[-139.624,185.173]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"p_bl4","parent":39,"sr":1,"ks":{"p":{"a":0,"k":[-94.374,-154.336,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.595,0.824],[0,0]],"o":[[-0.033,-3.738],[0,0],[0,0]],"v":[[-66.337,18.909],[-59.652,10.344],[66.338,-18.909]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.929411768913,0.933333337307,0.945098042488,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"p_sh2","parent":39,"sr":1,"ks":{"o":{"a":0,"k":33},"p":{"a":0,"k":[-140.348,177.818,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-4.572,7.663]],"o":[[10.337,14.81],[0,0]],"v":[[-14.261,0.419],[14.261,-6.841]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"p_shad 2","parent":39,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.163],"y":[1]},"o":{"x":[0.951],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.301],"y":[1]},"o":{"x":[0.951],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.163],"y":[1]},"o":{"x":[0.476],"y":[0]},"t":80,"s":[100]},{"t":120,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.163,"y":0.163},"o":{"x":0.333,"y":0.333},"t":0,"s":[3.569,12.387,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":40,"s":[3.569,12.387,0],"to":[-0.25,-0.583,0],"ti":[0,0,0]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[2.069,8.887,0],"to":[0,0,0],"ti":[-0.25,-0.583,0]},{"t":120,"s":[3.569,12.387,0]}]},"a":{"a":0,"k":[245.016,323.16,0]},"s":{"a":1,"k":[{"i":{"x":[0.163,0.163,0.163],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,97,100]},{"i":{"x":[0.301,0.301,0.301],"y":[1,1,1]},"o":{"x":[0.951,0.951,0.951],"y":[0,0,0]},"t":40,"s":[100,97,100]},{"i":{"x":[0.223,0.223,0.223],"y":[1,1,1]},"o":{"x":[0.476,0.476,0.476],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"t":120,"s":[100,97,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.262,-1.435],[0,0],[1.345,-0.897],[-0.044,-4.985],[0,0],[-9.197,-14.632],[-1.207,0.307]],"o":[[0,0],[0.278,-6.501],[0,0],[-1.557,0.357],[-4.148,2.766],[0,0],[0.045,5.059],[1.147,0.153],[0,0]],"v":[[135.781,91.782],[145.245,-150.133],[134.41,-159.315],[-134.447,-97.21],[-138.828,-95.291],[-145.256,-82.737],[-143.551,110.732],[-135.398,159.515],[-131.847,159.315]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[249.77,335.347]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":80},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.351,-1.456],[0,0],[1.364,-0.909],[-0.045,-5.056],[0,0],[-9.328,-14.84],[-1.224,0.311]],"o":[[0,0],[0.282,-6.594],[0,0],[-1.579,0.362],[-4.207,2.805],[0,0],[0.045,5.131],[1.163,0.155],[0,0]],"v":[[137.715,93.09],[147.314,-152.271],[136.324,-161.584],[-136.362,-98.595],[-140.805,-96.649],[-147.325,-83.915],[-145.596,112.309],[-137.327,161.787],[-133.725,161.584]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[249.175,333.823]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":70},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.44,-1.476],[0,0],[1.383,-0.922],[-0.045,-5.127],[0,0],[-9.459,-15.049],[-1.241,0.316]],"o":[[0,0],[0.285,-6.686],[0,0],[-1.601,0.367],[-4.266,2.845],[0,0],[0.046,5.203],[1.179,0.158],[0,0]],"v":[[139.649,94.397],[149.383,-154.41],[138.239,-163.853],[-138.277,-99.979],[-142.783,-98.006],[-149.394,-85.094],[-147.64,113.886],[-139.255,164.059],[-135.603,163.853]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[248.581,332.3]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":60},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.529,-1.497],[0,0],[1.402,-0.935],[-0.046,-5.198],[0,0],[-9.59,-15.257],[-1.259,0.32]],"o":[[0,0],[0.289,-6.779],[0,0],[-1.623,0.372],[-4.325,2.884],[0,0],[0.046,5.275],[1.196,0.16],[0,0]],"v":[[141.583,95.704],[151.452,-156.548],[140.153,-166.122],[-140.192,-101.364],[-144.76,-99.363],[-151.463,-86.272],[-149.685,115.463],[-141.184,166.331],[-137.481,166.122]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[247.987,330.777]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.618,-1.517],[0,0],[1.421,-0.948],[-0.046,-5.269],[0,0],[-9.721,-15.465],[-1.276,0.324]],"o":[[0,0],[0.293,-6.871],[0,0],[-1.646,0.378],[-4.384,2.924],[0,0],[0.047,5.348],[1.212,0.162],[0,0]],"v":[[143.517,97.012],[153.521,-158.686],[142.068,-168.391],[-142.107,-102.748],[-146.738,-100.72],[-153.532,-87.451],[-151.73,117.041],[-143.113,168.604],[-139.359,168.392]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[247.393,329.253]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.708,-1.537],[0,0],[1.44,-0.961],[-0.047,-5.34],[0,0],[-9.852,-15.674],[-1.293,0.329]],"o":[[0,0],[0.297,-6.964],[0,0],[-1.668,0.383],[-4.443,2.963],[0,0],[0.048,5.42],[1.228,0.164],[0,0]],"v":[[145.451,98.319],[155.589,-160.825],[143.982,-170.661],[-144.022,-104.133],[-148.715,-102.078],[-155.601,-88.629],[-153.774,118.618],[-145.041,170.876],[-141.237,170.661]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[246.799,327.73]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":30},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.797,-1.558],[0,0],[1.46,-0.973],[-0.048,-5.411],[0,0],[-9.983,-15.882],[-1.31,0.333]],"o":[[0,0],[0.301,-7.056],[0,0],[-1.69,0.388],[-4.502,3.002],[0,0],[0.048,5.492],[1.245,0.166],[0,0]],"v":[[147.385,99.626],[157.658,-162.963],[145.897,-172.93],[-145.937,-105.518],[-150.693,-103.435],[-157.67,-89.807],[-155.819,120.195],[-146.97,173.148],[-143.115,172.93]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[246.204,326.207]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":20},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.886,-1.578],[0,0],[1.479,-0.986],[-0.048,-5.482],[0,0],[-10.114,-16.091],[-1.327,0.337]],"o":[[0,0],[0.305,-7.149],[0,0],[-1.712,0.393],[-4.561,3.042],[0,0],[0.049,5.564],[1.261,0.168],[0,0]],"v":[[149.319,100.934],[159.727,-165.102],[147.811,-175.199],[-147.852,-106.902],[-152.67,-104.792],[-159.739,-90.986],[-157.864,121.772],[-148.898,175.42],[-144.993,175.199]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[245.61,324.684]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":10},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.975,-1.599],[0,0],[1.498,-0.999],[-0.049,-5.553],[0,0],[-10.245,-16.299],[-1.345,0.342]],"o":[[0,0],[0.309,-7.242],[0,0],[-1.734,0.398],[-4.62,3.081],[0,0],[0.05,5.636],[1.277,0.171],[0,0]],"v":[[151.253,102.241],[161.796,-167.24],[149.726,-177.468],[-149.767,-108.287],[-154.647,-106.15],[-161.808,-92.164],[-159.909,123.349],[-150.827,177.692],[-146.871,177.468]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[245.016,323.16]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":0},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"p_shad","parent":39,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.163],"y":[1]},"o":{"x":[0.951],"y":[0]},"t":0,"s":[90]},{"i":{"x":[0.301],"y":[1]},"o":{"x":[0.951],"y":[0]},"t":40,"s":[85]},{"i":{"x":[0.163],"y":[1]},"o":{"x":[0.476],"y":[0]},"t":80,"s":[100]},{"t":120,"s":[90]}]},"p":{"a":1,"k":[{"i":{"x":0.163,"y":0.163},"o":{"x":0.333,"y":0.333},"t":0,"s":[3.569,12.387,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":40,"s":[3.569,12.387,0],"to":[-0.25,-0.583,0],"ti":[0,0,0]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[2.069,8.887,0],"to":[0,0,0],"ti":[-0.25,-0.583,0]},{"t":120,"s":[3.569,12.387,0]}]},"a":{"a":0,"k":[245.016,323.16,0]},"s":{"a":1,"k":[{"i":{"x":[0.163,0.163,0.163],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,97,100]},{"i":{"x":[0.301,0.301,0.301],"y":[1,1,1]},"o":{"x":[0.951,0.951,0.951],"y":[0,0,0]},"t":40,"s":[100,97,100]},{"i":{"x":[0.223,0.223,0.223],"y":[1,1,1]},"o":{"x":[0.476,0.476,0.476],"y":[0,0,0]},"t":80,"s":[100,100,100]},{"t":120,"s":[100,97,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.262,-1.435],[0,0],[1.345,-0.897],[-0.044,-4.985],[0,0],[-9.197,-14.632],[-1.207,0.307]],"o":[[0,0],[0.278,-6.501],[0,0],[-1.557,0.357],[-4.148,2.766],[0,0],[0.045,5.059],[1.147,0.153],[0,0]],"v":[[135.781,91.782],[145.245,-150.133],[134.41,-159.315],[-134.447,-97.21],[-138.828,-95.291],[-145.256,-82.737],[-143.551,110.732],[-135.398,159.515],[-131.847,159.315]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[249.77,335.347]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":80},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.351,-1.456],[0,0],[1.364,-0.909],[-0.045,-5.056],[0,0],[-9.328,-14.84],[-1.224,0.311]],"o":[[0,0],[0.282,-6.594],[0,0],[-1.579,0.362],[-4.207,2.805],[0,0],[0.045,5.131],[1.163,0.155],[0,0]],"v":[[137.715,93.09],[147.314,-152.271],[136.324,-161.584],[-136.362,-98.595],[-140.805,-96.649],[-147.325,-83.915],[-145.596,112.309],[-137.327,161.787],[-133.725,161.584]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[249.175,333.823]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":70},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.44,-1.476],[0,0],[1.383,-0.922],[-0.045,-5.127],[0,0],[-9.459,-15.049],[-1.241,0.316]],"o":[[0,0],[0.285,-6.686],[0,0],[-1.601,0.367],[-4.266,2.845],[0,0],[0.046,5.203],[1.179,0.158],[0,0]],"v":[[139.649,94.397],[149.383,-154.41],[138.239,-163.853],[-138.277,-99.979],[-142.783,-98.006],[-149.394,-85.094],[-147.64,113.886],[-139.255,164.059],[-135.603,163.853]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[248.581,332.3]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":60},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.529,-1.497],[0,0],[1.402,-0.935],[-0.046,-5.198],[0,0],[-9.59,-15.257],[-1.259,0.32]],"o":[[0,0],[0.289,-6.779],[0,0],[-1.623,0.372],[-4.325,2.884],[0,0],[0.046,5.275],[1.196,0.16],[0,0]],"v":[[141.583,95.704],[151.452,-156.548],[140.153,-166.122],[-140.192,-101.364],[-144.76,-99.363],[-151.463,-86.272],[-149.685,115.463],[-141.184,166.331],[-137.481,166.122]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[247.987,330.777]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.618,-1.517],[0,0],[1.421,-0.948],[-0.046,-5.269],[0,0],[-9.721,-15.465],[-1.276,0.324]],"o":[[0,0],[0.293,-6.871],[0,0],[-1.646,0.378],[-4.384,2.924],[0,0],[0.047,5.348],[1.212,0.162],[0,0]],"v":[[143.517,97.012],[153.521,-158.686],[142.068,-168.391],[-142.107,-102.748],[-146.738,-100.72],[-153.532,-87.451],[-151.73,117.041],[-143.113,168.604],[-139.359,168.392]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[247.393,329.253]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.708,-1.537],[0,0],[1.44,-0.961],[-0.047,-5.34],[0,0],[-9.852,-15.674],[-1.293,0.329]],"o":[[0,0],[0.297,-6.964],[0,0],[-1.668,0.383],[-4.443,2.963],[0,0],[0.048,5.42],[1.228,0.164],[0,0]],"v":[[145.451,98.319],[155.589,-160.825],[143.982,-170.661],[-144.022,-104.133],[-148.715,-102.078],[-155.601,-88.629],[-153.774,118.618],[-145.041,170.876],[-141.237,170.661]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[246.799,327.73]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":30},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.797,-1.558],[0,0],[1.46,-0.973],[-0.048,-5.411],[0,0],[-9.983,-15.882],[-1.31,0.333]],"o":[[0,0],[0.301,-7.056],[0,0],[-1.69,0.388],[-4.502,3.002],[0,0],[0.048,5.492],[1.245,0.166],[0,0]],"v":[[147.385,99.626],[157.658,-162.963],[145.897,-172.93],[-145.937,-105.518],[-150.693,-103.435],[-157.67,-89.807],[-155.819,120.195],[-146.97,173.148],[-143.115,172.93]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[246.204,326.207]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":20},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.886,-1.578],[0,0],[1.479,-0.986],[-0.048,-5.482],[0,0],[-10.114,-16.091],[-1.327,0.337]],"o":[[0,0],[0.305,-7.149],[0,0],[-1.712,0.393],[-4.561,3.042],[0,0],[0.049,5.564],[1.261,0.168],[0,0]],"v":[[149.319,100.934],[159.727,-165.102],[147.811,-175.199],[-147.852,-106.902],[-152.67,-104.792],[-159.739,-90.986],[-157.864,121.772],[-148.898,175.42],[-144.993,175.199]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[245.61,324.684]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":10},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[6.975,-1.599],[0,0],[1.498,-0.999],[-0.049,-5.553],[0,0],[-10.245,-16.299],[-1.345,0.342]],"o":[[0,0],[0.309,-7.242],[0,0],[-1.734,0.398],[-4.62,3.081],[0,0],[0.05,5.636],[1.277,0.171],[0,0]],"v":[[151.253,102.241],[161.796,-167.24],[149.726,-177.468],[-149.767,-108.287],[-154.647,-106.15],[-161.808,-92.164],[-159.909,123.349],[-150.827,177.692],[-146.871,177.468]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.396078437567,0.458823531866,0.509803950787,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[245.016,323.16]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":0},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"p_bl3","parent":39,"sr":1,"ks":{"p":{"a":0,"k":[74.699,-161.22,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-82.422,18.892],[82.422,-18.892]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.929411768913,0.933333337307,0.945098042488,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"p_bl2","parent":39,"sr":1,"ks":{"o":{"a":0,"k":40},"p":{"a":0,"k":[-158.75,9.661,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.076,8.644],[0,0]],"o":[[-1.278,-9.446],[0,0],[0,0]],"v":[[1.961,145.088],[0.34,115.925],[-1.961,-145.088]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.929411768913,0.933333337307,0.945098042488,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"p_bl1","parent":39,"sr":1,"ks":{"o":{"a":0,"k":25},"p":{"a":0,"k":[-10.378,135.807,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[145.485,-37.034],[-145.485,37.034]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.929411768913,0.933333337307,0.945098042488,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":38,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.163,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[240.867,414.113,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.301,"y":1},"o":{"x":0.951,"y":0},"t":54,"s":[240.867,403.213,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.223,"y":1},"o":{"x":0.476,"y":0},"t":80,"s":[240.867,422.833,0],"to":[0,0,0],"ti":[0,0,0]},{"t":119,"s":[240.867,414.113,0]}]},"a":{"a":0,"k":[60,60,0]},"s":{"a":0,"k":[109,109,100]}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"papk1","parent":38,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":64,"s":[60,60,0],"to":[0.303,12.479,0],"ti":[0.428,9.354,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":71.084,"s":[60,60,0],"to":[0.447,12.021,0],"ti":[0.322,8.271,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77.5,"s":[60,60,0],"to":[0.303,12.479,0],"ti":[0.178,3.979,0]},{"t":83,"s":[60,60,0]}]},"a":{"a":0,"k":[0,144.248,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.258,6.055],[0,0],[6.31,-1.446],[0,0],[-0.073,5.112],[0,0],[6.333,-1.453],[0,0],[-0.058,-6.533],[0,0],[-7.065,-16.479],[-5.052,1.289]],"o":[[6.051,-1.378],[0,0],[0.28,-6.551],[0,0],[-4.812,1.103],[0,0],[0.093,-6.574],[0,0],[-6.323,1.45],[0,0],[0.043,4.885],[7.129,16.628],[0,0]],"v":[[144.859,112.603],[156.283,99.152],[166.7,-176.707],[155.78,-185.961],[-9.063,-148.178],[-18.293,-155.977],[-18.097,-169.807],[-29.394,-179.09],[-155.367,-149.84],[-166.711,-135.375],[-164.411,125.639],[-158.249,172.856],[-139.624,185.173]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.705882370472,0.721568644047,0.741176486015,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":120,"st":0,"bm":0}]} \ No newline at end of file diff --git a/messenger-client/app/src/main/assets/folders.json b/messenger-client/app/src/main/assets/folders.json new file mode 100644 index 0000000..8f5315a --- /dev/null +++ b/messenger-client/app/src/main/assets/folders.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":180,"w":512,"h":512,"nm":"11_docs_3_perebor_v1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[256.072,425.476,0]},"a":{"a":0,"k":[60,60,0]}},"ao":0,"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 11","parent":1,"sr":1,"ks":{"p":{"a":0,"k":[59.374,144.509,0]},"a":{"a":0,"k":[255.446,479.986,0]},"s":{"a":1,"k":[{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.67,0.67,0.67],"y":[0,0,0]},"t":6,"s":[106,92,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.873,0.888,0.67],"y":[0,0,0]},"t":139,"s":[106,92,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":156,"s":[100,104,100]},{"t":170,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0.274,0.959],[0,0],[2.8,0],[0,0],[1.071,-2.012],[0,0],[3.912,-2.788]],"o":[[-0.482,-0.836],[0,0],[-0.773,-2.691],[0,0],[-2.339,0],[0,0],[-2.381,4.367],[0,0]],"v":[[56.339,13.151],[55.194,10.452],[49.747,-8.581],[43.677,-13.151],[-34.539,-13.151],[-40.085,-9.857],[-46.732,2.335],[-56.339,13.151]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":6,"s":[{"i":[[0,0],[0.274,0.959],[0,0],[2.8,0],[0,0],[1.071,-2.012],[0,0],[3.912,-2.788]],"o":[[-0.482,-0.836],[0,0],[-0.773,-2.691],[0,0],[-2.339,0],[0,0],[-2.381,4.367],[0,0]],"v":[[56.339,13.151],[55.194,10.452],[49.747,-8.581],[43.677,-13.151],[-34.539,-13.151],[-40.085,-9.857],[-46.732,2.335],[-56.339,13.151]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.67,"y":0},"t":139,"s":[{"i":[[0,0],[0.274,0.959],[0,0],[2.8,0],[0,0],[1.071,-2.012],[0,0],[3.912,-2.788]],"o":[[-0.482,-0.836],[0,0],[-0.773,-2.691],[0,0],[-2.339,0],[0,0],[-2.381,4.367],[0,0]],"v":[[56.339,13.151],[55.194,10.452],[49.747,-8.581],[43.677,-13.151],[-34.539,-13.151],[-40.085,-9.857],[-46.732,2.335],[-56.339,13.151]],"c":true}]},{"t":166,"s":[{"i":[[0,0],[0.274,0.959],[0,0],[2.8,0],[0,0],[1.071,-2.012],[0,0],[3.912,-2.788]],"o":[[-0.482,-0.836],[0,0],[-0.773,-2.691],[0,0],[-2.339,0],[0,0],[-2.381,4.367],[0,0]],"v":[[56.339,13.151],[55.194,10.452],[49.747,-8.581],[43.677,-13.151],[-34.539,-13.151],[-40.085,-9.857],[-46.732,2.335],[-56.339,13.151]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.101960785687,0.188235297799,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[401.878,166.98]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0.385,0.956],[2.888,0],[0,0],[1.474,5.149],[0,0],[2.8,0],[0,0],[1.071,-2.012],[0,0],[11.806,0],[0,0],[0.944,-0.412],[-0.081,-2.887],[0,0],[-3.925,0],[0,0],[-0.11,3.923]],"o":[[0.029,-1.03],[-1.157,-2.868],[0,0],[-5.356,0],[0,0],[-0.773,-2.691],[0,0],[-2.339,0],[0,0],[-5.652,10.366],[0,0],[-1.03,0],[-2.834,1.237],[0,0],[0.11,3.923],[0,0],[3.925,0],[0,0]],"v":[[226.94,-117.16],[226.449,-120.186],[219.697,-124.776],[213.162,-124.776],[201.625,-133.475],[196.178,-152.508],[190.108,-157.078],[111.892,-157.078],[106.346,-153.784],[99.699,-141.592],[71.378,-124.776],[-219.53,-124.776],[-222.541,-124.201],[-226.941,-117.323],[-219.444,150.031],[-212.197,157.078],[212.2,157.078],[219.448,150.031]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":6,"s":[{"i":[[0,0],[0.385,0.956],[2.888,0],[0,0],[1.474,5.149],[0,0],[2.8,0],[0,0],[1.071,-2.012],[0,0],[11.806,0],[0,0],[0.944,-0.412],[-0.081,-2.887],[0,0],[-3.925,0],[0,0],[-0.11,3.923]],"o":[[0.029,-1.03],[-1.157,-2.868],[0,0],[-5.356,0],[0,0],[-0.773,-2.691],[0,0],[-2.339,0],[0,0],[-5.652,10.366],[0,0],[-1.03,0],[-2.834,1.237],[0,0],[0.11,3.923],[0,0],[3.925,0],[0,0]],"v":[[226.94,-117.16],[226.449,-120.186],[219.697,-124.776],[213.162,-124.776],[201.625,-133.475],[196.178,-152.508],[190.108,-157.078],[111.892,-157.078],[106.346,-153.784],[99.699,-141.592],[71.378,-124.776],[-219.53,-124.776],[-222.541,-124.201],[-226.941,-117.323],[-207.194,150.031],[-199.947,157.078],[199.969,157.078],[207.216,150.031]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.67,"y":0},"t":139,"s":[{"i":[[0,0],[0.385,0.956],[2.888,0],[0,0],[1.474,5.149],[0,0],[2.8,0],[0,0],[1.071,-2.012],[0,0],[11.806,0],[0,0],[0.944,-0.412],[-0.081,-2.887],[0,0],[-3.925,0],[0,0],[-0.11,3.923]],"o":[[0.029,-1.03],[-1.157,-2.868],[0,0],[-5.356,0],[0,0],[-0.773,-2.691],[0,0],[-2.339,0],[0,0],[-5.652,10.366],[0,0],[-1.03,0],[-2.834,1.237],[0,0],[0.11,3.923],[0,0],[3.925,0],[0,0]],"v":[[226.94,-117.16],[226.449,-120.186],[219.697,-124.776],[213.162,-124.776],[201.625,-133.475],[196.178,-152.508],[190.108,-157.078],[111.892,-157.078],[106.346,-153.784],[99.699,-141.592],[71.378,-124.776],[-219.53,-124.776],[-222.541,-124.201],[-226.941,-117.323],[-207.194,150.031],[-199.947,157.078],[199.969,157.078],[207.216,150.031]],"c":true}]},{"t":166,"s":[{"i":[[0,0],[0.385,0.956],[2.888,0],[0,0],[1.474,5.149],[0,0],[2.8,0],[0,0],[1.071,-2.012],[0,0],[11.806,0],[0,0],[0.944,-0.412],[-0.081,-2.887],[0,0],[-3.925,0],[0,0],[-0.11,3.923]],"o":[[0.029,-1.03],[-1.157,-2.868],[0,0],[-5.356,0],[0,0],[-0.773,-2.691],[0,0],[-2.339,0],[0,0],[-5.652,10.366],[0,0],[-1.03,0],[-2.834,1.237],[0,0],[0.11,3.923],[0,0],[3.925,0],[0,0]],"v":[[226.94,-117.16],[226.449,-120.186],[219.697,-124.776],[213.162,-124.776],[201.625,-133.475],[196.178,-152.508],[190.108,-157.078],[111.892,-157.078],[106.346,-153.784],[99.699,-141.592],[71.378,-124.776],[-219.53,-124.776],[-222.541,-124.201],[-226.941,-117.323],[-219.444,150.031],[-212.197,157.078],[212.2,157.078],[219.448,150.031]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.773,0.612,0.5,0.893,0.721,0.537,1,0.848,0.669,0.462]}},"s":{"a":0,"k":[-0.447,-157.907]},"e":{"a":0,"k":[-0.447,156.249]},"t":1,"nm":"gr1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.447,310.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0.737,2.575],[0,0],[5.461,0],[0,0],[2.099,-3.941],[0,0],[9.61,0]],"o":[[-2.678,0],[0,0],[-1.508,-5.248],[0,0],[-4.561,0],[0,0],[-4.6,8.438],[0,0]],"v":[[70.892,16.151],[65.124,11.802],[59.674,-7.238],[47.837,-16.151],[-30.378,-16.151],[-41.192,-9.729],[-47.839,2.463],[-70.892,16.151]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":6,"s":[{"i":[[0,0],[0.737,2.575],[0,0],[5.461,0],[0,0],[2.099,-3.941],[0,0],[9.61,0]],"o":[[-2.678,0],[0,0],[-1.508,-5.248],[0,0],[-4.561,0],[0,0],[-4.6,8.438],[0,0]],"v":[[70.892,16.151],[65.124,11.802],[59.674,-7.238],[47.837,-16.151],[-30.378,-16.151],[-41.192,-9.729],[-47.839,2.463],[-70.892,16.151]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.67,"y":0},"t":139,"s":[{"i":[[0,0],[0.737,2.575],[0,0],[5.461,0],[0,0],[2.099,-3.941],[0,0],[9.61,0]],"o":[[-2.678,0],[0,0],[-1.508,-5.248],[0,0],[-4.561,0],[0,0],[-4.6,8.438],[0,0]],"v":[[70.892,16.151],[65.124,11.802],[59.674,-7.238],[47.837,-16.151],[-30.378,-16.151],[-41.192,-9.729],[-47.839,2.463],[-70.892,16.151]],"c":true}]},{"t":166,"s":[{"i":[[0,0],[0.737,2.575],[0,0],[5.461,0],[0,0],[2.099,-3.941],[0,0],[9.61,0]],"o":[[-2.678,0],[0,0],[-1.508,-5.248],[0,0],[-4.561,0],[0,0],[-4.6,8.438],[0,0]],"v":[[70.892,16.151],[65.124,11.802],[59.674,-7.238],[47.837,-16.151],[-30.378,-16.151],[-41.192,-9.729],[-47.839,2.463],[-70.892,16.151]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.388235300779,0.478431373835,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[397.717,163.98]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0.203,7.221],[0,0],[-5.009,2.188],[-1.955,0],[0,0],[-4.6,8.438],[0,0],[-4.561,0],[0,0],[-1.508,-5.248],[0,0],[-2.678,0],[0,0],[-2.048,-5.068],[0.056,-1.95],[0,0],[7.224,0]],"o":[[-7.224,0],[0,0],[-0.15,-5.435],[1.635,-0.714],[0,0],[9.61,0],[0,0],[2.099,-3.941],[0,0],[5.461,0],[0,0],[0.737,2.575],[0,0],[5.434,0],[0.67,1.664],[0,0],[-0.203,7.222],[0,0]],"v":[[-212.196,163.078],[-225.442,150.2],[-232.939,-117.155],[-224.941,-129.7],[-219.53,-130.776],[71.379,-130.776],[94.432,-144.465],[101.079,-156.656],[111.892,-163.078],[190.108,-163.078],[201.945,-154.165],[207.394,-135.126],[213.163,-130.776],[219.698,-130.776],[232.014,-122.434],[232.937,-116.989],[225.446,150.199],[212.201,163.078]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":6,"s":[{"i":[[0,0],[0.203,7.221],[0,0],[-5.009,2.188],[-1.955,0],[0,0],[-4.6,8.438],[0,0],[-4.561,0],[0,0],[-1.508,-5.248],[0,0],[-2.678,0],[0,0],[-2.048,-5.068],[0.056,-1.95],[0,0],[7.224,0]],"o":[[-7.224,0],[0,0],[-0.15,-5.435],[1.635,-0.714],[0,0],[9.61,0],[0,0],[2.099,-3.941],[0,0],[5.461,0],[0,0],[0.737,2.575],[0,0],[5.434,0],[0.67,1.664],[0,0],[-0.203,7.222],[0,0]],"v":[[-199.947,163.078],[-213.192,150.2],[-232.939,-117.155],[-224.941,-129.7],[-219.53,-130.776],[71.379,-130.776],[94.432,-144.465],[101.079,-156.656],[111.892,-163.078],[190.108,-163.078],[201.945,-154.165],[207.394,-135.126],[213.163,-130.776],[219.698,-130.776],[232.014,-122.434],[232.937,-116.989],[213.215,150.199],[199.97,163.078]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.67,"y":0},"t":139,"s":[{"i":[[0,0],[0.203,7.221],[0,0],[-5.009,2.188],[-1.955,0],[0,0],[-4.6,8.438],[0,0],[-4.561,0],[0,0],[-1.508,-5.248],[0,0],[-2.678,0],[0,0],[-2.048,-5.068],[0.056,-1.95],[0,0],[7.224,0]],"o":[[-7.224,0],[0,0],[-0.15,-5.435],[1.635,-0.714],[0,0],[9.61,0],[0,0],[2.099,-3.941],[0,0],[5.461,0],[0,0],[0.737,2.575],[0,0],[5.434,0],[0.67,1.664],[0,0],[-0.203,7.222],[0,0]],"v":[[-199.947,163.078],[-213.192,150.2],[-232.939,-117.155],[-224.941,-129.7],[-219.53,-130.776],[71.379,-130.776],[94.432,-144.465],[101.079,-156.656],[111.892,-163.078],[190.108,-163.078],[201.945,-154.165],[207.394,-135.126],[213.163,-130.776],[219.698,-130.776],[232.014,-122.434],[232.937,-116.989],[213.215,150.199],[199.97,163.078]],"c":true}]},{"t":166,"s":[{"i":[[0,0],[0.203,7.221],[0,0],[-5.009,2.188],[-1.955,0],[0,0],[-4.6,8.438],[0,0],[-4.561,0],[0,0],[-1.508,-5.248],[0,0],[-2.678,0],[0,0],[-2.048,-5.068],[0.056,-1.95],[0,0],[7.224,0]],"o":[[-7.224,0],[0,0],[-0.15,-5.435],[1.635,-0.714],[0,0],[9.61,0],[0,0],[2.099,-3.941],[0,0],[5.461,0],[0,0],[0.737,2.575],[0,0],[5.434,0],[0.67,1.664],[0,0],[-0.203,7.222],[0,0]],"v":[[-212.196,163.078],[-225.442,150.2],[-232.939,-117.155],[-224.941,-129.7],[-219.53,-130.776],[71.379,-130.776],[94.432,-144.465],[101.079,-156.656],[111.892,-163.078],[190.108,-163.078],[201.945,-154.165],[207.394,-135.126],[213.163,-130.776],[219.698,-130.776],[232.014,-122.434],[232.937,-116.989],[225.446,150.199],[212.201,163.078]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.96,0.813,0.684,0.5,0.932,0.777,0.642,1,0.904,0.742,0.599]}},"s":{"a":0,"k":[100.277,-119.562]},"e":{"a":0,"k":[99.98,161.562]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.446,310.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[3.125,-5.87],[0,0],[7.426,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-6.783,0],[0,0],[-3.555,6.52],[0,0],[0,0],[0,0],[0,0]],"v":[[41.63,-27.078],[6.526,-27.078],[-9.555,-17.528],[-16.194,-5.353],[-34.008,5.224],[-41.63,5.224],[-41.63,27.078],[41.628,27.078]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":6,"s":[{"i":[[0,0],[0,0],[3.125,-5.87],[0,0],[7.426,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-6.783,0],[0,0],[-3.555,6.52],[0,0],[0,0],[0,0],[0,0]],"v":[[41.63,-27.078],[6.526,-27.078],[-9.555,-17.528],[-16.194,-5.353],[-34.008,5.224],[-41.63,5.224],[-41.63,27.078],[41.628,27.078]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.67,"y":0},"t":139,"s":[{"i":[[0,0],[0,0],[3.125,-5.87],[0,0],[7.426,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-6.783,0],[0,0],[-3.555,6.52],[0,0],[0,0],[0,0],[0,0]],"v":[[41.63,-27.078],[6.526,-27.078],[-9.555,-17.528],[-16.194,-5.353],[-34.008,5.224],[-41.63,5.224],[-41.63,27.078],[41.628,27.078]],"c":true}]},{"t":166,"s":[{"i":[[0,0],[0,0],[3.125,-5.87],[0,0],[7.426,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-6.783,0],[0,0],[-3.555,6.52],[0,0],[0,0],[0,0],[0,0]],"v":[[41.63,-27.078],[6.526,-27.078],[-9.555,-17.528],[-16.194,-5.353],[-34.008,5.224],[-41.63,5.224],[-41.63,27.078],[41.628,27.078]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.78,0.118,0.212,0.5,0.724,0.302,0.253,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[3.187,12.093]},"e":{"a":0,"k":[-11.87,27.149]},"t":1,"nm":"gr2","hd":false},{"ty":"tr","p":{"a":0,"k":[360.813,168.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[8.122,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-2.242,-7.805],[0,0],[0,0]],"v":[[-35.767,27.078],[35.767,27.078],[35.767,5.224],[30.401,5.224],[24.95,-13.822],[7.346,-27.078],[-35.766,-27.078]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":6,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[8.122,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-2.242,-7.805],[0,0],[0,0]],"v":[[-35.767,27.078],[35.767,27.078],[35.767,5.224],[30.401,5.224],[24.95,-13.822],[7.346,-27.078],[-35.766,-27.078]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.67,"y":0},"t":139,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[8.122,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-2.242,-7.805],[0,0],[0,0]],"v":[[-35.767,27.078],[35.767,27.078],[35.767,5.224],[30.401,5.224],[24.95,-13.822],[7.346,-27.078],[-35.766,-27.078]],"c":true}]},{"t":166,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[8.122,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-2.242,-7.805],[0,0],[0,0]],"v":[[-35.767,27.078],[35.767,27.078],[35.767,5.224],[30.401,5.224],[24.95,-13.822],[7.346,-27.078],[-35.766,-27.078]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.78,0.118,0.212,0.5,0.724,0.302,0.253,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[3.792,14.093]},"e":{"a":0,"k":[13.596,23.897]},"t":1,"nm":"gr3","hd":false},{"ty":"tr","p":{"a":0,"k":[438.208,168.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[-7.262,3.171],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[-2.969,-7.347],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[7.893,0],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-212.196,169.078],[-231.44,150.369],[-238.937,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-147.336],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[207.712,-155.822],[213.163,-136.776],[219.698,-136.776],[237.577,-124.682],[238.935,-116.818],[231.444,150.367],[212.201,169.078]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":6,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[-7.262,3.171],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[-2.969,-7.347],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[7.893,0],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-199.947,169.078],[-219.19,150.369],[-238.937,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-147.336],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[207.712,-155.822],[213.163,-136.776],[219.698,-136.776],[237.577,-124.682],[238.935,-116.818],[219.213,150.367],[199.97,169.078]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.67,"y":0},"t":139,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[-7.262,3.171],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[-2.969,-7.347],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[7.893,0],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-199.947,169.078],[-219.19,150.369],[-238.937,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-147.336],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[207.712,-155.822],[213.163,-136.776],[219.698,-136.776],[237.577,-124.682],[238.935,-116.818],[219.213,150.367],[199.97,169.078]],"c":true}]},{"t":166,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[-7.262,3.171],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[-2.969,-7.347],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[7.893,0],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-212.196,169.078],[-231.44,150.369],[-238.937,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-147.336],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[207.712,-155.822],[213.163,-136.776],[219.698,-136.776],[237.577,-124.682],[238.935,-116.818],[231.444,150.367],[212.201,169.078]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.446,310.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 19","parent":2,"sr":1,"ks":{"o":{"a":0,"k":33},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":59,"s":[255.446,467.986,0],"to":[0,1.993,0],"ti":[0,-1.993,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":65,"s":[255.446,479.942,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":142,"s":[255.446,479.942,0],"to":[0,-1.993,0],"ti":[0,1.993,0]},{"t":170,"s":[255.446,467.986,0]}]},"a":{"a":0,"k":[255.446,479.986,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.256,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,0.251],[0,0],[0,0],[0,0],[-2.439,-1.1],[-1.915,-4.739],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,0.189],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-199.946,169.078],[-219.19,150.369],[-226.687,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-147.336],[91.155,-150.988],[95.811,-150.714],[111.892,-150.407],[190.108,-150.407],[207.712,-150.833],[209.548,-149.406],[213.163,-136.776],[219.698,-136.776],[227.63,-135.078],[227.577,-124.682],[228.935,-116.818],[221.444,150.367],[202.201,169.078]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[0,0],[-2.439,-1.1],[-1.915,-4.739],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-186.503,169.078],[-205.746,150.369],[-213.243,-116.987],[-213.899,-135.198],[-206.087,-136.776],[71.379,-136.776],[89.164,-147.336],[90.596,-149.963],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[207.712,-155.822],[209.151,-150.794],[213.163,-136.776],[212.623,-136.75],[214.187,-135.078],[214.134,-124.682],[215.492,-116.818],[208.001,150.367],[188.758,169.078]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[0,0],[-2.439,-1.1],[0.068,-5.803],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[-0.031,2.628],[0,0],[-0.296,10.492],[0,0]],"v":[[-186.503,169.078],[-205.746,150.369],[-217.96,-116.987],[-218.616,-135.198],[-206.087,-136.776],[71.379,-136.776],[89.164,-147.336],[90.596,-149.963],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[207.712,-155.822],[209.151,-150.794],[213.163,-136.776],[212.623,-136.75],[218.432,-134.983],[217.907,-124.517],[219.266,-116.653],[208.001,150.367],[188.758,169.078]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":26,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.115,7.14],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.296,10.492],[0,0]],"v":[[-186.995,169.078],[-206.239,150.369],[-213.068,-116.737],[-213.275,-134.948],[-206.579,-136.776],[71.379,-136.776],[89.164,-147.336],[90.596,-149.963],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[204.41,-155.82],[204.152,-150.783],[203.432,-136.741],[203.352,-136.716],[205.019,-134.951],[204.979,-124.488],[205.363,-116.625],[201.336,150.367],[182.093,169.078]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":34,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.115,7.14],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.296,10.492],[0,0]],"v":[[-186.995,169.078],[-206.239,150.369],[-213.068,-116.737],[-213.275,-134.948],[-206.579,-136.776],[71.379,-136.776],[89.164,-147.336],[90.596,-149.963],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[204.41,-155.82],[204.152,-150.783],[203.432,-136.741],[203.352,-136.716],[205.019,-134.951],[204.979,-124.488],[205.363,-116.625],[201.336,150.367],[182.093,169.078]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":49,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[0,0],[-2.439,-1.1],[0.068,-5.803],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[-0.031,2.628],[0,0],[-0.296,10.492],[0,0]],"v":[[-186.503,169.078],[-205.746,150.369],[-217.96,-116.987],[-218.616,-135.198],[-206.087,-136.776],[71.379,-136.776],[89.164,-147.336],[90.596,-149.963],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[207.712,-155.822],[209.151,-150.794],[213.163,-136.776],[212.623,-136.75],[218.432,-134.983],[217.907,-124.517],[219.266,-116.653],[208.001,150.367],[188.758,169.078]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":59,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,-7.805],[0,0],[0,0],[0,0],[-2.439,-1.1],[-1.915,-4.739],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,-5.87],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-186.503,169.078],[-205.746,150.369],[-213.243,-116.987],[-213.899,-135.198],[-206.087,-136.776],[71.379,-136.776],[89.164,-147.336],[90.596,-149.963],[95.811,-159.528],[111.892,-169.078],[190.108,-169.078],[207.712,-155.822],[209.151,-150.794],[213.163,-136.776],[212.623,-136.75],[214.187,-135.078],[214.134,-124.682],[215.492,-116.818],[208.001,150.367],[188.758,169.078]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":65,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,4.932],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,0.19],[0,0],[0,0],[0,0],[-2.439,-1.1],[-1.915,-4.739],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,0.143],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-199.946,169.078],[-219.19,150.369],[-226.687,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-145.759],[91.155,-148.526],[95.811,-148.318],[111.892,-148.086],[190.108,-148.086],[207.712,-148.408],[209.548,-147.327],[213.163,-136.776],[219.698,-136.776],[227.63,-135.078],[227.577,-124.682],[228.935,-116.818],[221.444,150.367],[202.201,169.078]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":142,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,4.932],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,0.19],[0,0],[0,0],[0,0],[-2.439,-1.1],[-1.915,-4.739],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,0.143],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-199.946,169.078],[-219.19,150.369],[-226.687,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-145.759],[91.155,-148.526],[95.811,-148.318],[111.892,-148.086],[190.108,-148.086],[207.712,-148.408],[209.548,-147.327],[213.163,-136.776],[219.698,-136.776],[227.63,-135.078],[227.577,-124.682],[228.935,-116.818],[221.444,150.367],[202.201,169.078]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":157,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,0.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,0.02],[0,0],[0,0],[0,0],[-2.439,-1.1],[-1.915,-4.739],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,0.015],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-199.946,169.078],[-219.19,150.369],[-226.687,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-141.336],[91.155,-141.621],[95.811,-141.6],[111.892,-141.576],[190.108,-141.576],[207.712,-141.609],[209.548,-141.497],[213.163,-136.776],[219.698,-136.776],[227.63,-135.078],[227.577,-124.682],[228.935,-116.818],[221.444,150.367],[202.201,169.078]],"c":true}]},{"t":170,"s":[{"i":[[0,0],[0.296,10.491],[0,0],[0.396,7.291],[-2.786,0],[0,0],[-3.549,6.509],[0,0],[0,0],[-6.783,0],[0,0],[-2.242,0.251],[0,0],[0,0],[0,0],[-2.439,-1.1],[-1.915,-4.739],[0.079,-2.781],[0,0],[10.495,0]],"o":[[-10.495,0],[0,0],[-0.218,-7.893],[2.397,-1.047],[0,0],[7.414,0],[0,0],[0,0],[3.125,0.189],[0,0],[8.122,0],[0,0],[0,0],[0,0],[2.802,0],[-0.077,3.67],[0.981,2.438],[0,0],[-0.296,10.492],[0,0]],"v":[[-199.946,169.078],[-219.19,150.369],[-226.687,-116.987],[-227.342,-135.198],[-219.53,-136.776],[71.379,-136.776],[89.164,-147.336],[91.155,-150.988],[95.811,-150.714],[111.892,-150.407],[190.108,-150.407],[207.712,-150.833],[209.548,-149.406],[213.163,-136.776],[219.698,-136.776],[227.63,-135.078],[227.577,-124.682],[228.935,-116.818],[221.444,150.367],[202.201,169.078]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.446,310.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 2","parent":7,"sr":1,"ks":{"p":{"a":0,"k":[256,270.506,0]},"a":{"a":0,"k":[118.5,3.004,0]},"s":{"a":0,"k":[200,200,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.657,0],[0,0],[0,-4.971],[0,0],[-4.823,0],[0,0],[0,0],[-2.761,0.24],[0,0],[-0.009,0.001],[0.158,1.649],[0,0],[0.066,0.322],[0,0],[0,1.657],[0,0]],"o":[[0,0],[-4.971,0],[0,0],[0,4.823],[0,0],[0,0],[0.881,2.627],[0,0],[0.009,-0.001],[1.649,-0.158],[0,0],[-0.032,-0.332],[0,0],[1.657,0],[0,0],[0,-1.657]],"v":[[117,-13.521],[98,-13.521],[89,-4.521],[89,4.511],[97.733,13.245],[101.401,13.245],[105.316,24.916],[111.524,28.985],[113.472,28.815],[113.498,28.813],[116.198,25.541],[115.114,14.226],[114.966,13.245],[117,13.245],[120,10.245],[120,-10.521]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.945],[0,0],[2.94,0],[0.787,0.434],[0,0],[0,1.822],[0,0],[-1.532,0.897],[0,0],[-1.485,-2.537]],"o":[[0,0],[0,2.94],[-0.898,0],[0,0],[-1.596,-0.879],[0,0],[0,-1.775],[0,0],[2.537,-1.485],[0.478,0.816]],"v":[[148,-17.677],[148,16.279],[142.677,21.601],[140.108,20.94],[128.586,14.589],[126,10.211],[126,-11.212],[128.473,-15.527],[139.988,-22.27],[147.27,-20.366]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666666667,0.486274539723,0.294117647059,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 18","parent":1,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":26,"s":[-2.723]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[0]},"t":34,"s":[-2.723]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49,"s":[0]},{"t":59,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":6,"s":[59.626,106.092,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[59.626,106.092,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":0},"o":{"x":1,"y":1},"t":26,"s":[59.626,-30.908,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":34,"s":[59.626,-30.908,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":49,"s":[59.626,106.092,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":59,"s":[59.626,106.092,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":65,"s":[59.626,116.092,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":142,"s":[59.626,116.092,0],"to":[0,0,0],"ti":[0,0,0]},{"t":170,"s":[59.626,106.092,0]}]},"a":{"a":0,"k":[255.698,441.569,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9.631,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[102,98,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[99,101,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[99,101,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":49,"s":[102,98,100]},{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":59,"s":[100,100,100]},{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.67,0.67,0.67],"y":[0,0,0]},"t":65,"s":[107,90,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.67,0.67,0.67],"y":[0,0,0]},"t":142,"s":[107,90,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":157,"s":[100,101,100]},{"t":170,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.37,4.787],[0,0],[1.558,0],[0,0],[0.428,-1.497],[0,0],[3.772,-3.178]],"o":[[-3.588,-3.082],[0,0],[-0.428,-1.497],[0,0],[-1.557,0],[0,0],[-1.429,4.992],[0,0]],"v":[[53.103,12.139],[45.415,0.161],[42.622,-9.597],[39.25,-12.139],[-38.997,-12.139],[-42.368,-9.597],[-45.028,-0.301],[-53.103,12.139]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.219607844949,0.309803932905,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.561,140.144]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.778,0],[0,0],[3.045,10.642],[0,0],[1.558,0],[0,0],[0.428,-1.497],[0,0],[11.354,0],[0,0],[0.043,-4.282],[0,0],[-3.985,0],[0,0],[0,3.985],[0,0]],"o":[[0,0],[-11.069,0],[0,0],[-0.428,-1.497],[0,0],[-1.557,0],[0,0],[-3.123,10.916],[0,0],[-5.487,0],[0,0],[0,3.985],[0,0],[3.985,0],[0,0],[-0.041,-4.137]],"v":[[213.049,-120.503],[71.12,-120.503],[47.277,-138.481],[44.484,-148.24],[41.112,-150.782],[-37.135,-150.782],[-40.506,-148.24],[-43.166,-138.943],[-67.622,-120.503],[-209.049,-120.503],[-218.277,-113.35],[-210.777,143.553],[-203.549,150.782],[203.549,150.782],[210.777,143.553],[218.277,-113.351]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.773,0.612,0.5,0.924,0.751,0.567,1,0.91,0.729,0.522]}},"s":{"a":0,"k":[-0.699,-150.787]},"e":{"a":0,"k":[-0.699,150.777]},"t":1,"nm":"gr4","hd":false},{"ty":"tr","p":{"a":0,"k":[255.699,278.787]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.321,8.114],[0,0],[4.223,0],[0,0],[1.159,-4.057],[0,0],[8.675,0]],"o":[[-8.439,0],[0,0],[-1.16,-4.059],[0,0],[-4.222,0],[0,0],[-2.387,8.341],[0,0]],"v":[[69.412,15.139],[51.233,1.432],[48.464,-8.246],[39.323,-15.139],[-38.924,-15.139],[-48.064,-8.248],[-50.724,1.049],[-69.412,15.139]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380392163992,0.470588237047,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.488,137.144]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.055,7.248],[0,0],[0,0],[-8.748,0],[0,0],[-2.387,8.341],[0,0],[-4.222,0],[0,0],[-1.16,-4.059],[0,0],[-8.439,0],[0,0],[-0.073,-7.373],[0,0],[0,0],[7.261,0]],"o":[[-7.261,0],[0,0],[0,0],[0.076,-7.586],[0,0],[8.676,0],[0,0],[1.159,-4.057],[0,0],[4.223,0],[0,0],[2.321,8.114],[0,0],[5.133,0],[0,0],[0,0],[-0.055,7.248],[0,0]],"v":[[-203.548,156.782],[-216.777,143.655],[-224.278,-113.292],[-224.277,-113.411],[-209.048,-126.503],[-67.622,-126.503],[-48.934,-140.593],[-46.274,-149.89],[-37.134,-156.782],[41.113,-156.782],[50.254,-149.888],[53.023,-140.21],[71.202,-126.503],[213.049,-126.503],[224.278,-113.411],[224.275,-113.176],[216.778,143.655],[203.549,156.782]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.78823530674,0.647058844566,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.698,278.787]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.891,-6.618],[0,0],[5.954,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-6.887,0],[0,0],[-1.638,5.724],[0,0],[0,0],[0,0],[0,0]],"v":[[42.648,-32.471],[3.524,-32.471],[-11.384,-21.23],[-14.065,-11.862],[-26.888,-2.193],[-42.649,-2.193],[-42.649,32.471],[42.649,32.471]],"c":false}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.271,0.329,0.8,0.5,0.469,0.408,0.547,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[14.96,-0.476]},"e":{"a":0,"k":[-9.882,24.366]},"t":1,"nm":"gr5","hd":false},{"ty":"tr","p":{"a":0,"k":[215.04,148.476]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[1.586,5.544],[0,0],[6.887,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-5.767,0],[0,0],[-1.893,-6.62],[0,0],[0,0]],"v":[[-40.658,32.471],[40.658,32.471],[40.658,-2.193],[28.563,-2.193],[16.142,-11.558],[13.375,-21.227],[-1.535,-32.471],[-40.658,-32.471]],"c":false}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.271,0.329,0.8,0.5,0.469,0.408,0.547,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[-8.346,6.524]},"e":{"a":0,"k":[9.628,24.498]},"t":1,"nm":"gr6","hd":false},{"ty":"tr","p":{"a":0,"k":[298.346,148.476]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":59,"s":[{"i":[[0,0],[0.117,10.489],[0,0],[0,0],[-11.993,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-6.62],[0,0],[-5.766,0],[0,0],[-0.101,-10.14],[0,0],[0,0],[10.499,0]],"o":[[-10.499,0],[0,0],[0,0],[0.109,-10.859],[0,0],[5.953,0],[0,0],[1.891,-6.618],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[9.077,0],[0,0],[0,0],[-0.117,10.489],[0,0]],"v":[[-203.548,162.782],[-222.775,143.772],[-230.278,-113.23],[-230.276,-113.461],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.541],[-37.134,-162.782],[41.113,-162.782],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[230.278,-113.47],[230.275,-113.101],[222.777,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":65,"s":[{"i":[[0,0],[0.117,10.489],[0,0],[0,0],[-11.993,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-6.62],[0,0],[-5.766,0],[0,0],[-0.101,-10.14],[0,0],[0,0],[10.499,0]],"o":[[-10.499,0],[0,0],[0,0],[0.109,-10.859],[0,0],[5.953,0],[0,0],[1.891,-6.618],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[9.077,0],[0,0],[0,0],[-0.117,10.489],[0,0]],"v":[[-203.548,162.782],[-213.43,143.772],[-230.278,-113.23],[-230.276,-113.461],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.541],[-37.134,-162.782],[41.113,-162.782],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[230.278,-113.47],[230.275,-113.101],[218.06,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":142,"s":[{"i":[[0,0],[0.117,10.489],[0,0],[0,0],[-11.993,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-6.62],[0,0],[-5.766,0],[0,0],[-0.101,-10.14],[0,0],[0,0],[10.499,0]],"o":[[-10.499,0],[0,0],[0,0],[0.109,-10.859],[0,0],[5.953,0],[0,0],[1.891,-6.618],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[9.077,0],[0,0],[0,0],[-0.117,10.489],[0,0]],"v":[[-203.548,162.782],[-213.43,143.772],[-230.278,-113.23],[-230.276,-113.461],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.541],[-37.134,-162.782],[41.113,-162.782],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[230.278,-113.47],[230.275,-113.101],[218.06,143.772],[203.55,162.782]],"c":true}]},{"t":157,"s":[{"i":[[0,0],[0.117,10.489],[0,0],[0,0],[-11.993,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-6.62],[0,0],[-5.766,0],[0,0],[-0.101,-10.14],[0,0],[0,0],[10.499,0]],"o":[[-10.499,0],[0,0],[0,0],[0.109,-10.859],[0,0],[5.953,0],[0,0],[1.891,-6.618],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[9.077,0],[0,0],[0,0],[-0.117,10.489],[0,0]],"v":[[-203.548,162.782],[-222.775,143.772],[-230.278,-113.23],[-230.276,-113.461],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.541],[-37.134,-162.782],[41.113,-162.782],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[230.278,-113.47],[230.275,-113.101],[222.777,143.772],[203.55,162.782]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.698,278.787]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 23","sr":1,"ks":{"o":{"a":1,"k":[{"t":12,"s":[0],"h":1},{"t":13,"s":[33],"h":1},{"t":49,"s":[0],"h":1}]},"p":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":70,"s":[255.698,461.769,0],"to":[0,1.724,0],"ti":[0,-1.724,0]},{"i":{"x":0.33,"y":0.33},"o":{"x":0.67,"y":0.67},"t":76,"s":[255.698,472.113,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":145,"s":[255.698,472.113,0],"to":[0,-1.724,0],"ti":[0,1.724,0]},{"t":170,"s":[255.698,461.769,0]}]},"a":{"a":0,"k":[255.698,441.569,0]},"s":{"a":0,"k":[102,98,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[0.117,10.489],[0,0],[0,0],[-6.373,3.204],[-3.917,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-6.62],[0,0],[-5.766,0],[0,0],[-1.772,-0.732],[-0.079,-7.982],[0,0],[0,0],[10.499,0]],"o":[[-10.499,0],[0,0],[0,0],[0.074,-7.313],[3.091,-1.554],[0,0],[5.953,0],[0,0],[1.891,-6.618],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[1.932,0],[6.555,2.707],[0,0],[0,0],[-0.117,10.489],[0,0]],"v":[[-203.548,162.782],[-222.775,143.772],[-230.278,-113.23],[-230.276,-113.461],[-219.667,-130.077],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.541],[-37.134,-162.782],[41.113,-162.782],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.639,-131.369],[230.278,-113.47],[230.275,-113.101],[222.777,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,0],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,0],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-145.288],[-37.134,-145.287],[41.113,-145.287],[56.023,-145.288],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]},{"t":13,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-0.292],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,-0.292],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.538],[-37.134,-152.033],[41.113,-152.033],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.698,278.787]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-9,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 9","parent":5,"sr":1,"ks":{"o":{"a":1,"k":[{"t":12,"s":[33],"h":1},{"t":13,"s":[0],"h":1},{"t":49,"s":[33],"h":1}]},"p":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":70,"s":[255.698,431.569,0],"to":[0,1.759,0],"ti":[0,-1.759,0]},{"i":{"x":0.33,"y":0.33},"o":{"x":0.67,"y":0.67},"t":76,"s":[255.698,442.124,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":145,"s":[255.698,442.124,0],"to":[0,-1.759,0],"ti":[0,1.759,0]},{"t":170,"s":[255.698,431.569,0]}]},"a":{"a":0,"k":[255.698,441.569,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,0],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,0],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-145.288],[-37.134,-145.287],[41.113,-145.287],[56.023,-145.288],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-0.292],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,-0.292],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.538],[-37.134,-152.033],[41.113,-152.033],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-0.292],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,-0.292],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.538],[-37.134,-152.033],[41.113,-152.033],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-0.292],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,-0.292],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.019,-145.038],[-37.11,-145.533],[41.137,-145.533],[56.047,-145.038],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":61,"s":[{"i":[[0,0],[0.026,10.489],[0,0],[0,0],[-0.133,4.31],[-1.451,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-8.214],[0,0],[-5.766,0],[0,0],[-0.823,-0.801],[-0.02,-7.876],[0,0],[0,0],[2.671,0]],"o":[[-2.305,0],[0,0],[0,0],[0.017,-7.524],[1.167,-1.384],[0,0],[5.953,0],[0,0],[1.891,-8.212],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[0.903,0],[-0.154,8.222],[0,0],[0,0],[-0.03,10.489],[0,0]],"v":[[-203.548,162.782],[-207.768,143.772],[-209.415,-113.23],[-209.415,-113.461],[-209.676,-130.347],[-205.714,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.541],[-37.134,-165.489],[41.113,-165.489],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[207.785,-132.503],[210.392,-131.259],[210.349,-113.47],[210.348,-113.101],[208.441,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":70,"s":[{"i":[[0,0],[0.026,10.489],[0,0],[0,0],[-0.133,4.31],[-1.451,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-8.214],[0,0],[-5.766,0],[0,0],[-0.823,-0.801],[-0.02,-7.876],[0,0],[0,0],[2.671,0]],"o":[[-2.305,0],[0,0],[0,0],[0.017,-7.524],[1.167,-1.384],[0,0],[5.953,0],[0,0],[1.891,-8.212],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[0.903,0],[-0.154,8.222],[0,0],[0,0],[-0.03,10.489],[0,0]],"v":[[-197.048,162.782],[-201.268,143.772],[-202.915,-113.23],[-202.915,-113.461],[-203.176,-130.347],[-199.214,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-151.541],[-37.134,-165.489],[41.113,-165.489],[56.023,-151.538],[58.79,-141.869],[71.211,-132.503],[201.009,-132.503],[203.616,-131.259],[203.573,-113.47],[203.572,-113.101],[201.665,143.772],[196.774,162.782]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":76,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-0.119],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,-0.119],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-51.932,-144.038],[-37.024,-144.239],[41.224,-144.239],[56.134,-144.038],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":145,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,-0.119],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,-0.119],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-51.932,-144.038],[-37.024,-144.239],[41.224,-144.239],[56.134,-144.038],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]},{"t":170,"s":[{"i":[[0,0],[0.065,10.489],[0,0],[0,0],[-0.339,4.31],[-3.684,0],[0,0],[-1.638,5.724],[0,0],[-6.887,0],[0,0],[-1.893,0],[0,0],[-5.766,0],[0,0],[-1.847,-0.801],[-0.045,-7.876],[0,0],[0,0],[5.991,0]],"o":[[-5.852,0],[0,0],[0,0],[0.042,-7.524],[2.964,-1.384],[0,0],[5.953,0],[0,0],[1.891,0],[0,0],[6.887,0],[0,0],[1.586,5.544],[0,0],[2.026,0],[-0.346,8.222],[0,0],[0,0],[-0.067,10.489],[0,0]],"v":[[-203.548,162.782],[-214.266,143.772],[-218.448,-113.23],[-218.447,-113.461],[-219.109,-130.347],[-209.048,-132.503],[-67.546,-132.503],[-54.723,-142.172],[-52.042,-145.288],[-37.134,-145.287],[41.113,-145.287],[56.023,-145.288],[58.79,-141.869],[71.211,-132.503],[213.05,-132.503],[218.899,-131.259],[218.802,-113.47],[218.801,-113.101],[214.522,143.772],[203.55,162.782]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.698,278.787]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":205,"st":-52,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 7","parent":1,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":70,"s":[59.876,70.309,0],"to":[0,3.5,0],"ti":[0,-3.5,0]},{"i":{"x":0.33,"y":0.33},"o":{"x":0.67,"y":0.67},"t":76,"s":[59.876,91.309,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":145,"s":[59.876,91.309,0],"to":[0,-3.5,0],"ti":[0,3.5,0]},{"t":170,"s":[59.876,70.309,0]}]},"a":{"a":0,"k":[255.948,405.785,0]},"s":{"a":1,"k":[{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":70,"s":[100,100,100]},{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.67,0.67,0.67],"y":[0,0,0]},"t":76,"s":[108,89,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.67,0.67,0.67],"y":[0,0,0]},"t":145,"s":[108,89,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":160,"s":[100,101,100]},{"t":170,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.009,3.722],[0,0],[1.812,0],[0,0],[0.602,-2.101],[0,0],[0.482,-0.836]],"o":[[-3.25,-2.477],[0,0],[-0.86,-1.594],[0,0],[-2.186,0],[0,0],[-0.274,0.96],[0,0]],"v":[[49.032,11.325],[41.018,1.967],[35.24,-8.741],[30.907,-11.325],[-38.466,-11.325],[-43.2,-7.757],[-47.888,8.626],[-49.032,11.325]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.572549045086,0.109803922474,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[122.022,115.745]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.292,0],[0,0],[5.106,9.461],[0,0],[1.812,0],[0,0],[0.602,-2.101],[0,0],[5.356,0],[0,0],[0.044,-4.214],[0,0],[-3.985,0],[0,0],[0,3.985],[0,0]],"o":[[0,0],[-10.751,0],[0,0],[-0.86,-1.594],[0,0],[-2.186,0],[0,0],[-1.473,5.149],[0,0],[-5.107,0],[0,0],[0,3.985],[0,0],[3.985,0],[0,0],[-0.043,-4.152]],"v":[[203.875,-116.032],[-67.168,-116.032],[-92.909,-131.391],[-98.688,-142.099],[-103.021,-144.683],[-172.394,-144.683],[-177.127,-141.114],[-181.815,-124.731],[-193.352,-116.032],[-200.875,-116.032],[-209.603,-108.883],[-202.103,137.454],[-194.875,144.683],[194.875,144.683],[202.103,137.454],[209.603,-108.883]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.773,0.612,0.5,0.924,0.751,0.567,1,0.91,0.729,0.522]}},"s":{"a":0,"k":[-0.949,-145.103]},"e":{"a":0,"k":[-0.949,144.262]},"t":1,"nm":"gr7","hd":false},{"ty":"tr","p":{"a":0,"k":[255.949,249.103]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[4.033,7.474],[0,0],[4.021,0],[0,0],[1.335,-4.662],[0,0],[2.678,0],[0,0]],"o":[[0,0],[-1.909,-3.536],[0,0],[-4.849,0],[0,0],[-0.736,2.574],[0,0],[-8.493,0]],"v":[[42.716,2.193],[36.896,-8.592],[27.283,-14.325],[-42.09,-14.325],[-52.592,-6.407],[-57.281,9.976],[-63.049,14.325],[63.049,14.325]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.686274528503,0.372549027205,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[125.646,112.745]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.058,7.246],[0,0],[0,0],[-8.453,0],[0,0],[-0.737,2.575],[0,0],[-4.849,0],[0,0],[-1.909,-3.536],[0,0],[-8.492,0],[0,0],[-0.064,-6.178],[0,0],[0,0],[7.259,0]],"o":[[-7.259,0],[0,0],[0,0],[0.081,-7.582],[0,0],[2.678,0],[0,0],[1.335,-4.662],[0,0],[4.02,0],[0,0],[4.033,7.474],[0,0],[6.635,0],[0,0],[0,0],[-0.058,7.246],[0,0]],"v":[[-194.875,150.683],[-208.103,137.56],[-215.604,-108.823],[-215.603,-108.947],[-200.875,-122.032],[-193.351,-122.032],[-187.583,-126.381],[-182.895,-142.765],[-172.393,-150.683],[-103.02,-150.683],[-93.407,-144.949],[-87.587,-134.165],[-67.254,-122.032],[203.875,-122.032],[215.604,-108.945],[215.601,-108.7],[208.104,137.56],[194.875,150.683]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.78823530674,0.647058844566,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.948,249.103]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.068,-7.224],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-7.512,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[32.769,-35.78],[-4.963,-35.78],[-21.233,-23.512],[-25.921,-7.13],[-32.774,-7.13],[-32.774,35.78],[32.774,35.78]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.78,0.459,0.11,0.5,0.724,0.473,0.202,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[0.482,8.8]},"e":{"a":0,"k":[-8.222,17.504]},"t":1,"nm":"gr8","hd":false},{"ty":"tr","p":{"a":0,"k":[88.518,128.2]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[2.987,5.535],[0,0],[6.229,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-6.289,0],[0,0],[-2.958,-5.479],[0,0],[0,0]],"v":[[-35.263,35.78],[35.268,35.78],[35.268,-7.13],[32.143,-7.13],[17.085,-16.114],[11.266,-26.897],[-3.626,-35.78],[-35.268,-35.78]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.78,0.459,0.11,0.5,0.724,0.473,0.202,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[-6.555,7.8]},"e":{"a":0,"k":[5.047,19.401]},"t":1,"nm":"gr9","hd":false},{"ty":"tr","p":{"a":0,"k":[156.555,128.2]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.123,10.484],[0,0],[0,0],[-11.701,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-5.479],[0,0],[-6.34,0],[0,0],[-0.094,-8.998],[0,0],[0,0],[10.494,0]],"o":[[-10.494,0],[0,0],[0,0],[0.116,-10.862],[0,0],[0,0],[2.068,-7.224],[0,0],[6.229,0],[0,0],[3.011,5.58],[0,0],[10.33,0],[0,0],[0,0],[-0.123,10.484],[0,0]],"v":[[-194.874,156.683],[-214.102,137.682],[-221.604,-108.755],[-221.603,-108.993],[-200.874,-128.032],[-193.351,-128.032],[-188.663,-144.415],[-172.393,-156.683],[-103.02,-156.683],[-88.127,-147.8],[-82.348,-137.09],[-67.167,-128.032],[203.876,-128.032],[221.604,-109.008],[221.599,-108.518],[214.104,137.682],[194.876,156.683]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.948,249.103]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 20","parent":8,"sr":1,"ks":{"o":{"a":0,"k":33},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":119,"s":[255.948,397.785,0],"to":[0,1.404,0],"ti":[0,-1.404,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":126,"s":[255.948,406.212,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":148,"s":[255.948,406.212,0],"to":[0,-1.404,0],"ti":[0,1.404,0]},{"t":173,"s":[255.948,397.785,0]}]},"a":{"a":0,"k":[255.948,405.785,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":70,"s":[{"i":[[0,0],[0.067,10.484],[0,0],[0,0],[1.041,10.095],[-3.306,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-0.004],[0,0],[0,0],[-6.34,0],[0,0],[-0.028,-0.694],[-0.001,-7.225],[0,0],[0,0],[10.494,0]],"o":[[-5.722,0],[0,0],[0,0],[0.045,-7.793],[2.725,-1.182],[0,0],[0,0],[0,0],[2.068,-0.006],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[2.036,0],[0.116,2.828],[0,0],[0,0],[-0.002,10.484],[0,0]],"v":[[-194.874,156.683],[-205.357,137.682],[-209.448,-108.755],[-209.447,-108.993],[-209.989,-126.198],[-200.874,-128.032],[-193.351,-128.032],[-189.901,-140.089],[-188.663,-140.093],[-172.393,-140.103],[-103.02,-140.103],[-88.127,-140.096],[-84.08,-140.09],[-82.348,-137.09],[-67.167,-128.032],[203.876,-128.032],[209.109,-126.949],[209.302,-109.008],[209.302,-108.518],[209.181,137.682],[194.876,156.683]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.67,"y":0},"t":76,"s":[{"i":[[0,0],[-0.001,10.484],[0,0],[0,0],[0.081,3.082],[0.042,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-5.479],[0,0],[0,0],[-6.34,0],[0,0],[0.026,-0.743],[0.001,-7.159],[0,0],[0,0],[-0.15,0]],"o":[[0.128,0],[0,0],[0,0],[-0.001,-7.618],[-0.034,-1.312],[0,0],[0,0],[0,0],[2.068,-7.224],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[-0.03,0],[-0.102,2.893],[0,0],[0,0],[0.002,10.484],[0,0]],"v":[[-193.332,156.683],[-193.098,137.682],[-193.007,-108.755],[-193.007,-108.993],[-193.143,-125.99],[-193.259,-128.032],[-193.351,-128.032],[-189.471,-141.592],[-188.663,-144.415],[-172.393,-156.683],[-103.02,-156.683],[-88.127,-147.8],[-83.595,-139.401],[-82.348,-137.09],[-67.167,-128.032],[193.59,-128.032],[193.505,-126.87],[193.335,-109.008],[193.336,-108.518],[193.443,137.682],[193.719,156.683]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":82,"s":[{"i":[[0,0],[-0.001,10.484],[0,0],[0,0],[0.081,3.082],[0.042,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-5.479],[0,0],[0,0],[-6.34,0],[0,0],[0.026,-0.743],[0.001,-7.159],[0,0],[0,0],[-0.15,0]],"o":[[0.128,0],[0,0],[0,0],[-0.001,-7.618],[-0.034,-1.312],[0,0],[0,0],[0,0],[2.068,-7.224],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[-0.03,0],[-0.102,2.893],[0,0],[0,0],[0.002,10.484],[0,0]],"v":[[-193.332,156.683],[-193.098,137.682],[-193.007,-108.755],[-193.007,-108.993],[-193.143,-125.99],[-193.259,-128.032],[-193.351,-128.032],[-189.471,-141.592],[-188.663,-144.415],[-172.393,-156.683],[-103.02,-156.683],[-88.127,-147.8],[-83.595,-139.401],[-82.348,-137.09],[-67.167,-128.032],[193.59,-128.032],[193.505,-126.87],[193.335,-109.008],[193.336,-108.518],[193.443,137.682],[193.719,156.683]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":86,"s":[{"i":[[0,0],[-0.001,10.484],[0,0],[0,0],[0.081,3.082],[0.042,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-5.479],[0,0],[0,0],[-6.34,0],[0,0],[0.026,-0.743],[0.001,-7.159],[0,0],[0,0],[-0.15,0]],"o":[[0.128,0],[0,0],[0,0],[-0.001,-7.618],[-0.034,-1.312],[0,0],[0,0],[0,0],[2.068,-7.224],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[-0.03,0],[-0.102,2.893],[0,0],[0,0],[0.002,10.484],[0,0]],"v":[[-196.341,156.683],[-196.108,137.682],[-196.016,-108.755],[-196.016,-108.993],[-196.152,-125.99],[-193.259,-128.032],[-193.351,-128.032],[-189.471,-141.592],[-188.663,-144.415],[-172.393,-156.683],[-103.02,-156.683],[-88.127,-147.8],[-83.595,-139.401],[-82.348,-137.09],[-67.167,-128.032],[197.062,-128.032],[196.977,-126.87],[197.386,-109.008],[197.386,-108.518],[196.915,137.682],[197.191,156.683]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":100,"s":[{"i":[[0,0],[-0.001,10.484],[0,0],[0,0],[0.081,3.082],[0.042,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-5.479],[0,0],[0,0],[-6.34,0],[0,0],[0.026,-0.743],[0.001,-7.159],[0,0],[0,0],[-0.15,0]],"o":[[0.128,0],[0,0],[0,0],[-0.001,-7.618],[-0.034,-1.312],[0,0],[0,0],[0,0],[2.068,-7.224],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[-0.03,0],[-0.102,2.893],[0,0],[0,0],[0.002,10.484],[0,0]],"v":[[-185.693,156.683],[-185.46,137.682],[-185.368,-108.755],[-185.368,-108.993],[-185.504,-125.99],[-182.611,-128.032],[-182.702,-128.032],[-178.823,-141.592],[-178.015,-144.415],[-172.393,-156.683],[-103.02,-156.683],[-88.127,-147.8],[-83.595,-139.401],[-82.348,-137.09],[-67.167,-128.032],[199.377,-128.032],[199.292,-126.87],[199.701,-109.008],[199.701,-108.518],[199.23,137.682],[199.506,156.683]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":104,"s":[{"i":[[0,0],[-0.001,10.484],[0,0],[0,0],[0.081,3.082],[0.042,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-5.479],[0,0],[0,0],[-6.34,0],[0,0],[0.026,-0.743],[0.001,-7.159],[0,0],[0,0],[-0.15,0]],"o":[[0.128,0],[0,0],[0,0],[-0.001,-7.618],[-0.034,-1.312],[0,0],[0,0],[0,0],[2.068,-7.224],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[-0.03,0],[-0.102,2.893],[0,0],[0,0],[0.002,10.484],[0,0]],"v":[[-185.693,156.683],[-185.46,137.682],[-185.368,-108.755],[-185.368,-108.993],[-185.504,-125.99],[-182.611,-128.032],[-182.702,-128.032],[-178.823,-141.592],[-178.015,-144.415],[-172.393,-156.683],[-103.02,-156.683],[-88.127,-147.8],[-83.595,-139.401],[-82.348,-137.09],[-67.167,-128.032],[199.377,-128.032],[199.292,-126.87],[199.701,-109.008],[199.701,-108.518],[199.23,137.682],[199.506,156.683]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":116,"s":[{"i":[[0,0],[-0.001,10.484],[0,0],[0,0],[0.081,3.082],[0.042,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-5.479],[0,0],[0,0],[-6.34,0],[0,0],[0.026,-0.743],[0.001,-7.159],[0,0],[0,0],[-0.15,0]],"o":[[0.128,0],[0,0],[0,0],[-0.001,-7.618],[-0.034,-1.312],[0,0],[0,0],[0,0],[2.068,-7.224],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[-0.03,0],[-0.102,2.893],[0,0],[0,0],[0.002,10.484],[0,0]],"v":[[-194.027,156.683],[-193.793,137.682],[-193.702,-108.755],[-193.702,-108.993],[-193.837,-125.99],[-193.259,-128.032],[-193.351,-128.032],[-189.471,-141.592],[-188.663,-144.415],[-172.393,-156.683],[-103.02,-156.683],[-88.127,-147.8],[-83.595,-139.401],[-82.348,-137.09],[-67.167,-128.032],[194.052,-128.032],[193.968,-126.87],[194.377,-109.008],[194.377,-108.518],[193.906,137.682],[194.181,156.683]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":119,"s":[{"i":[[0,0],[-0.001,10.484],[0,0],[0,0],[0.081,3.082],[0.042,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-5.479],[0,0],[0,0],[-6.34,0],[0,0],[0.026,-0.743],[0.001,-7.159],[0,0],[0,0],[-0.15,0]],"o":[[0.128,0],[0,0],[0,0],[-0.001,-7.618],[-0.034,-1.312],[0,0],[0,0],[0,0],[2.068,-7.224],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[-0.03,0],[-0.102,2.893],[0,0],[0,0],[0.002,10.484],[0,0]],"v":[[-194.027,156.683],[-193.793,137.682],[-193.702,-108.755],[-193.702,-108.993],[-193.837,-125.99],[-193.259,-128.032],[-193.351,-128.032],[-189.471,-141.592],[-188.663,-144.415],[-172.393,-156.683],[-103.02,-156.683],[-88.127,-147.8],[-83.595,-139.401],[-82.348,-137.09],[-67.167,-128.032],[194.052,-128.032],[193.968,-126.87],[194.377,-109.008],[194.377,-108.518],[193.906,137.682],[194.181,156.683]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":126,"s":[{"i":[[0,0],[0.067,10.484],[0,0],[0,0],[1.041,10.095],[-3.306,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-0.004],[0,0],[0,0],[-6.34,0],[0,0],[-0.028,-0.694],[-0.001,-7.225],[0,0],[0,0],[10.494,0]],"o":[[-5.722,0],[0,0],[0,0],[0.045,-7.793],[2.725,-1.182],[0,0],[0,0],[0,0],[2.068,-0.006],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[2.036,0],[0.116,2.828],[0,0],[0,0],[-0.002,10.484],[0,0]],"v":[[-194.874,156.683],[-205.357,137.682],[-209.448,-108.755],[-209.447,-108.993],[-209.989,-126.198],[-200.874,-128.032],[-193.351,-128.032],[-189.901,-140.089],[-188.663,-140.093],[-172.393,-140.103],[-103.02,-140.103],[-88.127,-140.096],[-84.08,-140.09],[-82.348,-137.09],[-67.167,-128.032],[203.876,-128.032],[209.109,-126.949],[209.302,-109.008],[209.302,-108.518],[209.181,137.682],[194.876,156.683]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":148,"s":[{"i":[[0,0],[0.067,10.484],[0,0],[0,0],[1.041,10.095],[-3.306,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-0.004],[0,0],[0,0],[-6.34,0],[0,0],[-0.028,-0.694],[-0.001,-7.225],[0,0],[0,0],[10.494,0]],"o":[[-5.722,0],[0,0],[0,0],[0.045,-7.793],[2.725,-1.182],[0,0],[0,0],[0,0],[2.068,-0.006],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[2.036,0],[0.116,2.828],[0,0],[0,0],[-0.002,10.484],[0,0]],"v":[[-194.874,156.683],[-205.357,137.682],[-209.448,-108.755],[-209.447,-108.993],[-209.989,-126.198],[-200.874,-128.032],[-193.351,-128.032],[-189.901,-140.089],[-188.663,-140.093],[-172.393,-140.103],[-103.02,-140.103],[-88.127,-140.096],[-84.08,-140.09],[-82.348,-137.09],[-67.167,-128.032],[203.876,-128.032],[209.109,-126.949],[209.302,-109.008],[209.302,-108.518],[209.181,137.682],[194.876,156.683]],"c":true}]},{"t":173,"s":[{"i":[[0,0],[0.067,10.484],[0,0],[0,0],[1.041,10.095],[-3.306,0],[0,0],[0,0],[0,0],[-7.512,0],[0,0],[-2.958,-0.004],[0,0],[0,0],[-6.34,0],[0,0],[-0.028,-0.694],[-0.001,-7.225],[0,0],[0,0],[10.494,0]],"o":[[-5.722,0],[0,0],[0,0],[0.045,-7.793],[2.725,-1.182],[0,0],[0,0],[0,0],[2.068,-0.006],[0,0],[6.229,0],[0,0],[0,0],[3.011,5.58],[0,0],[2.036,0],[0.116,2.828],[0,0],[0,0],[-0.002,10.484],[0,0]],"v":[[-194.874,156.683],[-205.357,137.682],[-209.448,-108.755],[-209.447,-108.993],[-209.989,-126.198],[-200.874,-128.032],[-193.351,-128.032],[-189.901,-140.089],[-188.663,-140.093],[-172.393,-140.103],[-103.02,-140.103],[-88.127,-140.096],[-84.08,-140.09],[-82.348,-137.09],[-67.167,-128.032],[203.876,-128.032],[209.109,-126.949],[209.302,-109.008],[209.302,-108.518],[209.181,137.682],[194.876,156.683]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[255.948,249.103]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 17","parent":11,"sr":1,"ks":{"p":{"a":0,"k":[254.635,204.376,0]},"a":{"a":0,"k":[118.5,2.5,0]},"s":{"a":0,"k":[166,166,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[8.397,0],[0,-8.479],[0,0],[-1.73,0],[0,0],[0,1.753],[0,0]],"o":[[-8.397,0],[0,0],[0,1.753],[0,0],[1.73,0],[0,0],[0,-8.479]],"v":[[106.158,8.875],[81,21.625],[81,25.757],[83.213,28],[129.103,28],[131.316,25.757],[131.316,21.625]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[7.129,0],[1.198,-0.138],[0,-4.08],[0,0],[0.028,-0.275],[0,0],[0,1.489],[0,0]],"o":[[-0.983,0],[3.513,2.523],[0,0],[0,0.353],[0,0],[1.469,0],[0,0],[0,-7.199]],"v":[[134.639,11.762],[131.339,11.969],[137.316,21.875],[137.316,27.06],[137.276,28],[154.121,28],[156,26.096],[156,22.587]],"c":true}},"nm":"Path 2","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[-6.95,0],[0,7.044],[6.95,0],[0,-7.044]],"o":[[6.95,0],[0,-7.044],[-6.95,0],[0,7.044]],"v":[[106.158,2.5],[118.737,-10.25],[106.158,-23],[93.579,-10.25]],"c":true}},"nm":"Path 3","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,5.981],[-5.901,0],[0,-5.981],[5.901,0]],"o":[[0,-5.981],[5.901,0],[0,5.981],[-5.901,0]],"v":[[123.959,-4.476],[134.639,-15.302],[145.32,-4.476],[134.639,6.349]],"c":true}},"nm":"Path 4","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666666667,0.486274539723,0.294117647059,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Layer 5","parent":1,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":86,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":100,"s":[5.96]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[0]},"t":104,"s":[5.96]},{"t":116,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[60.126,36.802,0],"to":[0,-17.333,0],"ti":[0,17.333,0]},{"i":{"x":0,"y":0},"o":{"x":1,"y":1},"t":100,"s":[60.126,-67.198,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":104,"s":[60.126,-67.198,0],"to":[0,17.333,0],"ti":[0,-17.333,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":116,"s":[60.126,36.802,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":119,"s":[60.126,36.802,0],"to":[0,5,0],"ti":[0,-5,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":126,"s":[60.126,66.802,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":148,"s":[60.126,66.802,0],"to":[0,-5,0],"ti":[0,5,0]},{"t":173,"s":[60.126,36.802,0]}]},"a":{"a":0,"k":[256.198,372.279,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":82,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":86,"s":[102,98,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":100,"s":[99,101,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":104,"s":[99,101,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":116,"s":[100,100,100]},{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":119,"s":[100,100,100]},{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":126,"s":[109,88,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":148,"s":[109,88,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":163,"s":[100,101,100]},{"t":173,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.274,0.959],[0,0],[2.326,0],[0,0],[0.916,-1.697],[0,0],[3.293,-2.499]],"o":[[-0.482,-0.836],[0,0],[-0.64,-2.236],[0,0],[-1.928,0],[0,0],[-2.033,3.766],[0,0]],"v":[[50.614,11.739],[49.47,9.041],[44.611,-7.941],[39.574,-11.739],[-31.803,-11.739],[-36.414,-8.987],[-42.495,2.281],[-50.614,11.739]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.101960785687,0.188235297799,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[384.531,92.395]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.737,2.575],[0,0],[4.99,0],[0,0],[1.965,-3.641],[0,0],[8.648,0],[0,0]],"o":[[0,0],[-1.372,-4.798],[0,0],[-4.136,0],[0,0],[-4.107,7.611],[0,0],[-2.678,0]],"v":[[58.964,10.39],[54.105,-6.591],[43.299,-14.739],[-28.078,-14.739],[-37.969,-8.837],[-44.025,2.384],[-64.732,14.739],[64.732,14.739]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.388235300779,0.478431373835,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[380.806,89.395]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.86,0],[0,0],[1.473,5.149],[0,0],[2.326,0],[0,0],[0.916,-1.697],[0,0],[10.82,0],[0,0],[0.045,-4.146],[0,0],[-3.985,0],[0,0],[0,3.985],[0,0]],"o":[[0,0],[-5.356,0],[0,0],[-0.64,-2.236],[0,0],[-1.928,0],[0,0],[-5.139,9.522],[0,0],[-4.736,0],[0,0],[0,3.985],[0,0],[3.985,0],[0,0],[-0.045,-4.031]],"v":[[194.702,-110.333],[189.339,-110.333],[177.803,-119.031],[172.943,-136.014],[167.906,-139.812],[96.529,-139.812],[91.919,-137.06],[85.837,-125.791],[59.93,-110.333],[-192.702,-110.333],[-200.929,-103.187],[-193.429,132.584],[-186.202,139.812],[186.202,139.812],[193.429,132.584],[200.929,-103.187]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.773,0.612,0.5,0.924,0.751,0.567,1,0.91,0.729,0.522]}},"s":{"a":0,"k":[-0.199,-140.467]},"e":{"a":0,"k":[-0.199,139.156]},"t":1,"nm":"gr10","hd":false},{"ty":"tr","p":{"a":0,"k":[256.199,220.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.059,7.244],[0,0],[0,0],[-8.03,0],[0,0],[-4.107,7.611],[0,0],[-4.136,0],[0,0],[-1.372,-4.798],[0,0],[-2.678,0],[0,0],[-0.078,-6.968],[0,0],[0,0],[7.258,0]],"o":[[-7.258,0],[0,0],[0,0],[0.081,-7.458],[0,0],[8.648,0],[0,0],[1.965,-3.641],[0,0],[4.99,0],[0,0],[0.737,2.575],[0,0],[6.437,0],[0,0],[0,0],[-0.059,7.244],[0,0]],"v":[[-186.201,145.812],[-199.429,132.692],[-206.93,-103.124],[-206.929,-103.251],[-192.701,-116.333],[59.876,-116.333],[80.583,-128.688],[86.639,-139.909],[96.53,-145.812],[167.907,-145.812],[178.712,-137.663],[183.571,-120.682],[189.34,-116.333],[194.702,-116.333],[206.93,-103.253],[206.927,-102.996],[199.43,132.692],[186.202,145.812]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.78823530674,0.647058844566,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.198,220.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[3.014,-5.584],[0,0],[6.473,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-6.344,0],[0,0],[-3.074,5.696],[0,0],[0,0],[0,0],[0,0]],"v":[[44.152,-26.208],[5.017,-26.208],[-10.153,-17.155],[-16.186,-5.976],[-31.685,3.271],[-44.152,3.271],[-44.152,26.208],[44.152,26.208]],"c":false}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.78,0.118,0.212,0.5,0.724,0.302,0.253,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[5.289,8.137]},"e":{"a":0,"k":[-11.414,24.841]},"t":1,"nm":"gr11","hd":false},{"ty":"tr","p":{"a":0,"k":[347.711,94.863]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[7.654,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-2.104,-7.359],[0,0],[0,0]],"v":[[-29.443,26.208],[29.443,26.208],[29.443,3.271],[24.232,3.271],[19.374,-13.708],[2.8,-26.208],[-29.443,-26.208]],"c":false}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.78,0.118,0.212,0.5,0.724,0.302,0.253,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[-0.305,9.137]},"e":{"a":0,"k":[10.755,20.197]},"t":1,"nm":"gr12","hd":false},{"ty":"tr","p":{"a":0,"k":[421.305,94.863]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.125,10.481],[0,0],[0,0],[-11.414,0],[0,0],[-3.076,5.7],[0,0],[-6.344,0],[0,0],[-2.104,-7.359],[0,0],[0,0],[-0.116,-10.306],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.118,-10.861],[0,0],[6.478,0],[0,0],[3.014,-5.584],[0,0],[7.654,0],[0,0],[0,0],[9.765,0],[0,0],[0,0],[-0.125,10.481],[0,0]],"v":[[-186.2,151.812],[-205.428,132.816],[-212.931,-103.051],[-212.929,-103.296],[-192.7,-122.333],[59.82,-122.333],[75.33,-131.587],[81.359,-142.759],[96.53,-151.812],[167.907,-151.812],[184.481,-139.312],[189.34,-122.333],[194.702,-122.333],[212.931,-103.32],[212.925,-102.806],[205.43,132.816],[186.202,151.812]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.198,220.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Layer 24","sr":1,"ks":{"o":{"a":1,"k":[{"t":85,"s":[0],"h":1},{"t":86,"s":[33],"h":1},{"t":116,"s":[0],"h":1}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":126,"s":[256.198,394.779,0],"to":[0,1.231,0],"ti":[0,-1.231,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":133,"s":[256.198,402.165,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":151,"s":[256.198,402.165,0],"to":[0,-1.231,0],"ti":[0,1.231,0]},{"t":176,"s":[256.198,394.779,0]}]},"a":{"a":0,"k":[256.198,372.279,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":82,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.319,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-186.2,151.812],[-199.688,132.816],[-201.198,-103.051],[-201.197,-103.296],[-198.729,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-132.937],[81.359,-133.368],[96.53,-133.717],[167.907,-133.717],[184.481,-133.235],[186.203,-133.003],[189.34,-122.333],[194.702,-122.333],[199.433,-121.04],[201.302,-103.32],[201.301,-102.806],[200.114,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":86,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.318,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-186.2,151.812],[-197.237,132.816],[-198.747,-103.051],[-198.746,-103.296],[-196.279,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-138.039],[81.359,-138.47],[96.53,-138.819],[167.907,-138.819],[184.481,-138.337],[186.203,-138.105],[189.34,-122.333],[194.702,-122.333],[196.982,-121.04],[198.851,-103.32],[198.85,-102.806],[197.663,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":116,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.318,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-186.2,151.812],[-197.237,132.816],[-198.747,-103.051],[-198.746,-103.296],[-196.279,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-138.039],[81.359,-138.47],[96.53,-138.819],[167.907,-138.819],[184.481,-138.337],[186.203,-138.105],[189.34,-122.333],[194.702,-122.333],[196.982,-121.04],[198.851,-103.32],[198.85,-102.806],[197.663,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":119,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.318,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-186.2,151.812],[-197.237,132.816],[-198.747,-103.051],[-198.746,-103.296],[-196.279,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-133.039],[81.359,-133.47],[96.53,-133.819],[167.907,-133.819],[184.481,-133.337],[186.203,-133.105],[189.34,-122.333],[194.702,-122.333],[196.982,-121.04],[198.851,-103.32],[198.85,-102.806],[197.663,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":126,"s":[{"i":[[0,0],[0.029,3.439],[0.001,5.24],[0,0],[0,0],[0,0],[0,0],[-0.094,0],[0,0],[-3.076,5.7],[0,0],[-6.344,0],[0,0],[-2.104,-7.359],[0,0],[0,0],[0.003,-10.306],[0,0],[0,0],[-0.237,0]],"o":[[-0.043,0],[-0.029,-3.439],[0,0],[0,0],[0,0],[0,0],[0.001,-10.861],[0,0],[6.478,0],[0,0],[3.014,-5.584],[0,0],[7.654,0],[0,0],[0,0],[-0.221,0],[0,0],[0,0],[0.003,10.481],[0,0]],"v":[[-181.613,151.812],[-181.724,146.244],[-181.771,132.816],[-181.802,14.882],[-181.833,-103.051],[-181.833,-103.174],[-181.833,-103.296],[-181.666,-122.333],[59.82,-122.333],[75.33,-131.587],[81.359,-142.759],[96.53,-151.812],[167.907,-151.812],[184.481,-139.312],[184.067,-122.333],[183.946,-122.333],[183.534,-103.32],[183.534,-102.806],[183.704,132.816],[184.138,151.812]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":133,"s":[{"i":[[0,0],[0.009,10.481],[0,0],[0,0],[-0.503,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.005,-0.833],[0,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.006,-8.144],[0.168,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[0.037,0],[0.017,2.793],[0,0],[0,0],[0,10.481],[0,0]],"v":[[-186.2,151.812],[-202.514,132.816],[-203.033,-103.051],[-203.033,-103.296],[-202.184,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-132.937],[81.359,-133.368],[96.53,-133.717],[167.907,-133.717],[184.481,-133.235],[186.203,-133.003],[189.34,-122.333],[203.488,-122.333],[203.565,-121.04],[203.596,-103.32],[203.596,-102.806],[203.576,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":151,"s":[{"i":[[0,0],[0.009,10.481],[0,0],[0,0],[-0.503,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.005,-0.833],[0,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.006,-8.144],[0.168,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[0.037,0],[0.017,2.793],[0,0],[0,0],[0,10.481],[0,0]],"v":[[-186.2,151.812],[-202.514,132.816],[-203.033,-103.051],[-203.033,-103.296],[-202.184,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-132.937],[81.359,-133.368],[96.53,-133.717],[167.907,-133.717],[184.481,-133.235],[186.203,-133.003],[189.34,-122.333],[203.488,-122.333],[203.565,-121.04],[203.596,-103.32],[203.596,-102.806],[203.576,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":166,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.044],[0,0],[-6.344,0],[0,0],[-2.104,-0.056],[0,0],[0,0],[0,0],[-0.319,-0.166],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.043],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,0.555],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-173.7,151.812],[-187.188,132.816],[-188.698,-103.051],[-188.697,-103.296],[-186.229,-120.884],[-180.2,-122.333],[59.82,-119.059],[75.33,-121.167],[81.359,-121.252],[96.53,-121.322],[167.907,-121.322],[184.481,-121.226],[176.203,-121.18],[179.34,-119.059],[184.702,-119.059],[189.433,-118.803],[191.302,-103.32],[191.301,-102.806],[190.114,132.816],[176.202,151.812]],"c":true}]},{"t":176,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.319,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-186.2,151.812],[-199.688,132.816],[-201.198,-103.051],[-201.197,-103.296],[-198.729,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-132.937],[81.359,-133.368],[96.53,-133.717],[167.907,-133.717],[184.481,-133.235],[186.203,-133.003],[189.34,-122.333],[194.702,-122.333],[199.433,-121.04],[201.302,-103.32],[201.301,-102.806],[200.114,132.816],[186.202,151.812]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.198,220.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 21","parent":11,"sr":1,"ks":{"o":{"a":1,"k":[{"t":85,"s":[33],"h":1},{"t":86,"s":[0],"h":1},{"t":116,"s":[33],"h":1}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":126,"s":[256.198,364.779,0],"to":[0,1.231,0],"ti":[0,-1.231,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":133,"s":[256.198,372.165,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":151,"s":[256.198,372.165,0],"to":[0,-1.231,0],"ti":[0,1.231,0]},{"t":176,"s":[256.198,364.779,0]}]},"a":{"a":0,"k":[256.198,372.279,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":82,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.319,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-186.2,151.812],[-199.688,132.816],[-201.198,-103.051],[-201.197,-103.296],[-198.729,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-132.937],[81.359,-133.368],[96.53,-133.717],[167.907,-133.717],[184.481,-133.235],[186.203,-133.003],[189.34,-122.333],[194.702,-122.333],[199.433,-121.04],[201.302,-103.32],[201.301,-102.806],[200.114,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":86,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.318,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-186.2,151.812],[-197.237,132.816],[-198.747,-103.051],[-198.746,-103.296],[-196.279,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-138.039],[81.359,-138.47],[96.53,-138.819],[167.907,-138.819],[184.481,-138.337],[186.203,-138.105],[189.34,-122.333],[194.702,-122.333],[196.982,-121.04],[198.851,-103.32],[198.85,-102.806],[197.663,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":116,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.318,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-189.45,151.812],[-200.487,132.816],[-201.997,-103.051],[-201.996,-103.296],[-199.529,-120.884],[-195.95,-122.333],[59.82,-122.333],[75.33,-133.039],[81.359,-133.47],[96.53,-133.819],[167.907,-133.819],[184.481,-133.337],[186.203,-133.105],[189.34,-122.333],[199.202,-122.333],[201.482,-121.04],[203.351,-103.32],[203.35,-102.806],[202.163,132.816],[190.702,151.812]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.664,"y":0},"t":126,"s":[{"i":[[0,0],[0.001,10.481],[0,0],[0,0],[-0.079,2.81],[-0.154,0],[0,0],[-3.076,4.292],[0,0],[-6.344,0],[0,0],[-2.104,-5.542],[0,0],[0,0],[0,0],[0.015,-0.833],[0.001,-7.938],[0,0],[0,0],[-0.501,0]],"o":[[-0.567,0],[0,0],[0,0],[0.001,-8.144],[0.026,-0.938],[0,0],[6.478,0],[0,0],[3.014,-4.205],[0,0],[7.654,0],[0,0],[0,0],[0,0],[-0.107,0],[-0.051,2.793],[0,0],[0,0],[0.001,10.481],[0,0]],"v":[[-182.989,151.812],[-183.586,132.816],[-183.668,-103.051],[-183.668,-103.296],[-183.534,-120.884],[-183.341,-122.333],[59.82,-122.333],[75.33,-142.111],[81.359,-150.524],[96.53,-157.34],[167.907,-157.34],[182.188,-147.929],[183.909,-143.398],[183.759,-122.333],[183.503,-122.333],[183.394,-121.04],[183.305,-103.32],[183.305,-102.806],[183.361,132.816],[183.909,151.812]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.67,"y":0},"t":133,"s":[{"i":[[0,0],[0.009,10.481],[0,0],[0,0],[-0.503,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.005,-0.833],[0,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.006,-8.144],[0.168,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[0.037,0],[0.017,2.793],[0,0],[0,0],[0,10.481],[0,0]],"v":[[-186.2,151.812],[-202.514,132.816],[-203.033,-103.051],[-203.033,-103.296],[-202.184,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-132.937],[81.359,-133.368],[96.53,-133.717],[167.907,-133.717],[184.481,-133.235],[186.203,-133.003],[189.34,-122.333],[203.488,-122.333],[203.565,-121.04],[203.596,-103.32],[203.596,-102.806],[203.576,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":151,"s":[{"i":[[0,0],[0.009,10.481],[0,0],[0,0],[-0.503,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.005,-0.833],[0,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.006,-8.144],[0.168,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[0.037,0],[0.017,2.793],[0,0],[0,0],[0,10.481],[0,0]],"v":[[-186.2,151.812],[-202.514,132.816],[-203.033,-103.051],[-203.033,-103.296],[-202.184,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-132.937],[81.359,-133.368],[96.53,-133.717],[167.907,-133.717],[184.481,-133.235],[186.203,-133.003],[189.34,-122.333],[203.488,-122.333],[203.565,-121.04],[203.596,-103.32],[203.596,-102.806],[203.576,132.816],[186.202,151.812]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":166,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.044],[0,0],[-6.344,0],[0,0],[-2.104,-0.056],[0,0],[0,0],[0,0],[-0.319,-0.166],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.043],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,0.555],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-173.7,151.812],[-187.188,132.816],[-188.698,-103.051],[-188.697,-103.296],[-186.229,-120.884],[-180.2,-122.333],[59.82,-119.059],[75.33,-121.167],[81.359,-121.252],[96.53,-121.322],[167.907,-121.322],[184.481,-121.226],[176.203,-121.18],[179.34,-119.059],[184.702,-119.059],[189.433,-118.803],[191.302,-103.32],[191.301,-102.806],[190.114,132.816],[176.202,151.812]],"c":true}]},{"t":176,"s":[{"i":[[0,0],[0.025,10.481],[0,0],[0,0],[-1.462,2.81],[-2.856,0],[0,0],[-3.076,0.22],[0,0],[-6.344,0],[0,0],[-2.104,-0.284],[0,0],[0,0],[0,0],[-0.319,-0.833],[-0.014,-7.938],[0,0],[0,0],[10.492,0]],"o":[[-10.492,0],[0,0],[0,0],[0.018,-8.144],[0.488,-0.938],[0,0],[6.478,0],[0,0],[3.014,-0.215],[0,0],[7.654,0],[0,0],[0,0],[0,0],[2.243,0],[1.068,2.793],[0,0],[0,0],[-0.02,10.481],[0,0]],"v":[[-186.2,151.812],[-199.688,132.816],[-201.198,-103.051],[-201.197,-103.296],[-198.729,-120.884],[-192.7,-122.333],[59.82,-122.333],[75.33,-132.937],[81.359,-133.368],[96.53,-133.717],[167.907,-133.717],[184.481,-133.235],[186.203,-133.003],[189.34,-122.333],[194.702,-122.333],[199.433,-121.04],[201.302,-103.32],[201.301,-102.806],[200.114,132.816],[186.202,151.812]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.198,220.467]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Layer 3","parent":1,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":126,"s":[60.376,5.279,0],"to":[0,6.833,0],"ti":[0,-6.833,0]},{"i":{"x":0.33,"y":0.33},"o":{"x":0.67,"y":0.67},"t":133,"s":[60.376,46.279,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":151,"s":[60.376,46.279,0],"to":[0,-6.833,0],"ti":[0,6.833,0]},{"t":176,"s":[60.376,5.279,0]}]},"a":{"a":0,"k":[256.448,340.755,0]},"s":{"a":1,"k":[{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":126,"s":[100,100,100]},{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":133,"s":[110,88,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":151,"s":[110,88,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":166,"s":[100,101,100]},{"t":176,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.888,3.103],[0,0],[1.142,0],[0,0],[0.313,-1.097],[0,0],[2.124,-2.221]],"o":[[-2.124,-2.221],[0,0],[-0.313,-1.098],[0,0],[-1.142,0],[0,0],[-0.888,3.103],[0,0]],"v":[[45.871,11.084],[41.243,3.018],[37.741,-9.22],[35.27,-11.084],[-35.27,-11.084],[-37.741,-9.221],[-41.243,3.018],[-45.871,11.084]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.219607844949,0.309803932905,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.688,72.095]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.558,0],[0,0],[2.383,8.327],[0,0],[1.142,0],[0,0],[0.313,-1.097],[0,0],[8.661,0],[0,0],[0.045,-4.078],[0,0],[0,0],[-3.985,0],[0,0],[0,3.985],[0,0],[0,0]],"o":[[0,0],[-8.661,0],[0,0],[-0.313,-1.098],[0,0],[-1.142,0],[0,0],[-2.383,8.327],[0,0],[-4.375,0],[0,0],[0,0],[0,3.985],[0,0],[3.986,0],[0,0],[0,0],[-0.045,-3.814]],"v":[[185.527,-105.703],[61.139,-105.703],[42.483,-119.77],[38.98,-132.008],[36.509,-133.872],[-34.03,-133.872],[-36.502,-132.009],[-40.004,-119.77],[-58.661,-105.703],[-184.528,-105.703],[-192.254,-98.561],[-184.758,126.444],[-184.755,126.645],[-177.528,133.872],[177.527,133.872],[184.755,126.645],[184.755,126.545],[192.254,-98.561]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.773,0.612,0.5,0.924,0.751,0.567,1,0.91,0.729,0.522]}},"s":{"a":0,"k":[-0.449,-133.883]},"e":{"a":0,"k":[-0.449,133.861]},"t":1,"nm":"gr13","hd":false},{"ty":"tr","p":{"a":0,"k":[256.449,194.883]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.646,5.753],[0,0],[3.807,0],[0,0],[1.046,-3.657],[0,0],[5.983,0]],"o":[[-5.983,0],[0,0],[-1.046,-3.66],[0,0],[-3.806,0],[0,0],[-1.646,5.752],[0,0]],"v":[[59.9,14.084],[47.011,4.367],[43.511,-7.868],[35.27,-14.084],[-35.269,-14.084],[-43.51,-7.872],[-47.011,4.367],[-59.9,14.084]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380392163992,0.470588237047,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[257.688,69.095]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,7.294],[0,0],[0,0],[-7.616,0],[0,0],[-1.646,5.753],[0,0],[-3.806,0],[0,0],[-1.046,-3.66],[0,0],[-5.983,0],[0,0],[-0.084,-7.086],[0,0],[0,0],[7.257,0]],"o":[[-7.294,0],[0,0],[0,0],[0.081,-7.332],[0,0],[5.983,0],[0,0],[1.046,-3.657],[0,0],[3.807,0],[0,0],[1.646,5.752],[0,0],[6.814,0],[0,0],[0,0],[-0.061,7.34],[0,0]],"v":[[-177.527,139.872],[-190.755,126.645],[-198.254,-98.493],[-198.253,-98.627],[-184.527,-111.703],[-58.66,-111.703],[-45.772,-121.421],[-42.27,-133.659],[-34.03,-139.872],[36.509,-139.872],[44.75,-133.655],[48.251,-121.421],[61.139,-111.703],[185.528,-111.703],[198.254,-98.631],[198.251,-98.36],[190.755,126.659],[177.528,139.872]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.78823530674,0.647058844566,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.448,194.883]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.778,-6.219],[0,0],[3.254,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-6.47,0],[0,0],[-0.896,3.129],[0,0],[0,0],[0,0],[0,0]],"v":[[36.216,-31.867],[1.935,-31.867],[-12.074,-21.305],[-15.599,-8.984],[-22.61,-3.698],[-37.006,-3.698],[-37.006,31.867],[37.006,31.867]],"c":false}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.271,0.329,0.8,0.5,0.469,0.408,0.547,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[3.516,10.122]},"e":{"a":0,"k":[-8.418,22.056]},"t":1,"nm":"gr14","hd":false},{"ty":"tr","p":{"a":0,"k":[220.484,80.878]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.895,3.129],[0,0],[6.471,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-3.255,0],[0,0],[-1.778,-6.223],[0,0],[0,0]],"v":[[-35.569,31.867],[36.359,31.867],[36.359,-3.698],[24.443,-3.698],[17.433,-8.984],[13.909,-21.299],[-0.101,-31.867],[-36.359,-31.867]],"c":false}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.271,0.329,0.8,0.5,0.469,0.408,0.547,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[-4.059,10.122]},"e":{"a":0,"k":[6.141,20.322]},"t":1,"nm":"gr15","hd":false},{"ty":"tr","p":{"a":0,"k":[293.059,80.878]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.059,10.552],[0,0],[0,0],[-10.943,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-6.223],[0,0],[-3.254,0],[0,0],[-0.122,-10.3],[0,0],[0,0],[10.487,0]],"o":[[-10.566,0],[0,0],[0,0],[0.118,-10.681],[0,0],[3.254,0],[0,0],[1.778,-6.219],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[10.028,0],[0,0],[0,0],[-0.132,10.529],[0,0]],"v":[[-177.526,145.872],[-196.755,126.754],[-204.255,-98.416],[-204.253,-98.672],[-184.526,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-135.31],[-34.029,-145.872],[36.51,-145.872],[50.521,-135.304],[54.044,-122.989],[61.054,-117.703],[185.528,-117.703],[204.255,-98.702],[204.249,-98.16],[196.755,126.791],[177.528,145.872]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.448,194.883]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 22","parent":14,"sr":1,"ks":{"o":{"a":0,"k":33},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":140,"s":[256.448,333.755,0],"to":[0,1.136,0],"ti":[0,-1.136,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":145,"s":[256.448,340.573,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":154,"s":[256.448,340.573,0],"to":[0,-1.136,0],"ti":[0,1.136,0]},{"t":179,"s":[256.448,333.755,0]}]},"a":{"a":0,"k":[256.448,340.755,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[0.002,10.552],[0,0],[0,0],[-0.237,2.923],[-2.864,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-0.047],[0,0],[-3.255,0],[0,0],[-0.046,-1.107],[-0.002,-7.548],[0,0],[0,0],[0.206,0]],"o":[[-0.364,0],[0,0],[0,0],[0.003,-7.885],[0.084,-1.036],[0,0],[3.254,0],[0,0],[1.778,-0.047],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[2.68,0],[0.126,3.036],[0,0],[0,0],[-0.003,10.529],[0,0]],"v":[[-192.026,145.872],[-192.689,126.754],[-192.948,-98.416],[-192.948,-98.672],[-192.544,-116.095],[-184.526,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-127.804],[-34.029,-127.883],[36.51,-127.883],[50.521,-127.804],[54.044,-122.989],[61.054,-117.703],[185.528,-117.703],[192.334,-115.975],[192.552,-98.702],[192.552,-98.16],[192.405,126.791],[192.028,145.872]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":100,"s":[{"i":[[0,0],[0.002,10.552],[0,0],[0,0],[-0.237,2.923],[-2.864,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-0.047],[0,0],[-3.255,0],[0,0],[-0.046,-1.107],[-0.002,-7.548],[0,0],[0,0],[0.206,0]],"o":[[-0.364,0],[0,0],[0,0],[0.003,-7.885],[0.084,-1.036],[0,0],[3.254,0],[0,0],[1.778,-0.047],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[2.68,0],[0.126,3.036],[0,0],[0,0],[-0.003,10.529],[0,0]],"v":[[-192.026,145.872],[-192.689,126.754],[-192.948,-98.416],[-192.948,-98.672],[-192.544,-116.095],[-184.526,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-127.804],[-34.029,-127.883],[36.51,-127.883],[50.521,-127.804],[54.044,-122.989],[61.054,-117.703],[185.528,-117.703],[192.334,-115.975],[192.552,-98.702],[192.552,-98.16],[192.405,126.791],[192.028,145.872]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":104,"s":[{"i":[[0,0],[0.002,10.552],[0,0],[0,0],[-0.237,2.923],[-2.864,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-0.047],[0,0],[-3.255,0],[0,0],[-0.046,-1.107],[-0.002,-7.548],[0,0],[0,0],[0.206,0]],"o":[[-0.364,0],[0,0],[0,0],[0.003,-7.885],[0.084,-1.036],[0,0],[3.254,0],[0,0],[1.778,-0.047],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[2.68,0],[0.126,3.036],[0,0],[0,0],[-0.003,10.529],[0,0]],"v":[[-192.026,145.872],[-192.689,126.754],[-192.948,-98.416],[-192.948,-98.672],[-192.544,-116.095],[-184.526,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-127.804],[-34.029,-127.883],[36.51,-127.883],[50.521,-127.804],[54.044,-122.989],[61.054,-117.703],[185.528,-117.703],[192.334,-115.975],[192.552,-98.702],[192.552,-98.16],[192.405,126.791],[192.028,145.872]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":116,"s":[{"i":[[0,0],[0.002,10.552],[0,0],[0,0],[-0.237,2.923],[-2.864,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-0.047],[0,0],[-3.255,0],[0,0],[-0.046,-1.107],[-0.002,-7.548],[0,0],[0,0],[0.206,0]],"o":[[-0.364,0],[0,0],[0,0],[0.003,-7.885],[0.084,-1.036],[0,0],[3.254,0],[0,0],[1.778,-0.047],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[2.68,0],[0.126,3.036],[0,0],[0,0],[-0.003,10.529],[0,0]],"v":[[-192.026,145.872],[-192.689,126.754],[-192.948,-98.416],[-192.948,-98.672],[-192.544,-116.095],[-184.526,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-127.804],[-34.029,-127.883],[36.51,-127.883],[50.521,-127.804],[54.044,-122.989],[61.054,-117.703],[185.528,-117.703],[192.334,-115.975],[192.552,-98.702],[192.552,-98.16],[192.405,126.791],[192.028,145.872]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":119,"s":[{"i":[[0,0],[0.002,10.552],[0,0],[0,0],[-0.237,2.923],[-2.864,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-0.047],[0,0],[-3.255,0],[0,0],[-0.046,-1.107],[-0.002,-7.548],[0,0],[0,0],[0.206,0]],"o":[[-0.364,0],[0,0],[0,0],[0.003,-7.885],[0.084,-1.036],[0,0],[3.254,0],[0,0],[1.778,-0.047],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[2.68,0],[0.126,3.036],[0,0],[0,0],[-0.003,10.529],[0,0]],"v":[[-192.026,145.872],[-192.689,126.754],[-192.948,-98.416],[-192.948,-98.672],[-192.544,-116.095],[-184.526,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-127.804],[-34.029,-127.883],[36.51,-127.883],[50.521,-127.804],[54.044,-122.989],[61.054,-117.703],[185.528,-117.703],[192.334,-115.975],[192.552,-98.702],[192.552,-98.16],[192.405,126.791],[192.028,145.872]],"c":true}]},{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":126,"s":[{"i":[[0,0],[0.002,10.552],[0,0],[0,0],[-0.237,2.923],[-2.864,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-0.047],[0,0],[-3.255,0],[0,0],[-0.046,-1.107],[-0.002,-7.548],[0,0],[0,0],[0.206,0]],"o":[[-0.364,0],[0,0],[0,0],[0.003,-7.885],[0.084,-1.036],[0,0],[3.254,0],[0,0],[1.778,-0.047],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[2.68,0],[0.126,3.036],[0,0],[0,0],[-0.003,10.529],[0,0]],"v":[[-192.026,145.872],[-192.689,126.754],[-192.948,-98.416],[-192.948,-98.672],[-192.544,-116.095],[-184.526,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-127.804],[-34.029,-127.883],[36.51,-127.883],[50.521,-127.804],[54.044,-122.989],[61.054,-117.703],[185.528,-117.703],[192.334,-115.975],[192.552,-98.702],[192.552,-98.16],[192.405,126.791],[192.028,145.872]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":133,"s":[{"i":[[0,0],[0.001,10.552],[0,0],[0,0],[-0.154,2.972],[-0.067,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-6.223],[0,0],[-3.254,0],[0,0],[-0.101,-1.1],[-0.004,-7.557],[0,0],[0,0],[0.453,0]],"o":[[-0.24,0],[0,0],[0,0],[0.002,-7.796],[0.057,-1.1],[0,0],[3.254,0],[0,0],[1.778,-6.219],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[0.115,0],[0.278,3.03],[0,0],[0,0],[-0.006,10.529],[0,0]],"v":[[-172.981,145.872],[-173.418,126.754],[-173.589,-98.416],[-173.589,-98.672],[-173.328,-115.994],[-173.14,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-135.31],[-34.029,-145.872],[36.51,-145.872],[50.521,-135.304],[54.044,-122.989],[61.054,-117.703],[173.556,-117.703],[173.883,-115.986],[174.366,-98.702],[174.365,-98.16],[174.041,126.791],[173.21,145.872]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":140,"s":[{"i":[[0,0],[0.001,10.552],[0,0],[0,0],[-0.154,2.972],[-0.067,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-6.223],[0,0],[-3.254,0],[0,0],[-0.101,-1.1],[-0.004,-7.557],[0,0],[0,0],[0.453,0]],"o":[[-0.24,0],[0,0],[0,0],[0.002,-7.796],[0.057,-1.1],[0,0],[3.254,0],[0,0],[1.778,-6.219],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[0.115,0],[0.278,3.03],[0,0],[0,0],[-0.006,10.529],[0,0]],"v":[[-172.981,145.872],[-173.418,126.754],[-173.589,-98.416],[-173.589,-98.672],[-173.328,-115.994],[-173.14,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-135.31],[-34.029,-145.872],[36.51,-145.872],[50.521,-135.304],[54.044,-122.989],[61.054,-117.703],[173.556,-117.703],[173.883,-115.986],[174.366,-98.702],[174.365,-98.16],[174.041,126.791],[173.21,145.872]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":145,"s":[{"i":[[0,0],[0.001,10.552],[0,0],[0,0],[-0.154,2.972],[-0.067,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,0.562],[0,0],[-3.254,0],[0,0],[-0.101,-1.1],[-0.004,-7.557],[0,0],[0,0],[0.453,0]],"o":[[-0.24,0],[0,0],[0,0],[0.002,-7.796],[0.057,-1.1],[0,0],[3.254,0],[0,0],[1.778,0.561],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[0.115,0],[0.278,3.03],[0,0],[0,0],[-0.006,10.529],[0,0]],"v":[[-191.617,146.045],[-192.055,126.926],[-192.225,-98.243],[-192.225,-98.499],[-191.964,-115.822],[-191.777,-117.531],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-129.621],[-34.029,-128.668],[36.51,-128.668],[50.521,-129.622],[54.044,-122.989],[61.054,-117.703],[191.738,-117.531],[192.065,-115.814],[192.548,-98.53],[192.547,-97.988],[192.223,126.964],[191.392,146.045]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":151,"s":[{"i":[[0,0],[0.001,10.552],[0,0],[0,0],[-0.154,2.972],[-0.067,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,0.562],[0,0],[-3.254,0],[0,0],[-0.101,-1.1],[-0.004,-7.557],[0,0],[0,0],[0.453,0]],"o":[[-0.24,0],[0,0],[0,0],[0.002,-7.796],[0.057,-1.1],[0,0],[3.254,0],[0,0],[1.778,0.561],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[0.115,0],[0.278,3.03],[0,0],[0,0],[-0.006,10.529],[0,0]],"v":[[-191.617,146.045],[-192.055,126.926],[-192.225,-98.243],[-192.225,-98.499],[-191.964,-115.822],[-191.777,-117.531],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-129.621],[-34.029,-128.668],[36.51,-128.668],[50.521,-129.622],[54.044,-122.989],[61.054,-117.703],[191.738,-117.531],[192.065,-115.814],[192.548,-98.53],[192.547,-97.988],[192.223,126.964],[191.392,146.045]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":154,"s":[{"i":[[0,0],[0.001,10.552],[0,0],[0,0],[-0.154,2.972],[-0.067,0],[0,0],[-0.895,0.565],[0,0],[-6.47,0],[0,0],[-1.778,0.101],[0,0],[-3.254,0],[0,0],[-0.101,-1.1],[-0.004,-7.557],[0,0],[0,0],[0.453,0]],"o":[[-0.24,0],[0,0],[0,0],[0.002,-7.796],[0.057,-1.1],[0,0],[3.254,0],[0,0],[1.778,0.101],[0,0],[6.471,0],[0,0],[0.895,0.565],[0,0],[0.115,0],[0.278,3.03],[0,0],[0,0],[-0.006,10.529],[0,0]],"v":[[-191.617,146.045],[-192.055,126.926],[-192.225,-98.243],[-192.225,-98.499],[-191.964,-115.822],[-191.777,-117.531],[-58.574,-117.703],[-51.564,-118.658],[-48.038,-119.855],[-34.029,-119.683],[36.51,-119.683],[50.521,-119.855],[54.044,-118.658],[61.054,-117.703],[191.738,-117.531],[192.065,-115.814],[192.548,-98.53],[192.547,-97.988],[192.223,126.964],[191.392,146.045]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":166,"s":[{"i":[[0,0],[0.002,10.552],[0,0],[0,0],[-0.193,2.948],[-1.399,0],[0,0],[-0.895,-0.096],[0,0],[-6.47,0],[0,0],[-1.778,-0.002],[0,0],[-3.254,0],[0,0],[-0.075,-1.103],[-0.003,-7.553],[0,0],[0,0],[0.335,0]],"o":[[-0.299,0],[0,0],[0,0],[0.002,-7.839],[0.07,-1.069],[0,0],[3.254,0],[0,0],[1.778,-0.002],[0,0],[6.471,0],[0,0],[0.895,-0.096],[0,0],[1.336,0],[0.205,3.033],[0,0],[0,0],[-0.004,10.529],[0,0]],"v":[[-171.812,145.962],[-172.357,126.844],[-172.569,-98.326],[-172.569,-98.581],[-172.24,-115.952],[-168.325,-117.613],[-58.574,-117.703],[-51.564,-117.542],[-48.038,-117.385],[-34.029,-117.388],[36.51,-117.388],[50.521,-117.385],[54.044,-117.542],[61.054,-117.703],[178.782,-117.613],[182.193,-115.891],[182.55,-98.612],[182.55,-98.07],[182.31,126.881],[181.695,145.962]],"c":true}]},{"t":179,"s":[{"i":[[0,0],[0.002,10.552],[0,0],[0,0],[-0.237,2.923],[-2.864,0],[0,0],[-0.895,3.129],[0,0],[-6.47,0],[0,0],[-1.778,-0.047],[0,0],[-3.255,0],[0,0],[-0.046,-1.107],[-0.002,-7.548],[0,0],[0,0],[0.206,0]],"o":[[-0.364,0],[0,0],[0,0],[0.003,-7.885],[0.084,-1.036],[0,0],[3.254,0],[0,0],[1.778,-0.047],[0,0],[6.471,0],[0,0],[0.895,3.129],[0,0],[2.68,0],[0.126,3.036],[0,0],[0,0],[-0.003,10.529],[0,0]],"v":[[-192.026,145.872],[-192.689,126.754],[-192.948,-98.416],[-192.948,-98.672],[-192.544,-116.095],[-184.526,-117.703],[-58.574,-117.703],[-51.564,-122.989],[-48.038,-127.804],[-34.029,-127.883],[36.51,-127.883],[50.521,-127.804],[54.044,-122.989],[61.054,-117.703],[185.528,-117.703],[192.334,-115.975],[192.552,-98.702],[192.552,-98.16],[192.405,126.791],[192.028,145.872]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.448,194.883]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Layer 1","parent":1,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.33,"y":1},"o":{"x":0.167,"y":0},"t":140,"s":[60.626,-24.509,0],"to":[0,8.167,0],"ti":[0,-8.167,0]},{"i":{"x":0.33,"y":0.33},"o":{"x":0.67,"y":0.67},"t":145,"s":[60.626,24.491,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.67,"y":0},"t":154,"s":[60.626,24.491,0],"to":[0,-8.167,0],"ti":[0,8.167,0]},{"t":179,"s":[60.626,-24.509,0]}]},"a":{"a":0,"k":[256.698,310.967,0]},"s":{"a":1,"k":[{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":140,"s":[100,100,100]},{"i":{"x":[0.33,0.33,0.33],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":145,"s":[110,88,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":154,"s":[110,88,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":169,"s":[100,101,100]},{"t":179,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.855,3.703],[0,0],[1.342,0],[0,0],[0.444,-1.554],[0,0],[0.482,-0.836]],"o":[[-1.094,-1.169],[0,0],[-0.637,-1.18],[0,0],[-1.618,0],[0,0],[-0.275,0.959],[0,0]],"v":[[42.088,9.646],[36.793,2.994],[31.004,-7.733],[27.797,-9.646],[-33.448,-9.646],[-36.951,-7.007],[-40.943,6.948],[-42.088,9.646]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.572549045086,0.109803922474,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[135.426,54.315]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.956,0],[0,0],[4.4,8.153],[0,0],[1.342,0],[0,0],[0.444,-1.554],[0,0],[5.356,0],[0,0],[0.047,-3.945],[0,0],[0,0],[-3.985,0],[0,0],[0,3.985],[0,0],[0,0]],"o":[[0,0],[-9.264,0],[0,0],[-0.637,-1.18],[0,0],[-1.618,0],[0,0],[-1.473,5.149],[0,0],[-3.956,0],[0,0],[0,0],[0,3.985],[0,0],[3.985,0],[0,0],[0,0],[-0.047,-3.945]],"v":[[176.354,-101.856],[-62.612,-101.856],[-84.794,-115.092],[-90.268,-125.236],[-93.475,-127.149],[-154.72,-127.149],[-158.223,-124.51],[-162.216,-110.555],[-173.753,-101.856],[-176.353,-101.856],[-183.58,-94.717],[-176.085,119.712],[-176.081,119.922],[-168.853,127.149],[168.854,127.149],[176.081,119.922],[176.081,119.817],[183.58,-94.717]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.773,0.612,0.5,0.924,0.751,0.567,1,0.91,0.729,0.522]}},"s":{"a":0,"k":[-0.698,-127.818]},"e":{"a":0,"k":[-0.698,126.481]},"t":1,"nm":"gr16","hd":false},{"ty":"tr","p":{"a":0,"k":[256.698,171.818]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[3.757,6.705],[0,0],[3.55,0],[0,0],[1.177,-4.115],[0,0],[2.678,0]],"o":[[-4.782,0],[0,0],[-1.686,-3.123],[0,0],[-4.282,0],[0,0],[-0.737,2.575],[0,0]],"v":[[55.059,12.646],[39.412,2.991],[33.706,-7.583],[25.219,-12.646],[-36.026,-12.646],[-45.298,-5.657],[-49.29,8.297],[-55.059,12.646]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.686274528503,0.372549027205,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[138.004,51.315]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.034,7.265],[0,0],[0,0],[-7.207,0],[0,0],[-0.737,2.575],[0,0],[-4.282,0],[0,0],[-1.686,-3.123],[0,0],[-7.106,0],[0,0],[-0.086,-7.206],[0,0],[0,0],[7.293,0]],"o":[[-7.273,0],[0,0],[0,0],[0.086,-7.206],[0,0],[2.678,0],[0,0],[1.177,-4.115],[0,0],[3.55,0],[0,0],[3.375,6.254],[0,0],[7.207,0],[0,0],[0,0],[0,7.294],[0,0]],"v":[[-168.853,133.149],[-182.082,119.984],[-189.581,-94.647],[-189.58,-94.788],[-176.353,-107.856],[-173.753,-107.856],[-167.984,-112.206],[-163.992,-126.16],[-154.72,-133.149],[-93.475,-133.149],[-84.988,-128.086],[-79.55,-118.009],[-62.536,-107.856],[176.354,-107.856],[189.581,-94.788],[189.577,-94.507],[182.081,119.922],[168.854,133.149]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.78823530674,0.647058844566,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.698,171.818]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.909,-6.676],[0,0],[0,0],[0.188,-0.005],[0,0],[0,0]],"o":[[0,0],[-6.946,0],[0,0],[0,0],[-0.189,0],[0,0],[0,0],[0,0]],"v":[[27.573,-35.876],[-5.38,-35.876],[-20.42,-24.537],[-24.413,-10.583],[-27.013,-10.583],[-27.573,-10.555],[-27.573,35.876],[27.572,35.876]],"c":false}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.78,0.459,0.11,0.5,0.724,0.473,0.202,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[0.642,5.456]},"e":{"a":0,"k":[-7.525,13.623]},"t":1,"nm":"gr17","hd":false},{"ty":"tr","p":{"a":0,"k":[107.358,68.544]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[1.245,2.307],[0,0],[5.758,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-4.937,0],[0,0],[-2.734,-5.066],[0,0],[0,0]],"v":[[-33.282,35.876],[33.282,35.876],[33.282,-10.583],[24.852,-10.583],[14.802,-16.5],[8.779,-27.662],[-4.989,-35.876],[-33.281,-35.876]],"c":false}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.78,0.459,0.11,0.5,0.724,0.473,0.202,1,0.667,0.486,0.294]}},"s":{"a":0,"k":[-8.212,4.456]},"e":{"a":0,"k":[1.767,14.434]},"t":1,"nm":"gr18","hd":false},{"ty":"tr","p":{"a":0,"k":[168.212,68.544]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.103,10.507],[0,0],[0,0],[-10.477,0],[0,0],[0,0],[-6.946,0],[0,0],[-2.734,-5.066],[0,0],[-4.888,0],[0,0],[-0.125,-10.476],[0,0],[0,0],[10.563,0]],"o":[[-10.521,0],[0,0],[0,0],[0.125,-10.504],[0,0],[0,0],[1.909,-6.676],[0,0],[5.758,0],[0,0],[2.321,4.301],[0,0],[10.477,0],[0,0],[0,0],[-0.062,10.55],[0,0]],"v":[[-168.853,139.149],[-188.08,120.11],[-195.581,-94.564],[-195.579,-94.831],[-176.353,-113.856],[-173.753,-113.856],[-169.76,-127.811],[-154.72,-139.149],[-93.475,-139.149],[-79.707,-130.936],[-74.259,-120.839],[-62.557,-113.856],[176.354,-113.856],[195.581,-94.859],[195.573,-94.297],[188.081,120.036],[168.854,139.149]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666666686535,0.486274510622,0.29411765933,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.698,171.818]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":-52,"op":216,"st":-52,"bm":0}]} \ No newline at end of file diff --git a/messenger-client/app/src/main/assets/key_gold.json b/messenger-client/app/src/main/assets/key_gold.json new file mode 100644 index 0000000..2805d38 --- /dev/null +++ b/messenger-client/app/src/main/assets/key_gold.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":157,"w":512,"h":512,"nm":"KEY 1 MAIN NEW","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"SCALE ALL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[251,266,0]},"s":{"a":0,"k":[94,94,100]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"NULL MOVE","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[0.891]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.38],"y":[-0.057]},"t":9,"s":[-10]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[53]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[15]},{"i":{"x":[0.806],"y":[1.639]},"o":{"x":[0.7],"y":[0]},"t":104,"s":[50]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.279],"y":[0.085]},"t":117,"s":[53]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":139,"s":[-2]},{"t":156,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[0,0,0],"to":[5.625,-3.625,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.757},"o":{"x":0.256,"y":0},"t":12,"s":[7.75,-11.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0.041},"t":36,"s":[-24.5,3.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":55,"s":[-106.5,-14.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.39,"y":0.51},"o":{"x":0.8,"y":0},"t":73,"s":[-107,-4.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":0.929},"o":{"x":0.7,"y":0.045},"t":102,"s":[-106.5,-14.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.38,"y":1},"o":{"x":0.2,"y":0.198},"t":123,"s":[-17.5,3.5,0],"to":[4.625,0.375,0],"ti":[0,0,0]},{"t":146,"s":[0,0,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.38,0.38,0.38],"y":[0,0,0]},"t":12,"s":[97,97,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":55,"s":[100,100,100]},{"i":{"x":[0.39,0.39,0.39],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":73,"s":[100,100,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.7],"y":[0,0,0]},"t":102,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":121,"s":[100,100,100]},{"t":156,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":184,"st":4,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Head","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"t":50,"s":[100],"h":1},{"t":70,"s":[0],"h":1},{"t":81,"s":[100],"h":1}]},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[-45]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[-94]},{"t":104,"s":[-45]}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[21.902,-19.229,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[13.7,-10.457,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.59,"y":0.531},"o":{"x":0.512,"y":0},"t":56,"s":[14.344,-15.846,0],"to":[5.763,1.954,0],"ti":[-1.432,-3.618,0]},{"i":{"x":0.521,"y":1},"o":{"x":0.219,"y":0.372},"t":65,"s":[43.531,-3.468,0],"to":[1.051,6.624,0],"ti":[0,0,0]},{"i":{"x":0.281,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[41.554,15.476,0],"to":[23.745,-25.52,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[21.902,-19.229,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[14.446,-11.123,0],"to":[0,0,0],"ti":[0,0,0]},{"t":144,"s":[21.902,-19.229,0]}]},"a":{"a":0,"k":[-11.848,-84.075,0]},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.38,0.38,0.38],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":39,"s":[119,119,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":56,"s":[98,98,100]},{"i":{"x":[0.39,0.39,0.39],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":73,"s":[98,96,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.7],"y":[0,0,0]},"t":104,"s":[98,98,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":121,"s":[120,120,100]},{"t":144,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[-3.677,-1.485],[-3.741,3.741],[-7.667,-1.211],[-27.386,27.386],[-1.52,31.845]],"o":[[2.058,-1.662],[8.882,0.014],[4.893,1.98],[0,0],[49.011,7.743],[24.319,-24.319],[0,0]],"v":[[-13.246,39.594],[12.219,38.373],[36.883,48.527],[51.117,45.635],[67.176,36.124],[186.005,-2.958],[224.763,-90.524]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[-3.677,-1.485],[-3.741,3.741],[-7.667,-1.211],[-27.386,27.386],[-1.52,31.845]],"o":[[2.058,-1.662],[8.882,0.014],[4.893,1.98],[0,0],[49.011,7.743],[24.319,-24.319],[0,0]],"v":[[-13.246,39.594],[12.219,38.373],[36.883,48.527],[51.117,45.635],[67.176,36.124],[186.005,-2.958],[224.763,-90.524]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.929,0.596],[-5.348,-2.441],[-19.099,25.381],[-5.985,19.176]],"o":[[3.573,1.172],[3.996,2.482],[3.558,1.712],[0,0],[37.872,17.284],[8.048,-8.352],[0,0]],"v":[[23.459,-8.163],[44.587,-2.156],[56.399,4.289],[67.252,6.93],[82.426,5.545],[185.677,-12.033],[210.699,-54.9]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.929,0.596],[-5.348,-2.441],[-19.099,25.381],[-8.242,23.269]],"o":[[5.108,0.869],[7.434,-0.391],[3.558,1.712],[0,0],[37.872,17.284],[1.988,-2.436],[0,0]],"v":[[25.371,-3.39],[39.444,-1.475],[56.399,4.289],[67.252,6.93],[82.426,5.545],[185.677,-12.033],[209.257,-52.784]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.929,0.596],[-5.348,-2.441],[-19.099,25.381],[-8.437,23.624]],"o":[[0.177,0.647],[7.834,0.594],[3.558,1.712],[0,0],[37.872,17.284],[1.463,-1.923],[0,0]],"v":[[38.976,-1.027],[36.651,-1.268],[56.399,4.289],[67.252,6.93],[82.426,5.545],[185.677,-12.033],[209.132,-52.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[-0.895,-0.43],[-2.72,-1.077],[-1.846,-0.682],[-37.948,-0.132],[6.338,11.11]],"o":[[0.059,0.217],[2.623,0.199],[1.191,0.573],[0,0],[14.908,5.511],[9.113,0.032],[0,0]],"v":[[35.576,-27.365],[35.539,-26.794],[37.054,-26.384],[60.789,-15.584],[94.572,-2.426],[194.659,19.659],[219.872,3.961]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-1.439,-0.85],[-1.486,-0.698],[-1.739,-0.689],[-11.462,-4.186],[-40.289,-5.123],[2.839,6.59]],"o":[[0.038,0.138],[4.99,3.725],[4.932,2.295],[0,0],[23.985,8.795],[8.034,0.575],[0,0]],"v":[[-17.043,-68.845],[11.257,-47.074],[32.391,-34.525],[56.59,-22.769],[100.213,-5.809],[202.351,22.373],[223.015,14.494]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0,0],[-3.598,-2.126],[-2.374,-1.099],[-0.268,-0.106],[-25.886,-9.441],[-43.8,-12.609],[-2.411,-0.189]],"o":[[0.006,0.021],[3.856,2.145],[10.543,4.878],[0,0],[37.601,13.72],[6.415,1.389],[0,0]],"v":[[-10.581,-61.856],[4.81,-54.265],[25,-45.523],[50.291,-33.546],[108.675,-10.883],[213.889,26.446],[227.728,30.294]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":72,"s":[{"i":[[0,0],[-3.991,-2.357],[-2.535,-1.172],[0,0],[-28.508,-10.397],[-41.186,-9.241],[0,0]],"o":[[0,0],[3.991,2.357],[11.563,5.347],[0,0],[40.077,14.616],[6.414,0.835],[0,0]],"v":[[-16.507,-62.554],[-0.655,-53.743],[21.683,-42.251],[45.974,-30.955],[107.662,-5.455],[218.291,30.324],[228.728,31.305]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0,0],[-3.349,-1.978],[-2.272,-1.053],[-0.159,0.032],[-24.212,-8.857],[-35.425,-13.64],[-1.131,-0.396]],"o":[[0.179,-0.036],[3.769,1.943],[9.896,4.58],[0,0],[35.686,13.203],[3.449,0.961],[0,0]],"v":[[-17.576,-65.15],[6.843,-55.015],[26.351,-46.478],[51.32,-36.954],[109.076,-13.083],[214.798,28.935],[223.989,31.579]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[-1.184,-4.401],[-1.674,-0.989],[-1.587,-0.744],[-0.574,0.117],[-13.054,-4.723],[-24.277,-1.868],[-1.865,2.445]],"o":[[3.061,11.379],[2.236,1.095],[5.549,2.579],[0,0],[25.58,9.012],[3.077,-0.95],[0,0]],"v":[[-18.266,-78.606],[20.437,-46.962],[31.827,-40.48],[52.298,-29.795],[103.335,-8.323],[213.216,24.622],[216.32,23.431]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[-1.392,-2.146],[-0.837,-0.495],[-1.245,-0.589],[-0.781,0.159],[-7.474,-2.657],[-18.704,4.018],[-2.231,3.865]],"o":[[7.966,11.855],[1.47,0.67],[3.375,1.578],[0,0],[20.527,6.917],[2.892,-1.906],[0,0]],"v":[[-13.428,-68.899],[24.58,-37.841],[32.601,-33.321],[52.43,-23.876],[100.464,-5.943],[212.425,22.466],[221.942,14.604]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[0,0],[-0.902,-0.434],[-0.989,0.201],[-1.895,-0.59],[-13.13,9.904],[-2.598,5.286]],"o":[[0.654,0.458],[2.851,2.011],[1.201,0.578],[0,0],[15.475,4.821],[2.706,-2.861],[0,0]],"v":[[30.096,-27.264],[30.134,-27.278],[36.772,-24.539],[52.8,-19.516],[97.593,-3.562],[211.635,20.309],[221.259,8.946]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[0,0],[-1.493,-0.718],[-2.394,-1.079],[-3.046,-1.207],[-15.12,15.063],[-3.459,8.756]],"o":[[1.842,-0.368],[3.207,-0.946],[1.987,0.956],[0,0],[22.393,8.29],[4.476,-4.732],[0,0]],"v":[[31.649,-10.965],[35.842,-16.454],[43.314,-14.93],[57.617,-10.701],[91.25,0.561],[202.982,9.528],[216.871,-10.297]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.929,0.596],[-5.348,-2.441],[-19.099,25.381],[-5.18,15.698]],"o":[[3.299,-0.659],[7.732,-0.64],[3.558,1.712],[0,0],[37.872,17.284],[8.015,-8.475],[0,0]],"v":[[29.174,-0.19],[38.999,-1.416],[56.399,4.289],[67.252,6.93],[82.426,5.545],[185.677,-12.033],[208.093,-48.783]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":109,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.929,0.596],[-5.348,-2.441],[-19.099,25.381],[-5.012,15.26]],"o":[[4.588,0.499],[6.92,0.038],[3.558,1.712],[0,0],[37.872,17.284],[8.651,-9.488],[0,0]],"v":[[25.61,-2.604],[40.212,-1.576],[56.399,4.289],[67.252,6.93],[82.426,5.545],[185.677,-12.033],[208.376,-49.49]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.929,0.596],[-5.348,-2.441],[-19.099,25.381],[-4.404,13.68]],"o":[[0.907,-0.111],[3.996,2.482],[3.558,1.712],[0,0],[37.872,17.284],[10.945,-13.14],[0,0]],"v":[[25.662,-3.111],[44.587,-2.156],[56.399,4.289],[67.252,6.93],[82.426,5.545],[185.677,-12.033],[209.397,-52.039]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0],[-3.677,-1.485],[-3.741,3.741],[-7.667,-1.211],[-27.386,27.386],[-1.52,31.845]],"o":[[2.058,-1.662],[8.882,0.014],[4.893,1.98],[0,0],[49.011,7.743],[24.319,-24.319],[0,0]],"v":[[-13.246,39.594],[12.219,38.373],[36.883,48.527],[51.117,45.635],[67.176,36.124],[186.005,-2.958],[224.763,-90.524]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.486274510622,0.309803932905,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[-3.677,-1.485],[-3.741,3.741],[-7.667,-1.211],[-27.386,27.386],[51.88,51.88],[51.88,-51.88],[-1.527,-35.864],[5.826,-7.121],[-6.368,-9.755],[2.326,-2.282]],"o":[[2.058,-1.662],[8.882,0.014],[4.893,1.98],[0,0],[49.011,7.743],[51.88,-51.88],[-51.88,-51.88],[-27.386,27.386],[0.24,5.727],[-4.882,5.967],[15.801,24.203],[0,0]],"v":[[-13.371,39.156],[12.219,38.373],[36.883,48.527],[51.117,45.635],[67.176,36.124],[186.005,-2.958],[186.005,-190.836],[-1.873,-190.836],[-42.779,-89.104],[-43.911,-62.503],[-54.254,-41.149],[-50.72,-29.955]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[-3.677,-1.485],[-3.741,3.741],[-7.667,-1.211],[-27.386,27.386],[51.88,51.88],[51.88,-51.88],[-1.527,-35.864],[5.826,-7.121],[-6.368,-9.755],[2.326,-2.282]],"o":[[2.058,-1.662],[8.882,0.014],[4.893,1.98],[0,0],[49.011,7.743],[51.88,-51.88],[-51.88,-51.88],[-27.386,27.386],[0.24,5.727],[-4.882,5.967],[15.801,24.203],[0,0]],"v":[[-13.371,39.156],[12.219,38.373],[36.883,48.527],[51.117,45.635],[67.176,36.124],[186.005,-2.958],[186.005,-190.836],[-1.873,-190.836],[-42.779,-89.104],[-43.911,-62.503],[-54.254,-41.149],[-50.72,-29.955]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.765,0.07],[-5.32,-2.503],[-18.904,24.255],[53.155,46.602],[33.391,-38.316],[-8.089,-29.478],[1.32,-1.908],[-2.672,-3.102],[0.072,-0.726]],"o":[[2.67,0.895],[5.179,3.142],[3.558,1.712],[0,0],[36.975,17.4],[31.25,-40.097],[-53.155,-46.602],[-17.626,20.226],[1.292,4.707],[-3.027,4.375],[5.354,6.214],[0,0]],"v":[[23.981,-7.995],[44.587,-2.156],[56.512,4.332],[66.965,6.646],[82.426,5.545],[185.677,-12.033],[149.89,-165.794],[-6.818,-180.797],[-21.56,-100.806],[-14.79,-74.475],[-16.85,-63.287],[-6.958,-52.595]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.765,0.07],[-5.32,-2.503],[-18.904,24.255],[53.155,46.602],[33.391,-38.316],[-8.089,-29.478],[1.32,-1.908],[-3.063,-2.717],[0.071,0.071]],"o":[[2.597,-0.047],[5.076,1.71],[3.558,1.712],[0,0],[36.975,17.4],[31.25,-40.097],[-53.155,-46.602],[-17.626,20.226],[1.292,4.707],[-3.027,4.375],[4.663,4.136],[0,0]],"v":[[38.708,-1.294],[43.806,-0.907],[56.512,4.332],[66.965,6.646],[82.426,5.545],[185.677,-12.033],[149.89,-165.794],[-6.818,-180.797],[-21.56,-100.806],[-14.79,-74.475],[-16.85,-63.287],[-7.72,-55.124]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[-2.762,-1.07],[-2.504,-0.502],[-7.335,-1.531],[-15.85,18.815],[56.074,25.815],[19.401,-10.114],[-8.378,-9.262],[-0.504,-0.591],[0,0],[0.024,0.024]],"o":[[2.998,1.061],[4.372,1.552],[3.943,1.516],[0,0],[32.387,9.591],[11.651,-21.603],[-53.357,-25.903],[-13.83,8.158],[1.787,2.377],[1.565,1.834],[0,0],[0,0]],"v":[[49.917,-21.068],[60.59,-16.344],[70.06,-12.252],[79.077,-8.101],[94.637,-2.167],[219.032,11.452],[123.103,-76.541],[-13.241,-100.502],[-15.954,-68.69],[-10.264,-61.771],[-8.71,-60.256],[-8.106,-59.701]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0,0],[0,0],[-2.802,-0.972],[-2.386,-0.761],[-5.666,-2.061],[-37.699,-9.236],[62.078,24.296],[11.636,6.222],[-3.568,-2.535],[-0.05,-0.058],[0,0],[0.002,0.002]],"o":[[3.18,1.563],[4.053,1.48],[4.117,1.427],[0,0],[26.664,10.012],[-0.593,-2.548],[-51.468,-20.326],[-2.191,0.336],[2.011,1.321],[0.154,0.18],[0,0],[0,0]],"v":[[45.439,-35.742],[57.676,-29.076],[75.731,-22.584],[97.272,-15.842],[110.358,-9.708],[227.095,30.865],[110.545,-11.142],[-14.962,-64.587],[-11.802,-61.359],[-5.844,-58.238],[-5.309,-57.97],[-4.178,-57.436]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":72,"s":[{"i":[[0,0],[0,0],[-2.806,-0.961],[-2.373,-0.789],[-5.484,-2.118],[-41.605,-8.595],[62.733,24.13],[12.36,4.079],[-3.043,-1.802],[0,0],[0,0],[0,0]],"o":[[3.2,1.618],[4.018,1.472],[4.136,1.417],[0,0],[26.04,10.058],[-1.929,-0.469],[-51.262,-19.718],[-0.922,-0.517],[2.036,1.205],[0,0],[0,0],[0,0]],"v":[[41.779,-32.792],[55.189,-27.138],[74.759,-19.093],[96.122,-9.286],[109.521,-4.181],[226.723,31.156],[109.12,-4.2],[-15.137,-61.714],[-8.709,-58.61],[-5.362,-57.853],[-4.938,-57.721],[-3.75,-57.189]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0,0],[0,0],[-2.799,-0.979],[-2.394,-0.743],[-5.475,-2.139],[-34.106,-10.417],[62.213,25.35],[13.502,1.777],[-3.317,-3.305],[0,0],[0,0],[0.082,-0.091]],"o":[[3.167,1.528],[4.081,1.563],[4.105,1.433],[0,0],[26.634,10.456],[-0.695,-0.165],[-51.365,-21.178],[-2.626,0.369],[1.995,1.395],[0,0],[0,0],[0,0]],"v":[[45.706,-39.218],[59.452,-33.729],[77.953,-25.783],[97.317,-17.018],[110.704,-12.027],[223.562,30.805],[111.423,-13.584],[-17.159,-65.512],[-9.921,-62.877],[-6.552,-61.385],[-6.128,-61.215],[-4.949,-60.631]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[0,0],[0,0],[-2.78,-1.025],[-2.45,-0.621],[-5.452,-2.194],[-20.094,-0.967],[60.856,28.533],[16.481,-4.228],[-4.032,-7.225],[0,0],[0,0],[0.295,-0.33]],"o":[[3.082,1.292],[4.246,1.799],[4.023,1.475],[0,0],[28.183,11.496],[4.288,-7.006],[-51.633,-24.986],[-7.07,2.681],[1.89,1.891],[0,0],[0,0],[0,0]],"v":[[45.185,-34.047],[56.05,-27.24],[74.075,-19.628],[92.072,-12.35],[105.814,-8.35],[217.67,24.847],[117.428,-38.056],[-15.288,-82.557],[-11.316,-68.673],[-7.744,-64.789],[-6.804,-64.924],[-5.657,-63.862]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[0,0],[-2.761,-1.071],[-2.505,-0.499],[-5.429,-2.248],[-6.082,8.483],[59.5,31.716],[19.46,-10.233],[-4.747,-11.145],[0,0],[0,0],[0.508,-0.568]],"o":[[2.997,1.056],[4.41,2.036],[3.941,1.517],[0,0],[29.732,12.536],[9.272,-13.847],[-51.901,-28.794],[-11.514,4.992],[1.785,2.387],[0,0],[0,0],[0,0]],"v":[[41.692,-23.76],[52.648,-20.752],[70.197,-13.474],[86.828,-7.683],[100.923,-4.673],[211.778,18.89],[123.433,-62.528],[-13.417,-99.601],[-14.894,-71.235],[-11.413,-65.911],[-10.987,-65.539],[-9.861,-64.684]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[0,0],[-2.732,-1.142],[-2.592,-0.31],[-5.393,-2.333],[-10.356,13.741],[57.385,36.678],[24.103,-19.594],[-5.861,-17.256],[0.44,-0.636],[-0.864,-1.057],[0.841,-0.939]],"o":[[2.863,0.688],[4.667,2.405],[3.814,1.582],[0,0],[29.582,11.081],[16.598,-22.597],[-52.319,-34.73],[-13.552,10.07],[1.62,3.16],[-1.009,1.458],[4.414,5.399],[0,0]],"v":[[40.697,-16.271],[49.961,-14.553],[65.635,-7.538],[79.987,-3.384],[93.616,0.247],[203.077,8.582],[132.252,-96.95],[-11.217,-126.667],[-17.116,-81.092],[-12.538,-68.766],[-12.941,-64.789],[-10.891,-62.133]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.765,0.07],[-5.32,-2.503],[-18.904,24.255],[53.155,46.602],[33.391,-38.316],[-8.089,-29.478],[1.32,-1.908],[-2.591,-3.17],[1.506,-1.682]],"o":[[2.597,-0.047],[5.179,3.142],[3.558,1.712],[0,0],[36.975,17.4],[31.25,-40.097],[-53.155,-46.602],[-17.626,20.226],[1.292,4.707],[-3.027,4.375],[13.241,16.198],[0,0]],"v":[[38.708,-1.294],[44.587,-2.156],[56.512,4.332],[66.965,6.646],[82.426,5.545],[185.677,-12.033],[149.89,-165.794],[-6.818,-180.797],[-21.56,-100.806],[-14.79,-74.475],[-16.85,-63.287],[-12.952,-57.03]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[-2.673,-1.286],[-2.765,0.07],[-5.32,-2.503],[-18.904,24.255],[53.155,46.602],[33.391,-38.316],[-8.089,-29.478],[1.32,-1.908],[-2.591,-3.17],[1.506,-1.682]],"o":[[0.553,-0.573],[5.179,3.142],[3.558,1.712],[0,0],[36.975,17.4],[31.25,-40.097],[-53.155,-46.602],[-17.626,20.226],[1.292,4.707],[-3.027,4.375],[13.241,16.198],[0,0]],"v":[[26.184,-2.943],[44.587,-2.156],[56.512,4.332],[66.965,6.646],[82.426,5.545],[185.677,-12.033],[149.89,-165.794],[-6.818,-180.797],[-21.56,-100.806],[-14.79,-74.475],[-16.85,-63.287],[-12.952,-57.03]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0],[-3.677,-1.485],[-3.741,3.741],[-7.667,-1.211],[-27.386,27.386],[51.88,51.88],[51.88,-51.88],[-1.527,-35.864],[5.826,-7.121],[-6.368,-9.755],[2.326,-2.282]],"o":[[2.058,-1.662],[8.882,0.014],[4.893,1.98],[0,0],[49.011,7.743],[51.88,-51.88],[-51.88,-51.88],[-27.386,27.386],[0.24,5.727],[-4.882,5.967],[15.801,24.203],[0,0]],"v":[[-13.371,39.156],[12.219,38.373],[36.883,48.527],[51.117,45.635],[67.176,36.124],[186.005,-2.958],[186.005,-190.836],[-1.873,-190.836],[-42.779,-89.104],[-43.911,-62.503],[-54.254,-41.149],[-50.72,-29.955]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[0.698039233685,0.454901963472,0.06274510175,1]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":72,"s":[0.631372570992,0.408438146114,0.089960381389,1]},{"t":104,"s":[0.698039233685,0.454901963472,0.06274510175,1]}]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[-8.087,14.454],[-23.126,-12.939],[-3.34,-11.818]],"o":[[-6.929,-13.76],[12.939,-23.126],[11.563,6.47],[0,0]],"v":[[89.412,-115.463],[90.376,-160.522],[155.685,-178.961],[178.435,-150.129]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-8.087,14.454],[-23.126,-12.939],[-3.34,-11.818]],"o":[[-6.929,-13.76],[12.939,-23.126],[11.563,6.47],[0,0]],"v":[[89.412,-115.463],[90.376,-160.522],[155.685,-178.961],[178.435,-150.129]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-3.721,10.912],[-21.588,-12.603],[-5.124,-9.851]],"o":[[-8.461,-11.754],[5.954,-17.46],[10.794,6.301],[0,0]],"v":[[77.088,-103.2],[68.791,-139.481],[118.665,-148.27],[143.15,-122.873]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0,0],[-3.721,10.912],[-21.588,-12.603],[-5.124,-9.851]],"o":[[-8.461,-11.754],[5.954,-17.46],[10.794,6.301],[0,0]],"v":[[77.088,-103.2],[68.791,-139.481],[118.665,-148.27],[143.15,-122.873]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[-4.509,9.535],[-18.363,-4.908],[-7.989,-6.992]],"o":[[-6.486,-3.557],[0.252,-3.562],[13.516,3.599],[0,0]],"v":[[102.232,-30.133],[87.126,-53.253],[117.587,-54.478],[148.454,-37.602]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0,0],[5.561,0.734],[-27.809,-10.755],[-7.954,-4.114]],"o":[[-5.234,-2.515],[-0.454,-0.174],[10.85,4.115],[0,0]],"v":[[122.312,-6.133],[101.13,-13.021],[119.267,-7.249],[153.498,6.179]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":72,"s":[{"i":[[0,0],[5.982,2.258],[-28.839,-11.393],[-7.95,-3.8]],"o":[[-5.097,-2.402],[-0.531,0.196],[10.56,4.172],[0,0]],"v":[[122.994,0.663],[101.958,-7.08],[118.75,-0.544],[154.048,10.955]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0,0],[2.911,-0.19],[-28.445,-11.459],[-7.797,-4.129]],"o":[[-5.28,-2.91],[-0.179,-0.763],[10.572,4.287],[0,0]],"v":[[121.704,-7.846],[100.432,-15.828],[118.734,-8.462],[153.3,3.989]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[2.706,5.18],[-26.391,-11.802],[-6.996,-5.843]],"o":[[-6.233,-5.559],[1.658,-5.765],[10.639,4.891],[0,0]],"v":[[107.426,-33.748],[88.947,-51.854],[118.651,-49.763],[149.399,-32.343]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[-3.721,10.912],[-21.588,-12.603],[-5.124,-9.851]],"o":[[-8.461,-11.754],[5.954,-17.46],[10.794,6.301],[0,0]],"v":[[77.088,-103.2],[68.791,-139.481],[118.665,-148.27],[143.15,-122.873]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[-3.721,10.912],[-21.588,-12.603],[-5.124,-9.851]],"o":[[-8.461,-11.754],[5.954,-17.46],[10.794,6.301],[0,0]],"v":[[77.088,-103.2],[68.791,-139.481],[118.665,-148.27],[143.15,-122.873]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-8.087,14.454],[-23.126,-12.939],[-3.34,-11.818]],"o":[[-6.929,-13.76],[12.939,-23.126],[11.563,6.47],[0,0]],"v":[[89.412,-115.463],[90.376,-160.522],[155.685,-178.961],[178.435,-150.129]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.61960786581,0.349019616842,0.019607843831,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[23.126,12.939],[-12.939,23.126],[-23.126,-12.939],[12.939,-23.126]],"o":[[-23.126,-12.939],[12.939,-23.126],[23.126,12.939],[-12.939,23.126]],"v":[[108.824,-95.209],[90.376,-160.522],[155.685,-178.961],[174.137,-113.657]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[23.126,12.939],[-12.939,23.126],[-23.126,-12.939],[12.939,-23.126]],"o":[[-23.126,-12.939],[12.939,-23.126],[23.126,12.939],[-12.939,23.126]],"v":[[108.824,-95.209],[90.376,-160.522],[155.685,-178.961],[174.137,-113.657]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[21.588,12.603],[-5.954,17.46],[-21.588,-12.603],[5.954,-17.46]],"o":[[-21.588,-12.603],[5.954,-17.46],[21.588,12.603],[-5.954,17.46]],"v":[[97.102,-85.039],[68.791,-139.481],[118.665,-148.27],[146.979,-93.835]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[21.588,12.603],[-5.954,17.46],[-21.588,-12.603],[5.954,-17.46]],"o":[[-21.588,-12.603],[5.954,-17.46],[21.588,12.603],[-5.954,17.46]],"v":[[97.102,-85.039],[68.791,-139.481],[118.665,-148.27],[146.979,-93.835]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[14.998,5.562],[-1.969,7.253],[-13.26,-3.968],[4.242,-9.404]],"o":[[-18.379,-6.816],[2.073,-7.638],[17.771,5.318],[-3.277,7.264]],"v":[[121.143,-20.208],[85.552,-51.239],[120.213,-54.521],[160.3,-19.01]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[1.475,0.547],[-0.194,0.713],[-1.304,-0.39],[0.417,-0.925]],"o":[[-1.808,-0.67],[0.204,-0.751],[1.748,0.523],[-0.322,0.714]],"v":[[140.508,1.037],[99.967,-14.744],[121.777,-7.082],[167.744,11.331]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":72,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[141.778,6.041],[100.257,-8.158],[121.248,-0.354],[168.186,15.892]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[1.172,0.684],[-0.323,0.948],[-1.172,-0.684],[0.323,-0.948]],"o":[[-1.172,-0.684],[0.323,-0.948],[1.172,0.685],[-0.323,0.948]],"v":[[139.951,-0.882],[98.823,-16.848],[121.097,-8.283],[166.879,10.284]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[7.288,4.255],[-2.01,5.894],[-7.288,-4.255],[2.01,-5.894]],"o":[[-7.288,-4.255],[2.01,-5.894],[7.288,4.255],[-2.01,5.894]],"v":[[125.726,-22.825],[87.82,-52.568],[120.305,-49.637],[160.061,-18.965]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[21.588,12.603],[-5.954,17.46],[-21.588,-12.603],[5.954,-17.46]],"o":[[-21.588,-12.603],[5.954,-17.46],[21.588,12.603],[-5.954,17.46]],"v":[[97.102,-85.039],[68.791,-139.481],[118.665,-148.27],[146.979,-93.835]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[21.588,12.603],[-5.954,17.46],[-21.588,-12.603],[5.954,-17.46]],"o":[[-21.588,-12.603],[5.954,-17.46],[21.588,12.603],[-5.954,17.46]],"v":[[97.102,-85.039],[68.791,-139.481],[118.665,-148.27],[146.979,-93.835]],"c":true}]},{"t":144,"s":[{"i":[[23.126,12.939],[-12.939,23.126],[-23.126,-12.939],[12.939,-23.126]],"o":[[-23.126,-12.939],[12.939,-23.126],[23.126,12.939],[-12.939,23.126]],"v":[[108.824,-95.209],[90.376,-160.522],[155.685,-178.961],[174.137,-113.657]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.454901963472,0.06274510175,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Stroke","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[-20.826,-20.825],[43.055,-43.055],[0,0],[45.452,45.453],[29.851,0],[0,0],[22.724,-22.723],[-45.452,-45.453],[-29.852,0],[-22.54,21.786],[0,0],[29.045,0],[20.824,20.824],[-43.059,43.06],[-29.531,0]],"o":[[29.534,0],[43.06,43.061],[0,0],[45.448,-45.448],[-22.726,-22.725],[0,0],[-29.85,0],[-45.452,45.453],[22.726,22.726],[29.228,0],[0,0],[-20.703,20.173],[-29.534,0],[-43.059,-43.06],[20.821,-20.82],[0,0]],"v":[[92.056,-207.275],[170.15,-174.982],[170.158,-18.805],[174.497,-14.467],[174.489,-179.32],[92.056,-213.411],[92.056,-213.411],[9.635,-179.327],[9.635,-14.467],[92.067,19.623],[173.061,-13.055],[169.117,-17.777],[92.066,13.488],[13.974,-18.805],[13.974,-174.988],[92.056,-207.275]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-20.826,-20.825],[43.055,-43.055],[0,0],[45.452,45.453],[29.851,0],[0,0],[22.724,-22.723],[-45.452,-45.453],[-29.852,0],[-22.54,21.786],[0,0],[29.045,0],[20.824,20.824],[-43.059,43.06],[-29.531,0]],"o":[[29.534,0],[43.06,43.061],[0,0],[45.448,-45.448],[-22.726,-22.725],[0,0],[-29.85,0],[-45.452,45.453],[22.726,22.726],[29.228,0],[0,0],[-20.703,20.173],[-29.534,0],[-43.059,-43.06],[20.821,-20.82],[0,0]],"v":[[92.056,-207.275],[170.15,-174.982],[170.158,-18.805],[174.497,-14.467],[174.489,-179.32],[92.056,-213.411],[92.056,-213.411],[9.635,-179.327],[9.635,-14.467],[92.067,19.623],[173.061,-13.055],[169.117,-17.777],[92.066,13.488],[13.974,-18.805],[13.974,-174.988],[92.056,-207.275]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-21.337,-18.707],[27.711,-31.799],[0,0],[46.57,40.827],[24.899,2.384],[0,0],[14.625,-16.783],[-46.569,-40.828],[-24.9,-2.384],[-14.651,16.03],[0,0],[24.226,2.319],[21.336,18.706],[-27.715,31.801],[-24.631,-2.358]],"o":[[24.635,2.358],[44.118,38.68],[0,0],[29.251,-33.566],[-23.285,-20.413],[0,0],[-24.898,-2.384],[-29.253,33.569],[23.285,20.414],[24.379,2.334],[0,0],[-13.425,14.857],[-24.635,-2.358],[-44.117,-38.679],[13.401,-15.377],[0,0]],"v":[[68.396,-186.751],[139.686,-154.085],[169.441,-26.268],[173.886,-22.372],[142.478,-157.289],[67.228,-191.772],[67.228,-191.772],[4.974,-170.459],[36.376,-35.536],[111.625,-1.054],[172.957,-21.331],[168.768,-25.51],[110.456,-6.076],[39.168,-38.741],[9.419,-166.562],[68.396,-186.751]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[-21.337,-18.707],[27.711,-31.799],[0,0],[46.57,40.827],[24.899,2.384],[0,0],[14.625,-16.783],[-46.569,-40.828],[-24.9,-2.384],[-14.651,16.03],[0,0],[24.226,2.319],[21.336,18.706],[-27.715,31.801],[-24.631,-2.358]],"o":[[24.635,2.358],[44.118,38.68],[0,0],[29.251,-33.566],[-23.285,-20.413],[0,0],[-24.898,-2.384],[-29.253,33.569],[23.285,20.414],[24.379,2.334],[0,0],[-13.425,14.857],[-24.635,-2.358],[-44.117,-38.679],[13.401,-15.377],[0,0]],"v":[[68.396,-186.751],[139.686,-154.085],[169.441,-26.268],[173.886,-22.372],[142.478,-157.289],[67.228,-191.772],[67.228,-191.772],[4.974,-170.459],[36.376,-35.536],[111.625,-1.054],[172.957,-21.331],[168.768,-25.51],[110.456,-6.076],[39.168,-38.741],[9.419,-166.562],[68.396,-186.751]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[-28.867,-12.627],[9.12,-12.577],[0,0],[54.678,24.843],[15.369,4.537],[0,0],[4.487,-7.995],[-36.656,-21.814],[-24.274,-9.124],[-16.043,12.391],[0,0],[31.749,10.445],[23.29,13.445],[-3.704,6.308],[-25.619,-6.939]],"o":[[15.454,3.631],[49.259,22.892],[0,0],[13.086,-14.774],[-25.324,-11.845],[0,0],[-27.104,-7.66],[-5.394,10.809],[25.516,15.185],[21.294,7.3],[0,0],[-5.178,8.111],[-20.172,-7.349],[-29.98,-17.043],[4.593,-7.823],[0,0]],"v":[[54.334,-82.934],[118.302,-61.453],[202.701,3.286],[205.684,6.176],[119.022,-65.35],[54.298,-87.158],[54.298,-87.158],[-7.035,-88.524],[33.832,-44.007],[107.789,-9.343],[205.318,6.65],[202.437,3.633],[109.204,-12.76],[36.573,-47.482],[-2.673,-84.899],[54.334,-82.934]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0,0],[-2.839,-1.242],[0.897,-1.237],[0,0],[5.378,2.443],[1.512,0.446],[0,0],[0.441,-0.786],[-3.605,-2.145],[-2.387,-0.897],[-1.578,1.219],[0,0],[3.123,1.027],[2.291,1.322],[-0.364,0.62],[-2.52,-0.682]],"o":[[1.52,0.357],[4.845,2.252],[0,0],[1.287,-1.453],[-2.491,-1.165],[0,0],[-2.666,-0.753],[-0.531,1.063],[2.51,1.493],[2.094,0.718],[0,0],[-0.509,0.798],[-1.984,-0.723],[-2.949,-1.676],[0.452,-0.769],[0,0]],"v":[[41.971,-38.439],[116.517,-9.08],[217.985,27.141],[218.043,27.06],[117.074,-9.343],[42.054,-38.799],[42.054,-38.799],[-10.026,-63.333],[32.151,-40.512],[109.438,-10.935],[217.676,27.534],[217.72,27.488],[109.664,-11.451],[32.376,-40.641],[-9.96,-62.959],[41.971,-38.439]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":72,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[40.623,-33.586],[115.622,-1.814],[219.652,29.744],[219.391,29.339],[116.161,-1.681],[40.718,-33.524],[40.718,-33.524],[-10.353,-60.585],[31.968,-40.131],[107.066,-4.759],[219.025,29.812],[219.387,30.09],[107.162,-4.959],[31.918,-39.895],[-10.755,-60.565],[40.623,-33.586]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0,0],[-1.245,-1.092],[0.163,-0.034],[0,0],[2.719,2.383],[1.453,0.139],[0,0],[0.854,-0.98],[-2.719,-2.383],[-1.453,-0.139],[-0.855,0.936],[0,0],[1.414,0.135],[1.245,1.092],[-1.618,1.856],[-1.438,-0.138]],"o":[[1.438,0.138],[2.575,2.258],[0,0],[0.057,0.287],[-1.359,-1.192],[0,0],[-1.453,-0.139],[-1.708,1.96],[1.359,1.192],[1.423,0.136],[0,0],[-0.784,0.867],[-1.438,-0.138],[-2.575,-2.258],[0.782,-0.898],[0,0]],"v":[[40.522,-41.003],[117.027,-10.702],[215.048,28.827],[215.062,28.674],[117.698,-10.765],[40.543,-41.238],[40.543,-41.238],[-12.847,-62.607],[34.593,-44.384],[109.898,-12.31],[214.662,29.18],[214.759,29.198],[109.921,-12.791],[34.709,-44.349],[-12.966,-62.362],[40.522,-41.003]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[0,0],[-8.863,-3.079],[3.619,-4.796],[0,0],[22.78,10.512],[7.115,1.883],[0,0],[2.325,-3.871],[-16.763,-10.761],[-7.981,-2.288],[-2.362,2.821],[0,0],[16.584,6.994],[7.801,5.319],[-2.814,3.93],[-7.039,-1.862]],"o":[[7.04,1.863],[19.986,6.877],[0,0],[3.762,-4.901],[-9.306,-4.349],[0,0],[-7.115,-1.883],[-3.638,5.939],[8.671,5.561],[7.827,2.244],[0,0],[-2.15,2.627],[-7.396,-3.119],[-17.232,-11.73],[2.158,-3.095],[0,0]],"v":[[42.346,-61.906],[117.4,-33.858],[202.612,15.825],[203.866,16.905],[118.56,-34.08],[41.786,-63.317],[41.786,-63.317],[-8.378,-76.524],[35.113,-41.804],[108.93,-8.817],[203.518,17.362],[202.362,16.159],[109.826,-10.518],[36.009,-42.713],[-6.849,-74.769],[42.346,-61.906]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[-12.672,-4.073],[5.346,-7.177],[0,0],[32.81,14.576],[9.946,2.754],[0,0],[3.061,-5.317],[-23.786,-14.951],[-11.245,-3.362],[-3.115,3.764],[0,0],[11.07,2.889],[11.079,7.433],[-3.412,4.967],[-9.839,-2.725]],"o":[[9.84,2.725],[28.691,9.186],[0,0],[5.614,-7.495],[-13.28,-5.928],[0,0],[-9.946,-2.754],[-4.603,7.929],[12.327,7.745],[11.029,3.297],[0,0],[-2.834,3.507],[-10.961,-2.859],[-24.56,-16.466],[2.847,-4.194],[0,0]],"v":[[43.258,-72.357],[117.587,-45.436],[192.799,11.967],[194.673,13.664],[118.991,-45.738],[42.408,-74.357],[42.408,-74.357],[-6.144,-83.483],[35.373,-40.514],[108.446,-7.071],[194.351,14.096],[192.567,12.282],[109.778,-9.381],[36.66,-41.895],[-3.79,-80.972],[43.258,-72.357]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[-16.481,-5.066],[7.074,-9.558],[0,0],[42.841,18.641],[12.777,3.626],[0,0],[3.797,-6.762],[-30.808,-19.14],[-14.509,-4.436],[-3.868,4.706],[0,0],[14.289,3.807],[14.357,9.546],[-4.01,6.004],[-12.639,-3.587]],"o":[[12.641,3.587],[37.397,11.496],[0,0],[7.467,-10.089],[-17.253,-7.507],[0,0],[-12.776,-3.626],[-5.569,9.919],[15.983,9.929],[14.23,4.351],[0,0],[-3.517,4.387],[-14.135,-3.765],[-31.888,-21.202],[3.535,-5.292],[0,0]],"v":[[44.171,-82.808],[117.773,-57.014],[185.383,6.347],[187.876,8.661],[119.422,-57.395],[43.03,-85.396],[43.03,-85.396],[-3.91,-90.441],[35.633,-39.223],[110.275,-7.336],[187.581,9.067],[185.17,6.644],[110.598,-10.123],[37.31,-41.078],[-0.731,-87.176],[44.171,-82.808]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[-21.337,-18.707],[27.711,-31.799],[0,0],[46.57,40.827],[24.899,2.384],[0,0],[14.625,-16.783],[-46.569,-40.828],[-24.9,-2.384],[-14.651,16.03],[0,0],[24.226,2.319],[21.336,18.706],[-27.715,31.801],[-24.631,-2.358]],"o":[[24.635,2.358],[44.118,38.68],[0,0],[29.251,-33.566],[-23.285,-20.413],[0,0],[-24.898,-2.384],[-29.253,33.569],[23.285,20.414],[24.379,2.334],[0,0],[-13.425,14.857],[-24.635,-2.358],[-44.117,-38.679],[13.401,-15.377],[0,0]],"v":[[68.396,-186.751],[139.686,-154.085],[169.441,-26.268],[173.886,-22.372],[142.478,-157.289],[67.228,-191.772],[67.228,-191.772],[4.974,-170.459],[36.376,-35.536],[111.625,-1.054],[172.957,-21.331],[168.768,-25.51],[110.456,-6.076],[39.168,-38.741],[9.419,-166.562],[68.396,-186.751]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[-21.337,-18.707],[27.711,-31.799],[0,0],[46.57,40.827],[24.899,2.384],[0,0],[14.625,-16.783],[-46.569,-40.828],[-24.9,-2.384],[-14.651,16.03],[0,0],[24.226,2.319],[21.336,18.706],[-27.715,31.801],[-24.631,-2.358]],"o":[[24.635,2.358],[44.118,38.68],[0,0],[29.251,-33.566],[-23.285,-20.413],[0,0],[-24.898,-2.384],[-29.253,33.569],[23.285,20.414],[24.379,2.334],[0,0],[-13.425,14.857],[-24.635,-2.358],[-44.117,-38.679],[13.401,-15.377],[0,0]],"v":[[68.396,-186.751],[139.686,-154.085],[169.441,-26.268],[173.886,-22.372],[142.478,-157.289],[67.228,-191.772],[67.228,-191.772],[4.974,-170.459],[36.376,-35.536],[111.625,-1.054],[172.957,-21.331],[168.768,-25.51],[110.456,-6.076],[39.168,-38.741],[9.419,-166.562],[68.396,-186.751]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-20.826,-20.825],[43.055,-43.055],[0,0],[45.452,45.453],[29.851,0],[0,0],[22.724,-22.723],[-45.452,-45.453],[-29.852,0],[-22.54,21.786],[0,0],[29.045,0],[20.824,20.824],[-43.059,43.06],[-29.531,0]],"o":[[29.534,0],[43.06,43.061],[0,0],[45.448,-45.448],[-22.726,-22.725],[0,0],[-29.85,0],[-45.452,45.453],[22.726,22.726],[29.228,0],[0,0],[-20.703,20.173],[-29.534,0],[-43.059,-43.06],[20.821,-20.82],[0,0]],"v":[[92.056,-207.275],[170.15,-174.982],[170.158,-18.805],[174.497,-14.467],[174.489,-179.32],[92.056,-213.411],[92.056,-213.411],[9.635,-179.327],[9.635,-14.467],[92.067,19.623],[173.061,-13.055],[169.117,-17.777],[92.066,13.488],[13.974,-18.805],[13.974,-174.988],[92.056,-207.275]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,0.408,0.5,0.998,0.951,0.267,1,0.996,0.902,0.125,0,1,0.5,0.5,1,0]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.98},"o":{"x":0.51,"y":0},"t":56,"s":[15,-181.743],"to":[-1.53,-1.923],"ti":[4.01,5.042]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.003},"t":64,"s":[30.655,-192.447],"to":[-2.951,-3.71],"ti":[4.01,5.042]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[30.655,-192.447],"to":[-2.951,-3.71],"ti":[2.609,-1.784]},{"t":104,"s":[15,-181.743]}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.978},"o":{"x":0.51,"y":0},"t":56,"s":[98,-85.743],"to":[-0.723,-0.618],"ti":[1.897,1.619]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.009},"t":64,"s":[80.604,-68.496],"to":[-1.396,-1.192],"ti":[1.897,1.619]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[80.604,-68.496],"to":[-1.396,-1.192],"ti":[-2.899,2.875]},{"t":104,"s":[98,-85.743]}]},"t":1,"nm":"Gradient Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[24.294,-24.294],[0,-34.452],[-24.299,-24.299],[-34.454,0],[-24.243,23.994],[0,0],[31.423,0],[23.922,23.923],[-47.844,47.844],[-31.418,0.001],[-23.924,-23.924],[47.308,-47.884],[0,0],[50.236,50.237],[34.45,0],[0,0]],"o":[[-34.453,0.001],[-24.299,24.299],[0,34.452],[24.298,24.299],[34.224,0],[0,0],[-23.922,23.923],[-31.424,0],[-47.844,-47.844],[23.918,-23.918],[31.426,-0.001],[47.666,47.666],[0,0],[50.232,-50.232],[-24.3,-24.3],[0,0],[0,0]],"v":[[92.058,-227.304],[0.959,-188.003],[-36.721,-96.897],[0.959,-5.79],[92.067,31.89],[182.688,-5.308],[178.835,-10.129],[92.067,25.755],[5.297,-10.129],[5.297,-183.665],[92.055,-219.543],[178.827,-183.658],[178.835,-10.129],[182.688,-5.308],[183.165,-187.996],[92.06,-227.304],[92.06,-227.304]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[24.294,-24.294],[0,-34.452],[-24.299,-24.299],[-34.454,0],[-24.243,23.994],[0,0],[31.423,0],[23.922,23.923],[-47.844,47.844],[-31.418,0.001],[-23.924,-23.924],[47.308,-47.884],[0,0],[50.236,50.237],[34.45,0],[0,0]],"o":[[-34.453,0.001],[-24.299,24.299],[0,34.452],[24.298,24.299],[34.224,0],[0,0],[-23.922,23.923],[-31.424,0],[-47.844,-47.844],[23.918,-23.918],[31.426,-0.001],[47.666,47.666],[0,0],[50.232,-50.232],[-24.3,-24.3],[0,0],[0,0]],"v":[[92.058,-227.304],[0.959,-188.003],[-36.721,-96.897],[0.959,-5.79],[92.067,31.89],[182.688,-5.308],[178.835,-10.129],[92.067,25.755],[5.297,-10.129],[5.297,-183.665],[92.055,-219.543],[178.827,-183.658],[178.835,-10.129],[182.688,-5.308],[183.165,-187.996],[92.06,-227.304],[92.06,-227.304]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[15.636,-17.942],[-6.562,-28.196],[-24.895,-21.827],[-28.738,-2.751],[-15.651,17.701],[0,0],[26.21,2.509],[24.51,21.488],[-30.793,35.336],[-26.205,-2.508],[-24.512,-21.49],[30.339,-35.411],[0,0],[51.471,45.126],[28.735,2.751],[0,0]],"o":[[-28.737,-2.75],[-15.639,17.946],[6.562,28.196],[24.895,21.827],[28.546,2.733],[0,0],[-15.396,17.668],[-26.211,-2.509],[-49.02,-42.977],[15.394,-17.665],[26.212,2.509],[48.838,42.817],[0,0],[32.33,-37.099],[-24.897,-21.828],[0,0],[0,0]],"v":[[64.584,-203.142],[-3.916,-178.253],[-17.991,-106.7],[30.792,-29.128],[113.429,9.696],[182.463,-14.222],[178.33,-18.475],[112.793,3.964],[33.584,-32.333],[0.529,-174.356],[66.059,-196.791],[145.27,-160.493],[178.33,-18.475],[182.463,-14.222],[148.062,-163.697],[64.585,-203.142],[64.585,-203.142]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[15.636,-17.942],[-6.562,-28.196],[-24.895,-21.827],[-28.738,-2.751],[-15.651,17.701],[0,0],[26.21,2.509],[24.51,21.488],[-30.793,35.336],[-26.205,-2.508],[-24.512,-21.49],[30.339,-35.411],[0,0],[51.471,45.126],[28.735,2.751],[0,0]],"o":[[-28.737,-2.75],[-15.639,17.946],[6.562,28.196],[24.895,21.827],[28.546,2.733],[0,0],[-15.396,17.668],[-26.211,-2.509],[-49.02,-42.977],[15.394,-17.665],[26.212,2.509],[48.838,42.817],[0,0],[32.33,-37.099],[-24.897,-21.828],[0,0],[0,0]],"v":[[64.584,-203.142],[-3.916,-178.253],[-17.991,-106.7],[30.383,-28.798],[113.429,9.696],[182.463,-14.222],[178.33,-18.475],[112.793,3.964],[33.175,-32.002],[0.529,-174.356],[66.059,-196.791],[145.27,-160.493],[178.33,-18.475],[182.463,-14.222],[148.062,-163.697],[64.585,-203.142],[64.585,-203.142]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[10.925,-9.886],[-8.401,-6.218],[-26.192,-15.188],[-27.739,-7.289],[-14.179,17.566],[0,0],[27.032,6.711],[28.916,15.023],[-3.395,5.845],[-21.449,-6.449],[-28.842,-13.859],[17.29,-18.647],[0,0],[61.002,27.662],[29.444,2.429],[0,0]],"o":[[-30.007,-8.055],[-6.498,2.997],[11.608,14.193],[30.29,17.564],[33.695,9.398],[0,0],[-17.688,13.061],[-24.836,-9.438],[-49.389,-25.66],[8.19,-10.386],[21.122,6.35],[69.072,31.361],[0,0],[18.494,-16.162],[-29.696,-13.434],[0,0],[0,0]],"v":[[52.352,-98.67],[-18.532,-95.502],[-12.955,-69.247],[22.944,-35.824],[106.692,0.963],[215.037,10.425],[210.389,9.461],[105.668,-5.145],[30.461,-40.122],[-10.598,-91.766],[54.249,-90.995],[119.979,-69.006],[210.389,9.461],[215.037,10.425],[123.403,-76.098],[52.654,-98.85],[51.936,-98.056]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0,0],[1.075,-0.972],[-0.826,-0.612],[-2.576,-1.494],[-2.728,-0.717],[-1.395,1.728],[0,0],[2.659,0.66],[2.844,1.478],[-0.334,0.575],[-2.11,-0.634],[-2.837,-1.363],[1.701,-1.834],[0,0],[6,2.721],[2.896,0.239],[0,0]],"o":[[-2.951,-0.792],[-0.639,0.295],[1.142,1.396],[2.979,1.728],[3.314,0.924],[0,0],[-1.74,1.285],[-2.443,-0.928],[-4.858,-2.524],[0.806,-1.022],[2.077,0.625],[6.794,3.085],[0,0],[1.819,-1.59],[-2.921,-1.321],[0,0],[0,0]],"v":[[40.609,-40.386],[-17.145,-65.674],[-16.735,-63.822],[30.666,-41.183],[109.428,-9.763],[225.984,30.848],[225.366,30.938],[108.605,-10.62],[30.805,-41.662],[-16.214,-64.872],[40.916,-39.481],[102.16,-14.657],[225.366,30.938],[225.984,30.848],[102.6,-15.257],[40.912,-40.567],[40.193,-39.773]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":72,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[39.328,-34.029],[-16.993,-62.42],[-17.148,-63.23],[30.452,-39.28],[107.175,-4.584],[225.927,31.249],[225.748,31.454],[106.374,-4.868],[29.786,-39.342],[-16.827,-61.938],[39.462,-33.862],[99.517,-7.176],[225.748,31.454],[225.927,31.249],[99.63,-7.067],[39.631,-34.209],[38.912,-33.415]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0,0],[1.182,-0.73],[-0.118,-0.24],[-1.453,-1.274],[-1.677,-0.161],[-0.914,1.033],[0,0],[1.53,0.146],[1.431,1.254],[-1.798,2.063],[-1.53,-0.146],[-1.431,-1.254],[1.771,-2.067],[0,0],[3.005,2.634],[1.677,0.161],[0,0]],"o":[[-1.678,-0.161],[-0.419,0.334],[0.608,1.577],[1.453,1.274],[1.667,0.16],[0,0],[-0.899,1.031],[-1.53,-0.147],[-2.862,-2.509],[0.899,-1.031],[1.53,0.146],[2.851,2.499],[0,0],[-0.058,0.554],[-1.453,-1.274],[0,0],[0,0]],"v":[[39.08,-42.377],[-18.529,-66.884],[-18.253,-65.114],[32.839,-43.209],[110.106,-11.517],[222.634,30.217],[222.224,30.162],[109.314,-12.119],[32.375,-43.454],[-18.112,-66.203],[39.292,-41.85],[102.188,-16.126],[222.224,30.162],[222.634,30.217],[102.458,-16.211],[39.365,-42.547],[38.688,-41.799]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[0,0],[1.616,-2.133],[-0.484,-2.524],[-11.744,-6.909],[-9.57,-0.916],[-3.4,4.083],[0,0],[8.728,0.836],[9.254,5.655],[-4.051,3.512],[-7.489,-1.981],[-9.629,-4.943],[4.709,-6.398],[0,0],[18.557,10.597],[8.211,2.173],[0,0]],"o":[[-8.212,-2.172],[-1.251,2.013],[1.834,9.45],[11.211,6.596],[9.506,0.91],[0,0],[-2.414,3.171],[-8.728,-0.836],[-25.152,-15.275],[3.018,-2.537],[7.49,1.982],[28.382,14.301],[0,0],[8.776,-12.841],[-9.563,-5.445],[0,0],[0,0]],"v":[[39.479,-66.971],[-14.729,-81.085],[-15.801,-75.08],[32.29,-39.985],[111.075,-5.33],[211.911,23.86],[208.823,20.862],[110.329,-7.429],[33.187,-40.922],[-11.587,-79.289],[40.357,-65.023],[107.722,-39.254],[208.823,20.862],[211.911,23.86],[110.055,-39.685],[39.664,-67.075],[39.24,-66.596]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[1.832,-2.834],[-0.666,-3.666],[-16.276,-10.705],[-13.516,-1.294],[-4.644,5.608],[0,0],[12.327,1.18],[13.165,7.855],[-5.178,4.237],[-10.468,-2.898],[-13.729,-6.788],[6.178,-8.563],[0,0],[26.333,14.579],[11.478,3.179],[0,0]],"o":[[-11.479,-3.178],[-1.668,2.852],[2.446,13.386],[13.01,8.557],[13.426,1.285],[0,0],[-3.172,4.241],[-12.327,-1.18],[-36.298,-21.658],[4.078,-3.29],[10.47,2.899],[41.147,20.202],[0,0],[13.194,-19.538],[-13.617,-7.53],[0,0],[0,0]],"v":[[39.679,-79.267],[-12.829,-88.185],[-14.575,-80.062],[30.953,-36.329],[111.56,-2.237],[206.55,20.681],[202.122,16.212],[110.836,-5.083],[33.593,-39.656],[-8.325,-85.833],[40.889,-76.61],[110.489,-50.818],[202.122,16.212],[206.55,20.681],[113.853,-51.422],[39.814,-79.339],[39.515,-78.995]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[2.049,-3.536],[-0.849,-4.807],[-15.127,-13.262],[-17.462,-1.672],[-5.887,7.133],[0,0],[15.926,1.525],[14.893,13.057],[-6.304,4.962],[-13.447,-3.816],[-17.828,-8.632],[7.647,-10.729],[0,0],[34.11,18.56],[14.745,4.185],[0,0]],"o":[[-14.746,-4.184],[-2.084,3.692],[3.059,17.323],[0.066,8.914],[17.346,1.661],[0,0],[-3.93,5.311],[-15.926,-1.525],[-29.786,-26.114],[5.137,-4.043],[13.45,3.817],[53.913,26.103],[0,0],[17.611,-26.236],[-17.672,-9.616],[0,0],[0,0]],"v":[[39.879,-91.564],[-10.93,-95.285],[-13.348,-85.045],[31.645,-34.996],[112.044,0.857],[201.188,17.502],[195.421,11.562],[111.343,-2.738],[33.08,-36.967],[-5.063,-92.376],[41.421,-88.197],[113.256,-62.382],[195.421,11.562],[201.188,17.502],[117.651,-63.159],[39.964,-91.603],[39.791,-91.393]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[6.578,-8.338],[-2.753,-12.604],[-18.383,-16.117],[-20.511,-5.807],[-9.142,10.656],[0,0],[19.354,1.853],[18.099,15.867],[-14.467,15.086],[-17.7,-3.38],[-20.056,-12.918],[15.211,-18.956],[0,0],[39.897,27.415],[19.408,3.707],[0,0]],"o":[[-19.41,-3.706],[-6.602,8.443],[4.227,20.947],[8.343,13.218],[19.669,5.568],[0,0],[-7.752,9.43],[-19.354,-1.853],[-36.197,-31.735],[8.556,-8.584],[17.704,3.381],[52.221,31.675],[0,0],[22.517,-29.857],[-20.08,-13.686],[0,0],[0,0]],"v":[[48.114,-128.757],[-8.592,-122.941],[-14.896,-92.263],[31.361,-33.04],[112.861,5.683],[194.946,6.927],[189.724,1.55],[111.826,-0.504],[33.248,-35.422],[-3.199,-119.702],[49.634,-124.395],[123.927,-95.086],[189.724,1.55],[194.946,6.927],[127.788,-96.672],[48.171,-128.782],[48.056,-128.643]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[15.636,-17.942],[-6.562,-28.196],[-24.895,-21.827],[-28.738,-2.751],[-15.651,17.701],[0,0],[26.21,2.509],[24.51,21.488],[-30.793,35.336],[-26.205,-2.508],[-24.512,-21.49],[30.339,-35.411],[0,0],[51.471,45.126],[28.735,2.751],[0,0]],"o":[[-28.737,-2.75],[-15.639,17.946],[6.562,28.196],[24.895,21.827],[28.546,2.733],[0,0],[-15.396,17.668],[-26.211,-2.509],[-49.02,-42.977],[15.394,-17.665],[26.212,2.509],[48.838,42.817],[0,0],[32.33,-37.099],[-24.897,-21.828],[0,0],[0,0]],"v":[[64.584,-203.142],[-3.916,-178.253],[-17.991,-106.7],[30.792,-29.128],[113.429,9.696],[182.463,-14.222],[178.33,-18.475],[112.793,3.964],[33.584,-32.333],[0.529,-174.356],[66.059,-196.791],[145.27,-160.493],[178.33,-18.475],[182.463,-14.222],[148.062,-163.697],[64.585,-203.142],[64.585,-203.142]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[15.636,-17.942],[-6.562,-28.196],[-24.895,-21.827],[-28.738,-2.751],[-15.651,17.701],[0,0],[26.21,2.509],[24.51,21.488],[-30.793,35.336],[-26.205,-2.508],[-24.512,-21.49],[30.339,-35.411],[0,0],[51.471,45.126],[28.735,2.751],[0,0]],"o":[[-28.737,-2.75],[-15.639,17.946],[6.562,28.196],[24.895,21.827],[28.546,2.733],[0,0],[-15.396,17.668],[-26.211,-2.509],[-49.02,-42.977],[15.394,-17.665],[26.212,2.509],[48.838,42.817],[0,0],[32.33,-37.099],[-24.897,-21.828],[0,0],[0,0]],"v":[[64.584,-203.142],[-3.916,-178.253],[-17.991,-106.7],[30.792,-29.128],[113.429,9.696],[182.463,-14.222],[178.33,-18.475],[112.793,3.964],[33.584,-32.333],[0.529,-174.356],[66.059,-196.791],[145.27,-160.493],[178.33,-18.475],[182.463,-14.222],[148.062,-163.697],[64.585,-203.142],[64.585,-203.142]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[24.294,-24.294],[0,-34.452],[-24.299,-24.299],[-34.454,0],[-24.243,23.994],[0,0],[31.423,0],[23.922,23.923],[-47.844,47.844],[-31.418,0.001],[-23.924,-23.924],[47.308,-47.884],[0,0],[50.236,50.237],[34.45,0],[0,0]],"o":[[-34.453,0.001],[-24.299,24.299],[0,34.452],[24.298,24.299],[34.224,0],[0,0],[-23.922,23.923],[-31.424,0],[-47.844,-47.844],[23.918,-23.918],[31.426,-0.001],[47.666,47.666],[0,0],[50.232,-50.232],[-24.3,-24.3],[0,0],[0,0]],"v":[[92.058,-227.304],[0.959,-188.003],[-36.721,-96.897],[0.959,-5.79],[92.067,31.89],[182.688,-5.308],[178.835,-10.129],[92.067,25.755],[5.297,-10.129],[5.297,-183.665],[92.055,-219.543],[178.827,-183.658],[178.835,-10.129],[182.688,-5.308],[183.165,-187.996],[92.06,-227.304],[92.06,-227.304]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[0,0.996,1,0.361,0.2,0.978,0.91,0.235,0.4,0.961,0.82,0.11,0.7,0.933,0.759,0.098,1,0.906,0.698,0.086,0,1,0.2,0.7,0.4,0.4,0.7,0.7,1,1]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[0,0.996,1,0.361,0.2,0.978,0.91,0.235,0.4,0.961,0.82,0.11,0.7,0.848,0.653,0.064,1,0.736,0.485,0.018,0,1,0.2,0.7,0.4,0.4,0.7,0.7,1,1]},{"t":104,"s":[0,0.996,1,0.361,0.2,0.978,0.91,0.235,0.4,0.961,0.82,0.11,0.7,0.933,0.759,0.098,1,0.906,0.698,0.086,0,1,0.2,0.7,0.4,0.4,0.7,0.7,1,1]}]}},"s":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[34,-187.243],"to":[-14.412,-9.431],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[-52.47,-243.832],"to":[0,0],"ti":[-14.412,-9.431]},{"t":104,"s":[34,-187.243]}]},"e":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[158.127,7.757],"to":[-13.487,-14.521],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[77.207,-79.37],"to":[0,0],"ti":[-13.487,-14.521]},{"t":104,"s":[158.127,7.757]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[45.288,45.289],[29.851,0],[22.724,-22.723],[-45.452,-45.453],[-45.453,45.454],[0,0],[31.423,0],[23.922,23.923],[-47.844,47.844],[-47.842,-47.842],[47.105,-47.9]],"o":[[44.957,-45.488],[-22.726,-22.725],[-29.85,0],[-45.452,45.453],[45.453,45.453],[0,0],[-23.922,23.923],[-31.424,0],[-47.844,-47.844],[47.842,-47.842],[47.598,47.598],[0,0]],"v":[[174.497,-14.467],[174.489,-179.32],[92.056,-213.411],[9.635,-179.327],[9.635,-14.467],[174.497,-14.467],[178.835,-10.129],[92.067,25.755],[5.297,-10.129],[5.297,-183.665],[178.827,-183.658],[178.835,-10.129]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[45.288,45.289],[29.851,0],[22.724,-22.723],[-45.452,-45.453],[-45.453,45.454],[0,0],[31.423,0],[23.922,23.923],[-47.844,47.844],[-47.842,-47.842],[47.105,-47.9]],"o":[[44.957,-45.488],[-22.726,-22.725],[-29.85,0],[-45.452,45.453],[45.453,45.453],[0,0],[-23.922,23.923],[-31.424,0],[-47.844,-47.844],[47.842,-47.842],[47.598,47.598],[0,0]],"v":[[174.497,-14.467],[174.489,-179.32],[92.056,-213.411],[9.635,-179.327],[9.635,-14.467],[174.497,-14.467],[178.835,-10.129],[92.067,25.755],[5.297,-10.129],[5.297,-183.665],[178.827,-183.658],[178.835,-10.129]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[46.402,40.68],[24.899,2.384],[14.625,-16.783],[-46.569,-40.828],[-29.254,33.57],[0,0],[26.21,2.509],[24.51,21.488],[-30.793,35.336],[-49.018,-42.975],[30.166,-35.44]],"o":[[28.834,-33.638],[-23.285,-20.413],[-24.898,-2.384],[-29.253,33.569],[46.569,40.828],[0,0],[-15.396,17.668],[-26.211,-2.509],[-49.02,-42.977],[30.792,-35.334],[48.768,42.756],[0,0]],"v":[[173.886,-22.372],[142.478,-157.289],[67.228,-191.772],[4.974,-170.459],[36.376,-35.536],[173.886,-22.372],[178.33,-18.475],[112.793,3.964],[33.584,-32.333],[0.529,-174.356],[145.27,-160.493],[178.33,-18.475]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[46.402,40.68],[24.899,2.384],[14.625,-16.783],[-46.569,-40.828],[-29.254,33.57],[0,0],[26.21,2.509],[24.51,21.488],[-30.793,35.336],[-49.018,-42.975],[30.166,-35.44]],"o":[[28.834,-33.638],[-23.285,-20.413],[-24.898,-2.384],[-29.253,33.569],[46.569,40.828],[0,0],[-15.396,17.668],[-26.211,-2.509],[-49.02,-42.977],[30.792,-35.334],[48.768,42.756],[0,0]],"v":[[173.886,-22.372],[142.478,-157.289],[67.228,-191.772],[4.974,-170.459],[36.376,-35.536],[173.886,-22.372],[178.33,-18.475],[112.793,3.964],[33.584,-32.333],[0.529,-174.356],[145.27,-160.493],[178.33,-18.475]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[54.624,23.637],[22.77,5.394],[3.004,-5.547],[-40.834,-21.475],[-12.999,13.488],[0,0],[30.492,10.01],[29.076,14.733],[-7.338,9.043],[-57.5,-25.729],[17.051,-14.33]],"o":[[13.983,-13.474],[-26.824,-11.711],[-38.547,-9.132],[-4.497,8.304],[62.432,37.66],[0,0],[-15.236,12.274],[-23.322,-7.404],[-43.097,-21.758],[11.86,-14.629],[64.099,27.5],[0,0]],"v":[[205.872,5.827],[118.568,-65.217],[54.275,-87.441],[-7.328,-88.488],[34.31,-43.578],[205.922,6.59],[209.351,9.538],[110.26,-3.747],[31.391,-40.192],[-10.431,-91.356],[120.976,-68.403],[209.351,9.538]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0,0],[5.373,2.325],[2.24,0.531],[0.295,-0.546],[-4.016,-2.112],[-62.958,-16.323],[-4.055,-0.938],[30.492,10.01],[2.86,1.449],[-0.722,0.889],[-5.655,-2.531],[-46.754,-14.573]],"o":[[1.375,-1.325],[-2.638,-1.152],[-3.791,-0.898],[-0.442,0.817],[6.14,3.704],[0.253,-0.468],[-30.916,-5.231],[-23.322,-7.404],[-4.239,-2.14],[1.167,-1.439],[6.304,2.705],[-1.384,-0.3]],"v":[[195.504,20.472],[103.488,-13.512],[34.159,-42.979],[-12.317,-62.585],[36.902,-38.642],[196.526,19.998],[201.652,22.235],[113.057,-8.537],[32.239,-40.799],[-15.42,-65.453],[103.321,-14.483],[199.364,21.641]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":72,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-68.408,-19.575],[-4.498,-1.04],[30.492,10.01],[0,0],[0,0],[0,0],[-53.714,-14.599]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0.28,-0.519],[-32.627,-7.14],[-23.321,-7.404],[0,0],[0,0],[0,0],[-1.535,-0.333]],"v":[[194.306,23.65],[101.144,-6.319],[31.964,-38.129],[-12.861,-59.76],[34.602,-36.948],[195.434,23.041],[200.744,25.201],[110.811,-2.71],[31.275,-38.377],[-15.964,-62.628],[100.696,-7.049],[198.207,24.541]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0,0],[2.52,2.209],[1.352,0.129],[0.207,-1.191],[-2.529,-2.217],[-54.857,-19.318],[-3.774,-0.873],[30.26,9.603],[1.331,1.167],[-1.672,1.919],[-2.662,-2.334],[-43.434,-14.175]],"o":[[1.566,-1.827],[-1.265,-1.109],[-1.352,-0.129],[-0.342,0.149],[2.529,2.217],[0.235,-0.435],[-28.214,-5.032],[-23.478,-7.138],[-2.662,-2.334],[1.672,-1.919],[2.649,2.322],[-1.288,-0.279]],"v":[[193.475,21.185],[103.897,-15.744],[33.952,-46.557],[-14.366,-63.102],[36.827,-41.596],[194.415,20.656],[199.476,22.884],[113.573,-10.722],[33.84,-42.653],[-17.542,-66.026],[103.205,-15.99],[197.347,22.331]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[0,0],[9.092,7.971],[4.879,0.467],[2.572,-3.428],[-14.646,-9.105],[-28.529,-3.516],[-1.887,-0.436],[29.653,8.54],[5.423,3.347],[-6.034,6.924],[-11.463,-5.46],[-7.645,-17.153]],"o":[[5.65,-6.591],[-4.563,-4],[-4.879,-0.467],[-5.109,5.741],[37.165,23.368],[0.118,-0.218],[-16.706,0.466],[-23.888,-6.445],[-14.969,-9.088],[6.034,-6.924],[12.764,6.009],[-0.644,-0.14]],"v":[[193.707,12.996],[111.077,-40.322],[39.134,-68.536],[-11.493,-78.67],[38.868,-42.31],[194.154,12.675],[198.566,15.082],[112.801,-7.477],[33.171,-39.753],[-15.517,-80.068],[109.367,-37.869],[198.917,14.923]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[12.378,10.852],[6.642,0.636],[3.755,-4.547],[-22.286,-14.005],[-21.121,3.67],[-0.944,-0.218],[29.35,8.009],[7.469,4.437],[-8.215,9.427],[-15.863,-7.024],[-1.521,-17.83]],"o":[[7.692,-8.974],[-6.212,-5.446],[-6.642,-0.636],[-7.492,8.537],[35.559,24.154],[0.059,-0.109],[-10.952,3.215],[-24.092,-6.098],[-21.122,-12.464],[8.214,-9.426],[17.821,7.852],[-0.322,-0.07]],"v":[[190.228,11.545],[114.668,-52.611],[41.725,-79.525],[-10.056,-86.453],[34.495,-38.703],[190.428,11.328],[194.516,13.824],[112.415,-5.855],[32.836,-38.303],[-14.504,-87.089],[112.449,-48.808],[193.411,15.844]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[15.665,13.733],[8.406,0.805],[4.937,-5.666],[-28.871,-17.934],[-9.876,11.333],[0,0],[29.047,7.478],[9.516,5.526],[-10.396,11.929],[-20.263,-8.587],[12.45,-19.048]],"o":[[9.734,-11.356],[-7.861,-6.891],[-8.406,-0.805],[-9.876,11.333],[17.76,11.032],[0,0],[-5.198,5.965],[-24.297,-5.752],[-27.275,-15.841],[10.395,-11.928],[22.879,9.695],[0,0]],"v":[[189.146,8.331],[118.258,-64.9],[44.317,-90.515],[-8.62,-94.237],[33.718,-37.738],[189.1,8.218],[192.862,10.804],[112.029,-4.232],[32.502,-36.853],[-13.491,-94.11],[115.53,-59.747],[192.099,13.682]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[46.402,40.68],[24.899,2.384],[14.625,-16.783],[-46.569,-40.828],[-29.254,33.57],[0,0],[26.21,2.509],[24.51,21.488],[-30.793,35.336],[-49.018,-42.975],[30.166,-35.44]],"o":[[28.834,-33.638],[-23.285,-20.413],[-24.898,-2.384],[-29.253,33.569],[46.569,40.828],[0,0],[-15.396,17.668],[-26.211,-2.509],[-49.02,-42.977],[30.792,-35.334],[48.768,42.756],[0,0]],"v":[[173.886,-22.372],[142.478,-157.289],[67.228,-191.772],[4.974,-170.459],[36.376,-35.536],[173.886,-22.372],[178.33,-18.475],[112.793,3.964],[33.584,-32.333],[0.529,-174.356],[145.27,-160.493],[178.33,-18.475]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[46.402,40.68],[24.899,2.384],[14.625,-16.783],[-46.569,-40.828],[-29.254,33.57],[0,0],[26.21,2.509],[24.51,21.488],[-30.793,35.336],[-49.018,-42.975],[30.166,-35.44]],"o":[[28.834,-33.638],[-23.285,-20.413],[-24.898,-2.384],[-29.253,33.569],[46.569,40.828],[0,0],[-15.396,17.668],[-26.211,-2.509],[-49.02,-42.977],[30.792,-35.334],[48.768,42.756],[0,0]],"v":[[173.886,-22.372],[142.478,-157.289],[67.228,-191.772],[4.974,-170.459],[36.376,-35.536],[173.886,-22.372],[178.33,-18.475],[112.793,3.964],[33.584,-32.333],[0.529,-174.356],[145.27,-160.493],[178.33,-18.475]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[45.288,45.289],[29.851,0],[22.724,-22.723],[-45.452,-45.453],[-45.453,45.454],[0,0],[31.423,0],[23.922,23.923],[-47.844,47.844],[-47.842,-47.842],[47.105,-47.9]],"o":[[44.957,-45.488],[-22.726,-22.725],[-29.85,0],[-45.452,45.453],[45.453,45.453],[0,0],[-23.922,23.923],[-31.424,0],[-47.844,-47.844],[47.842,-47.842],[47.598,47.598],[0,0]],"v":[[174.497,-14.467],[174.489,-179.32],[92.056,-213.411],[9.635,-179.327],[9.635,-14.467],[174.497,-14.467],[178.835,-10.129],[92.067,25.755],[5.297,-10.129],[5.297,-183.665],[178.827,-183.658],[178.835,-10.129]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.902,0.682,0.075,0.275,0.847,0.614,0.09,0.55,0.792,0.545,0.106,0.775,0.612,0.406,0.075,1,0.431,0.267,0.043]}},"s":{"a":0,"k":[61.5,-188.743]},"e":{"a":0,"k":[126.5,29.757]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[58.809,-1.805],[-75.451,8.324],[0,0],[0,0],[11.104,-11.104],[0,-15.712],[-11.107,-11.107],[-15.712,0],[-11.107,11.107],[0.002,15.71],[11.107,11.107],[15.442,0.183]],"o":[[68.143,4.934],[-50.133,1.538],[0,0],[0,0],[-15.707,0.001],[-11.107,11.107],[0,15.711],[11.107,11.107],[15.712,0],[11.107,-11.107],[-0.002,-15.708],[-10.94,-10.94],[0,0]],"v":[[132.247,-184.931],[132.258,-89.243],[132.247,-184.931],[132.249,-195.898],[132.247,-195.898],[90.669,-178.677],[73.445,-137.089],[90.669,-95.5],[132.258,-78.276],[173.846,-95.5],[191.067,-137.087],[173.839,-178.67],[132.247,-195.898]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[58.809,-1.805],[-75.451,8.324],[0,0],[0,0],[11.104,-11.104],[0,-15.712],[-11.107,-11.107],[-15.712,0],[-11.107,11.107],[0.002,15.71],[11.107,11.107],[15.442,0.183]],"o":[[68.143,4.934],[-50.133,1.538],[0,0],[0,0],[-15.707,0.001],[-11.107,11.107],[0,15.711],[11.107,11.107],[15.712,0],[11.107,-11.107],[-0.002,-15.708],[-10.94,-10.94],[0,0]],"v":[[132.247,-184.931],[132.258,-89.243],[132.247,-184.931],[132.249,-195.898],[132.247,-195.898],[90.669,-178.677],[73.445,-137.089],[90.669,-95.5],[132.258,-78.276],[173.846,-95.5],[191.067,-137.087],[173.839,-178.67],[132.247,-195.898]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[47.896,4.032],[-60.238,-0.323],[0,0],[0,0],[6.873,-7.927],[-3.169,-12.682],[-11.355,-10.002],[-12.893,-1.466],[-6.875,7.929],[3.171,12.682],[11.355,10.002],[12.709,1.589]],"o":[[56.914,10.342],[-40.83,-3.437],[0,0],[0,0],[-12.89,-1.465],[-6.875,7.929],[3.169,12.682],[11.355,10.002],[12.893,1.466],[6.875,-7.929],[-3.17,-12.68],[-11.184,-9.852],[0,0]],"v":[[98.228,-155.276],[117.536,-78.036],[98.228,-155.276],[96.017,-164.128],[96.015,-164.129],[65.369,-154.108],[59.622,-122.146],[82.145,-86.968],[119.748,-69.184],[150.402,-79.206],[156.146,-111.167],[135.179,-146.43],[96.015,-164.129]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[47.896,4.032],[-60.238,-0.323],[0,0],[0,0],[6.873,-7.927],[-3.169,-12.682],[-11.355,-10.002],[-12.893,-1.466],[-6.875,7.929],[3.171,12.682],[11.355,10.002],[12.709,1.589]],"o":[[56.914,10.342],[-40.83,-3.437],[0,0],[0,0],[-12.89,-1.465],[-6.875,7.929],[3.169,12.682],[11.355,10.002],[12.893,1.466],[6.875,-7.929],[-3.17,-12.68],[-11.184,-9.852],[0,0]],"v":[[98.228,-155.276],[117.536,-78.036],[98.228,-155.276],[96.017,-164.128],[96.015,-164.129],[65.369,-154.108],[59.622,-122.146],[82.145,-86.968],[119.748,-69.184],[150.402,-79.206],[156.146,-111.167],[135.179,-146.43],[96.015,-164.129]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[25.529,-0.481],[-42.522,9.888],[0,0],[0,0],[2.532,-6.891],[-6.738,-6.159],[-12.341,-4.808],[-8.981,0.561],[-2.43,6.908],[6.938,8.275],[11.401,5.513],[10.42,-1.353]],"o":[[43.879,-2.045],[-32.762,5.964],[0,0],[0,0],[-10.516,1.475],[-2.533,6.893],[8.883,8.12],[12.341,4.808],[12.164,-0.578],[2.371,-6.472],[-6.937,-8.274],[-11.744,-5.679],[0,0]],"v":[[99.821,-58.18],[151.579,-15.723],[99.821,-58.18],[97.475,-65.368],[97.473,-65.368],[77.241,-54.312],[85.616,-32.553],[114.727,-13.341],[148.29,-6.475],[169.357,-16.49],[159.581,-39.859],[132.694,-59.039],[97.473,-65.368]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0,0],[2.511,-0.047],[-4.182,0.973],[0,0],[0,0],[0.249,-0.678],[-0.663,-0.606],[-1.214,-0.473],[-0.883,0.055],[-0.239,0.679],[0.682,0.814],[1.121,0.542],[1.025,-0.133]],"o":[[4.316,-0.201],[-3.222,0.587],[0,0],[0,0],[-1.034,0.145],[-0.249,0.678],[0.874,0.799],[1.214,0.473],[1.196,-0.057],[0.233,-0.637],[-0.682,-0.814],[-1.155,-0.559],[0,0]],"v":[[106.594,-12.376],[162.855,10.735],[106.594,-12.376],[105.655,-13.604],[105.654,-13.604],[95.913,-16.301],[106.851,-11.848],[130.64,-1.46],[163.262,9.711],[170.157,11.77],[163.341,8.105],[131.978,-3.405],[105.654,-13.604]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":72,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[106.633,-5.827],[164.085,13.621],[106.633,-5.827],[105.847,-6.404],[105.846,-6.404],[96.667,-9.55],[106.972,-5.631],[131.677,2.846],[163.914,13.682],[169.97,16.076],[163.752,13.337],[131.899,2.664],[105.846,-6.404]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0,0],[2.601,0.219],[-3.272,-0.018],[0,0],[0,0],[0.373,-0.431],[-0.172,-0.689],[-0.617,-0.543],[-0.7,-0.08],[-0.373,0.431],[0.172,0.689],[0.617,0.543],[0.69,0.086]],"o":[[3.091,0.562],[-2.218,-0.187],[0,0],[0,0],[-0.7,-0.08],[-0.373,0.431],[0.172,0.689],[0.617,0.543],[0.7,0.08],[0.373,-0.431],[-0.172,-0.689],[-0.607,-0.535],[0,0]],"v":[[105.885,-13.956],[161.402,8.995],[105.885,-13.956],[105.022,-14.983],[105.021,-14.983],[95.252,-18.516],[104.741,-14.685],[129.701,-4.732],[161.36,9.533],[168.752,11.252],[163.183,6.926],[131.924,-5.259],[105.021,-14.983]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[16.169,1.361],[-20.336,-0.109],[0,0],[0,0],[2.32,-2.676],[-1.07,-4.281],[-3.833,-3.377],[-4.353,-0.495],[-2.321,2.677],[1.07,4.281],[3.833,3.377],[4.29,0.536]],"o":[[19.214,3.491],[-13.784,-1.16],[0,0],[0,0],[-4.351,-0.495],[-2.321,2.677],[1.07,4.281],[3.833,3.377],[4.353,0.495],[2.321,-2.677],[-1.07,-4.281],[-3.776,-3.326],[0,0]],"v":[[101.982,-56.356],[147.404,-15.135],[101.982,-56.356],[100.715,-59.727],[100.714,-59.727],[84.287,-58.428],[89.173,-45.042],[114,-26.39],[148.038,-12.106],[162.398,-13.904],[160.218,-26.508],[132.051,-46.584],[100.714,-59.727]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[47.896,4.032],[-60.238,-0.323],[0,0],[0,0],[6.873,-7.927],[-3.169,-12.682],[-11.355,-10.002],[-12.893,-1.466],[-6.875,7.929],[3.171,12.682],[11.355,10.002],[12.709,1.589]],"o":[[56.914,10.342],[-40.83,-3.437],[0,0],[0,0],[-12.89,-1.465],[-6.875,7.929],[3.169,12.682],[11.355,10.002],[12.893,1.466],[6.875,-7.929],[-3.17,-12.68],[-11.184,-9.852],[0,0]],"v":[[98.228,-155.276],[117.536,-78.036],[98.228,-155.276],[96.017,-164.128],[96.015,-164.129],[65.369,-154.108],[59.622,-122.146],[82.145,-86.968],[119.748,-69.184],[150.402,-79.206],[156.146,-111.167],[135.179,-146.43],[96.015,-164.129]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[47.896,4.032],[-60.238,-0.323],[0,0],[0,0],[6.873,-7.927],[-3.169,-12.682],[-11.355,-10.002],[-12.893,-1.466],[-6.875,7.929],[3.171,12.682],[11.355,10.002],[12.709,1.589]],"o":[[56.914,10.342],[-40.83,-3.437],[0,0],[0,0],[-12.89,-1.465],[-6.875,7.929],[3.169,12.682],[11.355,10.002],[12.893,1.466],[6.875,-7.929],[-3.17,-12.68],[-11.184,-9.852],[0,0]],"v":[[98.228,-155.276],[117.536,-78.036],[98.228,-155.276],[96.017,-164.128],[96.015,-164.129],[65.369,-154.108],[59.622,-122.146],[82.145,-86.968],[119.748,-69.184],[150.402,-79.206],[156.146,-111.167],[135.179,-146.43],[96.015,-164.129]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[58.809,-1.805],[-75.451,8.324],[0,0],[0,0],[11.104,-11.104],[0,-15.712],[-11.107,-11.107],[-15.712,0],[-11.107,11.107],[0.002,15.71],[11.107,11.107],[15.442,0.183]],"o":[[68.143,4.934],[-50.133,1.538],[0,0],[0,0],[-15.707,0.001],[-11.107,11.107],[0,15.711],[11.107,11.107],[15.712,0],[11.107,-11.107],[-0.002,-15.708],[-10.94,-10.94],[0,0]],"v":[[132.247,-184.931],[132.258,-89.243],[132.247,-184.931],[132.249,-195.898],[132.247,-195.898],[90.669,-178.677],[73.445,-137.089],[90.669,-95.5],[132.258,-78.276],[173.846,-95.5],[191.067,-137.087],[173.839,-178.67],[132.247,-195.898]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":50},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.996,1,0.361,0.2,0.978,0.91,0.235,0.4,0.961,0.82,0.11,0.7,0.933,0.759,0.098,1,0.906,0.698,0.086,0,1,0.2,0.7,0.4,0.4,0.7,0.7,1,1]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.978},"o":{"x":0.51,"y":0},"t":56,"s":[176,-92.743],"to":[6.868,10.486],"ti":[-18.004,-27.49]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.02},"t":64,"s":[241.121,-2.093],"to":[13.241,20.217],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[247.514,16.448],"to":[0,0],"ti":[11.919,18.199]},{"t":104,"s":[176,-92.743]}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.978},"o":{"x":0.51,"y":0},"t":56,"s":[98.271,-174.403],"to":[0.356,7.767],"ti":[-0.935,-20.362]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.021},"t":64,"s":[106.933,-22.841],"to":[0.687,14.975],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[101.983,-93.526],"to":[0,0],"ti":[0.619,13.479]},{"t":104,"s":[98.271,-174.403]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[-1.575,6.139],[-1.69,7.87],[-103.175,65.803]],"o":[[1.084,-1.949],[1.959,-7.637],[1.372,-6.387],[0,0]],"v":[[-44.827,-27.06],[-48.901,-45.915],[-35.031,-66.027],[40.942,-219.543]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-1.575,6.139],[-1.69,7.87],[-103.175,65.803]],"o":[[1.084,-1.949],[1.959,-7.637],[1.372,-6.387],[0,0]],"v":[[-44.827,-27.06],[-48.901,-45.915],[-35.031,-66.027],[40.942,-219.543]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-0.722,4.321],[-0.687,5.529],[-73.524,45.615]],"o":[[0.533,-1.509],[0.898,-5.376],[0.558,-4.487],[0,0]],"v":[[-6.079,-53.058],[-13.303,-66.771],[-8.608,-77.204],[23.426,-200.873]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[-0.722,4.321],[-0.687,5.529],[-73.524,45.615]],"o":[[0.533,-1.509],[0.898,-5.376],[0.558,-4.487],[0,0]],"v":[[-6.766,-56.204],[-13.303,-66.771],[-8.608,-77.204],[23.426,-200.873]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[1.132,1.483],[-63.933,-15.523]],"o":[[0,0],[0,0],[-18.495,-24.221],[0,0]],"v":[[-8.865,-60.065],[-8.949,-60.509],[-16.059,-69.163],[49.91,-99.924]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":72,"s":[{"i":[[0,0],[0,0],[0,0],[-21.987,-9.618]],"o":[[-2.219,-0.646],[0,0],[0,0],[0,0]],"v":[[4.131,-52.237],[-5.716,-58.314],[-1.402,-56.265],[45.136,-31.384]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0,0],[-0.05,0.299],[-0.048,0.383],[-31.235,-10.271]],"o":[[-2.028,-0.706],[0.062,-0.372],[0.039,-0.311],[0,0]],"v":[[4.92,-56.865],[-6.611,-60.81],[-3.62,-59.48],[41.837,-42.837]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[0,0],[-0.179,1.07],[-0.17,1.369],[-55.063,-11.955]],"o":[[-1.537,-0.86],[0.222,-1.331],[0.138,-1.111],[0,0]],"v":[[2.471,-56.58],[-5.455,-63.638],[-8.517,-68.433],[38.636,-77.034]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[-0.243,1.455],[-0.232,1.862],[-66.977,-12.797]],"o":[[-1.292,-0.937],[0.302,-1.811],[0.188,-1.511],[0,0]],"v":[[1.246,-56.437],[-6.464,-62.502],[-10.966,-72.909],[37.035,-94.132]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[-0.308,1.841],[-0.293,2.356],[-78.891,-13.639]],"o":[[-1.046,-1.014],[0.383,-2.29],[0.238,-1.912],[0,0]],"v":[[1.516,-59.5],[-6.415,-63.066],[-13.414,-77.385],[35.434,-111.231]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[-0.722,4.321],[-0.687,5.529],[-73.524,45.615]],"o":[[0.533,-1.509],[0.898,-5.376],[0.558,-4.487],[0,0]],"v":[[-7.485,-54.19],[-13.303,-66.771],[-8.608,-77.204],[23.426,-200.873]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[-0.722,4.321],[-0.687,5.529],[-73.524,45.615]],"o":[[0.533,-1.509],[0.898,-5.376],[0.558,-4.487],[0,0]],"v":[[-7.485,-54.19],[-13.303,-66.771],[-8.608,-77.204],[23.426,-200.873]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-1.575,6.139],[-1.69,7.87],[-103.175,65.803]],"o":[[1.084,-1.949],[1.959,-7.637],[1.372,-6.387],[0,0]],"v":[[-44.827,-27.06],[-48.901,-45.915],[-35.031,-66.027],[40.942,-219.543]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.972549021244,0.423529416323,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[0]},{"t":97,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[51.88,-51.88],[-3.997,-53.695],[-1.414,-2.701],[1.23,-1.23],[0,0],[-3.246,-2.104],[0,0],[-27.386,27.386],[50.464,51.985],[0,0],[18.738,-18.738],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334],[0,0]],"o":[[-27.386,27.386],[0.425,5.717],[0.799,1.534],[0,0],[0,0],[25.061,16.242],[49.627,8.136],[51.405,-51.405],[0,0],[18.738,18.738],[-18.738,18.738],[-18.738,-18.738],[18.262,-18.262],[0,0],[-51.88,-51.88]],"v":[[-1.873,-190.836],[-40.831,-70.438],[-55.247,-47.233],[-44.72,-26.83],[13.163,31.231],[23.194,41.456],[61.271,36.952],[186.005,-2.958],[186.005,-190.836],[164.733,-172.409],[166.192,-103.155],[98.324,-103.155],[98.324,-171.023],[164.733,-172.409],[186.005,-190.836]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[51.88,-51.88],[-3.997,-53.695],[-1.414,-2.701],[1.23,-1.23],[0,0],[-3.246,-2.104],[0,0],[-27.386,27.386],[50.464,51.985],[0,0],[18.738,-18.738],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334],[0,0]],"o":[[-27.386,27.386],[0.425,5.717],[0.799,1.534],[0,0],[0,0],[25.061,16.242],[49.627,8.136],[51.405,-51.405],[0,0],[18.738,18.738],[-18.738,18.738],[-18.738,-18.738],[18.262,-18.262],[0,0],[-51.88,-51.88]],"v":[[-1.873,-190.836],[-40.831,-70.438],[-55.247,-47.233],[-44.72,-26.83],[13.163,31.231],[23.194,41.456],[61.271,36.952],[186.005,-2.958],[186.005,-190.836],[164.733,-172.409],[166.192,-103.155],[98.324,-103.155],[98.324,-171.023],[164.733,-172.409],[186.005,-190.836]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[33.391,-38.316],[-6.537,-37.239],[-1.202,-1.838],[0.792,-0.909],[0,0],[-2.524,-1.51],[0,0],[-17.626,20.226],[51.994,46.575],[0,0],[11.598,-13.377],[19.156,16.874],[-11.598,13.377],[-18.944,-15.748],[0,0]],"o":[[-17.626,20.226],[0.696,3.965],[0.682,1.043],[0,0],[0,0],[14.842,8.88],[42.306,16.25],[33.085,-37.966],[0,0],[19.156,16.874],[-11.598,13.377],[-19.156,-16.874],[11.303,-13.037],[0,0],[-53.155,-46.602]],"v":[[-6.818,-180.797],[-13.102,-80.092],[-17.981,-67.49],[-5.946,-52.861],[45.368,-7.38],[52.483,2.511],[78.098,5.465],[185.677,-12.033],[149.89,-165.794],[127.412,-142.136],[142.577,-86.099],[86.883,-92.433],[73.194,-147.215],[127.412,-142.136],[149.89,-165.794]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[33.391,-38.316],[-19.947,-40.657],[-1.202,-1.838],[0.792,-0.909],[19.318,-15.324],[-2.524,-1.51],[0,0],[-17.626,20.226],[51.994,46.575],[0,0],[11.598,-13.377],[19.157,16.874],[-11.598,13.377],[-18.944,-15.748],[0,0]],"o":[[-17.626,20.226],[1.773,3.614],[0.682,1.043],[0,0],[2.797,2.572],[14.842,8.88],[42.306,16.25],[33.085,-37.966],[0,0],[19.156,16.874],[-11.598,13.377],[-19.156,-16.874],[11.303,-13.037],[0,0],[-53.155,-46.602]],"v":[[-6.818,-180.797],[-13.102,-80.092],[-17.981,-67.49],[-6.633,-56.007],[31.358,-5.32],[52.483,2.511],[78.098,5.465],[185.677,-12.033],[149.89,-165.794],[127.412,-142.136],[142.577,-86.099],[86.883,-92.433],[73.194,-147.215],[127.412,-142.136],[149.89,-165.794]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[22.52,-11.577],[-14.494,-18.769],[-1.202,-1.838],[-2.347,-1.908],[-18.454,-8.511],[-2.704,-1.116],[0,0],[-18.51,24.533],[55.806,26.656],[0,0],[3.145,-7.954],[19.277,5.908],[-3.995,4.38],[-18.219,-6.838],[0,0]],"o":[[-7.988,4.107],[2.187,3.362],[0.682,1.043],[0,0],[4.361,-0.325],[10.44,4.77],[38.622,11.756],[15.37,-20.373],[0,0],[18.702,7.53],[-1.895,4.792],[-21.671,-6.642],[2.548,-2.794],[0,0],[-57.27,-25.938]],"v":[[-13.043,-100.307],[-11.516,-63.291],[-6.336,-57.801],[6.125,-48.965],[53.139,-19.646],[70.136,-12.109],[93.321,-3.379],[219.006,11.535],[129.359,-72.895],[118.006,-55.466],[160.072,-19.222],[119.778,-21.225],[86.923,-52.441],[118.006,-55.466],[129.359,-72.895]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[2.215,-1.139],[-7.072,-4.592],[-1.438,-0.768],[-4.023,-1.419],[-10.687,-4.762],[-2.786,-0.937],[0,0],[-1.82,2.413],[55.497,21.61],[0,0],[0.309,-0.782],[1.896,0.581],[-0.393,0.431],[-14.183,-5.741],[0,0]],"o":[[-0.786,0.404],[2.105,1.255],[1.094,0.559],[0,0],[5.37,1.654],[8.443,2.904],[33.175,11.678],[1.512,-2.004],[0,0],[1.839,0.741],[-0.186,0.471],[-2.131,-0.653],[0.251,-0.275],[0,0],[-57.148,-20.66]],"v":[[-16.994,-66.336],[2.211,-53.57],[6.499,-52.748],[23.784,-44.823],[52.859,-31.571],[98.99,-15.033],[118.231,-7.421],[228.822,30.969],[106.718,-13.62],[124.092,-5.471],[167.53,11.126],[124.269,-5.076],[101.107,-12.684],[124.092,-5.471],[106.718,-13.62]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":72,"s":[{"i":[[0,0],[-6.262,-3.046],[-1.464,-0.651],[-4.205,-1.365],[-9.84,-4.353],[-2.795,-0.918],[0,0],[0,0],[55.463,21.059],[0,0],[0,0],[0,0],[0,0],[-13.742,-5.621],[0,0]],"o":[[0,0],[2.096,1.025],[1.138,0.507],[0,0],[5.48,1.87],[8.225,2.701],[32.58,11.669],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-57.134,-20.085]],"v":[[-17.425,-62.631],[3.709,-52.509],[6.993,-50.272],[24.778,-41.815],[50.783,-29.477],[99.002,-7.951],[117.792,-0.715],[228.642,31.263],[103.549,-5.601],[124.056,1.536],[167.973,15.687],[123.979,1.591],[101.955,-6.794],[124.056,1.536],[103.549,-5.601]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[1.814,-2.081],[-6.277,-4.903],[-1.449,-0.716],[-3.934,-1.34],[-9.197,-5.068],[-2.78,-0.95],[0,0],[1.457,0.018],[55.275,22.445],[0,0],[0.63,-0.727],[1.04,0.917],[-0.63,0.726],[-14.025,-6.171],[0,0]],"o":[[-0.957,1.099],[2.02,1.185],[1.114,0.536],[0,0],[5.334,1.908],[8.585,3.036],[33.109,11.918],[-1.407,-0.018],[0,0],[1.04,0.916],[-0.63,0.727],[-1.04,-0.916],[0.614,-0.708],[0,0],[-56.918,-21.525]],"v":[[-19.323,-66.379],[2.592,-56.999],[7.825,-56.59],[25.769,-49.173],[53.55,-35.285],[99.39,-16.488],[116.879,-9.102],[225.377,30.906],[106.154,-14.909],[124.227,-6.163],[166.439,10.51],[122.857,-5.826],[100.668,-15.978],[124.227,-6.163],[106.154,-14.909]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[6.543,-7.508],[-8.066,-8.264],[-1.412,-0.884],[-3.226,-1.276],[-10.589,-5.114],[-2.742,-1.034],[0,0],[-2.247,3.423],[54.783,26.059],[0,0],[2.273,-2.621],[3.754,3.307],[-2.273,2.621],[-14.761,-7.606],[0,0]],"o":[[-3.454,3.963],[1.821,1.601],[1.049,0.612],[0,0],[4.954,2.007],[9.522,3.912],[34.486,12.567],[4.881,-6.417],[0,0],[3.754,3.307],[-2.273,2.621],[-3.754,-3.307],[2.215,-2.555],[0,0],[-56.355,-25.281]],"v":[[-16.09,-80.515],[-1.519,-61.387],[3.872,-56.491],[19.654,-47.806],[49.748,-31.017],[91.618,-12.341],[110.91,-5.753],[219.213,24.933],[112.948,-39.183],[124.672,-26.239],[162.436,-2.989],[117.121,-17.662],[95.55,-35.127],[124.672,-26.239],[112.948,-39.183]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[8.908,-10.222],[-8.96,-9.945],[-1.394,-0.968],[-2.872,-1.243],[-11.286,-5.137],[-2.722,-1.076],[0,0],[-4.099,5.126],[54.538,27.866],[0,0],[3.094,-3.568],[5.11,4.502],[-3.094,3.568],[-15.13,-8.323],[0,0]],"o":[[-4.702,5.396],[1.722,1.809],[1.017,0.65],[0,0],[4.764,2.057],[9.99,4.349],[35.175,12.891],[8.025,-9.617],[0,0],[5.11,4.502],[-3.094,3.569],[-5.111,-4.502],[3.015,-3.478],[0,0],[-56.073,-27.159]],"v":[[-14.473,-87.582],[-3.575,-63.581],[1.895,-56.442],[15.135,-44.623],[47.269,-26.013],[87.733,-10.268],[107.925,-4.079],[216.131,21.947],[116.345,-51.32],[124.895,-36.276],[160.435,-9.739],[114.253,-23.58],[92.991,-44.701],[124.895,-36.276],[116.345,-51.32]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[11.273,-12.935],[-9.855,-11.626],[-1.375,-1.052],[-2.518,-1.211],[-5.843,-8.797],[-2.703,-1.118],[0,0],[-5.95,6.828],[54.292,29.673],[0,0],[3.915,-4.516],[6.467,5.697],[-3.915,4.516],[-15.498,-9.04],[0,0]],"o":[[-5.95,6.828],[1.623,2.018],[0.984,0.688],[0,0],[4.574,2.107],[10.459,4.787],[35.864,13.215],[11.169,-12.817],[0,0],[6.467,5.697],[-3.915,4.516],[-6.467,-5.697],[3.816,-4.401],[0,0],[-55.791,-29.037]],"v":[[-12.857,-94.65],[-5.631,-65.775],[1.361,-59.083],[14.706,-48.689],[45.176,-22.923],[83.847,-8.195],[104.941,-2.404],[213.049,18.96],[119.742,-63.457],[125.118,-46.314],[158.433,-16.489],[111.385,-29.498],[90.432,-54.276],[125.118,-46.314],[119.742,-63.457]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[33.391,-38.316],[-6.537,-37.239],[-1.202,-1.838],[0.792,-0.909],[1.999,-17.517],[-2.524,-1.51],[0,0],[-17.626,20.226],[51.994,46.575],[0,0],[11.598,-13.377],[19.156,16.874],[-11.598,13.377],[-18.944,-15.748],[0,0]],"o":[[-17.626,20.226],[0.696,3.965],[0.682,1.043],[0,0],[2.797,2.572],[14.842,8.88],[42.306,16.25],[33.085,-37.966],[0,0],[19.156,16.874],[-11.598,13.377],[-19.156,-16.874],[11.303,-13.037],[0,0],[-53.155,-46.602]],"v":[[-6.818,-180.797],[-13.102,-80.092],[-17.981,-67.49],[-7.352,-53.993],[31.358,-5.32],[52.483,2.511],[78.098,5.465],[185.677,-12.033],[149.89,-165.794],[127.412,-142.136],[142.577,-86.099],[86.883,-92.433],[73.194,-147.215],[127.412,-142.136],[149.89,-165.794]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[33.391,-38.316],[-6.537,-37.239],[-1.202,-1.838],[0.792,-0.909],[3.172,-6.585],[-2.524,-1.51],[0,0],[-17.626,20.226],[51.994,46.575],[0,0],[11.598,-13.377],[19.156,16.874],[-11.598,13.377],[-18.944,-15.748],[0,0]],"o":[[-17.626,20.226],[0.696,3.965],[0.682,1.043],[0,0],[2.17,5.676],[14.842,8.88],[42.306,16.25],[33.085,-37.966],[0,0],[19.156,16.874],[-11.598,13.377],[-19.156,-16.874],[11.303,-13.037],[0,0],[-53.155,-46.602]],"v":[[-6.818,-180.797],[-13.102,-80.092],[-17.981,-67.49],[-7.352,-53.993],[37.529,-3.623],[52.483,2.511],[78.098,5.465],[185.677,-12.033],[149.89,-165.794],[127.412,-142.136],[142.577,-86.099],[86.883,-92.433],[73.194,-147.215],[127.412,-142.136],[149.89,-165.794]],"c":true}]},{"t":144,"s":[{"i":[[51.88,-51.88],[-3.997,-53.695],[-1.414,-2.701],[1.23,-1.23],[0,0],[-3.246,-2.104],[0,0],[-27.386,27.386],[50.464,51.985],[0,0],[18.738,-18.738],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334],[0,0]],"o":[[-27.386,27.386],[0.425,5.717],[0.799,1.534],[0,0],[0,0],[25.061,16.242],[49.627,8.136],[51.405,-51.405],[0,0],[18.738,18.738],[-18.738,18.738],[-18.738,-18.738],[18.262,-18.262],[0,0],[-51.88,-51.88]],"v":[[-1.873,-190.836],[-40.831,-70.438],[-55.247,-47.233],[-44.72,-26.83],[13.163,31.231],[23.194,41.456],[61.271,36.952],[186.005,-2.958],[186.005,-190.836],[164.733,-172.409],[166.192,-103.155],[98.324,-103.155],[98.324,-171.023],[164.733,-172.409],[186.005,-190.836]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,1,0.945,0,0.275,0.951,0.835,0.059,0.55,0.902,0.725,0.118,0.775,0.82,0.633,0.127,1,0.737,0.541,0.137]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.979},"o":{"x":0.51,"y":0},"t":56,"s":[-86.464,-156.442],"to":[7.502,-12.909],"ti":[-19.666,33.84]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.022},"t":64,"s":[-97.498,-239.652],"to":[14.463,-24.887],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[-8.351,-290.854],"to":[0,0],"ti":[13.019,-22.402]},{"t":104,"s":[-86.464,-156.442]}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.978},"o":{"x":0.51,"y":0},"t":56,"s":[44.78,118.226],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.008},"t":64,"s":[32.958,86.282],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":72,"s":[35.242,-14.956],"to":[0,0],"ti":[-1.59,-22.197]},{"t":104,"s":[44.78,118.226]}]},"t":1,"nm":"Gradient Fill 44","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[84.411,-90.129]},"a":{"a":0,"k":[84.411,-90.129]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":184,"st":4,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","parent":3,"sr":1,"ks":{"r":{"a":0,"k":67},"p":{"a":0,"k":[69.731,-34.262,0]},"a":{"a":0,"k":[-30,-162.5,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":69,"s":[{"i":[[-21.97,-0.085],[0,0],[20.506,-0.075],[0,0]],"o":[[20.506,0.079],[0,0],[-20.506,0.075],[0,0]],"v":[[34.867,-5.151],[72.718,-5.134],[34.787,-5.135],[-3.046,-4.031]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[-21.97,-0.126],[0.786,-1.061],[20.506,-0.11],[-0.081,1.295]],"o":[[20.506,0.117],[-0.868,1.172],[-20.506,0.11],[0.087,-1.392]],"v":[[38.203,1.375],[77.312,4.145],[37.961,7.24],[-0.173,4.403]],"c":true}]},{"t":81,"s":[{"i":[[-21.97,-0.006],[0.211,-0.014],[20.506,-0.005],[-0.022,0.017]],"o":[[20.506,0.006],[-0.233,0.015],[-20.506,0.005],[0.023,-0.018]],"v":[[36.414,-4.752],[74.86,-4.646],[36.409,-4.692],[-1.623,-4.655]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039215686,0.454901990704,0.062745098039,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.84313731474,0.603921568627,0.149019607843,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-30,-162.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":69,"s":[{"i":[[-74.554,0.297],[-0.006,-0.208],[74.554,-0.297],[0.006,0.208]],"o":[[74.555,-0.297],[0.006,0.208],[-74.555,0.297],[-0.006,-0.208]],"v":[[-1.386,-4.982],[127.682,-6.417],[-1.366,-4.23],[-128.147,-4.647]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[-71.137,0.341],[-0.319,-7.596],[71.137,-0.341],[-0.342,5.642]],"o":[[71.137,-0.341],[0.237,5.644],[-71.137,0.341],[0.535,-8.837]],"v":[[1.627,-9.676],[132.61,-0.142],[1.831,10.608],[-131.657,0.756]],"c":true}]},{"t":81,"s":[{"i":[[-74.124,0.078],[-0.041,-0.135],[74.124,-0.078],[0.044,0.165]],"o":[[74.124,-0.078],[0.054,0.164],[-74.124,0.078],[-0.041,-0.156]],"v":[[-0.244,-4.706],[129.32,-4.573],[-0.748,-4.378],[-134.114,-4.322]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039215686,0.454901990704,0.062745098039,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784313725,0.796321973614,0.174574040432,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-30,-162.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":69,"op":82,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Head BACK","parent":3,"sr":1,"ks":{"p":{"a":0,"k":[104.791,-92.51,0]},"a":{"a":0,"k":[84.411,-90.129,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[-4.779,12.169],[45.434,38.112],[39.57,-28.294]],"o":[[17.972,-45.757],[-48.739,-40.884],[-7.126,5.096]],"v":[[195.098,-31.064],[148.55,-163.505],[5.149,-190.342]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0.606,5.17],[66.198,33.472],[12.975,-17.501]],"o":[[-2.277,-19.442],[-71.767,-37.044],[-3.49,4.707]],"v":[[205.693,22.934],[116.92,-53.355],[-33.338,-76.1]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[8.29,2.716],[64.874,26.654],[26.743,10.358]],"o":[[-15.45,-6.785],[-61.759,-25.694],[-7.813,-1.346]],"v":[[211.418,45.601],[102.669,5.874],[-31.382,-49.614]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":73,"s":[{"i":[[9.981,2.176],[64.582,25.154],[29.772,16.488]],"o":[[-18.349,-4],[-59.557,-23.197],[-8.765,-2.678]],"v":[[212.678,50.588],[99.592,17.516],[-30.952,-43.787]],"c":false}]},{"t":81,"s":[{"i":[[9.345,3.359],[61.817,25.251],[18.453,8.382]],"o":[[-23.374,-7.65],[-65.059,-25.476],[-8.688,-2.312]],"v":[[211.028,47.907],[95.836,3.987],[-31.111,-48.816]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.486274539723,0.309803921569,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":56,"s":[0],"h":1},{"t":70,"s":[100],"h":1},{"t":81,"s":[0],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[-27.386,27.386],[-5.422,12.413],[40.982,40.982],[49.07,-30.785],[7.917,-7.917]],"o":[[10.899,-10.899],[20.388,-46.678],[-43.963,-43.963],[-8.837,5.544],[-27.386,27.386]],"v":[[179.501,0.778],[203.863,-34.392],[166.625,-176.592],[12.894,-195.691],[-12.321,-175.495]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[-18.258,20.549],[-4.765,12.175],[45.476,38.07],[39.607,-28.399],[6.071,-8.028]],"o":[[10.347,-11.645],[17.917,-45.782],[-48.784,-40.839],[-7.133,5.115],[-21.001,27.769]],"v":[[173.485,3.806],[196.038,-32.038],[148.561,-163.822],[5.994,-191.206],[-13.871,-171.544]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[-18.039,20.329],[-4.779,12.169],[45.434,38.112],[39.57,-28.294],[5.992,-7.948]],"o":[[10.223,-11.521],[17.972,-45.757],[-48.739,-40.884],[-7.126,5.096],[-20.725,27.492]],"v":[[172.696,4.595],[195.098,-31.064],[148.55,-163.505],[5.149,-190.342],[-14.592,-170.822]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[-4.458,5.923],[0.606,5.17],[66.198,33.472],[12.975,-17.501],[2.943,-8.27]],"o":[[4.749,-6.545],[-2.277,-19.442],[-71.767,-37.044],[-3.49,4.707],[-5.524,9.301]],"v":[[205.769,28.389],[217.685,-0.996],[128.913,-77.284],[-21.346,-100.029],[-33.887,-76.461]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0.445,2.3],[8.579,-0.417],[58.655,24.158],[9.411,6.333],[-4.475,-4.127]],"o":[[6.904,1.221],[-12.336,-4.298],[-48.685,-20.545],[-7.813,-1.346],[-4.902,1.456]],"v":[[212.008,46.05],[220.545,17.509],[115.889,-22.428],[-17.553,-77.269],[-31.937,-50.198]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":73,"s":[{"i":[[1.524,1.502],[10.334,-1.647],[56.996,22.108],[8.627,11.577],[-6.107,-3.216]],"o":[[7.379,2.93],[-15.052,2.399],[-43.606,-16.915],[-8.765,-2.678],[-4.765,-0.271]],"v":[[213.38,49.936],[221.174,21.581],[111.966,-8.453],[-16.719,-72.261],[-31.508,-44.419]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[0.604,2.388],[9.345,3.359],[61.816,25.251],[25.069,8.557],[-5.22,-3.101]],"o":[[7.512,2.251],[-20.596,-9.569],[-65.059,-25.476],[-8.688,-2.312],[-5.191,1.389]],"v":[[211.467,47.803],[220.895,20.703],[110.745,-24.938],[-18.841,-76.143],[-31.501,-49.412]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[-5.08,7.858],[4.85,6.611],[43.857,24.16],[23.813,-6.532],[0.255,-2.393]],"o":[[8.339,-1.948],[-4.475,-19.53],[-52.375,-28.852],[-8.212,-0.053],[-7.828,11.644]],"v":[[199.646,34.629],[212.958,6.203],[123.845,-67.182],[-11.83,-108.778],[-31.455,-80.256]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[-18.039,20.329],[-4.779,12.169],[45.434,38.112],[39.57,-28.294],[5.992,-7.948]],"o":[[10.223,-11.521],[17.972,-45.757],[-48.739,-40.884],[-7.126,5.096],[-20.725,27.492]],"v":[[172.696,4.595],[195.098,-31.064],[148.55,-163.505],[7.563,-189.647],[-18.364,-166.328]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[-18.039,20.329],[-4.779,12.169],[45.434,38.112],[39.57,-28.294],[5.992,-7.948]],"o":[[10.223,-11.521],[17.972,-45.757],[-48.739,-40.884],[-7.126,5.096],[-20.725,27.492]],"v":[[172.696,4.595],[195.098,-31.064],[148.55,-163.505],[5.149,-190.342],[-14.592,-170.822]],"c":false}]},{"t":144,"s":[{"i":[[-27.386,27.386],[-5.422,12.413],[40.982,40.982],[43.106,-24.821],[7.917,-7.917]],"o":[[10.899,-10.899],[20.388,-46.678],[-43.963,-43.963],[-7.763,4.47],[-27.386,27.386]],"v":[[179.501,0.778],[203.863,-34.392],[166.625,-176.592],[10.005,-192.164],[-12.321,-175.495]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[0.486274539723,0.309803921569,0,1]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[0.657516419888,0.431203007698,0.06618142873,1]},{"t":104,"s":[0.486274539723,0.309803921569,0,1]}]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[23.126,12.939],[-16.853,20.45],[13.891,-38.131]],"o":[[-23.126,-12.94],[38.094,-46.225],[-13.937,38.256]],"v":[[90.323,-75.819],[77.778,-164.588],[176.827,-102.748]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[21.588,12.603],[-9.55,15.783],[14.711,-33.499]],"o":[[-21.588,-12.603],[26.777,-44.252],[-7.417,16.89]],"v":[[95.198,-83.344],[68.791,-139.481],[146.979,-93.835]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.469,"y":0},"t":56,"s":[{"i":[[21.537,12.654],[-9.406,15.639],[14.438,-33.226]],"o":[[-21.537,-12.654],[26.375,-43.85],[-7.28,16.752]],"v":[[94.359,-82.504],[67.783,-138.473],[145.786,-92.642]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[7.669,3.334],[-3.149,5.236],[-9.977,-22.898]],"o":[[-7.669,-3.334],[6.958,-7.44],[-2.437,5.608]],"v":[[114.025,-23.329],[77.85,-50.413],[151.616,-16.448]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[1.383,0.601],[-0.568,0.944],[-2.323,-0.589]],"o":[[-1.383,-0.601],[0.566,-0.218],[0.01,0.562]],"v":[[123.019,14.793],[79.863,-1.879],[154.758,25.927]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[124.319,26.008],[79.717,9.541],[155.031,36.819]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[1.137,0.442],[0.184,0.138],[-0.579,-0.356]],"o":[[-1.137,-0.442],[-0.515,-0.386],[0.292,0.179]],"v":[[125.886,15.451],[82.412,-1.43],[155.247,26.982]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[13.447,6.137],[-1.566,7.026],[0.527,-15.013]],"o":[[-13.447,-6.137],[4.39,-19.7],[-0.266,7.57]],"v":[[119.375,-11.331],[78.087,-42.713],[154.48,-11.588]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[21.537,12.654],[-9.406,15.639],[14.438,-33.226]],"o":[[-21.537,-12.654],[26.375,-43.85],[-7.28,16.752]],"v":[[94.359,-82.504],[67.783,-138.473],[145.786,-92.642]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[21.537,12.654],[-9.406,15.639],[14.438,-33.226]],"o":[[-21.537,-12.654],[26.375,-43.85],[-7.28,16.752]],"v":[[94.359,-82.504],[67.783,-138.473],[145.786,-92.642]],"c":true}]},{"t":144,"s":[{"i":[[23.126,12.939],[-16.853,20.45],[13.891,-38.131]],"o":[[-23.126,-12.94],[38.094,-46.225],[-13.937,38.256]],"v":[[90.323,-75.819],[77.778,-164.588],[176.827,-102.748]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.486274539723,0.309803921569,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Stroke","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[84.411,-90.129]},"a":{"a":0,"k":[84.411,-90.129]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Stroke","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[51.88,-51.88],[-27.386,27.386],[0,0],[16.016,-21.112],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334]],"o":[[-27.386,27.386],[51.406,-51.405],[18.738,18.738],[-22.917,30.209],[-18.738,-18.738],[18.262,-18.262],[0,0]],"v":[[-12.321,-175.495],[179.501,0.778],[157.864,-165.696],[168.882,-92.245],[79.823,-83.765],[85.725,-175.088],[157.864,-165.696]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[39.784,-52.605],[-16.247,17.634],[0,0],[11.598,-13.377],[19.156,16.874],[-11.598,13.377],[-18.944,-15.748]],"o":[[-21.001,27.769],[51.23,-55.602],[19.156,16.874],[-11.598,13.377],[-19.156,-16.874],[11.303,-13.037],[0,0]],"v":[[-13.871,-171.544],[173.485,3.806],[127.412,-142.136],[142.577,-86.099],[84.979,-90.737],[73.194,-147.215],[127.412,-142.136]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[39.261,-52.082],[-16.055,17.442],[0,0],[11.456,-13.235],[19.144,16.887],[-11.456,13.235],[-18.926,-15.766]],"o":[[-20.725,27.492],[50.624,-54.997],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0]],"v":[[-14.592,-170.822],[172.696,4.595],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[19.084,-52.148],[-4.681,5.161],[0,0],[3.835,-4.431],[18.963,6.982],[-3.835,4.431],[-17.664,-8.093]],"o":[[-5.631,9.184],[11.053,-21.689],[18.098,8.814],[-3.835,4.431],[-16.267,-6.497],[3.738,-4.318],[0,0]],"v":[[-34.27,-76.472],[206.31,28.311],[121.101,-43.347],[151.062,-14.018],[104.355,-27.17],[79.176,-53.047],[121.101,-43.347]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[9.125,3.359],[-90.144,-30.327],[0,0],[-0.006,-0.617],[14.202,5.345],[-0.519,1.154],[-13.716,-4.925]],"o":[[-0.969,3.8],[-44.169,-11.682],[14.087,5.437],[0.006,0.617],[-12.18,-4.967],[0.506,-1.124],[0,0]],"v":[[-32.317,-50.246],[212.549,45.972],[117.879,11.624],[155.549,26.424],[116.027,11.669],[79.534,-2.865],[117.879,11.624]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":73,"s":[{"i":[[13.76,6.783],[-114.721,-20.487],[0,0],[-0.244,-0.385],[13.154,4.985],[0.211,0.433],[-12.848,-4.228]],"o":[[0.057,2.616],[-56.319,-9.48],[13.204,4.694],[0.244,0.385],[-11.281,-4.63],[-0.205,-0.422],[0,0]],"v":[[-31.887,-44.476],[213.921,49.858],[117.419,22.79],[156.409,36.599],[117.562,23.201],[79.024,8.918],[117.419,22.79]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[10.26,7.272],[-85.388,-30.466],[0,0],[-0.452,-0.253],[13.367,5.041],[0.46,0.26],[-13.134,-4.771]],"o":[[-0.92,3.786],[-44.05,-16.099],[13.483,5.267],[0.452,0.253],[-11.862,-4.502],[-0.448,-0.254],[0,0]],"v":[[-31.862,-49.466],[211.982,47.729],[118.406,12.52],[155.809,27.392],[118.709,13.139],[81.137,-2.032],[118.406,12.52]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[22.369,-13.089],[-5.728,5.661],[0,0],[3.706,-4.723],[15.176,9.003],[-3.728,4.755],[-14.9,-8.123]],"o":[[-6.958,11.014],[8.421,-22.003],[15.209,8.81],[-3.706,4.723],[-13.935,-8.768],[3.633,-4.634],[0,0]],"v":[[-31.706,-80.294],[200.004,34.578],[123.298,-37.457],[153.154,-9.222],[109.247,-20.013],[78.709,-49.17],[123.298,-37.457]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[39.261,-52.082],[-16.055,17.442],[0,0],[11.456,-13.235],[19.143,16.887],[-11.456,13.235],[-18.926,-15.766]],"o":[[-20.725,27.492],[50.624,-54.997],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0]],"v":[[-18.364,-166.328],[172.696,4.595],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[39.261,-52.082],[-16.055,17.442],[0,0],[11.456,-13.235],[19.144,16.887],[-11.456,13.235],[-18.926,-15.766]],"o":[[-20.725,27.492],[50.624,-54.997],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0]],"v":[[-14.592,-170.822],[172.696,4.595],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781]],"c":true}]},{"t":144,"s":[{"i":[[51.88,-51.88],[-27.386,27.386],[0,0],[16.016,-21.112],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334]],"o":[[-27.386,27.386],[51.406,-51.405],[18.738,18.738],[-22.917,30.209],[-18.738,-18.738],[18.262,-18.262],[0,0]],"v":[[-12.321,-175.495],[179.501,0.778],[157.864,-165.696],[168.882,-92.245],[79.823,-83.765],[85.725,-175.088],[157.864,-165.696]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.961,0.799,0.185,0.5,0.822,0.608,0.162,1,0.684,0.416,0.139]}},"s":{"a":1,"k":[{"i":{"x":0.4,"y":0.4},"o":{"x":0.4,"y":0.4},"t":37,"s":[-72.861,-194.431],"to":[0,0],"ti":[0,0]},{"i":{"x":0.642,"y":0.704},"o":{"x":0.52,"y":0},"t":56,"s":[-72.861,-194.431],"to":[19.351,11.66],"ti":[0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.184,"y":1},"t":64,"s":[122.943,-72.494],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[116.204,-33.526],"to":[0,0],"ti":[31.511,26.818]},{"t":104,"s":[-72.861,-194.431]}]},"e":{"a":1,"k":[{"i":{"x":0.4,"y":0.4},"o":{"x":0.4,"y":0.4},"t":37,"s":[169.941,-46.42],"to":[0,0],"ti":[0,0]},{"i":{"x":0.642,"y":0.784},"o":{"x":0.52,"y":0},"t":56,"s":[169.941,-46.42],"to":[-4.644,3.88],"ti":[0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.199,"y":1},"t":64,"s":[97.494,-2.317],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[105.547,5.858],"to":[0,0],"ti":[-10.732,8.713]},{"t":104,"s":[169.941,-46.42]}]},"t":1,"nm":"Gradient Fill 44457","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[84.411,-90.129]},"a":{"a":0,"k":[84.411,-90.129]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Middle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[9.555,-9.555],[-27.386,27.386],[-5.191,10.434],[41.399,42.646],[0,0],[16.016,-21.112],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334],[0,0],[48.039,-27.003]],"o":[[-27.386,27.386],[9.235,-9.235],[23.702,-47.644],[0,0],[18.738,18.738],[-22.917,30.209],[-18.738,-18.738],[18.262,-18.262],[0,0],[-42.325,-42.325],[-10.845,6.096]],"v":[[-12.321,-175.495],[179.501,0.778],[201.057,-28.855],[166.625,-176.592],[157.864,-165.696],[168.882,-92.245],[79.823,-83.765],[85.725,-175.088],[157.864,-165.696],[166.625,-176.592],[18.425,-198.979]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[7.327,-9.689],[-16.247,17.634],[-4.819,10.383],[46.243,39.509],[0,0],[11.598,-13.377],[19.156,16.874],[-11.598,13.377],[-18.944,-15.748],[0,0],[39.15,-24.256]],"o":[[-21.001,27.769],[9.203,-9.989],[22.006,-47.414],[0,0],[19.156,16.874],[-11.598,13.377],[-19.156,-16.874],[11.303,-13.037],[0,0],[-46.967,-39.318],[-8.838,5.476]],"v":[[-13.871,-171.544],[173.485,3.806],[194.419,-26.823],[148.561,-163.822],[127.412,-142.136],[142.577,-86.099],[84.979,-90.737],[73.194,-147.215],[127.412,-142.136],[148.561,-163.822],[10.48,-194.201]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[7.231,-9.592],[-16.055,17.442],[-4.817,10.365],[46.205,39.547],[0,0],[11.456,-13.235],[19.144,16.887],[-11.456,13.235],[-18.926,-15.766],[0,0],[39.18,-24.21]],"o":[[-20.725,27.492],[9.095,-9.88],[21.997,-47.33],[0,0],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0],[-46.923,-39.361],[-8.845,5.466]],"v":[[-14.592,-170.822],[172.696,4.595],[193.473,-25.85],[148.55,-163.505],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781],[148.55,-163.505],[9.634,-193.327]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[3.515,-9.604],[-5.267,4.87],[0.105,4.16],[69.844,36.345],[0,0],[3.835,-4.431],[18.854,7.514],[-3.835,4.431],[-17.664,-8.093],[0,0],[10.479,-17.079]],"o":[[-5.468,9.226],[3.855,-5.352],[-0.48,-18.994],[0,0],[18.098,8.815],[-3.835,4.431],[-19.642,-7.692],[3.738,-4.318],[0,0],[-70.264,-37.429],[-3.574,5.825]],"v":[[-34.27,-76.472],[206.31,28.311],[218.111,1.722],[128.941,-77.233],[121.102,-43.347],[151.221,-13.957],[103.656,-27.171],[78.97,-52.036],[121.102,-43.347],[128.941,-77.233],[-19.328,-102.111]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[-4.559,-4.578],[-63.4,-17.535],[6.95,2.474],[58.744,22.749],[0,0],[-0.006,-0.617],[14.118,5.744],[-0.519,1.154],[-13.717,-4.925],[0,0],[17.98,4.796]],"o":[[-1.675,3.974],[7.318,-2.029],[-20.688,-8.526],[0,0],[14.087,5.437],[0.006,0.617],[-14.708,-5.882],[0.506,-1.124],[0,0],[-68.162,-29.449],[-9.357,-3.214]],"v":[[-32.317,-50.246],[212.548,45.972],[221.053,18.26],[115.814,-22.291],[117.88,11.624],[155.667,26.523],[115.502,11.665],[79.863,-2.391],[117.88,11.624],[115.814,-22.291],[-18.503,-75.516]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":73,"s":[{"i":[[-6.335,-3.472],[-82.835,-7.993],[8.534,-1.766],[41.2,14.458],[0,0],[-0.244,-0.385],[13.075,5.354],[0.21,0.433],[-12.848,-4.228],[0,0],[7.429,11.419]],"o":[[-0.84,2.818],[8.081,-1.297],[-15.028,3.11],[0,0],[13.204,4.694],[0.244,0.385],[-13.623,-5.484],[-0.205,-0.422],[0,0],[-49.541,-20.265],[-6.453,-9.92]],"v":[[-31.887,-44.476],[213.921,49.858],[221.577,21.148],[111.984,-8.42],[117.42,22.79],[156.538,36.687],[117.075,23.196],[79.47,9.273],[117.42,22.79],[111.984,-8.42],[-16.504,-71.525]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[-5.144,-3.829],[-65.122,-22.558],[7.796,2.603],[60.681,24.188],[0,0],[-0.452,-0.253],[13.552,5.139],[0.46,0.26],[-13.134,-4.771],[0,0],[20.883,7.908]],"o":[[-1.775,3.978],[8.128,-1.701],[-14.254,-6.249],[0,0],[13.483,5.267],[0.452,0.253],[-14.009,-5.304],[-0.448,-0.254],[0,0],[-73.138,-30.809],[-10.591,-4.593]],"v":[[-31.862,-49.466],[211.982,47.729],[221.202,20.536],[110.776,-24.892],[118.406,12.52],[155.953,27.449],[118.374,13.026],[81.671,-1.818],[118.406,12.52],[110.776,-24.892],[-18.425,-75.582]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[2.215,-6.036],[-6.225,6.014],[3.714,5.689],[48.105,27.466],[0,0],[3.706,-4.723],[15.124,9.248],[-3.728,4.755],[-14.9,-8.123],[0,0],[28.618,-2.605]],"o":[[-7.553,11.148],[8.423,-4.195],[-2.386,-20.002],[0,0],[15.209,8.81],[-3.706,4.723],[-15.486,-9.333],[3.633,-4.634],[0,0],[-55.508,-29.459],[-10.357,-0.822]],"v":[[-31.706,-80.294],[200.004,34.578],[212.677,7.676],[123.867,-67.15],[123.298,-37.457],[153.239,-9.164],[108.925,-20.016],[79.005,-48.935],[123.298,-37.457],[123.867,-67.15],[-10.173,-109.298]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[7.231,-9.592],[-16.055,17.442],[-4.817,10.365],[46.205,39.547],[0,0],[11.456,-13.235],[19.143,16.887],[-11.456,13.235],[-18.926,-15.766],[0,0],[39.18,-24.21]],"o":[[-20.725,27.492],[9.095,-9.88],[21.997,-47.33],[0,0],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0],[-46.923,-39.361],[-8.845,5.466]],"v":[[-18.364,-166.328],[172.696,4.595],[193.473,-25.85],[148.55,-163.505],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781],[148.55,-163.505],[12.049,-192.633]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[7.231,-9.592],[-16.055,17.442],[-4.817,10.365],[46.205,39.547],[0,0],[11.456,-13.235],[19.144,16.887],[-11.456,13.235],[-18.926,-15.766],[0,0],[39.18,-24.21]],"o":[[-20.725,27.492],[9.095,-9.88],[21.997,-47.33],[0,0],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0],[-46.923,-39.361],[-8.845,5.466]],"v":[[-14.592,-170.822],[172.696,4.595],[193.473,-25.85],[148.55,-163.505],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781],[148.55,-163.505],[9.634,-193.327]],"c":true}]},{"t":144,"s":[{"i":[[9.555,-9.555],[-27.386,27.386],[-5.191,10.434],[41.399,42.646],[0,0],[16.016,-21.112],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334],[0,0],[42.434,-21.399]],"o":[[-27.386,27.386],[9.235,-9.235],[23.702,-47.644],[0,0],[18.738,18.738],[-22.917,30.209],[-18.738,-18.738],[18.262,-18.262],[0,0],[-42.325,-42.325],[-9.58,4.831]],"v":[[-12.321,-175.495],[179.501,0.778],[201.057,-28.855],[166.625,-176.592],[157.864,-165.696],[168.882,-92.245],[79.823,-83.765],[85.725,-175.088],[157.864,-165.696],[166.625,-176.592],[14.877,-194.793]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":1,"k":[{"i":{"x":[0.51],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.71],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":85,"s":[100]},{"t":99,"s":[0]}]},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.35,1,0.984,0.576,0.477,1,0.985,0.576,0.5,1,0.985,0.576,0.522,1,0.985,0.576,0.65,1,0.984,0.576,0.35,0,0.425,0.5,0.5,1,0.575,0.5,0.65,0]}},"s":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[-16.486,-143.475],"to":[27.129,-1.384],"ti":[17.095,-5.197]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":57,"s":[146.288,-151.779],"to":[-17.095,5.197],"ti":[9.359,5.242]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":75,"s":[-119.054,-112.295],"to":[-9.359,-5.242],"ti":[-34.865,11.823]},{"t":106,"s":[90.135,-183.233]}]},"e":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":37,"s":[217.733,-72.984],"to":[10.016,7.761],"ti":[2.568,-5.53]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":57,"s":[277.831,-26.418],"to":[-2.568,5.53],"ti":[4.685,3.956]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":75,"s":[202.326,-39.804],"to":[-4.685,-3.956],"ti":[-7.899,1.725]},{"t":106,"s":[249.722,-50.156]}]},"t":1,"nm":"Gradient Fill 44457","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[84.411,-90.129]},"a":{"a":0,"k":[84.411,-90.129]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shine","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[9.144,-9.144],[-27.386,27.386],[-5.096,9.737],[41.956,43.22],[0,0],[16.016,-21.112],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334],[0,0],[48.31,-27.933]],"o":[[-27.386,27.386],[8.667,-8.667],[25.129,-48.014],[0,0],[18.738,18.738],[-22.917,30.209],[-18.738,-18.738],[18.262,-18.262],[0,0],[-42.736,-42.736],[-10.337,5.977]],"v":[[-12.321,-175.495],[179.501,0.778],[200.077,-26.935],[166.625,-176.592],[157.864,-165.696],[168.882,-92.245],[79.823,-83.765],[85.725,-175.088],[157.864,-165.696],[166.625,-176.592],[17.029,-198.183]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[7.012,-9.272],[-16.247,17.634],[-4.765,9.729],[46.866,40.041],[0,0],[11.598,-13.377],[19.156,16.874],[-11.598,13.377],[-18.944,-15.748],[0,0],[39.277,-25.268]],"o":[[-21.001,27.769],[8.637,-9.375],[23.498,-47.978],[0,0],[19.156,16.874],[-11.598,13.377],[-19.156,-16.874],[11.303,-13.037],[0,0],[-47.422,-39.699],[-8.404,5.407]],"v":[[-13.871,-171.544],[173.485,3.806],[193.506,-24.908],[148.561,-163.822],[127.412,-142.136],[142.577,-86.099],[84.979,-90.737],[73.194,-147.215],[127.412,-142.136],[148.561,-163.822],[9.344,-193.483]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[6.92,-9.18],[-16.055,17.442],[-4.758,9.708],[46.828,40.08],[0,0],[11.456,-13.235],[19.144,16.887],[-11.456,13.235],[-18.926,-15.766],[0,0],[39.291,-25.208]],"o":[[-20.725,27.492],[8.535,-9.273],[23.462,-47.871],[0,0],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0],[-47.379,-39.743],[-8.407,5.394]],"v":[[-14.592,-170.822],[172.696,4.595],[192.561,-23.939],[148.55,-163.505],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781],[148.55,-163.505],[8.497,-192.612]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[3.364,-9.192],[-5.413,4.797],[-0.078,3.833],[70.324,36.006],[0,0],[3.835,-4.431],[18.863,7.478],[-3.835,4.431],[-17.664,-8.093],[0,0],[10.292,-15.338]],"o":[[-5.631,9.184],[3.798,-4.86],[0.384,-18.9],[0,0],[18.098,8.814],[-3.835,4.431],[-18.16,-7.321],[3.738,-4.318],[0,0],[-70.946,-37.792],[-3.656,5.449]],"v":[[-34.27,-76.472],[206.31,28.311],[218.437,2.767],[128.941,-77.233],[121.101,-43.347],[150.819,-13.384],[103.779,-26.965],[79.03,-52.194],[121.101,-43.347],[128.941,-77.233],[-19.962,-101.505]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[-4.03,-4.541],[-56.572,-15.644],[5.623,1.859],[59.714,23.039],[0,0],[-0.006,-0.617],[14.124,5.717],[-0.519,1.154],[-13.716,-4.925],[0,0],[17.643,5.551]],"o":[[-1.734,4.626],[7.339,-1.144],[-10.344,-5.567],[0,0],[14.087,5.437],[0.006,0.617],[-13.597,-5.595],[0.506,-1.124],[0,0],[-61.278,-25.092],[-8.971,-3.396]],"v":[[-32.317,-50.246],[212.548,45.972],[221.414,18.605],[115.814,-22.291],[117.879,11.624],[155.72,26.643],[115.593,11.82],[79.83,-2.457],[117.879,11.624],[115.814,-22.291],[-18.603,-75.786]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.848,"y":0},"t":73,"s":[{"i":[[-5.657,-3.518],[-72.499,-7.516],[6.746,-1.952],[41.99,14.772],[0,0],[-0.244,-0.385],[13.082,5.329],[0.21,0.433],[-12.848,-4.228],[0,0],[8.107,10.813]],"o":[[-0.876,3.624],[8.118,-0.327],[-17,4.919],[0,0],[13.205,4.694],[0.244,0.385],[-12.593,-5.216],[-0.205,-0.422],[0,0],[-38.886,-17.062],[-6.875,-9.17]],"v":[[-31.887,-44.476],[213.921,49.858],[221.946,21.339],[111.984,-8.42],[117.419,22.79],[156.625,36.774],[117.159,23.34],[79.417,9.229],[117.419,22.79],[111.984,-8.42],[-16.487,-71.989]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":81,"s":[{"i":[[-4.248,-4.319],[-55.521,-17.514],[6.304,1.907],[62.131,24.994],[0,0],[-0.452,-0.253],[13.541,5.132],[0.46,0.26],[-13.134,-4.771],[0,0],[20.579,8.371]],"o":[[-1.81,4.746],[8.138,-0.747],[-10.802,-4.875],[0,0],[13.484,5.267],[0.452,0.253],[-13.135,-4.985],[-0.448,-0.254],[0,0],[-59.322,-26.569],[-10.111,-4.722]],"v":[[-31.862,-49.466],[211.982,47.729],[221.511,20.807],[110.775,-24.892],[118.405,12.52],[156.069,27.496],[118.524,13.091],[81.605,-1.845],[118.405,12.52],[110.775,-24.892],[-18.462,-75.99]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[4.457,-9.266],[-5.836,6.887],[2.759,4.886],[48.427,28.727],[0,0],[3.706,-4.723],[15.128,9.231],[-3.728,4.755],[-14.9,-8.123],[0,0],[28.723,-2.604]],"o":[[-7.577,11.682],[8.259,-3.347],[0.948,-18.73],[0,0],[15.209,8.81],[-3.706,4.723],[-14.805,-9.156],[3.633,-4.634],[0,0],[-56.037,-29.741],[-9.931,-0.888]],"v":[[-31.706,-80.294],[200.004,34.578],[212.614,8.448],[123.866,-67.15],[123.297,-37.457],[153.297,-9.107],[108.98,-19.921],[78.97,-48.964],[123.297,-37.457],[123.866,-67.15],[-10.545,-109.364]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[6.92,-9.18],[-16.055,17.442],[-4.758,9.708],[46.828,40.08],[0,0],[11.456,-13.235],[19.143,16.887],[-11.456,13.235],[-18.926,-15.766],[0,0],[39.291,-25.208]],"o":[[-20.725,27.492],[8.535,-9.273],[23.462,-47.871],[0,0],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0],[-47.379,-39.743],[-8.407,5.394]],"v":[[-18.364,-166.328],[172.696,4.595],[192.561,-23.939],[148.55,-163.505],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781],[148.55,-163.505],[10.912,-191.917]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[6.92,-9.18],[-16.055,17.442],[-4.758,9.708],[46.828,40.08],[0,0],[11.456,-13.235],[19.144,16.887],[-11.456,13.235],[-18.926,-15.766],[0,0],[39.291,-25.208]],"o":[[-20.725,27.492],[8.535,-9.273],[23.462,-47.871],[0,0],[19.143,16.887],[-11.456,13.235],[-19.144,-16.887],[11.165,-12.899],[0,0],[-47.379,-39.743],[-8.407,5.394]],"v":[[-14.592,-170.822],[172.696,4.595],[192.561,-23.939],[148.55,-163.505],[126.057,-140.781],[141.453,-84.975],[84.156,-89.913],[72.118,-146.139],[126.057,-140.781],[148.55,-163.505],[8.497,-192.612]],"c":true}]},{"t":144,"s":[{"i":[[9.144,-9.144],[-27.386,27.386],[-5.096,9.737],[41.956,43.22],[0,0],[16.016,-21.112],[18.738,18.738],[-18.738,18.738],[-18.824,-17.334],[0,0],[42.616,-22.239]],"o":[[-27.386,27.386],[8.667,-8.667],[25.129,-48.014],[0,0],[18.738,18.738],[-22.917,30.209],[-18.738,-18.738],[18.262,-18.262],[0,0],[-42.736,-42.736],[-9.119,4.758]],"v":[[-12.321,-175.495],[179.501,0.778],[200.077,-26.935],[166.625,-176.592],[157.864,-165.696],[168.882,-92.245],[79.823,-83.765],[85.725,-175.088],[157.864,-165.696],[166.625,-176.592],[13.645,-194.161]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[0,0.953,0.853,0.078,0.5,0.814,0.627,0.096,1,0.676,0.4,0.114]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[0,0.961,0.799,0.185,0.5,0.842,0.618,0.163,1,0.723,0.438,0.141]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[0,0.974,0.856,0.164,0.5,0.869,0.658,0.153,1,0.765,0.459,0.141]},{"t":104,"s":[0,0.953,0.853,0.078,0.5,0.838,0.646,0.11,1,0.723,0.438,0.141]}]}},"s":{"a":1,"k":[{"i":{"x":0.4,"y":0.4},"o":{"x":0.4,"y":0.4},"t":37,"s":[-16.486,-143.475],"to":[0,0],"ti":[0,0]},{"i":{"x":0.642,"y":0.377},"o":{"x":0.52,"y":0},"t":56,"s":[-16.486,-143.475],"to":[12.848,4.152],"ti":[0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.201,"y":0.422},"t":64,"s":[47.912,-130.991],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[-0.953,-168.041],"to":[0,0],"ti":[2.589,-4.094]},{"t":104,"s":[-16.486,-143.475]}]},"e":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[199.173,-81.305],"to":[3.093,1.387],"ti":[14.635,-13.092]},{"i":{"x":0.642,"y":0.626},"o":{"x":0.52,"y":0},"t":56,"s":[217.733,-72.984],"to":[-8.556,7.654],"ti":[27.263,-17.661]},{"i":{"x":0.4,"y":1},"o":{"x":0.201,"y":0.783},"t":64,"s":[190.857,19.735],"to":[-19.366,12.546],"ti":[1.285,0.576]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[186.124,44.523],"to":[-3.093,-1.387],"ti":[-2.175,20.971]},{"t":104,"s":[199.173,-81.305]}]},"t":1,"nm":"Gradient Fill 44457","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[84.411,-90.129]},"a":{"a":0,"k":[84.411,-90.129]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":11,"op":134,"st":4,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"MASK","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":43,"s":[100],"h":1},{"t":118,"s":[0],"h":1}]},"p":{"a":0,"k":[216.646,165.23,0]},"a":{"a":0,"k":[216.646,165.23,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[218.678,211.91],[203.92,216.405],[203.92,195.786],[214.301,186.314],[214.301,165.223],[203.103,158.229],[203.103,124.843],[228.821,114.055]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[219.512,207.597],[204.129,208.368],[203.546,195.46],[215.147,187.475],[214.167,165.58],[205.138,159.236],[204.036,142.131],[224.752,138.177]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[218.923,208.507],[201.701,208.197],[201.693,195.168],[213.431,187.448],[214.167,165.58],[202.559,159.457],[202.429,143.944],[231.658,143.542]],"c":false}]},{"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[218.678,211.91],[203.92,216.405],[203.92,195.786],[214.301,186.314],[214.301,165.223],[203.103,158.229],[203.103,124.843],[228.821,114.055]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.356862745098,0.180392156863,0.003921568627,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[217,164.5]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.98]},"o":{"x":[0.591],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.167],"y":[0.023]},"t":64,"s":[-66]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.754],"y":[0]},"t":73,"s":[-108]},{"t":104,"s":[0]}]},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":36,"s":[{"i":[[0,0],[1.223,5.43],[3.636,-5.606],[-13.042,-4.122],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-12.646,20.042],[1.733,3.778],[39.519,12.491],[0,0],[0,0],[0,0],[0,0]],"v":[[-84.674,1.241],[-85.921,-18.236],[-117.5,31.25],[-94.544,51.922],[-39.828,8.169],[-78.637,14.138],[-93.006,29.233],[-92.78,10.853]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0,0],[1.223,5.43],[3.636,-5.605],[-12.449,-5.666],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-12.646,20.042],[1.733,3.778],[31.424,14.303],[0,0],[0,0],[0,0],[0,0]],"v":[[-84.674,1.241],[-85.921,-18.236],[-117.5,31.25],[-94.544,51.922],[-44.204,20.05],[-72.537,19.484],[-93.006,29.234],[-92.78,10.853]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[-0.444,2.118],[8.849,12.951],[3.636,-5.605],[-12.75,-4.919],[-11.718,34.52],[0,0],[0,0],[0,0]],"o":[[-4.604,-9.02],[-7.211,19.085],[2.564,9.899],[22.183,8.895],[-2.617,0.769],[0,0],[0,0],[0,0]],"v":[[-66.781,-4.913],[-100.41,-27.068],[-122.056,21.437],[-94.515,52.157],[-37.368,6.844],[-46.69,4.283],[-53.29,10.208],[-63.572,5.745]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[-0.667,3.184],[12.686,16.736],[-2.09,-17.103],[-12.901,-4.543],[-9.57,59.78],[0,0],[0,0],[0,0]],"o":[[-6.921,-13.56],[-4.476,18.603],[2.983,12.98],[17.532,6.174],[-3.934,1.156],[0,0],[0,0],[0,0]],"v":[[-71.134,-5.699],[-107.702,-31.513],[-124.349,16.499],[-94.501,52.276],[-34.524,-10.524],[-49.014,-7.752],[-60.594,-8.15],[-67.241,-6.796]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[{"i":[[-0.488,2.331],[9.615,13.707],[-0.556,-14.022],[-12.872,-4.624],[-7.006,43.765],[0.645,1.021],[0,0],[0,0]],"o":[[-6.233,-1.265],[-6.665,18.989],[2.648,10.514],[20.648,7.48],[-2.88,0.847],[-2.155,-0.792],[0,0],[0,0]],"v":[[-80.822,-14.13],[-107.53,-17.426],[-122.514,20.451],[-94.513,52.181],[-35.963,-1.715],[-45.886,4.042],[-65.079,-6.926],[-69.933,-9.294]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[-0.229,1.095],[5.168,9.32],[1.666,-9.562],[-12.829,-4.741],[-3.293,20.57],[3.154,-4.353],[0,0],[0,0]],"o":[[-2.929,-0.595],[-9.835,19.547],[2.163,6.944],[25.161,9.371],[-1.354,0.398],[-4.6,2.836],[0,0],[0,0]],"v":[[-82.864,-5.983],[-96.078,-17.855],[-119.857,26.174],[-94.529,52.044],[-38.046,11.044],[-61.552,18.183],[-72.926,25.897],[-82.042,1.384]],"c":true}]},{"t":104,"s":[{"i":[[0,0],[1.223,5.43],[3.636,-5.605],[-12.791,-4.845],[0,0],[2.407,3.811],[0,0],[0,0]],"o":[[0,0],[-12.646,20.042],[1.733,3.778],[29.164,11.048],[0,0],[-8.043,-2.958],[0,0],[0,0]],"v":[[-84.674,1.241],[-85.921,-18.236],[-117.5,31.25],[-94.544,51.922],[-39.894,22.358],[-70.649,20.212],[-93.006,29.233],[-92.78,10.853]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.922,0.773,0.094,0.35,0.729,0.471,0.091,0.7,0.537,0.169,0.088,0.002,0.01,0.351,0.505,0.7,1]}},"s":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[-101.656,21.86],"to":[-2.172,-4.655],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[-114.69,-6.068],"to":[0,0],"ti":[-2.172,-4.655]},{"t":104,"s":[-101.656,21.86]}]},"e":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[-85.521,24.475],"to":[-1.684,-4.734],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[-95.627,-3.926],"to":[0,0],"ti":[-1.684,-4.734]},{"t":104,"s":[-85.521,24.475]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[211.85,195.64]},"a":{"a":0,"k":[-87.679,12.685]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0.045]},"t":36,"s":[0]},{"i":{"x":[0.39],"y":[1.448]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[27]},{"i":{"x":[0.6],"y":[0.929]},"o":{"x":[0.7],"y":[0.045]},"t":102,"s":[27]},{"t":121,"s":[0]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shadow","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":44,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[225.5,209.99],[205.111,215.692],[203.887,193.172],[213.711,184.344],[214.301,165.223],[203.103,158.229],[202.597,121.119],[232.955,108.944]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[218.678,211.91],[206.017,214.846],[205.27,195.104],[214.301,186.314],[215.152,165.127],[203.566,157.383],[203.103,124.843],[228.821,114.055]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[219.438,215.554],[206.084,217.273],[205.745,196.284],[215.147,187.475],[214.126,172.352],[205.307,164.862],[205.021,143.336],[226.705,138.612]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[220.851,216.674],[203.656,214.759],[203.133,200.267],[214.039,193.551],[214.1,165.76],[203.542,165.242],[204.13,149.958],[233.593,148.949]],"c":false}]},{"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[218.678,211.91],[206.017,214.846],[205.27,195.104],[214.301,186.314],[215.152,165.127],[203.566,157.383],[203.103,124.843],[228.821,114.055]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.945098099054,0.847058883368,0.239215701234,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[211.881,166.436]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.98]},"o":{"x":[0.51],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.167],"y":[0.023]},"t":64,"s":[-66]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[-108]},{"t":104,"s":[0]}]},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.253,1.262],[-2.656,68.805],[-14.839,-36.51]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.969,49.805],[1.691,-43.811],[-8.831,5.121]],"v":[[205.757,128.86],[204.494,157.562],[215.914,165.22],[214.483,183.65],[205.956,192.506],[205.559,212.257],[218.543,207.299],[175.069,162.587],[226.511,118.442]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.253,1.262],[-2.656,68.805],[-15.729,-34.993]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.969,49.805],[1.691,-43.811],[-8.831,5.121]],"v":[[205.757,128.86],[204.494,157.562],[215.914,165.22],[214.483,183.65],[205.956,192.506],[205.559,212.257],[218.543,207.299],[174.878,162.842],[226.511,118.442]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.537,1.103],[14.236,64.603],[-17.544,-23.266]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[10.298,33.557],[-8.398,-40.117],[-6.919,6.846]],"v":[[192.536,151.85],[206.599,165.931],[215.699,165.975],[225.599,180.183],[224.506,189.936],[230.946,201.317],[236.952,200.947],[180.367,177.743],[205.916,130.461]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.711,1.006],[24.645,62.013],[-18.663,-16.039]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[12.349,23.545],[-14.615,-37.841],[-5.74,7.909]],"v":[[192.722,164.412],[207.896,171.089],[215.566,166.441],[232.448,178.046],[235.936,188.352],[246.589,194.575],[248.296,197.032],[183.75,186.925],[201.423,143.063]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.942,0.877],[38.384,58.595],[-20.139,-6.501]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[15.057,10.329],[-22.821,-34.837],[-4.184,9.312]],"v":[[191.142,147.976],[204.7,168.762],[215.391,167.056],[228.131,177.537],[232.655,176.291],[239.947,176.893],[246.325,174.347],[188.214,199.046],[199.627,126.177]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.757,0.98],[27.573,61.656],[-19.645,-14.569]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[12.801,20.173],[-16.42,-35.718],[-5.429,8.189]],"v":[[192.294,164.304],[206.726,172.943],[207.011,173.367],[228.903,173.233],[240.689,184.168],[252.13,186.739],[256.65,174.516],[184.688,189.149],[206.83,124.104]],"c":true}]},{"i":{"x":0.221,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.439,1.158],[8.936,66.933],[-18.792,-28.48]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[8.91,37.146],[-5.384,-37.238],[-7.576,6.254]],"v":[[194.249,140.466],[205.318,163.239],[215.632,165.339],[223.914,182.889],[219.177,194.726],[226.859,209.463],[245.11,193.416],[178.609,172.087],[219.247,120.532]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.253,1.262],[-1.968,70.02],[-18.293,-36.618]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.634,47.076],[1.072,-38.127],[-8.831,5.121]],"v":[[205.757,128.86],[204.494,157.562],[215.914,165.22],[214.483,183.65],[205.956,192.506],[205.559,212.257],[227.138,202.879],[175.053,162.106],[226.511,118.442]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.253,1.262],[-1.516,70.669],[-18.428,-37.163]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.634,47.076],[0.798,-39.433],[-8.831,5.121]],"v":[[205.757,128.86],[204.494,157.562],[215.914,165.22],[214.483,183.65],[205.956,192.506],[205.559,212.257],[220.108,206.797],[174.579,162.441],[226.511,118.442]],"c":true}]},{"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.253,1.262],[2.201,76.005],[-19.544,-41.643]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.634,47.076],[-1.453,-50.166],[-8.831,5.121]],"v":[[205.757,128.86],[204.494,157.562],[215.914,165.22],[214.483,183.65],[205.956,192.506],[205.559,212.257],[218.543,207.299],[170.683,165.198],[226.511,118.442]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,1,0.945,0,0.275,0.951,0.835,0.059,0.55,0.902,0.725,0.118,0.775,0.82,0.633,0.127,1,0.737,0.541,0.137]}},"s":{"a":0,"k":[194.055,105.823]},"e":{"a":0,"k":[244.571,237.496]},"t":1,"nm":"Gradient Fill 45","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":184,"st":4,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Body","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"t":41,"s":[100],"h":1},{"t":53,"s":[0],"h":1},{"t":106,"s":[100],"h":1}]},"r":{"a":0,"k":-45},"p":{"a":0,"k":[14.868,-30.421,0]},"a":{"a":0,"k":[60.369,80.577,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-15.791,72.716],[-14.934,49.05]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[22.812,22.682],[17.152,5.489]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.044,18.65],[20.066,6.855]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.207,15.827],[22.105,7.812]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[22.19,17.228],[26.856,11.719]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[35.936,3.483],[38.499,0.076]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[33.242,2.609],[35.805,-0.797]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[21.151,16.327],[23.709,9.589]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.207,15.827],[21.002,6.989]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[24.754,20.359],[21.322,8.112]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[23.244,28.339],[18.126,10.731]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-15.791,72.716],[-14.934,49.05]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.35686275363,0.180392161012,0.003921568859,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.93,106.274],[-51.753,107.818]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.346,44.245],[-8.529,43.672]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.508,38.746],[-4.86,37.92]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.694,33.423],[-2.388,34.046]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.012,17.42],[15.231,16.737]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.362,-0.954],[30.313,1.655]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[18.362,-0.954],[29.338,-0.877]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.012,17.42],[15.231,16.737]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.694,33.423],[-2.388,34.046]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-16.437,37.138],[-2.659,38.315]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-25.021,45.92],[-11.195,47.55]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.93,106.274],[-51.753,107.818]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.35686275363,0.180392161012,0.003921568859,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-124.962,157.744],[-103.184,158.1]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-52.961,73.457],[-37.625,72.582]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-49.531,68.949],[-33.768,67.016]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-37.629,49.446],[-27.286,59.15]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.478,20.22],[3.679,27.236]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[15.398,0.345],[23.319,7.596]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[15.398,0.345],[23.319,7.596]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.478,20.22],[7.331,28.314]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-29.386,39.393],[-19.043,49.097]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.91,67.453],[-33.768,67.016]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-56.053,76.746],[-39.877,74.834]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-124.962,157.744],[-103.184,158.1]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.35686275363,0.180392161012,0.003921568859,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-177.505,209.328],[-154.336,209.555]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-78.02,97.639],[-67.548,98.637]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.825,92.499],[-63.48,93.302]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-37.725,49.019],[-32.292,54.518]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.137,21.569],[-0.472,26.628]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[14.361,1.072],[19.9,6.256]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[14.361,1.072],[19.9,6.256]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.137,21.569],[-0.472,26.628]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-29.483,38.966],[-24.05,44.465]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-67.662,85.396],[-60.254,89.741]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-81.157,100.777],[-70.557,101.646]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-177.505,209.328],[-154.336,209.555]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.35686275363,0.180392161012,0.003921568859,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-215.03,185.144],[-215.114,162.736]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-103.252,83.421],[-107.605,75.5]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-98.599,79.571],[-102.954,71.124]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-58.725,29.74],[-63.015,21.41]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-27.057,-8.011],[-39.506,-8.006]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.349,-26.719],[-18.224,-29.288]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.349,-26.719],[-18.224,-29.288]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-27.409,-6.026],[-37.457,-6.95]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-50.482,19.687],[-54.773,11.357]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-89.438,67.424],[-95.529,60.019]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-106.448,87.415],[-110.843,78.738]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-215.03,185.144],[-215.114,162.736]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.427450984716,0.223529413342,0.003921568859,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-2.567,-0.021],[-2.647,1.51],[-1.86,-0.035],[-2.695,2.746],[-3.438,3.72],[-5.622,6.371],[0,0],[-0.092,1.973],[-2.058,1.662],[0,0]],"o":[[0.014,2.574],[0,0],[5.235,-3.365],[0,0],[4.609,-4.696],[3.712,-4.017],[0,0],[1.4,-1.4],[0,0],[2.058,-1.662],[0,0]],"v":[[-214.96,204.303],[-210.307,208.984],[-143.235,208.928],[-141.864,158.1],[-94.17,156.342],[-94.932,106.105],[-37.243,106.107],[-18.483,87.347],[-16.171,82.107],[-13.371,39.156],[12.219,38.373]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-0.977,-0.525],[-1.076,0.592],[-0.971,-0.226],[-1.797,1.965],[-2.051,2.492],[-3.36,4.244],[0,0],[-3.109,3.979],[-1.087,0.935],[0,0]],"o":[[0.608,1.099],[0,0],[2.099,-1.345],[0,0],[3.073,-3.361],[2.214,-2.691],[0,0],[0.648,-0.745],[0,0],[1.087,-0.935],[0,0]],"v":[[-99.027,91.757],[-96.168,94.686],[-62.588,98.776],[-62.202,73.089],[-31.27,71.606],[-31.645,43.522],[4.124,43.34],[22.154,26.746],[22.841,23.728],[15.924,0.96],[16.182,0.779]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[-0.962,-0.501],[-1.066,0.605],[-0.958,-0.206],[-1.786,1.975],[-2.04,2.501],[-3.342,4.256],[0,0],[-3.093,3.99],[-1.228,0.705],[0,0]],"o":[[0.595,1.075],[0,0],[2.081,-1.368],[0,0],[3.054,-3.378],[2.202,-2.7],[0,0],[0.644,-0.748],[0,0],[1.304,-0.736],[0,0]],"v":[[-94.352,86.832],[-91.544,89.674],[-58.392,93.102],[-57.872,67.709],[-27.307,65.677],[-27.525,37.928],[7.812,37.094],[22.373,22.679],[23.068,19.683],[19.577,1.595],[19.752,1.397]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[-0.717,-0.72],[-0.217,-0.229],[-0.568,-0.573],[-1.778,1.982],[-2.032,2.506],[-3.329,4.264],[0,0],[-3.081,3.997],[-1.327,0.543],[0,0]],"o":[[0.824,0.82],[0,0],[0.33,0.354],[0,0],[3.04,-3.39],[2.193,-2.706],[0,0],[0.642,-0.75],[0,0],[1.457,-0.596],[0,0]],"v":[[-50.542,36.103],[-47.764,38.88],[-29.959,56.891],[-42.335,44.693],[-24.532,61.526],[-24.641,34.013],[10.394,32.722],[22.526,19.832],[23.226,16.852],[22.134,2.039],[22.251,1.829]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[-0.722,-0.693],[-0.269,-0.164],[-0.585,-0.537],[-1.772,1.987],[0.04,0.446],[-3.32,4.27],[0,0],[-3.072,4.002],[0.024,1.416],[0,0]],"o":[[0.797,0.826],[0,0],[0.44,0.222],[0,0],[3.03,-3.399],[-0.043,-0.481],[0,0],[0.64,-0.752],[0,0],[-0.041,-2.436],[0,0]],"v":[[-21.07,-1.862],[-16.513,12.169],[2.04,28.832],[-9.322,15.856],[-3.756,17.801],[-3.919,14.145],[12.426,29.28],[26.67,13.212],[27.375,10.245],[27.372,4.808],[27.566,2.251]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[-0.716,-0.699],[-0.248,-0.186],[-0.575,-0.547],[-0.995,1.21],[0.124,0.362],[-1.751,2.702],[0,0],[-1.61,2.54],[0.312,1.128],[0,0]],"o":[[0.803,0.82],[0,0],[0.395,0.267],[0,0],[1.701,-2.07],[-0.134,-0.391],[0,0],[0.352,-0.464],[0,0],[-0.536,-1.941],[0,0]],"v":[[-2.329,-20.603],[4.186,-8.53],[22.348,8.523],[10.653,-4.119],[15.471,-1.425],[14.585,-4.36],[30.681,11.025],[38.659,1.223],[38.605,-0.986],[28.931,5.006],[28.556,3.018]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[-0.716,-0.699],[-0.248,-0.186],[-0.575,-0.547],[-0.995,1.21],[0.124,0.362],[-1.751,2.702],[0,0],[-1.61,2.54],[0.312,1.128],[0,0]],"o":[[0.803,0.82],[0,0],[0.395,0.267],[0,0],[1.701,-2.07],[-0.134,-0.391],[0,0],[0.352,-0.464],[0,0],[-0.536,-1.941],[0,0]],"v":[[-2.329,-20.603],[4.186,-8.53],[22.348,8.523],[10.653,-4.119],[15.471,-1.425],[14.585,-4.36],[30.681,11.025],[35.965,0.349],[35.911,-1.859],[28.931,5.006],[28.556,3.018]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[-0.722,-0.693],[-0.269,-0.164],[-0.585,-0.537],[-1.772,1.987],[0.04,0.446],[-3.32,4.27],[0,0],[-0.22,1.778],[-0.577,0.922],[0,0]],"o":[[0.797,0.826],[0,0],[0.44,0.222],[0,0],[3.03,-3.399],[-0.043,-0.481],[0,0],[0.64,-0.752],[0,0],[0.149,-0.273],[0,0]],"v":[[-21.07,-1.862],[-16.513,12.169],[5.692,29.909],[-9.322,15.856],[-3.756,17.801],[-3.919,14.145],[12.426,29.28],[23.523,11.082],[24.761,-2.399],[25.157,-2.787],[25.438,-2.616]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[-0.717,-0.72],[-0.217,-0.229],[-0.568,-0.573],[-1.778,1.982],[-2.032,2.506],[-3.329,4.264],[0,0],[-3.081,3.997],[-1.327,0.543],[0,0]],"o":[[0.824,0.82],[0,0],[0.33,0.354],[0,0],[3.04,-3.39],[2.193,-2.706],[0,0],[0.642,-0.75],[0,0],[1.457,-0.596],[0,0]],"v":[[-42.299,26.05],[-39.522,28.827],[-21.717,46.838],[-34.093,34.64],[-16.289,51.474],[-24.641,34.013],[10.394,32.722],[22.526,19.832],[23.226,16.852],[19.415,-0.756],[19.532,-0.966]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[-0.846,-0.697],[-0.512,0.025],[-0.958,-0.206],[-1.786,1.975],[-2.04,2.501],[-3.342,4.256],[0,0],[-3.065,4.017],[-1.249,0.679],[0,0]],"o":[[0.803,0.957],[0,0],[0.929,-0.178],[0,0],[3.054,-3.378],[2.202,-2.7],[0,0],[0.641,-0.751],[0,0],[1.322,-0.719],[0,0]],"v":[[-83.856,73.974],[-80.883,76.958],[-56.828,91.468],[-57.872,67.709],[-27.307,65.677],[-27.525,37.928],[7.812,37.094],[24.185,24.492],[24.81,21.425],[20.658,2.675],[20.832,2.476]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[-0.983,-0.519],[-1.099,0.615],[-0.981,-0.216],[-1.848,2.016],[-2.112,2.554],[-3.411,4.398],[0,0],[-3.154,4.125],[-1.123,0.954],[0,0]],"o":[[0.602,1.106],[0,0],[2.145,-1.392],[0,0],[3.16,-3.448],[2.281,-2.757],[0,0],[0.662,-0.77],[0,0],[1.123,-0.954],[0,0]],"v":[[-102.369,95.099],[-99.511,98.029],[-65.532,101.72],[-64.793,75.681],[-33.423,73.759],[-33.423,45.3],[6.095,47.895],[22.719,32.665],[23.322,29.461],[17.214,6.877],[17.483,6.695]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-2.567,-0.021],[-2.647,1.51],[-1.86,-0.035],[-2.695,2.746],[-3.438,3.72],[-5.622,6.371],[0,0],[-0.092,1.973],[-2.058,1.662],[0,0]],"o":[[0.014,2.574],[0,0],[5.235,-3.365],[0,0],[4.609,-4.696],[3.712,-4.017],[0,0],[1.4,-1.4],[0,0],[2.058,-1.662],[0,0]],"v":[[-214.96,204.303],[-210.307,208.984],[-143.235,208.928],[-141.864,158.1],[-94.17,156.342],[-94.932,106.105],[-37.243,106.107],[-18.483,87.347],[-16.171,82.107],[-13.371,39.156],[12.219,38.373]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.486274510622,0.309803932905,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-215.207,138.124],[-214.96,204.303]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-112.93,65.43],[-99.027,91.757]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-109.833,59.407],[-94.56,87.05]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-72.161,15.91],[-50.526,36.112]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-43.171,-15.893],[-21.066,-1.859]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.767,-34.28],[-2.325,-20.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-21.595,-32.784],[-2.325,-20.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-40.723,-14.339],[-21.066,-1.859]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-63.918,5.858],[-42.283,26.059]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-104.555,49.44],[-83.919,74.048]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-116.615,68.862],[-102.369,95.099]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-215.207,138.124],[-214.96,204.303]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.57647061348,0.329411774874,0.082352943718,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[-0.007,-2.298],[0,0],[-2.567,-0.021],[-2.647,1.51],[-1.86,-0.035],[-2.695,2.746],[-3.438,3.72],[-5.622,6.371],[0,0],[-0.092,1.973],[-2.058,1.662],[0,0]],"o":[[0,0],[-1.626,1.626],[0,0],[0.014,2.574],[0,0],[5.235,-3.365],[0,0],[4.609,-4.696],[3.712,-4.017],[0,0],[1.4,-1.4],[0,0],[2.058,-1.662],[0,0]],"v":[[-50.72,-29.955],[-212.676,132.001],[-215.207,138.124],[-214.96,204.303],[-210.307,208.984],[-143.235,208.928],[-141.864,158.1],[-94.169,156.342],[-94.932,106.105],[-37.243,106.107],[-18.483,87.347],[-16.171,82.107],[-13.371,39.156],[12.219,38.373]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[-0.541,-0.98],[0,0],[-0.977,-0.525],[-1.076,0.592],[-0.971,-0.226],[-1.797,1.965],[-2.051,2.492],[-3.36,4.244],[0,0],[0.204,1.198],[-1.087,0.935],[0,0]],"o":[[0,0],[-0.235,0.366],[0,0],[0.608,1.099],[0,0],[2.099,-1.345],[0,0],[3.073,-3.361],[2.214,-2.691],[0,0],[0.648,-0.745],[0,0],[1.087,-0.935],[0,0]],"v":[[-12.964,-63.544],[-113.406,63.331],[-112.93,65.429],[-99.027,91.757],[-96.168,94.686],[-62.588,98.776],[-62.202,73.089],[-31.27,71.606],[-31.645,43.522],[4.124,43.339],[22.154,26.746],[22.841,23.728],[15.739,0.999],[15.749,1.266]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[-0.529,-0.959],[0,0],[-0.962,-0.501],[-1.066,0.605],[-0.958,-0.206],[-1.786,1.975],[-2.039,2.501],[-3.342,4.256],[0,0],[0.195,1.18],[-1.079,0.944],[0,0]],"o":[[0,0],[-0.234,0.366],[0,0],[0.595,1.075],[0,0],[2.081,-1.368],[0,0],[3.054,-3.378],[2.202,-2.7],[0,0],[0.644,-0.748],[0,0],[1.079,-0.944],[0,0]],"v":[[-11.429,-64.638],[-110.069,57.15],[-109.61,59.216],[-94.352,86.832],[-91.544,89.674],[-58.392,93.102],[-57.872,67.709],[-27.307,65.677],[-27.525,37.928],[7.812,37.094],[22.373,22.679],[23.068,19.683],[19.6,1.241],[19.5,1.099]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[-0.521,-0.944],[0,0],[-0.717,-0.72],[-0.217,-0.229],[-0.568,-0.573],[-1.778,1.982],[-2.032,2.506],[-3.329,4.264],[0,0],[0.189,1.168],[-1.073,0.95],[0,0]],"o":[[0,0],[-0.233,0.366],[0,0],[0.824,0.82],[0,0],[0.33,0.354],[0,0],[3.04,-3.39],[2.193,-2.706],[0,0],[0.642,-0.75],[0,0],[1.073,-0.95],[0,0]],"v":[[-10.355,-65.403],[-72.103,13.435],[-71.656,15.477],[-50.542,36.103],[-47.764,38.88],[-29.959,56.891],[-42.335,44.693],[-24.532,61.526],[-24.641,34.013],[10.394,32.721],[22.526,19.831],[23.226,16.852],[22.304,1.41],[22.126,0.983]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[-0.514,-0.932],[0,0],[-0.722,-0.693],[-0.269,-0.164],[-0.585,-0.537],[-1.772,1.987],[0.04,0.446],[-3.32,4.27],[0,0],[0.184,1.158],[-0.284,1.405],[0,0]],"o":[[0,0],[-0.233,0.366],[0,0],[0.797,0.826],[0,0],[0.44,0.222],[0,0],[3.03,-3.399],[-0.043,-0.481],[0,0],[0.64,-0.752],[0,0],[0.474,-2.344],[0,0]],"v":[[-5.432,-70.989],[-43.46,-18.044],[-43.022,-16.02],[-21.07,-1.862],[-16.513,12.169],[2.04,28.832],[-9.322,15.856],[-3.756,17.801],[-3.919,14.145],[12.426,29.28],[26.67,13.212],[27.375,10.245],[26.994,5.367],[26.69,2.335]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[-0.601,-0.846],[0,0],[-0.716,-0.699],[-0.248,-0.186],[-0.575,-0.547],[-0.995,1.21],[0.124,0.362],[-1.751,2.702],[0,0],[0.385,0.956],[0.065,1.056],[0,0]],"o":[[0,0],[-0.109,0.242],[0,0],[0.803,0.82],[0,0],[0.395,0.267],[0,0],[1.701,-2.07],[-0.134,-0.391],[0,0],[0.352,-0.464],[0,0],[-0.109,-1.762],[0,0]],"v":[[-5.085,-72.712],[-22.992,-35.268],[-23.675,-34.35],[-2.329,-20.603],[4.186,-8.53],[22.348,8.523],[10.653,-4.119],[15.471,-1.425],[14.585,-4.36],[30.681,11.025],[38.659,1.222],[38.605,-0.986],[28.746,5.372],[27.879,2.904]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[-0.601,-0.846],[0,0],[-0.716,-0.699],[-0.248,-0.186],[-0.575,-0.547],[-0.995,1.21],[0.124,0.362],[-1.751,2.702],[0,0],[0.385,0.956],[0.065,1.056],[0,0]],"o":[[0,0],[-0.109,0.242],[0,0],[0.803,0.82],[0,0],[0.395,0.267],[0,0],[1.701,-2.07],[-0.134,-0.391],[0,0],[0.352,-0.464],[0,0],[-0.109,-1.762],[0,0]],"v":[[-3.775,-71.939],[-21.648,-33.54],[-21.503,-32.854],[-2.329,-20.603],[4.186,-8.53],[22.348,8.523],[10.653,-4.119],[15.471,-1.425],[14.585,-4.36],[30.681,11.025],[35.965,0.349],[35.911,-1.859],[28.746,5.372],[27.879,2.904]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[-0.514,-0.932],[0,0],[-0.722,-0.693],[-0.269,-0.164],[-0.585,-0.537],[-1.772,1.987],[0.04,0.446],[-3.32,4.27],[0,0],[-0.112,0.862],[-0.697,0.893],[0,0]],"o":[[0,0],[-0.233,0.366],[0,0],[0.797,0.826],[0,0],[0.44,0.222],[0,0],[3.03,-3.399],[-0.043,-0.481],[0,0],[0.64,-0.752],[0,0],[0.625,-0.802],[0,0]],"v":[[-5.432,-70.989],[-41.012,-16.49],[-40.574,-14.467],[-21.07,-1.862],[-16.513,12.169],[5.692,29.909],[-9.322,15.856],[-3.756,17.801],[-3.919,14.145],[12.426,29.28],[23.523,11.082],[25.319,-1.318],[25.038,-1.711],[25.202,-2.48]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[-0.521,-0.944],[0,0],[-0.717,-0.72],[-0.217,-0.229],[-0.568,-0.573],[-1.778,1.982],[-2.032,2.506],[-3.329,4.264],[0,0],[0.189,1.168],[-1.073,0.95],[0,0]],"o":[[0,0],[-0.233,0.366],[0,0],[0.824,0.82],[0,0],[0.33,0.354],[0,0],[3.041,-3.39],[2.193,-2.706],[0,0],[0.642,-0.75],[0,0],[1.073,-0.95],[0,0]],"v":[[-10.355,-65.403],[-63.861,3.382],[-63.414,5.424],[-42.299,26.05],[-39.522,28.827],[-21.717,46.838],[-34.093,34.64],[-16.289,51.474],[-24.641,34.013],[10.394,32.721],[22.526,19.831],[23.226,16.852],[19.585,-1.386],[19.406,-1.813]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[-0.715,-0.853],[0,0],[-0.845,-0.697],[-0.512,0.025],[-0.958,-0.206],[-1.786,1.975],[-2.039,2.501],[-3.342,4.256],[0,0],[0.237,1.222],[-1.083,0.94],[0,0]],"o":[[0,0],[-0.027,0.166],[0,0],[0.803,0.957],[0,0],[0.929,-0.178],[0,0],[3.054,-3.378],[2.202,-2.7],[0,0],[0.641,-0.751],[0,0],[1.083,-0.94],[0,0]],"v":[[-13.329,-66.538],[-105.545,47.801],[-104.472,49.39],[-83.856,73.974],[-80.883,76.958],[-56.828,91.468],[-57.872,67.709],[-27.307,65.677],[-27.525,37.928],[7.812,37.094],[24.185,24.491],[24.81,21.425],[20.671,2.311],[20.563,2.162]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[-0.535,-0.986],[0,0],[-0.983,-0.519],[-1.099,0.615],[-0.981,-0.216],[-1.848,2.016],[-2.112,2.554],[-3.411,4.398],[0,0],[0.271,1.292],[-1.123,0.954],[0,0]],"o":[[0,0],[-0.243,0.374],[0,0],[0.602,1.106],[0,0],[2.145,-1.392],[0,0],[3.16,-3.448],[2.281,-2.757],[0,0],[0.661,-0.77],[0,0],[1.123,-0.954],[0,0]],"v":[[-15.281,-65.501],[-117.069,66.742],[-116.615,68.862],[-102.369,95.099],[-99.511,98.029],[-65.532,101.72],[-64.793,75.681],[-33.423,73.759],[-33.423,45.3],[6.095,47.895],[22.719,32.665],[23.322,29.461],[17.017,6.911],[17.04,7.197]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0],[-0.007,-2.298],[0,0],[-2.567,-0.021],[-2.647,1.51],[-1.86,-0.035],[-2.695,2.746],[-3.438,3.72],[-5.622,6.371],[0,0],[-0.092,1.973],[-2.058,1.662],[0,0]],"o":[[0,0],[-1.626,1.626],[0,0],[0.014,2.574],[0,0],[5.235,-3.365],[0,0],[4.609,-4.696],[3.712,-4.017],[0,0],[1.4,-1.4],[0,0],[2.058,-1.662],[0,0]],"v":[[-50.72,-29.955],[-212.676,132.001],[-215.207,138.124],[-214.96,204.303],[-210.307,208.984],[-143.235,208.928],[-141.864,158.1],[-94.169,156.342],[-94.932,106.105],[-37.243,106.107],[-18.483,87.347],[-16.171,82.107],[-13.371,39.156],[12.219,38.373]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":37,"s":[0.698039233685,0.454901963472,0.06274510175,1]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":53,"s":[0.486274540424,0.309803932905,0,1]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":104,"s":[0.486274540424,0.309803932905,0,1]},{"t":121,"s":[0.698039233685,0.454901963472,0.06274510175,1]}]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[4.195,-3.262],[0,0],[0,0],[0,0],[-1.86,-0.035],[0.226,2.772],[-1.98,-0.141],[-1.619,1.619],[-0.092,1.973],[-1.739,-0.014]],"o":[[0,0],[-1.626,1.626],[0.014,2.574],[2.687,0.028],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-50.72,-29.955],[-214.302,133.627],[-215.03,207.054],[-143.235,208.928],[-140.847,158.1],[-92.814,156.851],[-94.932,105.698],[-38.898,107.046],[-16.171,82.107],[-12.966,38.387]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[2.815,-2.375],[0,0],[0,0],[0,0],[-0.971,-0.226],[0.203,1.86],[-1.392,-0.161],[-0.982,1.077],[0.204,1.198],[-1.074,-0.106]],"o":[[0,0],[-0.235,0.366],[0.608,1.099],[1.215,0.117],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-12.964,-63.544],[-113.641,63.696],[-98.409,92.915],[-62.588,98.776],[-61.674,73.203],[-30.334,71.892],[-31.682,43.238],[3.073,43.96],[22.841,23.728],[16.923,3.487]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[2.794,-2.399],[0,0],[0,0],[0,0],[-0.958,-0.206],[0.191,1.834],[-1.374,-0.134],[-0.976,1.083],[0.195,1.18],[-1.061,-0.085]],"o":[[0,0],[-0.234,0.366],[0.595,1.075],[1.199,0.093],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-11.429,-64.638],[-110.303,57.516],[-93.748,87.964],[-58.392,93.102],[-57.351,67.811],[-26.383,65.942],[-27.56,37.648],[6.771,37.726],[23.068,19.683],[18.339,-0.078]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[2.779,-2.415],[0,0],[0,0],[0,0],[-0.568,-0.573],[0.182,1.816],[-1.362,-0.115],[-0.972,1.086],[0.189,1.168],[-1.051,-0.071]],"o":[[0,0],[-0.233,0.366],[0.824,0.82],[0.629,0.636],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-10.355,-65.403],[-72.337,13.801],[-49.685,36.956],[-29.96,56.891],[-42.031,45],[-23.617,61.777],[-24.675,33.735],[9.359,33.362],[23.226,16.852],[19.331,-2.573]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[2.767,-2.428],[0,0],[0,0],[0,0],[-0.585,-0.537],[0.175,1.802],[-0.782,-0.67],[-0.968,1.089],[0.184,1.158],[-1.044,-0.059]],"o":[[0,0],[-0.233,0.366],[0.797,0.826],[0.657,0.587],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.433,-70.989],[-43.693,-17.679],[-20.242,-1.002],[2.04,28.832],[-9.008,16.143],[-2.848,18.041],[-4.063,13.98],[11.397,29.927],[27.375,10.245],[33.837,-3.239]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[1.693,-1.355],[0,0],[0,0],[0,0],[-0.575,-0.547],[0.511,1.466],[-0.759,-0.693],[-0.543,0.664],[0.385,0.957],[-0.84,-0.263]],"o":[[0,0],[-0.109,0.242],[0.803,0.82],[0.642,0.601],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.085,-72.712],[-23.101,-35.026],[-1.494,-19.75],[22.348,8.523],[10.961,-3.826],[16.24,-1.048],[14.438,-4.52],[29.998,11.326],[38.605,-0.986],[40.945,-10.347]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[1.693,-1.355],[0,0],[0,0],[0,0],[-0.575,-0.547],[0.511,1.466],[-0.759,-0.693],[-0.543,0.664],[0.385,0.957],[-0.84,-0.263]],"o":[[0,0],[-0.109,0.242],[0.803,0.82],[0.642,0.601],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-3.775,-71.939],[-21.356,-33.777],[-1.494,-19.75],[22.348,8.523],[10.961,-3.826],[16.24,-1.048],[14.438,-4.52],[29.998,11.326],[35.911,-1.859],[40.945,-10.347]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[2.767,-2.428],[0,0],[0,0],[0,0],[-0.585,-0.537],[0.175,1.802],[-0.782,-0.67],[-0.968,1.089],[-0.112,0.862],[-1.044,-0.059]],"o":[[0,0],[-0.233,0.366],[0.797,0.826],[0.657,0.587],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.433,-70.989],[-41.245,-16.125],[-20.242,-1.002],[5.692,29.909],[-9.008,16.143],[-2.848,18.041],[-4.063,13.98],[11.397,29.927],[25.319,-1.318],[33.837,-3.239]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[2.779,-2.415],[0,0],[0,0],[0,0],[-0.568,-0.573],[0.182,1.816],[-1.362,-0.115],[-0.972,1.086],[0.189,1.168],[-1.051,-0.071]],"o":[[0,0],[-0.233,0.366],[0.824,0.82],[0.629,0.636],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-10.355,-65.403],[-64.094,3.748],[-41.443,26.903],[-21.717,46.838],[-33.789,34.947],[-15.375,51.725],[-24.675,33.735],[9.359,33.362],[23.226,16.852],[19.331,-2.573]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[2.806,-2.387],[0,0],[0,0],[0,0],[-0.958,-0.206],[0.191,1.834],[-1.374,-0.134],[-0.976,1.083],[0.237,1.222],[-1.096,-0.12]],"o":[[0,0],[-0.027,0.166],[0.803,0.957],[0.859,0.504],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-13.329,-66.538],[-105.571,47.967],[-83.025,74.974],[-56.828,91.468],[-57.351,67.811],[-26.383,65.942],[-27.56,37.648],[6.771,37.726],[24.81,21.425],[19.331,0.914]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[2.911,-2.42],[0,0],[0,0],[0,0],[-0.981,-0.216],[0.181,1.882],[-1.409,-0.144],[-1.004,1.111],[0.271,1.292],[-1.156,-0.161]],"o":[[0,0],[-0.243,0.374],[0.602,1.106],[1.229,0.102],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-15.281,-65.501],[-117.312,67.115],[-101.758,96.264],[-65.532,101.72],[-64.259,75.788],[-32.478,74.036],[-33.457,45.012],[4.997,48.513],[23.322,29.461],[17.792,8.576]],"c":true}]},{"t":144,"s":[{"i":[[4.195,-3.262],[0,0],[0,0],[0,0],[-1.86,-0.035],[0.226,2.772],[-1.98,-0.141],[-1.619,1.619],[-0.092,1.973],[-1.739,-0.014]],"o":[[0,0],[-1.626,1.626],[0.014,2.574],[2.687,0.028],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-50.72,-29.955],[-214.302,133.627],[-215.03,207.054],[-143.235,208.928],[-140.847,158.1],[-92.814,156.851],[-94.932,105.698],[-38.898,107.046],[-16.171,82.107],[-12.966,38.387]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":30},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.624,0.243,0.004,0.5,0.555,0.276,0.002,1,0.486,0.31,0,0,1,0.5,0.5,1,0]}},"s":{"a":0,"k":[-210,206.257]},"e":{"a":0,"k":[-32.189,21.446]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-142.467,169.4],[-141.336,197.401],[-153.498,209.563],[-182.348,209.281]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-61.591,78.308],[-62.632,93.552],[-67.169,98.673],[-80.953,96.698]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-57.488,73.097],[-58.595,88.188],[-63.106,93.331],[-76.72,91.62]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-39.435,47.555],[-32.461,54.418],[-32.096,54.717],[-39.571,47.159]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.654,18.808],[-0.312,26.16],[-0.267,26.811],[-8.022,19.814]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[13.38,-1.226],[19.931,5.917],[20.101,6.443],[12.502,-0.711]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[13.38,-1.226],[19.931,5.917],[20.101,6.443],[12.502,-0.711]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.654,18.808],[-0.312,26.16],[-0.267,26.811],[-8.022,19.814]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-31.193,37.502],[-24.219,44.365],[-23.853,44.664],[-31.329,37.106]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-57.488,73.097],[-58.769,88.014],[-59.986,89.898],[-69.975,83.73]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-64.172,81.231],[-65.506,96.425],[-70.174,101.677],[-83.671,99.799]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-142.467,169.4],[-141.336,197.401],[-153.498,209.563],[-182.348,209.281]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.365,0.176,0.016,0.36,0.365,0.176,0.016,0.72,0.365,0.176,0.016,0,1,0.36,0.5,0.72,0]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-180.875,190.257],"to":[16.688,-16.641],"ti":[-16.688,16.641]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-80.748,90.409],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-80.748,90.409],"to":[-16.688,16.641],"ti":[16.688,-16.641]},{"t":144,"s":[-180.875,190.257]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-142.343,189.237],"to":[13.088,-16.537],"ti":[-13.088,16.537]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-63.818,90.015],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-63.818,90.015],"to":[-13.088,16.537],"ti":[13.088,-16.537]},{"t":144,"s":[-142.343,189.237]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-142.467,169.4],[-141.336,197.401],[-153.498,209.563],[-182.348,209.281]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-61.591,78.308],[-62.632,93.552],[-67.169,98.673],[-80.953,96.698]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-57.488,73.097],[-58.595,88.188],[-63.106,93.331],[-76.72,91.62]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-39.435,47.555],[-32.461,54.418],[-32.096,54.717],[-39.571,47.159]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.654,18.808],[-0.312,26.16],[-0.267,26.811],[-8.022,19.814]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[13.38,-1.226],[19.931,5.917],[20.101,6.443],[12.502,-0.711]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[13.38,-1.226],[19.931,5.917],[20.101,6.443],[12.502,-0.711]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6.654,18.808],[-0.312,26.16],[-0.267,26.811],[-8.022,19.814]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-31.193,37.502],[-24.219,44.365],[-23.853,44.664],[-31.329,37.106]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-57.488,73.097],[-58.769,88.014],[-59.986,89.898],[-69.975,83.73]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-64.172,81.231],[-65.506,96.425],[-70.174,101.677],[-83.671,99.799]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-142.467,169.4],[-141.336,197.401],[-153.498,209.563],[-182.348,209.281]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.784,0.518,0.004,0.28,0.635,0.41,0.02,0.4,0.486,0.302,0.035,0.52,0.743,0.557,0.098,1,1,0.812,0.161]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-163,189.257],"to":[15.069,-16.726],"ti":[-15.069,16.726]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-72.584,88.9],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-72.584,88.9],"to":[-15.069,16.726],"ti":[15.069,-16.726]},{"t":144,"s":[-163,189.257]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-147.341,204.917],"to":[13.765,-18.224],"ti":[-13.765,18.224]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-64.748,95.573],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-64.748,95.573],"to":[-13.765,18.224],"ti":[13.765,-18.224]},{"t":144,"s":[-147.341,204.917]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-142.467,169.4],[-141.336,197.401],[-149.873,205.688],[-179.098,205.281]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-79.515,97.898],[-78.659,114.83],[-84.357,120.779],[-104.46,121.673]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-75.608,92.485],[-74.849,109.213],[-80.512,115.194],[-100.387,116.43]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72.975,88.838],[-72.282,105.428],[-75.234,105.788],[-86.895,95.407]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-48.705,65.253],[-51.21,61.314],[-43.631,75.138],[-53.82,66.325]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-30.067,46.615],[-32.869,42.973],[-23.999,55.506],[-33.903,46.408]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-30.067,46.615],[-32.869,42.973],[-23.999,55.506],[-33.903,46.408]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-48.705,65.253],[-51.21,61.314],[-39.979,76.215],[-53.82,66.325]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72.975,88.838],[-64.039,95.375],[-66.991,95.735],[-78.653,85.354]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-75.334,91.909],[-74.849,109.213],[-80.512,115.194],[-100.264,115.429]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-81.091,102.355],[-80.749,116.92],[-86.605,123.026],[-106.222,124.69]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-142.467,169.4],[-141.336,197.401],[-149.873,205.688],[-179.098,205.281]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.365,0.176,0.016,0.36,0.365,0.176,0.016,0.72,0.365,0.176,0.016,0,1,0.36,0.5,0.72,0]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-184.5,194.757],"to":[12.791,-14.308],"ti":[-12.791,14.308]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-107.755,108.906],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-107.755,108.906],"to":[-12.791,14.308],"ti":[12.791,-14.308]},{"t":144,"s":[-184.5,194.757]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-142.343,189.237],"to":[10.575,-12.822],"ti":[-10.575,12.822]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-78.893,112.306],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-78.893,112.306],"to":[-10.575,12.822],"ti":[10.575,-12.822]},{"t":144,"s":[-142.343,189.237]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-142.467,169.4],[-141.336,197.401],[-149.873,205.688],[-179.098,205.281]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-79.271,96.72],[-78.659,114.83],[-84.357,120.779],[-104.46,121.673]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-75.361,91.316],[-74.849,109.213],[-80.512,115.194],[-100.387,116.43]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72.726,87.675],[-72.282,105.428],[-74.21,106.09],[-86.895,95.407]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-49.095,64.737],[-51.21,61.314],[-43.426,75.324],[-53.82,66.325]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-30.483,46.125],[-32.869,42.973],[-23.798,55.696],[-33.903,46.408]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-30.483,46.125],[-32.869,42.973],[-23.798,55.696],[-33.903,46.408]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-49.095,64.737],[-51.21,61.314],[-39.774,76.401],[-53.82,66.325]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-72.726,87.675],[-64.039,95.375],[-65.967,96.037],[-78.653,85.354]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-75.087,90.74],[-74.849,109.213],[-80.512,115.194],[-100.264,115.429]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-80.828,101.158],[-80.749,116.92],[-86.605,123.026],[-106.222,124.69]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-142.467,169.4],[-141.336,197.401],[-149.873,205.688],[-179.098,205.281]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.784,0.518,0.004,0.28,0.635,0.41,0.02,0.4,0.486,0.302,0.035,0.52,0.743,0.557,0.098,1,1,0.812,0.161]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-163.125,188.382],"to":[12.151,-13.46],"ti":[-12.151,13.46]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-90.216,107.623],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-90.216,107.623],"to":[-12.151,13.46],"ti":[12.151,-13.46]},{"t":144,"s":[-163.125,188.382]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-145.716,206.042],"to":[10.75,-14.751],"ti":[-10.75,14.751]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-81.215,117.538],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-81.215,117.538],"to":[-10.75,14.751],"ti":[10.75,-14.751]},{"t":144,"s":[-145.716,206.042]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-112.5,145.25]},"a":{"a":0,"k":[-160,193]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-117.311,144.087],[-118.336,174.401],[-153.498,209.563],[-182.348,209.281]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-88.419,104.23],[-82.354,121.796],[-107.921,146.195],[-129.995,145.743]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-86.978,100.707],[-82.089,117.823],[-104.138,140.09],[-125.942,140.047]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-85.969,98.241],[-81.904,115.041],[-101.49,135.816],[-123.105,136.059]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[-2.135,2.054],[0,0],[0,0],[0,0]],"o":[[9.572,-1.019],[0,0],[0,0],[0,0]],"v":[[-91.313,103.917],[-74.339,105.006],[-99.405,132.451],[-104.758,118.472]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[-1.269,1.189],[0,0],[0,0],[0,0]],"o":[[7.383,1.17],[0,0],[0,0],[0,0]],"v":[[-83.614,97.804],[-73.548,105.972],[-79.212,112.259],[-86.348,100.062]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[-1.269,1.189],[0,0],[0,0],[0,0]],"o":[[7.383,1.17],[0,0],[0,0],[0,0]],"v":[[-83.614,97.804],[-73.548,105.972],[-79.212,112.259],[-86.348,100.062]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[-2.135,2.054],[0,0],[0,0],[0,0]],"o":[[9.572,-1.019],[0,0],[0,0],[0,0]],"v":[[-84.227,97.126],[-77.94,99.514],[-95.753,133.529],[-104.758,118.472]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-85.969,98.241],[-82.141,114.443],[-101.49,135.816],[-123.105,136.059]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-85.714,103.129],[-80.505,119.407],[-104.138,140.09],[-125.269,139.145]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-86.859,109.703],[-82.781,125.919],[-107.674,149.477],[-128.807,147.883]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-117.311,144.087],[-118.336,174.401],[-153.498,209.563],[-182.348,209.281]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.365,0.176,0.016,0.36,0.365,0.176,0.016,0.72,0.365,0.176,0.016,0,1,0.36,0.5,0.72,0]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-181.125,178.507],"to":[7.204,-9.284],"ti":[-7.204,9.284]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-137.898,122.805],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-137.898,122.805],"to":[-7.204,9.284],"ti":[7.204,-9.284]},{"t":144,"s":[-181.125,178.507]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-136.593,190.487],"to":[7.655,-9.674],"ti":[-7.655,9.674]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-90.661,132.441],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-90.661,132.441],"to":[-7.655,9.674],"ti":[7.655,-9.674]},{"t":144,"s":[-136.593,190.487]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-117.311,144.087],[-118.336,174.401],[-153.498,209.563],[-182.348,209.281]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-88.438,104.255],[-82.303,121.521],[-107.921,146.195],[-129.995,145.743]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-86.996,100.732],[-82.038,117.55],[-104.138,140.09],[-125.942,140.047]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-85.987,98.266],[-81.852,114.77],[-101.49,135.816],[-123.105,136.059]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[-2.413,0.866],[0,0],[0,0],[0,0]],"o":[[8.11,-2.911],[0,0],[0,0],[0,0]],"v":[[-90.819,104.093],[-74.287,104.736],[-99.405,132.451],[-104.758,118.472]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[-1.735,0.188],[0,0],[0,0],[0,0]],"o":[[5.832,-0.633],[0,0],[0,0],[0,0]],"v":[[-83.186,98.046],[-73.562,105.769],[-79.212,112.259],[-86.348,100.062]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[-1.735,0.188],[0,0],[0,0],[0,0]],"o":[[5.832,-0.633],[0,0],[0,0],[0,0]],"v":[[-83.186,98.046],[-73.562,105.769],[-79.212,112.259],[-86.348,100.062]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[-2.413,0.866],[0,0],[0,0],[0,0]],"o":[[8.11,-2.911],[0,0],[0,0],[0,0]],"v":[[-83.734,97.302],[-78.677,99.228],[-95.753,133.529],[-104.758,118.472]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-85.987,98.266],[-82.089,114.172],[-101.49,135.816],[-123.105,136.059]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-85.732,103.154],[-80.46,119.128],[-104.138,140.09],[-125.269,139.145]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-86.878,109.729],[-82.739,125.627],[-107.674,149.477],[-128.807,147.883]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-117.311,144.087],[-118.336,174.401],[-153.498,209.563],[-182.348,209.281]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.784,0.518,0.004,0.28,0.635,0.41,0.02,0.4,0.486,0.302,0.035,0.52,0.743,0.557,0.098,1,1,0.812,0.161]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-163,189.257],"to":[8.979,-10.842],"ti":[-8.979,10.842]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-109.127,124.205],"to":[0,0],"ti":[-8.979,10.842]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":112,"s":[-111.131,122.304],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-106.33,126.399],"to":[-8.979,10.842],"ti":[8.979,-10.842]},{"t":144,"s":[-163,189.257]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-146.341,206.042],"to":[8.251,-11.573],"ti":[-8.251,11.573]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-96.833,136.604],"to":[0,0],"ti":[-8.251,11.573]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":112,"s":[-96.833,136.604],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-96.084,137.443],"to":[-8.251,11.573],"ti":[8.251,-11.573]},{"t":144,"s":[-146.341,206.042]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-57.25,89.125]},"a":{"a":0,"k":[-161,191]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0.071,-0.014],[0,0],[-4.023,-4.023],[-0.163,-2.383]],"o":[[-0.085,0],[0,0],[4.031,-4.031],[1.831,1.831],[-0.134,-0.007]],"v":[[-11.087,38.231],[-11.313,38.246],[-4.914,31.846],[9.66,31.839],[12.644,38.387]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0.042,-0.005],[0,0],[-6.453,-2.451],[3.278,-5.642]],"o":[[-0.052,-0.005],[0,0],[1.77,-1.902],[3.787,1.438],[-0.084,-0.012]],"v":[[16.327,0.453],[16.376,0.51],[13.698,2.196],[27.26,-5.402],[32.354,6.004]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0.042,-0.006],[0,0],[-3.889,-0.661],[0.639,-2.816]],"o":[[-0.052,-0.004],[0,0],[1.759,-1.912],[2.642,0.543],[-0.083,-0.01]],"v":[[18.333,1.074],[17.743,0.327],[15.141,-1.325],[22.797,-5.316],[29.641,2.372]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0.041,-0.006],[0,0],[-3.302,0.066],[0.315,-2.127]],"o":[[-0.051,-0.003],[0,0],[1.751,-1.919],[1.822,-0.036],[-0.082,-0.009]],"v":[[19.737,1.509],[18.701,0.199],[16.151,-3.79],[22.449,-6.754],[29.609,-0.013]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0.041,-0.006],[0,0],[-4.859,0.404],[0.315,-2.127]],"o":[[-0.051,-0.003],[0,0],[1.751,-1.919],[1.816,-0.151],[-0.082,-0.009]],"v":[[19.737,1.509],[17.512,1.335],[10.612,1.569],[21.626,-6.914],[29.609,-0.013]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0.041,-0.006],[0,0],[-4.859,0.404],[0.315,-2.127]],"o":[[-0.051,-0.003],[0,0],[1.751,-1.919],[1.816,-0.151],[-0.082,-0.009]],"v":[[23.886,1.82],[21.661,1.645],[14.761,1.879],[24.237,-3.371],[33.758,0.297]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0.031,0.003],[0,0],[-1.003,0.855],[-0.128,-0.4]],"o":[[-0.041,-0.012],[0,0],[0.986,-1.166],[1.239,-0.921],[-0.066,-0.023]],"v":[[28.06,-1.306],[39.91,-7.922],[28.462,-0.723],[40.522,-9.824],[42.419,-9.799]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0.033,-0.014],[0,0],[-3.575,-1.741],[-0.032,-0.496]],"o":[[-0.039,0.009],[0,0],[2.037,-3.182],[3.912,1.906],[-0.081,-0.008]],"v":[[24.405,-3.314],[23.292,-4.756],[18.281,-5.095],[29.708,-9.39],[36.078,-3.458]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0.041,-0.006],[0,0],[-5.349,-0.972],[1.931,-3.293]],"o":[[-0.051,-0.003],[0,0],[1.751,-1.919],[5.873,1.067],[-0.082,-0.009]],"v":[[17.018,-1.286],[18.701,0.199],[16.151,-3.79],[24.778,-8.897],[31.524,0.384]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0.043,-0.005],[0,0],[-5.837,-1.512],[0.982,-5.248]],"o":[[-0.053,-0.005],[0,0],[1.754,-1.917],[2.739,0.641],[-0.085,-0.013]],"v":[[19.413,2.155],[18.783,1.367],[16.516,1.257],[28.166,-6.133],[34.931,3.104]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0.045,-0.003],[0,0],[-6.122,-3.103],[4.257,-3.53]],"o":[[-0.056,-0.007],[0,0],[5.369,-5.516],[3.955,2.005],[-0.09,-0.017]],"v":[[17.741,6.436],[17.796,6.5],[15.253,7.67],[30.692,0.124],[34.029,6.904]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0.071,-0.014],[0,0],[-4.023,-4.023],[-0.163,-2.383]],"o":[[-0.085,0],[0,0],[4.031,-4.031],[1.831,1.831],[-0.134,-0.007]],"v":[[-11.087,38.231],[-11.313,38.246],[-4.914,31.846],[9.66,31.839],[12.644,38.387]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.365,0.176,0.016,0.5,0.365,0.176,0.016,1,0.365,0.176,0.016,0,0,0.5,0.5,1,1]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-4.25,41.882],"to":[4.353,-6.711],"ti":[-4.353,6.711]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[21.866,1.617],"to":[0,0],"ti":[0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.2,"y":0},"t":108,"s":[19.229,-2.102],"to":[-4.353,6.711],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[18.771,5.31],"to":[-4.353,6.711],"ti":[4.353,-6.711]},{"t":144,"s":[-4.25,41.882]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[6.697,31.436],"to":[2.971,-5.639],"ti":[-2.971,5.639]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[24.523,-2.399],"to":[0,0],"ti":[0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.2,"y":0},"t":108,"s":[33.865,-13.718],"to":[-2.971,5.639],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[24.056,-0.012],"to":[-2.971,5.639],"ti":[2.971,-5.639]},{"t":144,"s":[6.697,31.436]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[1.5,0.25]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Grad 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[-9.296,-8.741]],"o":[[4.828,-21.431],[0,0],[0,0],[9.708,9.129]],"v":[[-34.288,10.145],[-49.476,-3.813],[-49.476,-3.813],[-30.188,-8.511]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[-6.852,-5.895]],"o":[[2.56,-15.084],[0,0],[0,0],[7.156,6.157]],"v":[[-11.984,-22.231],[-23.167,-31.638],[-23.167,-31.638],[-9.827,-35.36]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[-6.737,-5.701]],"o":[[2.611,-14.955],[0,0],[0,0],[7.036,5.954]],"v":[[-11.21,-22.673],[-22.207,-31.764],[-22.207,-31.764],[-9.009,-35.687]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[-6.657,-5.565]],"o":[[2.646,-14.864],[0,0],[0,0],[6.952,5.812]],"v":[[-10.1,-23.702],[-20.966,-32.573],[-20.966,-32.573],[-7.867,-36.637]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[0,0],[-6.488,-5.563]],"o":[[1.059,-13.177],[0,0],[0,0],[6.776,5.81]],"v":[[-9.388,-24.818],[-19.961,-33.706],[-19.961,-33.706],[-8.53,-36.29]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[0,0],[-6.034,-6.017]],"o":[[-5.926,-6.192],[0,0],[0,0],[6.302,6.284]],"v":[[-2.736,-28.677],[-12.483,-38.392],[-12.483,-38.392],[-7.928,-34.099]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[-6.034,-6.017]],"o":[[-5.926,-6.192],[0,0],[0,0],[6.302,6.284]],"v":[[-5.497,-24.184],[-15.244,-33.899],[-15.244,-33.899],[-10.689,-29.606]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[0,0],[-6.488,-5.563]],"o":[[1.059,-13.177],[0,0],[0,0],[6.776,5.81]],"v":[[-7.327,-26.383],[-17.9,-35.272],[-17.9,-35.272],[-6.469,-37.855]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[0,0],[-6.657,-5.565]],"o":[[2.646,-14.864],[0,0],[0,0],[6.952,5.812]],"v":[[-10.118,-23.406],[-20.985,-32.277],[-20.985,-32.277],[-7.885,-36.34]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[-7.118,-6.082]],"o":[[2.232,-15.333],[0,0],[0,0],[7.434,6.352]],"v":[[-12.046,-22.811],[-23.658,-32.519],[-23.658,-32.519],[-10.175,-36.157]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[0,0],[-7.601,-6.619]],"o":[[2.075,-16.047],[0,0],[0,0],[7.939,6.913]],"v":[[-15.987,-14.553],[-28.657,-25.342],[-28.657,-25.342],[-14.531,-28.739]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[-9.296,-8.741]],"o":[[4.828,-21.431],[0,0],[0,0],[9.708,9.129]],"v":[[-34.288,10.145],[-49.476,-3.813],[-49.476,-3.813],[-30.188,-8.511]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.27,0.365,0.176,0.016,0.635,0.365,0.176,0.016,1,0.365,0.176,0.016,0.27,0,0.635,0.5,1,1]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-41.875,2.257],"to":[4.249,-4.911],"ti":[-4.249,4.911]},{"i":{"x":0.685,"y":1},"o":{"x":0.354,"y":0},"t":37,"s":[-16.383,-27.21],"to":[0,0],"ti":[0,0]},{"i":{"x":0.685,"y":0.685},"o":{"x":0.363,"y":0.363},"t":49,"s":[-12.665,-30.816],"to":[0,0],"ti":[0,0]},{"i":{"x":0.592,"y":1},"o":{"x":0.363,"y":0},"t":108,"s":[-12.665,-30.816],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-19.653,-22.614],"to":[-4.249,4.911],"ti":[4.249,-4.911]},{"t":144,"s":[-41.875,2.257]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-31.367,-8.51],"to":[3.477,-4.371],"ti":[-3.477,4.371]},{"i":{"x":0.685,"y":1},"o":{"x":0.354,"y":0},"t":37,"s":[-10.507,-34.737],"to":[0,0],"ti":[0,0]},{"i":{"x":0.685,"y":0.685},"o":{"x":0.363,"y":0.363},"t":49,"s":[-3.376,-43.603],"to":[0,0],"ti":[0,0]},{"i":{"x":0.592,"y":1},"o":{"x":0.363,"y":0},"t":108,"s":[-3.376,-43.603],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-13.857,-28.73],"to":[-3.477,4.371],"ti":[3.477,-4.371]},{"t":144,"s":[-31.367,-8.51]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[9.007,-11.658],[0,0]],"o":[[0,0],[7.581,-7.594],[0,0],[0,0]],"v":[[-215.118,161.829],[-45.021,-8.268],[-30.448,6.306],[-215.009,190.867]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[5.865,-8.351],[0,0]],"o":[[0,0],[5.022,-5.479],[0,0],[0,0]],"v":[[-107.785,75.15],[-20.215,-34.852],[-9.44,-25.002],[-102.115,85.622]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[5.84,-8.361],[0,0]],"o":[[0,0],[4.99,-5.506],[0,0],[0,0]],"v":[[-102.915,70.579],[-19.274,-34.995],[-8.682,-25.457],[-97.277,81.515]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[5.821,-8.367],[0,0]],"o":[[0,0],[4.969,-5.526],[0,0],[0,0]],"v":[[-62.699,20.613],[-18.046,-35.815],[-7.583,-26.497],[-57.152,31.383]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[4.496,-7.061],[0,0]],"o":[[0,0],[3.981,-4.571],[0,0],[0,0]],"v":[[-39.533,-8.475],[-17.621,-36.388],[-7.371,-27.129],[-25.502,-6.39]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[-1.175,-1.391],[0,0]],"o":[[0,0],[-0.215,-0.375],[0,0],[0,0]],"v":[[-18.342,-29.665],[-12.606,-38.61],[-2.843,-28.865],[-6.781,-25.111]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[-1.175,-1.391],[0,0]],"o":[[0,0],[-0.215,-0.375],[0,0],[0,0]],"v":[[-18.342,-29.665],[-15.367,-34.116],[-5.604,-24.371],[-6.781,-25.111]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[4.496,-7.061],[0,0]],"o":[[0,0],[3.981,-4.571],[0,0],[0,0]],"v":[[-37.484,-7.418],[-15.56,-37.953],[-5.31,-28.694],[-25.854,-4.405]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[5.821,-8.367],[0,0]],"o":[[0,0],[4.969,-5.526],[0,0],[0,0]],"v":[[-54.457,10.56],[-18.064,-35.519],[-7.602,-26.2],[-48.91,21.33]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[5.762,-8.438],[0,0]],"o":[[0,0],[4.975,-5.522],[0,0],[0,0]],"v":[[-95.702,59.659],[-20.734,-35.758],[-9.525,-25.604],[-87.816,69.246]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[5.914,-8.687],[0,0]],"o":[[0,0],[5.137,-5.647],[0,0],[0,0]],"v":[[-111.021,78.386],[-25.637,-28.655],[-13.384,-17.409],[-105.326,89.631]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[9.007,-11.658],[0,0]],"o":[[0,0],[7.581,-7.594],[0,0],[0,0]],"v":[[-215.118,161.829],[-45.021,-8.268],[-30.448,6.306],[-215.009,190.867]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.365,0.176,0.016,0.36,0.365,0.176,0.016,0.72,0.365,0.176,0.016,0,1,0.36,0.5,0.72,0]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-159.75,67.257],"to":[8.047,-5.832],"ti":[-8.047,5.832]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-111.47,32.267],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-111.47,32.267],"to":[-8.047,5.832],"ti":[8.047,-5.832]},{"t":144,"s":[-159.75,67.257]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-129.076,86.961],"to":[9.109,-7.796],"ti":[-9.109,7.796]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-74.419,40.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-74.419,40.185],"to":[-9.109,7.796],"ti":[9.109,-7.796]},{"t":144,"s":[-129.076,86.961]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[11.177,-12.811],[0,0]],"o":[[0,0],[7.377,-8.543],[0,0],[0,0]],"v":[[-215.118,161.829],[-45.021,-8.268],[-30.448,6.306],[-215.009,190.867]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[7.342,-9.206],[0,0]],"o":[[0,0],[4.843,-6.137],[0,0],[0,0]],"v":[[-107.785,75.15],[-20.215,-34.852],[-9.44,-25.002],[-102.115,85.622]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[7.303,-9.232],[0,0]],"o":[[0,0],[4.817,-6.154],[0,0],[0,0]],"v":[[-102.915,70.579],[-19.274,-34.995],[-8.682,-25.457],[-97.277,81.515]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[7.275,-9.251],[0,0]],"o":[[0,0],[4.799,-6.166],[0,0],[0,0]],"v":[[-62.699,20.613],[-18.046,-35.815],[-7.583,-26.497],[-57.152,31.383]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[5.726,-7.738],[0,0]],"o":[[0,0],[3.772,-5.161],[0,0],[0,0]],"v":[[-39.533,-8.475],[-17.621,-36.388],[-7.371,-27.129],[-25.502,-6.39]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0],[-0.88,-1.132],[0,0]],"o":[[0,0],[-0.611,-0.778],[0,0],[0,0]],"v":[[-18.342,-29.665],[-12.606,-38.61],[-2.843,-28.865],[-6.781,-25.111]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0],[-0.88,-1.132],[0,0]],"o":[[0,0],[-0.611,-0.778],[0,0],[0,0]],"v":[[-18.342,-29.665],[-15.367,-34.116],[-5.604,-24.371],[-6.781,-25.111]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0],[5.726,-7.738],[0,0]],"o":[[0,0],[3.772,-5.161],[0,0],[0,0]],"v":[[-37.484,-7.418],[-15.56,-37.953],[-5.31,-28.694],[-25.854,-4.405]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0],[7.275,-9.251],[0,0]],"o":[[0,0],[4.799,-6.166],[0,0],[0,0]],"v":[[-54.457,10.56],[-18.064,-35.519],[-7.601,-26.2],[-48.91,21.331]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0],[7.243,-9.292],[0,0]],"o":[[0,0],[4.776,-6.195],[0,0],[0,0]],"v":[[-95.702,59.659],[-20.734,-35.758],[-9.525,-25.604],[-87.816,69.246]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0],[7.458,-9.538],[0,0]],"o":[[0,0],[4.916,-6.36],[0,0],[0,0]],"v":[[-111.021,78.386],[-25.637,-28.655],[-13.384,-17.409],[-105.326,89.631]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[11.177,-12.811],[0,0]],"o":[[0,0],[7.377,-8.543],[0,0],[0,0]],"v":[[-215.118,161.829],[-45.021,-8.268],[-30.448,6.306],[-215.009,190.867]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.784,0.518,0.004,0.2,0.635,0.41,0.02,0.4,0.486,0.302,0.035,0.7,0.733,0.578,0.129,1,0.98,0.855,0.224]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-134,80.257],"to":[10.474,-8.568],"ti":[-10.474,8.568]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-72.256,28.022],"to":[0,0],"ti":[-10.474,8.568]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-72.256,28.022],"to":[0,0],"ti":[10.474,-8.568]},{"t":144,"s":[-134,80.257]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-119.726,94.532],"to":[9.788,-9.528],"ti":[-9.788,9.528]},{"i":{"x":0.6,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[-61.994,36.613],"to":[0,0],"ti":[-9.788,9.528]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[-61.994,36.613],"to":[0,0],"ti":[9.788,-9.528]},{"t":144,"s":[-119.726,94.532]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Grad 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-215.207,143.012],[-44.827,-27.06]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-111.785,67.511],[-8.722,-61.656]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-108.49,61.252],[-7.249,-62.849]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-70.554,17.481],[-6.218,-63.685]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-42.979,-15.768],[-3.855,-68.881]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.273,-34.307],[-4.807,-71.952]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-21.54,-33.261],[-4.153,-71.565]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-40.532,-14.214],[-3.855,-68.881]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-62.311,7.429],[-6.218,-63.685]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-102.955,51.201],[-8.966,-64.567]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-115.482,70.957],[-10.653,-63.291]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-215.207,143.012],[-44.827,-27.06]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.972549021244,0.423529416323,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[1.23,-1.23],[-0.007,-2.298],[0,0],[0.106,2.694],[-1.86,-0.035],[0.226,2.772],[-1.98,-0.141],[-1.619,1.619],[-0.092,1.973],[-1.739,-0.014],[-3.246,-2.104]],"o":[[0.799,1.534],[0,0],[0,0],[0.014,2.574],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-55.247,-47.233],[-50.72,-29.955],[-215.207,138.124],[-214.96,204.303],[-141.039,204.755],[-139.526,157.52],[-93.568,156.51],[-94.932,106.105],[-37.243,106.107],[-16.171,82.107],[-11.087,38.231],[23.194,41.456]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0.815,-0.888],[-0.541,-0.98],[0,0],[0.258,1.242],[-0.971,-0.226],[0.203,1.86],[-1.392,-0.161],[-0.982,1.077],[0.204,1.198],[-1.074,-0.106],[-2.233,-1.511]],"o":[[0.619,1.054],[0,0],[0,0],[0.608,1.099],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-10.415,-66.918],[-12.964,-63.544],[-112.93,65.429],[-99.027,91.757],[-61.924,96.943],[-61.078,73.034],[-30.856,71.694],[-31.645,43.522],[4.123,43.34],[22.841,23.728],[16.687,0.864],[50.317,8.065]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0.81,-0.892],[-0.529,-0.959],[0,0],[0.249,1.223],[-0.958,-0.206],[0.191,1.834],[-1.374,-0.134],[-0.976,1.083],[0.195,1.18],[-1.061,-0.085],[-5.063,-0.411]],"o":[[0.606,1.03],[0,0],[0,0],[0.595,1.075],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.274,-13.772]],"v":[[-8.893,-68.019],[-11.429,-64.638],[-109.61,59.216],[-94.352,86.832],[-57.726,91.278],[-56.762,67.634],[-26.898,65.756],[-27.525,37.928],[7.812,37.094],[23.068,19.683],[20.244,1.236],[44.3,4.455]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0.807,-0.895],[-0.521,-0.944],[0,0],[0.729,0.722],[-0.568,-0.573],[0.182,1.816],[-1.362,-0.115],[-0.971,1.086],[0.189,1.168],[-1.051,-0.071],[-7.045,0.358]],"o":[[0.597,1.014],[0,0],[0,0],[0.824,0.82],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.566,-23.413]],"v":[[-7.828,-68.79],[-10.355,-65.403],[-71.656,15.477],[-50.542,36.102],[-30.543,56.325],[-41.833,45.203],[-24.127,61.6],[-24.641,34.013],[10.394,32.722],[23.226,16.852],[22.733,1.496],[42.439,-0.664]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0.804,-0.898],[-0.514,-0.932],[0,0],[0.687,0.748],[-0.585,-0.537],[0.175,1.802],[-0.782,-0.67],[-0.968,1.089],[0.184,1.158],[-1.044,-0.059],[-3.59,-0.857]],"o":[[0.589,1.001],[0,0],[0,0],[0.797,0.826],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.641,-6.904]],"v":[[-2.913,-74.379],[-5.433,-70.989],[-43.022,-16.02],[-21.07,-1.862],[1.546,28.182],[-8.788,16.315],[-3.354,17.87],[-3.919,14.145],[12.426,29.28],[27.375,10.245],[34.059,-0.791],[51.47,-3.551]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55,"s":[{"i":[[0,0],[0.452,-0.546],[-0.601,-0.846],[0,0],[0.7,0.735],[-0.575,-0.547],[0.511,1.466],[-0.759,-0.693],[-0.543,0.664],[0.385,0.956],[-0.84,-0.263],[-3.026,-1.422]],"o":[[0.674,0.916],[0,0],[0,0],[0.803,0.82],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.729,-5.816]],"v":[[-3.786,-74.881],[-5.085,-72.712],[-23.675,-34.35],[-2.329,-20.603],[21.822,7.906],[11.172,-3.644],[15.804,-1.288],[14.585,-4.36],[30.681,11.025],[38.605,-0.986],[41.627,-8.359],[54.869,-6.95]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0,0],[0.452,-0.546],[-0.601,-0.846],[0,0],[0.7,0.735],[-0.575,-0.547],[0.511,1.466],[-0.759,-0.693],[-0.543,0.664],[0.385,0.956],[-0.84,-0.263],[-3.026,-1.422]],"o":[[0.674,0.916],[0,0],[0,0],[0.803,0.82],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.729,-5.816]],"v":[[-2.477,-74.108],[-3.775,-71.939],[-21.503,-32.854],[-2.329,-20.603],[21.822,7.906],[11.172,-3.644],[15.804,-1.288],[14.585,-4.36],[30.681,11.025],[35.911,-1.859],[41.627,-8.359],[54.869,-6.95]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0,0],[0.804,-0.898],[-0.514,-0.932],[0,0],[0.687,0.748],[-0.585,-0.537],[0.175,1.802],[-0.782,-0.67],[-0.968,1.089],[-0.112,0.862],[-0.8,0.184],[-3.59,-0.857]],"o":[[0.589,1.001],[0,0],[0,0],[0.797,0.826],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.641,-6.904]],"v":[[-2.913,-74.379],[-5.433,-70.989],[-40.574,-14.466],[-21.07,-1.862],[1.546,28.182],[-8.788,16.315],[-3.354,17.87],[-3.919,14.145],[12.426,29.28],[25.319,-1.318],[26.117,-3.264],[51.47,-3.551]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0,0],[0.807,-0.895],[-0.521,-0.944],[0,0],[0.729,0.722],[-0.568,-0.573],[0.182,1.816],[-1.362,-0.115],[-0.971,1.086],[0.189,1.168],[-1.051,-0.071],[-7.045,0.358]],"o":[[0.597,1.014],[0,0],[0,0],[0.824,0.82],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.566,-23.413]],"v":[[-7.828,-68.79],[-10.355,-65.403],[-63.414,5.424],[-42.299,26.05],[-22.3,46.272],[-33.591,35.15],[-15.884,51.547],[-24.641,34.013],[10.394,32.722],[23.226,16.852],[20.014,-1.299],[42.439,-0.664]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0,0],[0.808,-0.895],[-0.715,-0.853],[0,0],[0.619,0.932],[-0.958,-0.206],[0.191,1.834],[-1.374,-0.134],[-0.976,1.083],[0.237,1.222],[-1.096,-0.12],[-5.231,-0.579]],"o":[[0.656,1.08],[0,0],[0,0],[0.803,0.957],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.796,-14.295]],"v":[[-10.82,-69.945],[-13.33,-66.538],[-104.472,49.39],[-83.856,73.974],[-57.039,90.458],[-56.762,67.634],[-26.898,65.756],[-27.525,37.928],[7.812,37.094],[24.81,21.425],[21.334,2.326],[46.226,6.381]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0,0],[0.834,-0.915],[-0.535,-0.986],[0,0],[0.245,1.256],[-0.982,-0.216],[0.181,1.882],[-1.409,-0.145],[-1.004,1.111],[0.271,1.292],[-1.156,-0.161],[-2.459,-1.718]],"o":[[0.71,1.156],[0,0],[0,0],[0.602,1.106],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-12.7,-69.003],[-15.281,-65.501],[-116.615,68.862],[-102.369,95.099],[-64.834,99.853],[-63.654,75.61],[-33.004,73.843],[-33.423,45.3],[6.095,47.895],[23.322,29.461],[18.027,6.808],[39.334,7.198]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[1.23,-1.23],[-0.007,-2.298],[0,0],[0.106,2.694],[-1.86,-0.035],[0.226,2.772],[-1.98,-0.141],[-1.619,1.619],[-0.092,1.973],[-1.739,-0.014],[-3.246,-2.104]],"o":[[0.799,1.534],[0,0],[0,0],[0.014,2.574],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-55.247,-47.233],[-50.72,-29.955],[-215.207,138.124],[-214.96,204.303],[-141.039,204.755],[-139.526,157.52],[-93.568,156.51],[-94.932,106.105],[-37.243,106.107],[-16.171,82.107],[-11.087,38.231],[23.194,41.456]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,1,0.945,0,0.275,0.951,0.835,0.059,0.55,0.902,0.725,0.118,0.775,0.82,0.633,0.127,1,0.737,0.541,0.137]}},"s":{"a":0,"k":[-86.464,-156.442]},"e":{"a":0,"k":[44.78,118.226]},"t":1,"nm":"Gradient Fill 44","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-96.042,81.19]},"a":{"a":0,"k":[-96.042,81.19]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":184,"st":4,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Body BACK","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"t":41,"s":[100],"h":1},{"t":50,"s":[0],"h":1},{"t":106,"s":[100],"h":1}]},"p":{"a":0,"k":[76.7,81.816,0]},"a":{"a":0,"k":[60.369,80.577,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[1.23,-1.23],[0,0],[0,0],[0.106,2.694],[-1.86,-0.035],[-11.378,-0.101],[0.114,1.403],[-1.98,-0.141],[-1.619,1.619],[-0.092,1.973],[-1.739,-0.014],[-3.246,-2.104]],"o":[[0,0],[0,0],[0.014,2.574],[0,0],[0,0],[11.656,0.103],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-50.72,-29.955],[-177.551,150.946],[-214.96,204.303],[-165.4,210.328],[-161.962,163.833],[-133.361,165.095],[-110.05,163.554],[-113.225,107.385],[-50.555,116.058],[-29.483,92.059],[-30.859,43.36],[23.194,41.456]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0.815,-0.888],[0,0],[0,0],[0.258,1.242],[-0.971,-0.226],[0,0],[0.102,0.936],[-1.392,-0.161],[-0.982,1.077],[0.204,1.198],[-1.074,-0.106],[-2.233,-1.511]],"o":[[0,0],[0,0],[0.608,1.099],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.804,-45.871],[-100.943,83.766],[-74.441,109.188],[-62.306,89.142],[-63.658,75.003],[-42.366,82.101],[-31.022,56.544],[-31.645,43.522],[11.039,36.655],[17.152,18.815],[14.335,1.909],[46.957,11.768]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0.81,-0.892],[0,0],[0,0],[0.249,1.223],[-0.958,-0.206],[0,0],[0.096,0.928],[-1.374,-0.134],[-0.976,1.083],[0.195,1.18],[-1.061,-0.085],[-5.063,-0.411]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.274,-13.772]],"v":[[-11.429,-64.638],[-95.823,77.685],[-67.433,100.543],[-53.843,76.986],[-57.653,63.832],[-39.752,77.247],[-23.406,47.414],[-27.525,37.928],[11.324,31.602],[20.732,13.228],[20.244,1.236],[44.3,4.455]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0.807,-0.895],[0,0],[0,0],[0.729,0.722],[-0.568,-0.573],[0,0],[0.092,0.919],[-1.362,-0.115],[-0.971,1.086],[0.189,1.168],[-1.051,-0.071],[-7.045,0.358]],"o":[[0,0],[0,0],[0.824,0.82],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.566,-23.413]],"v":[[-10.355,-65.403],[-41.389,12.983],[-50.542,36.102],[-30.543,56.325],[-41.833,45.203],[-30.15,65.833],[-24.127,61.6],[-19.244,35.575],[10.596,31.622],[19.942,9.994],[22.733,1.496],[42.439,-0.664]],"c":true}]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.016},"t":50,"s":[{"i":[[0.804,-0.898],[0,0],[0,0],[0.687,0.748],[-0.585,-0.537],[-1.364,-0.612],[0.089,0.912],[-0.782,-0.67],[-0.968,1.089],[0.184,1.158],[-1.044,-0.059],[-3.59,-0.857]],"o":[[0,0],[0,0],[0.797,0.826],[0,0],[0,0],[1.397,0.627],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.641,-6.904]],"v":[[-5.433,-70.989],[-17.508,-17.607],[-21.07,-1.862],[1.546,28.182],[-8.788,16.315],[-6.055,17.746],[-3.354,17.87],[-3.919,14.145],[10.001,18.374],[14.435,5.815],[34.059,-0.791],[51.47,-3.551]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":104,"s":[{"i":[[0.452,-0.546],[0,0],[0,0],[0.7,0.735],[-0.575,-0.547],[-1.209,-0.767],[0.259,0.742],[-0.759,-0.693],[-0.543,0.664],[0.385,0.956],[-0.84,-0.263],[-3.026,-1.422]],"o":[[0,0],[0,0],[0.803,0.82],[0,0],[0,0],[1.238,0.786],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.729,-5.816]],"v":[[-3.775,-71.939],[-2.658,-32.296],[-2.329,-20.603],[21.822,7.906],[11.172,-3.644],[13.635,-1.944],[15.804,-1.288],[14.585,-4.36],[19.725,13.581],[25.627,7.869],[41.627,-8.359],[54.869,-6.95]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":108,"s":[{"i":[[0.804,-0.898],[0,0],[0,0],[0.687,0.748],[-0.585,-0.537],[-1.364,-0.612],[0.089,0.912],[-0.782,-0.67],[-0.968,1.089],[0.184,1.158],[-1.044,-0.059],[-3.59,-0.857]],"o":[[0,0],[0,0],[0.797,0.826],[0,0],[0,0],[1.397,0.627],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.641,-6.904]],"v":[[-5.433,-70.989],[-17.508,-17.607],[-21.07,-1.862],[1.546,28.182],[-8.788,16.315],[-6.055,17.746],[-3.354,17.87],[-3.919,14.145],[12.16,24.316],[24.311,6.772],[34.059,-0.791],[51.47,-3.551]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[{"i":[[0.807,-0.895],[0,0],[0,0],[0.729,0.722],[-0.568,-0.573],[0,0],[0.092,0.919],[-1.362,-0.115],[-0.971,1.086],[0.189,1.168],[-1.051,-0.071],[-7.045,0.358]],"o":[[0,0],[0,0],[0.824,0.82],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.566,-23.413]],"v":[[-10.355,-65.403],[-41.389,12.983],[-50.542,36.102],[-30.543,56.325],[-41.833,45.203],[-30.15,65.833],[-19.236,60.76],[-12.263,40.428],[10.036,29.546],[19.582,9.231],[22.733,1.496],[42.439,-0.664]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[0.807,-0.896],[0,0],[0,0],[0.249,1.223],[-0.958,-0.206],[0,0],[0.096,0.928],[-1.374,-0.134],[-0.971,1.087],[0.251,1.236],[-1.107,-0.132],[-5.285,-0.633]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.964,-14.463]],"v":[[-13.955,-67.163],[-95.823,77.685],[-67.433,100.543],[-53.857,77.837],[-57.653,63.832],[-39.752,77.247],[-23.75,47.042],[-27.525,37.928],[13.617,33.895],[21.922,14.825],[21.668,2.66],[46.829,6.984]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.2,"y":0},"t":121,"s":[{"i":[[0.836,-0.92],[0,0],[0,0],[0.243,1.258],[-0.983,-0.215],[0,0],[0.089,0.949],[-1.411,-0.142],[-1.006,1.117],[0.297,1.322],[-1.181,-0.183],[-2.534,-1.79]],"o":[[0,0],[0,0],[0.601,1.107],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.986,-50],[-104.514,87.337],[-77.996,112.743],[-65.36,92.195],[-66.513,77.858],[-44.999,84.734],[-33.081,58.603],[-33.511,45.389],[13.25,41.057],[18.828,21.936],[14.703,3.284],[50.969,16.078]],"c":true}]},{"t":144,"s":[{"i":[[1.23,-1.23],[0,0],[0,0],[0.106,2.694],[-1.86,-0.035],[-11.224,-1.863],[0.114,1.403],[-1.98,-0.141],[-1.619,1.619],[-0.092,1.973],[-1.739,-0.014],[-3.246,-2.104]],"o":[[0,0],[0,0],[0.014,2.574],[0,0],[0,0],[1.508,0.25],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-50.72,-29.955],[-177.551,150.946],[-155.811,217.756],[-156.7,216.895],[-161.962,163.833],[-109.119,166.281],[-110.05,163.554],[-113.225,107.385],[-27.936,95.711],[-28.743,94.315],[-27.855,42.883],[23.194,41.456]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.486274539723,0.309803921569,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.639215686275,0.415686304429,0.019607843137,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-96.042,81.19]},"a":{"a":0,"k":[-96.042,81.19]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":45},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":184,"st":4,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Keyhole","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":116,"s":[100]},{"t":128,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.38],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[7]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":123,"s":[7]},{"t":146,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":0.475},"o":{"x":0.256,"y":0},"t":12,"s":[-219.854,7.23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0.04},"t":36,"s":[-203.854,-22.77,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.4,"y":0.4},"t":55,"s":[-80.354,-22.77,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":0.751},"o":{"x":0.7,"y":0.041},"t":102,"s":[-80.354,-22.77,0],"to":[-61.146,-7.23,0],"ti":[0,0,0]},{"i":{"x":0.559,"y":1},"o":{"x":0.2,"y":0.705},"t":123,"s":[-204.354,-17.77,0],"to":[0,0,0],"ti":[0,0,0]},{"t":144,"s":[-220.354,-2.77,0]}]},"a":{"a":0,"k":[216.646,165.23,0]},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.38,0.38,0.38],"y":[0,0,0]},"t":12,"s":[40,100,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[70,75,100]},{"i":{"x":[0.39,0.39,0.39],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":55,"s":[105,105,100]},{"i":{"x":[0.699,0.699,0.6],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.7],"y":[0,0,0]},"t":102,"s":[105,105,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":122,"s":[70,77,100]},{"t":140,"s":[40,80,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[3.798,-10.434],[34.313,3.143]],"o":[[-10.08,27.691],[-27.63,-2.531]],"v":[[260.63,200.234],[196.005,242.348]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[{"i":[[3.798,-10.434],[17.709,-0.216]],"o":[[-10.08,27.691],[-27.743,0.338]],"v":[[260.63,200.234],[214.496,240.557]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[3.798,-10.434],[21.515,1.476]],"o":[[-10.08,27.691],[-27.68,-1.899]],"v":[[260.63,200.234],[209.239,240.723]],"c":false}]},{"t":64,"s":[{"i":[[3.798,-10.434],[34.313,3.143]],"o":[[-10.08,27.691],[-27.63,-2.531]],"v":[[260.63,200.234],[196.005,242.348]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.486274539723,0.309803921569,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.424,-41.622],[27.729,0.949],[-1.424,41.622],[-27.729,-0.949]],"o":[[-1.424,41.622],[-27.729,-0.949],[1.424,-41.622],[27.729,0.949]],"v":[[266.854,166.948],[214.068,240.593],[166.438,163.512],[219.224,89.867]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.682352941176,0.447058853449,0.058823533152,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.167,41.324],[-32.263,3.618],[1.675,-48.668]],"o":[[-8.195,-65.544],[27.572,-3.092],[-1.432,41.621]],"v":[[165.373,191.822],[216.611,89.634],[269.04,171.086]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.968627510819,0.925490255917,0.396078461292,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[21.5,5.25]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[90.702,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":52,"s":[{"i":[[0,0],[16.918,-39.999],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-12.266,-8.228],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[228.821,118.477],[233.225,213.801],[204.7,200.067],[192.204,214.658],[192.197,195.948],[202.731,185.189],[202.323,165.432],[191.484,157.295],[192.619,127.834]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.51,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[225.576,120.232],[234.648,210.863],[202.258,202.568],[193.343,210.304],[192.217,194.973],[201.837,185.29],[202.734,165.108],[191.11,157.893],[192.315,130.091]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[227.268,128.396],[238.191,199.404],[204.294,200.734],[199.218,199.984],[199.313,187.121],[205.973,182.113],[206.861,158.181],[197.863,149.341],[198.191,134.216]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[230.489,133.201],[233.223,194.623],[204.266,197.801],[204.502,197.479],[203.914,189.016],[203.816,180.58],[202.363,158.357],[201.505,148.171],[200.334,134.945]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[231.623,125.32],[238.284,199.101],[204.38,198.187],[201.218,200.737],[200.78,190.612],[211.177,178.679],[209.053,157.359],[198.623,148.592],[195.328,131.652]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":92,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[229.042,123.148],[236.732,204.122],[201.93,199.123],[193.254,198.933],[194.271,187.283],[207.189,181.501],[206.355,160.667],[195.415,152.563],[193.509,131.612]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[225.576,120.232],[234.648,210.863],[204.691,199.241],[192.245,209.639],[192.217,194.973],[201.837,185.29],[202.734,165.108],[191.11,157.893],[191.067,131.558]],"c":true}]},{"t":109,"s":[{"i":[[0,0],[42.05,-40.888],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-8.986,-6.236],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[226.512,118.182],[231.265,208.188],[199.907,206.538],[192.038,207.011],[192.217,194.973],[201.837,185.29],[202.734,165.108],[191.11,157.893],[192.315,130.091]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.486274539723,0.309803921569,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":9.209},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[0,0.922,0.773,0.09,0.5,0.896,0.731,0.106,1,0.871,0.69,0.122]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[0,0.886,0.71,0.118,0.5,0.861,0.68,0.122,1,0.835,0.651,0.125]},{"t":104,"s":[0,0.922,0.773,0.09,0.5,0.896,0.731,0.106,1,0.871,0.69,0.122]}]}},"s":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[223.628,135.388],"to":[-0.687,-0.276],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[219.507,133.731],"to":[0,0],"ti":[-0.687,-0.276]},{"t":104,"s":[223.628,135.388]}]},"e":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[212.289,196.651],"to":[1.179,0.176],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[219.363,197.71],"to":[0,0],"ti":[1.179,0.176]},{"t":104,"s":[212.289,196.651]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[227,164.5]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.984]},"o":{"x":[0.632],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.436],"y":[1]},"o":{"x":[0.167],"y":[0.024]},"t":64,"s":[-72.046]},{"i":{"x":[0.833],"y":[0.958]},"o":{"x":[0.595],"y":[0]},"t":73,"s":[-109]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.167],"y":[0.044]},"t":88,"s":[-71.592]},{"t":104,"s":[0]}]},"o":{"a":1,"k":[{"t":37,"s":[0],"h":1},{"t":53,"s":[100],"h":1},{"t":106,"s":[0],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[229.439,115.44],[228.961,131.954],[218.849,135.406],[218.849,150.888],[230.189,158.631],[230.189,194.126],[220.232,198.942],[218.678,211.91],[203.92,216.405],[203.92,195.786],[214.301,186.314],[214.301,165.223],[203.103,158.229],[203.103,124.843]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[228.774,119.538],[228.821,130.911],[218.849,135.406],[218.849,150.888],[230.189,158.631],[230.189,194.126],[214.94,198.122],[220.465,212.272],[203.92,216.405],[203.92,195.786],[215.684,187.608],[214.301,165.223],[203.966,165.883],[194.006,149.346]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[228.755,121.743],[228.821,130.911],[218.849,135.406],[218.849,150.888],[230.189,158.631],[230.189,194.126],[212.813,197.793],[221.184,212.418],[203.92,216.405],[203.92,195.786],[216.24,188.129],[214.301,165.223],[203.103,158.229],[205.36,131.779]],"c":true}]},{"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[228.961,115.099],[228.766,131.58],[218.849,135.406],[218.849,150.888],[230.189,158.631],[230.189,194.126],[218.801,200.619],[218.908,212.547],[203.92,216.405],[203.92,195.786],[214.301,186.314],[214.301,165.223],[203.103,158.229],[203.103,124.843]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.356862745098,0.180392156863,0.003921568627,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.450980392157,0.287318151137,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[217,164.5]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":55,"s":[0]},{"i":{"x":[0.835],"y":[1.159]},"o":{"x":[0.562],"y":[0]},"t":73,"s":[-40]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.301],"y":[0.151]},"t":88,"s":[-78.284]},{"t":104,"s":[0]}]},"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":55,"s":[0],"h":1},{"t":94,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[240.622,108.784],[241.048,133.096],[230.679,139.279],[229.672,149.196],[239.938,156.87],[239.36,192.791],[225.759,198.907],[225.702,210.437],[204.468,217.27],[203.975,194.682],[214.095,184.873],[213.378,167.699],[202.5,158.476],[201.879,122.228]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":55,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[229.439,115.44],[228.961,131.954],[218.849,135.406],[218.849,150.888],[230.189,158.631],[230.189,194.126],[220.232,198.942],[218.678,211.91],[204.468,217.27],[203.92,195.786],[214.301,186.314],[214.301,165.223],[203.103,158.229],[203.103,124.843]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[228.774,119.538],[228.821,130.911],[218.849,135.406],[218.849,150.888],[230.189,158.631],[230.189,194.126],[214.94,198.122],[220.465,212.272],[204.077,216.653],[203.92,195.786],[215.684,187.608],[209.436,169.39],[203.103,158.229],[198.931,151.836]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[228.755,121.743],[228.821,130.911],[218.849,135.406],[218.849,150.888],[230.189,158.631],[230.189,194.126],[212.813,197.793],[221.184,212.418],[203.92,216.405],[203.92,195.786],[216.24,188.129],[214.301,165.223],[203.103,158.229],[205.36,131.779]],"c":true}]},{"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[228.961,115.099],[228.766,131.58],[218.849,135.406],[218.849,150.888],[230.189,158.631],[230.189,194.126],[218.801,200.619],[218.908,212.547],[203.92,216.405],[203.92,195.786],[214.301,186.314],[214.301,165.223],[203.103,158.229],[203.103,124.843]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.945098099054,0.847058883368,0.239215701234,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[212,164.5]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":55,"s":[0]},{"i":{"x":[0.835],"y":[1.151]},"o":{"x":[0.562],"y":[0]},"t":73,"s":[-40]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.301],"y":[0.148]},"t":88,"s":[-80.284]},{"t":104,"s":[0]}]},"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":55,"s":[0],"h":1},{"t":94,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.424,-41.622],[27.729,0.949],[-1.424,41.622],[-27.729,-0.949]],"o":[[-1.424,41.622],[-27.729,-0.949],[1.424,-41.622],[27.729,0.949]],"v":[[266.854,166.948],[214.068,240.593],[166.438,163.512],[219.224,89.867]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,1,0.945,0,0.275,0.951,0.835,0.059,0.55,0.902,0.725,0.118,0.775,0.82,0.633,0.127,1,0.737,0.541,0.137]}},"s":{"a":0,"k":[194.055,105.823]},"e":{"a":0,"k":[244.571,237.496]},"t":1,"nm":"Gradient Fill 44","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":184,"st":4,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Keyhole Wave","parent":9,"sr":1,"ks":{"o":{"a":0,"k":80},"p":{"a":0,"k":[188.051,168.741,0]},"a":{"a":0,"k":[216.646,165.23,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.1,"y":0},"t":56,"s":[{"i":[[0.991,-35.898],[19.301,0.818],[-0.991,35.898],[-19.301,-0.818]],"o":[[-0.991,35.898],[-19.301,-0.818],[0.991,-35.898],[19.301,0.818]],"v":[[260.186,166.711],[223.444,230.228],[190.291,163.748],[227.033,100.232]],"c":true}]},{"t":98,"s":[{"i":[[-7.401,-70.306],[48.763,-4.736],[7.401,70.306],[-48.763,4.736]],"o":[[7.401,70.306],[-48.763,4.736],[-7.401,-70.306],[48.763,-4.736]],"v":[[304.939,156.655],[230.047,292.531],[128.353,173.805],[203.246,37.929]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.1],"y":[0]},"t":56,"s":[30]},{"t":98,"s":[0]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":61,"op":185,"st":5,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Keyhole BACK","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":116,"s":[100]},{"t":128,"s":[0]}]},"p":{"a":0,"k":[197.613,167.567,0]},"a":{"a":0,"k":[216.646,165.23,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[2.444,-41.559],[28.96,-0.532],[-0.098,41.646],[-42.654,-2.052]],"o":[[-3.689,65.103],[-30.978,0.621],[0.097,-41.148],[26.351,0.861]],"v":[[284.896,163.8],[219.795,239.868],[169.474,163.38],[229.19,88.32]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0},"t":36,"s":[{"i":[[2.444,-41.559],[28.96,-0.532],[-0.098,41.646],[-42.654,-2.052]],"o":[[-3.689,65.103],[-30.978,0.621],[0.097,-41.148],[26.351,0.861]],"v":[[284.896,163.8],[219.795,239.868],[169.474,163.38],[229.19,88.32]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.4,"y":0},"t":55,"s":[{"i":[[2.77,-41.554],[27.738,0.639],[-0.112,41.646],[-47.199,-0.456]],"o":[[-5.431,81.474],[-35.801,-0.825],[0.11,-41.148],[36.113,0.349]],"v":[[272.043,160.363],[217.399,240.184],[163.544,163.388],[229.511,87.162]],"c":true}]},{"i":{"x":0.699,"y":1},"o":{"x":0.7,"y":0},"t":102,"s":[{"i":[[2.903,-41.545],[22.11,-0.019],[-0.112,41.646],[-47.199,-0.456]],"o":[[-5.175,74.043],[-35.811,0.031],[0.11,-41.148],[36.113,0.349]],"v":[[277.204,163.328],[217.399,240.184],[163.544,163.388],[229.511,87.162]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":122,"s":[{"i":[[2.903,-41.545],[22.101,0.625],[-0.112,41.646],[-47.028,-0.807]],"o":[[-5.175,74.043],[-30.81,-0.871],[0.11,-41.148],[36.109,0.619]],"v":[[277.204,163.328],[217.399,240.184],[166.38,163.071],[229.511,87.162]],"c":true}]},{"t":140,"s":[{"i":[[2.77,-41.554],[27.738,0.639],[-0.112,41.646],[-47.199,-0.456]],"o":[[-5.431,81.474],[-35.801,-0.825],[0.11,-41.148],[36.113,0.349]],"v":[[284.97,164.054],[217.399,240.184],[163.544,163.388],[229.511,87.162]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.486274539723,0.309803921569,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.956,0.794,0.179,0.497,0.827,0.614,0.16,0.995,0.698,0.435,0.141]}},"s":{"a":0,"k":[202.073,99.588]},"e":{"a":0,"k":[194.478,223.576]},"t":1,"nm":"Gradient Fill 44457","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":184,"st":4,"bm":0}]} \ No newline at end of file diff --git a/messenger-client/app/src/main/assets/key_iron.json b/messenger-client/app/src/main/assets/key_iron.json new file mode 100644 index 0000000..cca76b7 --- /dev/null +++ b/messenger-client/app/src/main/assets/key_iron.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":157,"w":512,"h":512,"nm":"KEY IRON MAIN","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"SCALE ALL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[255,256,0]},"s":{"a":0,"k":[97,97,100]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"NULL ALL","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[-37]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.313],"y":[0]},"t":9,"s":[-47]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":57,"s":[4]},{"i":{"x":[0.806],"y":[1.59]},"o":{"x":[0.7],"y":[0]},"t":104,"s":[4]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.279],"y":[0.106]},"t":116,"s":[7]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":139,"s":[-39]},{"t":156,"s":[-37]}]},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[0,0,0],"to":[5.625,-3.625,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.568},"o":{"x":0.256,"y":0},"t":12,"s":[7.75,-11.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0.034},"t":36,"s":[-5.5,-16.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.39,"y":0.204},"o":{"x":0.4,"y":0},"t":55,"s":[-106.5,-31.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":0.948},"o":{"x":0.7,"y":0.033},"t":102,"s":[-106.5,-31,0],"to":[61.5,2.5,0],"ti":[0,0,0]},{"i":{"x":0.38,"y":1},"o":{"x":0.2,"y":0.298},"t":123,"s":[-7.5,-8.5,0],"to":[4.625,0.375,0],"ti":[0,0,0]},{"t":146,"s":[0,0,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.38,0.38,0.38],"y":[0,0,0]},"t":12,"s":[97,97,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":55,"s":[103,103,100]},{"i":{"x":[0.39,0.39,0.39],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":73,"s":[103,103,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.7],"y":[0,0,0]},"t":102,"s":[103,103,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":120,"s":[100,100,100]},{"t":156,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Middle circles","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"t":50,"s":[100],"h":1},{"t":66,"s":[0],"h":1},{"t":89,"s":[100],"h":1}]},"p":{"a":0,"k":[8.089,-11.266,0]},"a":{"a":0,"k":[8.089,-11.266,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-0.038,-3.079],[0,0]],"o":[[3.079,-0.038],[0,0],[0,0]],"v":[[32.5,-50.309],[38.143,-44.803],[38.955,21.504]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[4.937,-4.825],[-14.312,-14.791]],"o":[[-2.163,1.564],[-6.592,6.442],[3.822,3.95]],"v":[[53.138,-40.27],[46.107,-34.605],[49.741,14.268]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[5.087,-4.667],[-13.839,-15.235]],"o":[[-2.211,1.495],[-6.792,6.231],[3.696,4.068]],"v":[[44.735,-41.702],[37.529,-36.263],[39.621,12.701]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[0,0],[5.087,-4.667],[-13.48,-13.938]],"o":[[-2.211,1.495],[-6.792,6.231],[3.821,3.951]],"v":[[48.659,-37.786],[41.99,-32.384],[46.222,12.374]],"c":false}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[0.947,-1.656],[-13.48,-13.938]],"o":[[0,0],[-3.246,5.677],[3.821,3.951]],"v":[[39.212,-27.894],[39.153,-27.622],[46.222,12.374]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0.546,-1.09],[-12.115,-14.974]],"o":[[0.361,0.345],[-3.497,4.467],[3.448,4.261]],"v":[[38.848,-27.089],[39.237,-27.047],[45.336,12.171]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[1.514,-1.852],[-12.406,-14.753]],"o":[[-0.187,0.59],[-4.199,4.843],[3.527,4.195]],"v":[[41.496,-29.137],[40.381,-27.953],[45.525,12.214]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[0,0],[3.625,-3.515],[-13.04,-14.272]],"o":[[-1.383,1.124],[-5.731,5.663],[3.701,4.051]],"v":[[37.584,-26.223],[35.45,-25.003],[45.936,12.309]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[5.087,-4.667],[-13.48,-13.938]],"o":[[-2.211,1.495],[-6.792,6.231],[3.821,3.951]],"v":[[48.659,-37.786],[41.99,-32.384],[46.222,12.374]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[0,0],[4.937,-4.825],[-14.312,-14.791]],"o":[[-2.163,1.564],[-6.592,6.442],[3.822,3.95]],"v":[[45.606,-42.925],[38.575,-37.261],[41.187,12.199]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-0.038,-3.079],[0,0]],"o":[[3.079,-0.038],[0,0],[0,0]],"v":[[32.5,-50.309],[38.143,-44.803],[38.955,21.504]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.207843139768,0.188235297799,0.184313729405,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1.019]},"o":{"x":[0.8],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.231],"y":[1]},"o":{"x":[0.167],"y":[0.008]},"t":63,"s":[100]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[0]},{"t":104,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0.038,3.079],[0,0],[-3.079,0.038],[0,0],[-0.038,-3.079],[0,0],[0,0],[3.079,-0.038],[0,0]],"o":[[0,0],[-0.038,-3.079],[0,0],[3.079,-0.038],[0,0],[0,0],[0.038,3.079],[0,0],[-3.079,0.038]],"v":[[24.284,21.683],[23.472,-44.623],[28.979,-50.266],[32.5,-50.309],[38.143,-44.803],[38.252,-35.929],[38.955,21.504],[33.448,27.147],[29.927,27.19]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[5.037,4.339],[-15.013,14.25],[-3.942,-0.031],[0,0],[-2.834,-7.339],[3.526,-4.327],[-22.954,-6.111],[3.653,-1.172],[0,0]],"o":[[-17.396,-14.985],[4.761,-4.519],[0,0],[3.942,0.031],[-6.165,-0.836],[-11.839,14.526],[0.151,2.747],[-1.995,0.64],[-4.02,-0.386]],"v":[[34.53,24.134],[33.408,-47.47],[46.051,-52.692],[50.558,-52.657],[60.983,-40.884],[46.395,-34.97],[61.123,21.644],[53.813,27.411],[47.864,28.441]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[4.982,4.34],[-14.848,14.252],[-3.898,-0.031],[0,0],[-2.803,-7.34],[3.488,-4.327],[-22.702,-6.112],[3.613,-1.172],[0,0]],"o":[[-17.206,-14.987],[4.709,-4.52],[0,0],[3.899,0.031],[-6.097,-0.836],[-11.709,14.528],[0.15,2.747],[-1.974,0.64],[-3.976,-0.386]],"v":[[25.464,22.897],[24.354,-48.717],[36.858,-53.939],[41.317,-53.904],[51.628,-42.13],[37.199,-36.215],[51.765,20.407],[44.536,26.175],[38.652,27.205]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[4.618,3.916],[-13.763,12.86],[-3.613,-0.028],[0,0],[-2.598,-6.623],[3.233,-3.904],[-21.042,-5.515],[3.349,-1.058],[0,0]],"o":[[-15.948,-13.522],[4.365,-4.078],[0,0],[3.613,0.028],[-5.652,-0.754],[-10.853,13.108],[0.139,2.479],[-1.829,0.578],[-3.686,-0.348]],"v":[[31.363,20.585],[30.334,-44.032],[41.924,-48.744],[46.057,-48.713],[55.613,-38.088],[42.24,-32.751],[55.741,18.338],[49.041,23.542],[43.587,24.472]],"c":true}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[4.618,3.916],[-9.932,11.605],[0,0],[0,0],[0,0],[-0.881,1.088],[-21.042,-5.515],[3.349,-1.058],[0,0]],"o":[[-15.948,-13.522],[0.104,-0.315],[0,0],[3.724,4.964],[0,0],[-5.389,8.371],[0.139,2.479],[-1.829,0.578],[-3.686,-0.348]],"v":[[31.363,20.585],[28.356,-42.43],[28.712,-42.386],[31.392,-38.211],[38.861,-28.556],[39.432,-29.071],[55.741,18.338],[49.041,23.542],[43.587,24.472]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[4.687,3.916],[-13.967,12.86],[-0.237,-0.309],[0,0],[-6.794,-13.088],[0.091,0.119],[-20.329,-5.25],[3.399,-1.058],[0,0]],"o":[[-16.185,-13.522],[1.621,-1.788],[0,0],[0.304,-0.117],[-0.192,-1.117],[-9.161,14.148],[0.141,2.479],[-1.856,0.578],[-3.74,-0.348]],"v":[[30.998,20.585],[29.954,-44.032],[35.978,-47.623],[36.088,-47.588],[45.027,-23.861],[40.549,-30.732],[55.739,18.338],[48.939,23.542],[43.403,24.472]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[4.673,3.916],[-13.928,12.86],[-0.958,-0.249],[0,0],[-5.901,-11.71],[0.762,-0.739],[-20.487,-5.306],[3.389,-1.058],[0,0]],"o":[[-16.14,-13.522],[2.207,-2.276],[0,0],[1.01,-0.086],[-1.357,-1.04],[-9.525,13.926],[0.141,2.479],[-1.851,0.578],[-3.73,-0.348]],"v":[[31.068,20.585],[30.584,-43.801],[37.798,-47.631],[38.767,-47.596],[47.84,-26.662],[41.462,-30.931],[55.739,18.338],[48.958,23.542],[43.439,24.472]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[4.645,3.916],[-13.842,12.86],[0.384,0.204],[0,0],[-1.837,-10.112],[2.224,-2.609],[-20.833,-5.429],[3.368,-1.058],[0,0]],"o":[[-16.04,-13.522],[-0.19,0.03],[0,0],[1.956,1.662],[-3.899,-0.871],[-6.182,11.495],[0.14,2.479],[-1.84,0.578],[-3.707,-0.348]],"v":[[31.222,20.585],[29.116,-42.592],[29.234,-42.328],[30.336,-41.429],[38.764,-25.137],[36.029,-26.439],[55.74,18.338],[49.001,23.542],[43.516,24.472]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[4.624,3.916],[-13.782,12.86],[-3.618,-0.028],[0,0],[-2.602,-6.623],[3.237,-3.904],[-21.072,-5.515],[3.353,-1.058],[0,0]],"o":[[-15.97,-13.522],[4.371,-4.078],[0,0],[3.619,0.028],[-5.659,-0.754],[-10.868,13.108],[0.139,2.479],[-1.832,0.578],[-3.691,-0.348]],"v":[[31.328,20.585],[30.298,-44.032],[41.905,-48.744],[46.043,-48.713],[55.613,-38.088],[42.221,-32.751],[55.741,18.338],[49.031,23.542],[43.569,24.472]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[4.91,4.418],[-14.634,14.509],[-3.842,-0.031],[0,0],[-2.762,-7.472],[3.437,-4.405],[-22.375,-6.222],[3.561,-1.193],[0,0]],"o":[[-16.958,-15.256],[4.641,-4.601],[0,0],[3.842,0.031],[-6.009,-0.851],[-11.54,14.789],[0.148,2.797],[-1.945,0.652],[-3.919,-0.393]],"v":[[26.855,22.548],[25.761,-50.355],[38.086,-55.672],[42.48,-55.636],[52.642,-43.649],[38.421,-37.628],[52.778,20.013],[45.653,25.884],[39.853,26.934]],"c":true}]},{"t":144,"s":[{"i":[[0.038,3.079],[0,0],[-3.079,0.038],[0,0],[-0.038,-3.079],[0,0],[0,0],[3.079,-0.038],[0,0]],"o":[[0,0],[-0.038,-3.079],[0,0],[3.079,-0.038],[0,0],[0,0],[0.038,3.079],[0,0],[-3.079,0.038]],"v":[[24.284,21.683],[23.472,-44.623],[28.979,-50.266],[32.5,-50.309],[38.143,-44.803],[38.252,-35.929],[38.955,21.504],[33.448,27.147],[29.927,27.19]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[38.641,20.835],[24.585,21.29]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[58.154,22.009],[36.475,25.896]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[48.83,20.772],[27.388,24.66]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[53.02,18.668],[33.146,22.176]],"c":false}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[53.02,18.668],[33.146,22.176]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[52.977,18.668],[32.807,22.176]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[53.016,18.668],[33.114,22.176]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[49.884,20.385],[28.751,24.342]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[38.641,20.835],[24.585,21.29]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.776470588235,0.560784313725,0.466666666667,1]},"o":{"a":0,"k":20},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0.208,7.903],[0,0],[0.128,-7.547],[0,0],[0,0]],"o":[[0,0],[0.666,-9.08],[0,0],[0,0],[-0.958,9.593]],"v":[[24.284,21.683],[23.472,-44.623],[38.143,-44.803],[38.231,-37.65],[38.955,21.504]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[5.02,6.434],[-12.339,11.941],[-2.111,-11.135],[3.19,-3.75],[-20.167,-8.363]],"o":[[-18.299,-23.455],[6.967,-6.742],[-5.927,0.599],[-12.447,14.633],[-8.849,11.806]],"v":[[33.896,23.848],[31.691,-47.237],[59.721,-41.729],[46.107,-34.841],[61.291,21.239]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[4.965,6.435],[-12.204,11.943],[-2.088,-11.137],[3.155,-3.751],[-19.947,-8.364]],"o":[[-18.099,-23.458],[6.891,-6.743],[-5.862,0.599],[-12.31,14.635],[-8.753,11.807]],"v":[[24.837,22.611],[22.656,-48.483],[50.379,-42.975],[36.914,-36.086],[51.932,20.002]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[4.602,5.806],[-11.312,10.776],[-1.935,-10.049],[2.924,-3.384],[-18.488,-7.547]],"o":[[-16.776,-21.166],[6.387,-6.084],[-5.433,0.541],[-11.41,13.205],[-8.113,10.654]],"v":[[30.781,20.327],[28.76,-43.821],[54.456,-38.851],[41.976,-32.635],[55.896,17.973]],"c":true}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[4.602,5.806],[-8.41,9.656],[0,0],[-0.096,0.448],[-18.488,-7.547]],"o":[[-16.776,-21.166],[0.251,-0.008],[0,0],[-6.901,10.749],[-8.113,10.654]],"v":[[30.781,20.327],[28.278,-42.742],[38.842,-28.98],[39.167,-28.955],[55.896,17.973]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[4.67,5.806],[-11.48,10.776],[-0.656,-1.836],[0.261,0.072],[-18.449,-7.42]],"o":[[-17.025,-21.166],[6.482,-6.084],[0.042,0.01],[-8.996,15.089],[-8.233,10.654]],"v":[[30.408,20.327],[28.356,-43.821],[40.664,-30.695],[40.318,-30.546],[55.896,17.973]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[4.657,5.806],[-11.448,10.776],[-0.929,-3.586],[0.83,-0.665],[-18.463,-7.447]],"o":[[-16.977,-21.166],[6.464,-6.084],[-1.127,0.123],[-9.514,14.688],[-8.21,10.654]],"v":[[30.48,20.327],[28.991,-43.59],[44.16,-32.202],[41.224,-30.76],[55.896,17.973]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[4.628,5.806],[-14.001,7.037],[-1.525,-7.404],[2.069,-2.271],[-18.493,-7.506]],"o":[[-16.872,-21.166],[1.594,-0.801],[-3.675,0.37],[-10.644,13.812],[-8.159,10.654]],"v":[[30.637,20.327],[27.533,-42.382],[38.074,-25.729],[35.775,-26.3],[55.896,17.973]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[4.608,5.806],[-11.328,10.776],[-1.938,-10.049],[2.928,-3.384],[-18.514,-7.547]],"o":[[-16.799,-21.166],[6.396,-6.084],[-5.441,0.541],[-11.426,13.205],[-8.124,10.654]],"v":[[30.746,20.327],[28.722,-43.821],[54.454,-38.851],[41.956,-32.635],[55.896,17.973]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[4.893,6.551],[-12.028,12.158],[-2.058,-11.337],[3.109,-3.818],[-19.659,-8.514]],"o":[[-17.838,-23.881],[6.792,-6.865],[-5.777,0.61],[-12.133,14.898],[-8.626,12.02]],"v":[[26.237,22.257],[24.088,-50.118],[51.411,-44.51],[38.14,-37.497],[52.942,19.601]],"c":true}]},{"t":144,"s":[{"i":[[0.208,7.903],[0,0],[0.128,-7.547],[0,0],[0,0]],"o":[[0,0],[0.666,-9.08],[0,0],[0,0],[-0.958,9.593]],"v":[[24.284,21.683],[23.472,-44.623],[38.143,-44.803],[38.231,-37.65],[38.955,21.504]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":7,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.981},"o":{"x":0.8,"y":0},"t":56,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.008},"t":63,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[0,0.307,0.303,0.346,0.125,0.431,0.417,0.439,0.25,0.556,0.531,0.531,0.425,0.364,0.363,0.387,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"t":104,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]}]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0.8},"t":56,"s":[31.218,-45.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.008},"t":63,"s":[31.218,-45.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[28.486,-30.125],"to":[0,0],"ti":[0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[31.218,-45.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[37.696,-64.709],"to":[0,0],"ti":[0,0]},{"t":144,"s":[31.218,-45.185]}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0.8},"t":56,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.231,"y":0.231},"o":{"x":0.167,"y":0.167},"t":63,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.8,"y":0.8},"t":73,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[29.571,21.806],"to":[0,0],"ti":[0,0]},{"t":144,"s":[31.782,22.889]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0.246,6.4],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.03,-6.928],[0,0],[0,0],[0,0]],"v":[[15.266,13.968],[20.954,3.738],[20.212,-26.486],[13.652,-36.676],[25.733,-36.824],[26.875,13.826]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[3.461,12.436],[-3.084,4.912],[0,0],[-4.294,-0.454],[-23.466,-23.647]],"o":[[0.709,0.228],[-1.345,-4.832],[3.675,-5.852],[0,0],[-8.127,2.529],[-3.015,0.63]],"v":[[30.436,18.23],[27.209,5.77],[23.913,-29.718],[28.739,-38.373],[56.566,-39.992],[57.002,17.619]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[3.423,12.437],[-3.05,4.912],[0,0],[-4.247,-0.454],[-23.209,-23.65]],"o":[[0.701,0.228],[-1.33,-4.832],[3.635,-5.853],[0,0],[-8.038,2.53],[-2.982,0.63]],"v":[[21.414,16.993],[18.223,4.531],[14.963,-30.962],[19.736,-39.618],[46.977,-41.218],[47.69,16.381]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[0,0],[3.173,11.222],[-2.827,4.432],[0,0],[-3.937,-0.409],[-21.512,-21.339]],"o":[[0.65,0.206],[-1.233,-4.36],[3.369,-5.281],[0,0],[-7.451,2.283],[-2.764,0.568]],"v":[[27.609,15.258],[24.652,4.013],[21.63,-28.011],[26.054,-35.822],[51.109,-37.253],[51.964,14.706]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[3.173,11.222],[-2.827,4.432],[0,0],[-4.876,-5.411],[-19.499,-20.106]],"o":[[0.65,0.206],[-1.233,-4.36],[3.369,-5.281],[0,0],[-0.71,0.359],[-2.764,0.568]],"v":[[27.609,15.258],[24.652,4.013],[21.63,-28.011],[28.133,-41.96],[40.379,-24.309],[50.508,14.808]],"c":true}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.167},"t":65,"s":[{"i":[[0,0],[3.19,11.222],[-2.843,4.432],[0,0],[-4.552,-3.572],[-18.351,-16.132]],"o":[[0.653,0.206],[-1.24,-4.36],[3.387,-5.281],[0,0],[-3.23,1.067],[-2.779,0.568]],"v":[[27.455,15.258],[24.481,4.013],[21.442,-28.011],[27.205,-39.703],[40.352,-24.399],[50.334,15.057]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[3.22,11.222],[-2.869,4.432],[0,0],[-3.995,-0.409],[-16.378,-9.3]],"o":[[0.659,0.206],[-1.251,-4.36],[3.419,-5.281],[0,0],[-7.562,2.283],[-2.805,0.568]],"v":[[27.188,15.258],[24.187,4.013],[21.12,-28.011],[25.61,-35.822],[42.893,-25.491],[53.404,14.871]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[3.211,11.222],[-2.861,4.432],[0,0],[-3.984,-0.409],[-17.479,-11.866]],"o":[[0.657,0.206],[-1.248,-4.36],[3.409,-5.281],[0,0],[-7.54,2.283],[-2.798,0.568]],"v":[[27.27,15.258],[24.277,4.013],[21.218,-28.011],[25.696,-35.822],[45.199,-27.766],[53.096,14.836]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[3.198,11.222],[-2.849,4.432],[0,0],[-3.967,-0.409],[-19.079,-15.597]],"o":[[0.655,0.206],[-1.243,-4.36],[3.395,-5.281],[0,0],[-7.509,2.283],[-2.786,0.568]],"v":[[27.388,15.258],[24.407,4.013],[21.361,-28.011],[25.82,-35.822],[40.265,-25.141],[50.903,15.743]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":90,"s":[{"i":[[0,0],[3.191,11.222],[-2.844,4.432],[0,0],[-3.959,-0.409],[-18.188,-8.78]],"o":[[0.653,0.206],[-1.24,-4.36],[3.388,-5.281],[0,0],[-4.167,4.209],[-2.78,0.568]],"v":[[27.447,15.258],[24.472,4.013],[21.433,-28.011],[25.883,-35.822],[40.56,-23.185],[50.898,14.866]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[3.178,11.222],[-2.831,4.432],[0,0],[-3.942,-0.409],[-21.542,-21.339]],"o":[[0.651,0.206],[-1.235,-4.36],[3.374,-5.281],[0,0],[-7.461,2.283],[-2.768,0.568]],"v":[[27.57,15.258],[24.608,4.013],[21.582,-28.011],[26.012,-35.822],[51.103,-37.253],[51.958,14.706]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[0,0],[3.374,12.661],[-3.006,5.001],[0,0],[-4.186,-0.462],[-22.875,-24.075]],"o":[[0.691,0.232],[-1.311,-4.919],[3.582,-5.959],[0,0],[-7.923,2.575],[-2.939,0.641]],"v":[[22.864,16.537],[19.719,3.851],[16.506,-32.28],[21.21,-41.093],[48.336,-42.741],[48.761,15.915]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0.246,6.4],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.03,-6.928],[0,0],[0,0],[0,0]],"v":[[15.266,13.968],[20.954,3.738],[20.212,-26.486],[13.652,-36.676],[25.733,-36.824],[26.875,13.826]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647058824,0.082352941176,0.082352941176,1]},"o":{"a":0,"k":50},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.082352943718,0.082352943718,1]},"o":{"a":0,"k":50},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.38],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":37,"s":[70]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":104,"s":[70]},{"t":144,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[26.186,-11.378]},"a":{"a":0,"k":[26.304,-11.396]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-0.038,-3.079],[0,0]],"o":[[3.079,-0.038],[0,0],[0,0]],"v":[[32.5,-50.309],[38.143,-44.803],[38.955,21.504]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[3.016,-3.951],[-13.123,-13.077]],"o":[[-2.163,1.564],[-5.533,7.248],[3.893,3.88]],"v":[[53.018,-39.893],[47.115,-33.868],[51.36,13.873]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[5.087,-4.667],[-13.839,-15.235]],"o":[[-2.211,1.495],[-6.792,6.231],[3.696,4.068]],"v":[[44.735,-41.702],[38.327,-35.915],[42.043,11.793]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[0,0],[4.188,-5.487],[-13.48,-13.938]],"o":[[-2.211,1.495],[-5.879,7.702],[3.821,3.951]],"v":[[50.752,-36.851],[45.679,-31.831],[50.201,11.285]],"c":false}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[4.188,-5.487],[-13.48,-13.938]],"o":[[-2.211,1.495],[-5.879,7.702],[3.821,3.951]],"v":[[50.752,-36.851],[45.679,-31.831],[50.201,11.285]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[4.188,-5.487],[-13.48,-13.938]],"o":[[-2.211,1.495],[-5.879,7.702],[3.821,3.951]],"v":[[50.752,-36.851],[45.679,-31.831],[49.797,11.313]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[4.188,-5.487],[-11.489,-11.798]],"o":[[-2.211,1.495],[-5.879,7.702],[3.835,3.938]],"v":[[50.752,-36.851],[46.106,-31.523],[49.778,11.044]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[0,0],[3.645,-5.863],[-11.705,-12.456]],"o":[[-2.163,1.564],[-5.817,9.357],[3.764,4.006]],"v":[[45.218,-42.564],[39.792,-36.341],[43.981,11.052]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-0.038,-3.079],[0,0]],"o":[[3.079,-0.038],[0,0],[0,0]],"v":[[32.5,-50.309],[38.143,-44.803],[38.955,21.504]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.207843139768,0.188235297799,0.184313729405,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1.019]},"o":{"x":[0.8],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.231],"y":[1]},"o":{"x":[0.167],"y":[0.008]},"t":63,"s":[100]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[60]},{"t":104,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0.038,3.079],[0,0],[-3.079,0.038],[0,0],[-0.038,-3.079],[0,0],[3.079,-0.038],[0,0]],"o":[[0,0],[-0.038,-3.079],[0,0],[3.079,-0.038],[0,0],[0.038,3.079],[0,0],[-3.079,0.038]],"v":[[24.284,21.683],[23.472,-44.623],[28.979,-50.266],[32.5,-50.309],[38.143,-44.803],[38.955,21.504],[33.448,27.147],[29.927,27.19]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[3.994,4.535],[-12.533,12.001],[-3.701,-0.027],[0,0],[-2.661,-6.483],[-27.485,-5.962],[3.43,-1.035],[0,0]],"o":[[-16.035,-18.204],[4.333,-4.149],[0,0],[3.701,0.027],[-23.565,-2.802],[0.142,2.426],[-1.874,0.566],[-3.775,-0.341]],"v":[[37.513,19.787],[36.677,-43.781],[46.599,-48.19],[50.831,-48.159],[61.072,-41.794],[61.282,19.6],[54.419,24.695],[48.836,24.755]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[3.951,4.535],[-12.396,12.003],[-3.661,-0.027],[0,0],[-2.632,-6.484],[-27.184,-5.963],[3.392,-1.035],[0,0]],"o":[[-15.859,-18.207],[4.285,-4.149],[0,0],[3.661,0.027],[-23.307,-2.802],[0.141,2.427],[-1.853,0.566],[-3.734,-0.341]],"v":[[28.811,18.55],[27.985,-45.027],[37.798,-49.437],[41.984,-49.406],[52.113,-43.04],[52.32,18.363],[45.532,23.458],[40.011,23.519]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[3.662,4.092],[-11.489,10.83],[-3.393,-0.024],[0,0],[-2.439,-5.85],[-25.197,-5.381],[3.144,-0.934],[0,0]],"o":[[-14.699,-16.428],[3.972,-3.744],[0,0],[3.393,0.024],[-21.603,-2.529],[0.13,2.19],[-1.718,0.51],[-3.461,-0.308]],"v":[[37.12,16.609],[36.355,-40.756],[45.45,-44.735],[49.33,-44.707],[58.718,-38.963],[58.91,16.44],[52.619,21.038],[47.501,21.092]],"c":true}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[3.662,4.092],[-11.489,10.83],[-3.393,-0.024],[0,0],[-2.439,-5.85],[-25.197,-5.381],[3.144,-0.934],[0,0]],"o":[[-14.699,-16.428],[3.972,-3.744],[0,0],[3.393,0.024],[-21.603,-2.529],[0.13,2.19],[-1.718,0.51],[-3.461,-0.308]],"v":[[37.12,16.609],[36.355,-40.756],[45.45,-44.735],[49.33,-44.707],[58.718,-38.963],[58.91,16.44],[52.619,21.038],[47.501,21.092]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[3.716,4.092],[-11.66,10.83],[-3.443,-0.024],[0,0],[-2.476,-5.85],[-25.572,-5.381],[3.191,-0.934],[0,0]],"o":[[-14.918,-16.428],[4.031,-3.744],[0,0],[3.443,0.024],[-21.924,-2.529],[0.132,2.19],[-1.743,0.51],[-3.512,-0.308]],"v":[[36.301,16.609],[35.524,-40.756],[44.754,-44.735],[48.692,-44.707],[58.22,-38.963],[58.415,16.44],[52.03,21.038],[46.836,21.092]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[3.667,4.092],[-11.506,10.83],[-3.398,-0.024],[0,0],[-2.443,-5.85],[-25.232,-5.381],[3.149,-0.934],[0,0]],"o":[[-14.72,-16.428],[3.978,-3.744],[0,0],[3.398,0.024],[-21.633,-2.529],[0.131,2.19],[-1.72,0.51],[-3.465,-0.308]],"v":[[37.043,16.609],[36.276,-40.756],[45.384,-44.735],[49.27,-44.707],[58.671,-38.963],[58.864,16.44],[52.563,21.038],[47.439,21.092]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[3.894,4.617],[-12.217,12.219],[-3.608,-0.028],[0,0],[-2.594,-6.6],[-26.792,-6.07],[3.343,-1.054],[0,0]],"o":[[-15.63,-18.535],[4.223,-4.224],[0,0],[3.608,0.028],[-22.971,-2.853],[0.139,2.47],[-1.826,0.576],[-3.68,-0.347]],"v":[[30.678,18.133],[29.864,-46.589],[39.535,-51.078],[43.661,-51.047],[53.643,-44.566],[53.848,17.942],[47.158,23.129],[41.716,23.19]],"c":true}]},{"t":144,"s":[{"i":[[0.038,3.079],[0,0],[-3.079,0.038],[0,0],[-0.038,-3.079],[0,0],[3.079,-0.038],[0,0]],"o":[[0,0],[-0.038,-3.079],[0,0],[3.079,-0.038],[0,0],[0.038,3.079],[0,0],[-3.079,0.038]],"v":[[24.284,21.683],[23.472,-44.623],[28.979,-50.266],[32.5,-50.309],[38.143,-44.803],[38.955,21.504],[33.448,27.147],[29.927,27.19]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[38.641,20.835],[24.585,21.29]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[58.495,19.923],[39.339,21.344]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[49.564,18.686],[30.618,20.107]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.355,16.732],[38.795,18.014]],"c":false}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.355,16.732],[38.795,18.014]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[55.822,16.732],[38,18.014]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.305,16.732],[38.72,18.014]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[51.131,18.271],[32.458,19.718]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[38.641,20.835],[24.585,21.29]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.776470588235,0.560784313725,0.466666666667,1]},"o":{"a":0,"k":20},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0.208,7.903],[0,0],[0.128,-7.547],[0,0]],"o":[[0,0],[0.666,-9.08],[0,0],[-0.958,9.593]],"v":[[24.284,21.683],[23.472,-44.623],[38.143,-44.803],[38.955,21.504]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[4.322,5.941],[-9.737,9.367],[-1.982,-9.836],[-29.068,-10.611]],"o":[[-12.415,-17.063],[6.372,-6.13],[-20.429,2.828],[-8.309,10.428]],"v":[[36.917,19.535],[35.065,-43.575],[59.887,-42.54],[61.44,19.243]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[4.275,5.941],[-9.631,9.369],[-1.96,-9.838],[-28.749,-10.613]],"o":[[-12.279,-17.065],[6.302,-6.131],[-20.205,2.828],[-8.218,10.43]],"v":[[28.223,18.297],[26.391,-44.821],[50.941,-43.786],[52.477,18.006]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[3.962,5.361],[-8.926,8.453],[-1.817,-8.876],[-26.647,-9.576]],"o":[[-11.381,-15.398],[5.842,-5.532],[-18.728,2.552],[-7.617,9.411]],"v":[[36.575,16.381],[34.877,-40.57],[57.632,-39.637],[59.056,16.118]],"c":true}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[3.962,5.361],[-8.926,8.453],[-1.817,-8.876],[-26.647,-9.576]],"o":[[-11.381,-15.398],[5.842,-5.532],[-18.728,2.552],[-7.617,9.411]],"v":[[36.575,16.381],[34.877,-40.57],[57.632,-39.637],[59.056,16.118]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[4.021,5.361],[-9.059,8.453],[-1.844,-8.876],[-27.044,-9.576]],"o":[[-11.551,-15.398],[5.929,-5.532],[-19.007,2.552],[-7.731,9.411]],"v":[[35.747,16.381],[34.023,-40.57],[57.117,-39.637],[58.562,16.118]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[3.968,5.361],[-8.939,8.453],[-1.82,-8.876],[-26.685,-9.576]],"o":[[-11.397,-15.398],[5.85,-5.532],[-18.754,2.552],[-7.628,9.411]],"v":[[36.497,16.381],[34.796,-40.57],[57.583,-39.637],[59.009,16.118]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[4.213,6.048],[-9.492,9.537],[-1.932,-10.015],[-28.335,-10.804]],"o":[[-12.102,-17.372],[6.212,-6.242],[-19.914,2.879],[-8.1,10.618]],"v":[[30.098,17.875],[28.292,-46.379],[52.488,-45.326],[54.003,17.578]],"c":true}]},{"t":144,"s":[{"i":[[0.208,7.903],[0,0],[0.128,-7.547],[0,0]],"o":[[0,0],[0.666,-9.08],[0,0],[-0.958,9.593]],"v":[[24.284,21.683],[23.472,-44.623],[38.143,-44.803],[38.955,21.504]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":7,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.981},"o":{"x":0.8,"y":0},"t":56,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.008},"t":63,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[0,0.307,0.303,0.346,0.125,0.431,0.417,0.439,0.25,0.556,0.531,0.531,0.425,0.364,0.363,0.387,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"t":104,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]}]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0.8},"t":56,"s":[31.218,-45.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.008},"t":63,"s":[31.218,-45.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[28.486,-30.125],"to":[0,0],"ti":[0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[31.218,-45.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[37.696,-64.709],"to":[0,0],"ti":[0,0]},{"t":144,"s":[31.218,-45.185]}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0.8},"t":56,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.231,"y":0.231},"o":{"x":0.167,"y":0.167},"t":63,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.8,"y":0.8},"t":73,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[29.571,21.806],"to":[0,0],"ti":[0,0]},{"t":144,"s":[31.782,22.889]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0.246,6.4],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.03,-6.928],[0,0],[0,0],[0,0]],"v":[[15.266,13.968],[20.954,3.738],[20.212,-26.486],[13.652,-36.676],[25.733,-36.824],[26.875,13.826]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[2.569,6.722],[-1.348,3.766],[0,0],[0,0],[-19.584,-27.964]],"o":[[0,0],[-4.19,-10.961],[2.086,-5.831],[0,0],[0,0],[-2.831,0.556]],"v":[[36.383,13.56],[31.116,2.353],[29.529,-26.695],[32.675,-34.934],[52.787,-35.718],[55.885,14.363]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[2.541,6.723],[-1.333,3.767],[0,0],[0,0],[-19.37,-27.968]],"o":[[0,0],[-4.144,-10.963],[2.063,-5.831],[0,0],[0,0],[-2.8,0.556]],"v":[[27.694,12.322],[22.484,1.113],[20.915,-27.939],[24.026,-36.179],[42.971,-36.99],[46.317,13.08]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":56,"s":[{"i":[[0,0],[2.355,6.066],[-1.235,3.399],[0,0],[0,0],[-17.953,-25.236]],"o":[[0,0],[-3.841,-9.892],[1.912,-5.262],[0,0],[0,0],[-2.596,0.502]],"v":[[36.085,10.989],[31.256,0.876],[29.802,-25.338],[32.685,-32.773],[49.597,-33.523],[52.891,11.642]],"c":true}]},{"i":{"x":0.231,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[2.355,6.066],[-1.235,3.399],[0,0],[0,0],[-17.953,-25.236]],"o":[[0,0],[-3.841,-9.892],[1.912,-5.262],[0,0],[0,0],[-2.596,0.502]],"v":[[36.085,10.989],[31.256,0.876],[29.802,-25.338],[32.685,-32.773],[49.597,-33.523],[52.891,11.642]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[2.39,6.066],[-1.254,3.399],[0,0],[0,0],[-18.221,-25.236]],"o":[[0,0],[-3.898,-9.892],[1.941,-5.262],[0,0],[0,0],[-2.634,0.502]],"v":[[35.249,10.989],[30.349,0.876],[28.873,-25.338],[31.8,-32.773],[48.963,-33.523],[52.306,11.642]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[2.359,6.066],[-1.237,3.399],[0,0],[0,0],[-17.979,-25.236]],"o":[[0,0],[-3.846,-9.892],[1.915,-5.262],[0,0],[0,0],[-2.599,0.502]],"v":[[36.006,10.989],[31.17,0.876],[29.714,-25.338],[32.602,-32.773],[49.537,-33.523],[52.836,11.642]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[0,0],[2.504,6.844],[-1.314,3.835],[0,0],[0,0],[-19.09,-28.472]],"o":[[0,0],[-4.084,-11.16],[2.034,-5.936],[0,0],[0,0],[-2.76,0.566]],"v":[[29.576,11.792],[24.442,0.382],[22.896,-29.193],[25.962,-37.582],[45.568,-38.38],[48.587,12.61]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0.246,6.4],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.03,-6.928],[0,0],[0,0],[0,0]],"v":[[15.266,13.968],[20.954,3.738],[20.212,-26.486],[13.652,-36.676],[25.733,-36.824],[26.875,13.826]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647058824,0.082352941176,0.082352941176,1]},"o":{"a":0,"k":50},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.082352943718,0.082352943718,1]},"o":{"a":0,"k":50},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.38],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":37,"s":[70]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":104,"s":[70]},{"t":144,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-10.123,-10.829]},"a":{"a":0,"k":[26.304,-11.396]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34.889,-8.027],[5.053,-8.442],[4.264,-36.561],[25.733,-36.824]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35.14,-9.571],[4.081,-8.941],[10.593,-36.15],[33.472,-36.156]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[26.066,-10.812],[-4.653,-10.182],[1.788,-37.395],[24.416,-37.401]],"c":true}]},{"i":{"x":0.231,"y":1},"o":{"x":0.457,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[31.912,-9.829],[3.44,-9.26],[9.41,-33.815],[30.383,-33.82]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[31.557,-9.829],[2.661,-9.26],[8.719,-33.815],[30.005,-33.82]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[31.625,-9.829],[2.811,-9.26],[8.853,-33.815],[30.635,-33.589]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[31.878,-9.829],[3.366,-9.26],[9.344,-33.815],[30.348,-33.82]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27.447,-11.768],[-2.829,-11.127],[3.519,-38.83],[25.821,-38.836]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34.889,-8.027],[5.053,-8.442],[4.264,-36.561],[25.733,-36.824]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":30},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.25,1,1,1,0.812,0.676,0.676,0.69,1,0.353,0.353,0.38,0.25,1,0.812,0.5,1,0]}},"s":{"a":0,"k":[18.407,-37.482]},"e":{"a":0,"k":[19.577,-9.715]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 11","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"TOP Head","parent":5,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.167],"y":[0.036]},"t":68,"s":[-29]},{"i":{"x":[0.873],"y":[0.829]},"o":{"x":[0.627],"y":[0]},"t":73,"s":[-37]},{"i":{"x":[0.58],"y":[1.025]},"o":{"x":[0.483],"y":[-0.409]},"t":82,"s":[-32.35]},{"t":84,"s":[-34]}]},"p":{"a":0,"k":[145.414,-43.069,0]},"a":{"a":0,"k":[15.08,-28.509,0]},"s":{"a":0,"k":[102.133,102.133,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.5,"y":0},"t":68,"s":[{"i":[[0,0],[-10.311,-5.801],[0,0],[-19.157,-10.605],[11.601,6.923],[0,0],[10.078,5.021]],"o":[[0,0],[17.2,9.677],[0,0],[21.462,11.881],[-9.763,-5.826],[0,0],[-19.291,-9.612]],"v":[[-42.121,-68.986],[-21.383,-57.824],[29.907,-28.611],[84.541,2.715],[89.033,5.004],[29.601,-28.876],[-3.689,-48.145]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[0.558,-1.833],[-9.959,-5.981],[-23.488,-6.295],[-16.078,-5.778],[0.054,1.351],[17.766,4.107],[10.093,4.457]],"o":[[-0.5,1.642],[6.454,3.876],[22.504,15.466],[11.17,4.014],[-0.226,-5.693],[-9.141,-6.433],[-19.715,-8.707]],"v":[[-59.484,-60.46],[-38.1,-44.89],[19.176,-18.46],[80.852,12.084],[99.875,16.618],[12.43,-28.877],[-22.065,-48.221]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0.33,-1.084],[-10.186,-5.101],[-12.962,-4.915],[-14.298,-6.859],[3.517,1.949],[9.512,3.888],[10.112,4.636]],"o":[[-0.296,0.971],[11.738,5.661],[11.43,6.26],[-0.249,-0.186],[-7.318,-2.947],[-5.407,-3.805],[-19.59,-8.978]],"v":[[-53.156,-60.852],[-30.561,-49.96],[24.185,-23.159],[90.553,8.105],[88.576,6.67],[19.809,-25.173],[-15.885,-43.314]],"c":true}]},{"t":84,"s":[{"i":[[0,0],[-9.99,-4.584],[0,0],[-14.057,-8.261],[11.285,7.427],[0,0],[10.139,4.896]],"o":[[0,0],[19.098,8.763],[0,0],[14.837,8.72],[-9.497,-6.251],[0,0],[-19.409,-9.371]],"v":[[-46.377,-61.752],[-23.093,-51.101],[29.846,-25.868],[85.949,4.161],[91.634,7.754],[29.297,-25.87],[-3.838,-42.979]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.254901960784,0.247058838489,0.266666666667,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.376470618154,0.376470618154,0.431372578939,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.6,"y":1},"o":{"x":0.5,"y":0},"t":68,"s":[{"i":[[21.296,-9.728],[-8.752,-0.403],[-45.881,-25.776],[11.188,7.438],[23.962,12.985]],"o":[[1.463,-1.758],[16.416,0.757],[20.96,10.065],[-21.093,-14.023],[-16.685,-9.041]],"v":[[-78.648,-70.866],[-60.867,-75.377],[79.153,0.008],[95.482,9.23],[-29.575,-62.096]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[-2.261,-5.5],[-6.984,-5.291],[-42.222,-6.917],[17.531,10.998],[41.277,14.388]],"o":[[2.421,5.887],[53.154,40.267],[19.473,3.19],[-21.457,-13.46],[-21.502,-7.495]],"v":[[-82.599,-71.373],[-68.26,-54.714],[113.938,30.305],[98.316,2.748],[-56.044,-72.232]],"c":true}]},{"t":84,"s":[{"i":[[2.5,-3.25],[-7.807,-3.429],[-42.635,-22.8],[10.495,8.387],[33.25,14.25]],"o":[[1.517,-1.712],[33.309,14.63],[20.001,11.859],[-19.787,-15.813],[-28.158,-12.068]],"v":[[-78.7,-76.097],[-60.947,-71.666],[84.307,-0.08],[99.768,10.534],[-26.396,-55.16]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.250980392157,0.231372563979,0.262745098039,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.581455305511,0.570835128485,0.597385541131,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":70,"op":83,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"HEAD","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"t":63,"s":[100],"h":1},{"t":70,"s":[0],"h":1},{"t":83,"s":[100],"h":1}]},"r":{"a":1,"k":[{"i":{"x":[0.54],"y":[1.102]},"o":{"x":[0.5],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.55],"y":[1]},"o":{"x":[0.236],"y":[0.023]},"t":66,"s":[14]},{"i":{"x":[0.867],"y":[0.941]},"o":{"x":[0.657],"y":[0]},"t":73,"s":[-8]},{"i":{"x":[0.258],"y":[1]},"o":{"x":[0.198],"y":[-0.112]},"t":90,"s":[14.556]},{"t":104,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.54,"y":0.982},"o":{"x":0.5,"y":0},"t":56,"s":[134.486,-12.946,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.55,"y":1},"o":{"x":0.236,"y":0.02},"t":66,"s":[115.246,-12.604,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.771,"y":0.709},"o":{"x":0.455,"y":0},"t":73,"s":[113.108,-6.761,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.791,"y":0.498},"o":{"x":0.517,"y":0.236},"t":84,"s":[118.483,-9.55,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.258,"y":1},"o":{"x":0.195,"y":1},"t":90,"s":[127.04,-6.175,0],"to":[0,0,0],"ti":[0,0,0]},{"t":104,"s":[134.486,-12.946,0]}]},"a":{"a":0,"k":[134.486,-12.946,0]},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.38,0.38,0.38],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":39,"s":[122,122,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.46,0.46,0.46],"y":[0,0,0]},"t":56,"s":[98,98,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.979,1.036,1.036]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":73,"s":[100,98,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.989,1.019,1.019]},"o":{"x":[0.167,0.167,0.167],"y":[0.011,-0.019,-0.019]},"t":86,"s":[107,98,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.015,-0.031,-0.031]},"t":93,"s":[100,98,100]},{"i":{"x":[0.697,0.697,0.6],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":104,"s":[98,98,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.143,0.143,0.2],"y":[0,0,0]},"t":120,"s":[124,124,100]},{"t":140,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-12.55,-3.333],[-5.186,-17.686],[21.496,-11.633],[-2.205,-1.125],[7.34,-27.449],[17.686,-5.166]],"o":[[10.493,-4.146],[17.807,4.731],[8.01,27.261],[-2.177,1.179],[21.774,11.103],[-4.752,17.797],[0,0]],"v":[[127.626,-115.017],[162.765,-116.827],[199.932,-80.611],[173.671,-16.115],[173.737,-10.703],[201.569,53.13],[165.301,90.246]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-9.591,-3.334],[-3.971,-17.684],[16.424,-11.639],[-1.686,-1.125],[5.601,-27.451],[13.516,-5.166]],"o":[[8.019,-4.146],[13.609,4.731],[6.121,27.261],[-1.664,1.179],[16.641,11.103],[-3.632,17.797],[0,0]],"v":[[122.281,-114.061],[149.135,-115.87],[177.539,-79.654],[154.528,-15.077],[154.579,-9.666],[178.79,54.087],[151.073,91.202]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.484,"y":0},"t":56,"s":[{"i":[[0,0],[-9.591,-3.334],[-3.971,-17.684],[16.424,-11.639],[-1.686,-1.125],[5.601,-27.451],[13.516,-5.166]],"o":[[8.019,-4.146],[13.609,4.731],[6.121,27.261],[-1.664,1.179],[16.641,11.103],[-3.632,17.797],[0,0]],"v":[[122.281,-114.061],[149.135,-115.87],[177.539,-79.654],[154.528,-15.077],[154.579,-9.666],[178.79,54.087],[151.073,91.202]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-10.856,1.495],[-14.527,-10.001],[7.212,-16.987],[-2.473,-0.73],[-9.5,-10.539],[15.369,-10.061]],"o":[[7.445,-5.755],[21.387,1.783],[11.172,8.853],[-0.832,1.96],[14.6,5.65],[11.308,10.792],[0,0]],"v":[[73.94,-70.228],[98.487,-78.409],[140.897,-59.95],[160.26,-14.812],[162.979,-10.639],[202.655,14.576],[207.821,52.09]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-10.856,0.628],[-14.527,-4.202],[-5.419,-1.223],[-2.256,-0.069],[-10.344,-1.616],[9.592,-1.422]],"o":[[2.63,-2.385],[21.387,0.749],[11.172,3.719],[-0.96,0.824],[17.059,2.202],[10.37,2.691],[0,0]],"v":[[53.133,-23.784],[77.62,-28.217],[126.808,-20.343],[147.126,-16.108],[150.202,-15.606],[204.974,-5.601],[213.291,5.793]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[0,0],[-12.288,2.534],[-16.407,3.566],[-6.122,1.318],[-2.551,0.533],[-11.692,2.491],[10.863,-2.209]],"o":[[2.992,-0.537],[24.193,-5.061],[12.614,-2.759],[-1.092,0.198],[19.286,-4.093],[11.714,-2.535],[0,0]],"v":[[63.42,13.258],[90.868,6.885],[146.465,-4.969],[169.424,-9.899],[172.9,-10.64],[226.403,-22.112],[235.731,-24.464]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0,0],[-11.881,1.453],[-15.872,1.93],[-5.922,0.722],[-2.467,0.302],[-12.307,1.499],[9.838,-1.208]],"o":[[2.89,-0.359],[23.395,-2.861],[12.204,-1.484],[-1.055,0.131],[19.224,-2.352],[11.331,-1.38],[0,0]],"v":[[62.105,8.68],[88.497,5.436],[141.878,-1.079],[162.368,-3.577],[166.625,-4.094],[220.639,-10.68],[229.346,-11.719]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[-10.856,0.628],[-14.527,-4.202],[-5.419,-1.223],[-2.255,-0.069],[-14.868,-5.549],[6.586,-1.331]],"o":[[2.63,-2.385],[21.387,0.749],[11.172,3.719],[-0.96,0.824],[19.654,-0.258],[10.37,2.691],[0,0]],"v":[[54.463,-26.165],[78.052,-29.303],[125.457,-22.237],[137.989,-17.217],[145.118,-16.57],[202.723,-8.927],[209.533,2.489]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[-10.856,1.495],[-13.149,-11.859],[2.375,-7.736],[-2.256,-0.164],[-8.249,-10.693],[14.259,-8.276]],"o":[[5.607,-4.937],[21.387,1.783],[5.757,7.661],[-0.96,1.96],[17.059,5.242],[8.111,9.473],[0,0]],"v":[[74.793,-71.565],[95.866,-79.623],[132.846,-59.39],[149.422,-21.993],[153.116,-17.612],[186.579,8.882],[190.12,46.142]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[-9.591,-3.334],[-3.971,-17.684],[16.424,-11.639],[-1.686,-1.125],[5.601,-27.451],[13.516,-5.166]],"o":[[8.019,-4.146],[13.609,4.731],[6.121,27.261],[-1.664,1.179],[16.641,11.103],[-3.632,17.797],[0,0]],"v":[[122.281,-114.061],[149.135,-115.87],[177.539,-79.654],[154.528,-15.077],[154.579,-9.666],[178.79,54.087],[151.073,91.202]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-12.55,-3.333],[-5.186,-17.686],[21.496,-11.633],[-2.205,-1.125],[7.34,-27.449],[17.686,-5.166]],"o":[[10.493,-4.146],[17.807,4.731],[8.01,27.261],[-2.177,1.179],[21.774,11.103],[-4.752,17.797],[0,0]],"v":[[127.626,-115.017],[162.765,-116.827],[199.932,-80.611],[173.671,-16.115],[173.737,-10.703],[201.569,53.13],[165.301,90.246]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[-4.752,17.797],[21.774,11.103],[-2.177,1.179],[8.009,27.261],[17.807,4.731],[-0.432,-35.277],[-17.508,-8.922],[2.167,-1.179],[-0.257,-21.018],[-36.787,10.74]],"o":[[7.34,-27.449],[-2.205,-1.125],[21.496,-11.633],[-5.187,-17.685],[-37.038,-9.836],[0.257,21.018],[2.195,1.126],[-17.285,9.349],[0.432,35.277],[17.686,-5.166]],"v":[[201.569,53.13],[173.737,-10.703],[173.671,-16.115],[199.932,-80.611],[162.765,-116.827],[93.07,-63.518],[122.931,-15.494],[122.997,-10.082],[94.321,38.66],[165.301,90.246]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[-3.637,17.796],[16.637,11.109],[-1.664,1.179],[6.11,27.264],[13.609,4.729],[-0.33,-35.277],[-13.356,-8.962],[1.659,-1.174],[-0.197,-21.018],[-28.112,10.744]],"o":[[5.609,-27.449],[-1.685,-1.125],[16.428,-11.633],[-3.964,-17.685],[-28.306,-9.836],[0.197,21.018],[1.678,1.126],[-13.209,9.349],[0.33,35.277],[13.516,-5.166]],"v":[[178.79,54.087],[154.579,-9.666],[154.528,-15.077],[177.539,-79.654],[149.135,-115.87],[95.872,-62.562],[117.222,-14.496],[117.273,-9.085],[96.828,39.616],[151.073,91.202]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[-3.637,17.796],[16.637,11.109],[-1.664,1.179],[6.11,27.264],[13.609,4.729],[-0.33,-35.277],[-13.356,-8.962],[1.659,-1.174],[-0.197,-21.018],[-28.112,10.744]],"o":[[5.609,-27.449],[-1.685,-1.125],[16.428,-11.633],[-3.964,-17.685],[-28.306,-9.836],[0.197,21.018],[1.678,1.126],[-13.209,9.349],[0.33,35.277],[13.516,-5.166]],"v":[[178.79,54.087],[154.579,-9.666],[154.528,-15.077],[177.539,-79.654],[149.135,-115.87],[95.872,-62.562],[117.222,-14.496],[117.273,-9.085],[96.828,39.616],[151.073,91.202]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[17.518,17.085],[11.979,3.352],[-0.626,1.153],[5.699,6.805],[27.387,-0.378],[-4.149,-10.956],[-36.754,-4.011],[1.505,-0.434],[-5.624,-9.822],[-29.039,-2.142]],"o":[[-14.583,-14.222],[-1.661,-0.642],[5.451,-10.493],[-10.739,-12.824],[-33.314,0.46],[3.666,9.681],[2.046,0.223],[0.463,6.191],[10.716,19.483],[37.627,0.007]],"v":[[203.431,14.886],[161.619,-10.961],[160.203,-14.68],[152.724,-46.751],[98.539,-77.645],[69.862,-46.762],[122.887,-5.404],[125.577,-1.995],[128.267,25.622],[183.628,57.706]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[29.521,5.395],[17.149,1.835],[1.5,0.396],[11.594,1.853],[15.123,-0.365],[-19.489,-3.64],[-19.295,-3.803],[1.171,-0.313],[-9.855,-1.774],[-24.382,1.529]],"o":[[-15.092,-1.857],[-1.972,0.08],[-2.098,-0.315],[-8.665,-1.385],[-22.045,-1.714],[9.661,1.984],[2.009,0.396],[4.94,0.239],[12.639,1.088],[22.16,-1.387]],"v":[[194.784,-7.164],[154.466,-15.146],[147.434,-14.861],[113.376,-23.107],[74.897,-26.956],[62.685,-18.01],[118.65,-5],[126.702,-3.881],[143.555,0.663],[202.742,7.061]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[6.861,-1.537],[15.844,-3.393],[-1.143,0.227],[4.118,-0.922],[16.082,-3.408],[-13.878,3.156],[-17.246,3.65],[1.06,-0.209],[-12.725,2.79],[-17.866,3.733]],"o":[[-10.578,2.369],[-2.09,0.448],[6.956,-1.383],[-8.896,1.993],[-23.206,4.917],[8.269,-1.88],[2.166,-0.458],[-4.903,0.967],[14.868,-3.26],[14.682,-3.068]],"v":[[213.402,-19.544],[155.181,-6.893],[152.813,-6.356],[111.77,2.607],[79.805,9.804],[74.88,10.252],[123.322,-0.197],[125.508,-0.693],[155.479,-7.079],[230.37,-23.146]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[13.456,-1.634],[15.137,-1.852],[-0.359,0.044],[6.879,-0.838],[15.683,-1.912],[-14.215,1.704],[-19.82,2.41],[1.084,-0.136],[-11.622,1.411],[-19.645,2.4]],"o":[[-11.825,1.436],[-2.04,0.25],[4.249,-0.524],[-8.781,1.07],[-22.695,2.766],[8.86,-1.062],[2.776,-0.338],[-1.98,0.247],[14.376,-1.745],[16.767,-2.048]],"v":[[206.062,-8.903],[151.962,-2.303],[148.234,-1.852],[112.211,2.529],[79.024,6.57],[71.675,7.501],[122.657,1.318],[125.57,0.963],[151.295,-2.157],[219.688,-10.508]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[29.521,5.395],[13.832,-0.326],[1.5,0.396],[13.638,1.432],[15.123,-0.365],[-15.363,-6.559],[-26.455,-0.591],[1.171,-0.313],[-9.278,-3.141],[-24.382,1.529]],"o":[[-15.093,-1.857],[-1.972,0.08],[-2.098,-0.315],[-8.727,-0.917],[-22.045,-1.714],[10.486,5.485],[4.3,0.096],[4.94,0.24],[13.56,3.408],[22.16,-1.387]],"v":[[189.888,-11.758],[144.261,-16.547],[137.196,-17.138],[112.246,-25.168],[75.318,-28.795],[61.987,-17.002],[120.293,-6.248],[125.011,-6.16],[141.251,1.836],[195.863,6.1]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[8.226,11.799],[13.815,3.352],[-1.555,0.438],[5.699,6.805],[15.508,-1.075],[-4.93,-7.73],[-24.31,-4.87],[1.505,-0.434],[-5.624,-9.822],[-24.684,3.079]],"o":[[-9.979,-14.314],[-1.915,-0.642],[2.588,-8.568],[-10.739,-12.824],[-33.237,2.304],[5.567,8.728],[2.018,0.404],[-3.462,9.125],[10.716,19.483],[24.814,-5.376]],"v":[[187.84,10.321],[150.488,-18.249],[149.562,-20.789],[134.11,-56.639],[94.329,-79.024],[73.709,-41.072],[110.294,-12.573],[112.984,-9.164],[115.229,17.037],[181.575,49.886]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[-3.637,17.796],[16.637,11.109],[-1.664,1.179],[6.11,27.264],[13.609,4.729],[-0.33,-35.277],[-13.356,-8.962],[1.659,-1.174],[-0.197,-21.018],[-28.112,10.744]],"o":[[5.609,-27.449],[-1.685,-1.125],[16.428,-11.633],[-3.964,-17.685],[-28.306,-9.836],[0.197,21.018],[1.678,1.126],[-13.209,9.349],[0.33,35.277],[13.516,-5.166]],"v":[[178.79,54.087],[154.579,-9.666],[154.528,-15.077],[177.539,-79.654],[149.135,-115.87],[95.872,-62.562],[117.222,-14.496],[117.273,-9.085],[96.828,39.616],[151.073,91.202]],"c":true}]},{"t":144,"s":[{"i":[[-4.752,17.797],[21.774,11.103],[-2.177,1.179],[8.009,27.261],[17.807,4.731],[-0.432,-35.277],[-17.508,-8.922],[2.167,-1.179],[-0.257,-21.018],[-36.787,10.74]],"o":[[7.34,-27.449],[-2.205,-1.125],[21.496,-11.633],[-5.187,-17.685],[-37.038,-9.836],[0.257,21.018],[2.195,1.126],[-17.285,9.349],[0.432,35.277],[17.686,-5.166]],"v":[[201.569,53.13],[173.737,-10.703],[173.671,-16.115],[199.932,-80.611],[162.765,-116.827],[93.07,-63.518],[122.931,-15.494],[122.997,-10.082],[94.321,38.66],[165.301,90.246]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[0.176470592618,0.176470592618,0.20000000298,1]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[0.161184161901,0.161184161901,0.184313729405,1]},{"t":104,"s":[0.176470592618,0.176470592618,0.20000000298,1]}]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-1.957,-19.004],[4.555,-0.136],[4.264,-0.764]],"o":[[-8.373,17.148],[-2.44,4.853],[-4.82,0.144],[0,0]],"v":[[75.795,-98.38],[64.934,-43.038],[53.808,-36.835],[39.43,-36.992]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-0.5,-15.938],[2.498,-0.179],[2.366,-0.764]],"o":[[-2.693,9.259],[-1.354,4.853],[-2.643,0.189],[0,0]],"v":[[82.188,-80.685],[78.415,-43.038],[72.299,-36.75],[64.383,-36.815]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0,0],[-0.5,-15.938],[1.65,-0.21],[1.225,-0.764]],"o":[[-2.693,9.259],[-1.354,4.853],[-1.747,0.222],[0,0]],"v":[[82.278,-80.763],[78.415,-43.038],[70.372,-36.603],[65.508,-36.602]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-2.206,-2.234],[0.604,-0.119],[-0.179,0.042]],"o":[[1.889,3.985],[-3.168,-3.657],[-1.481,0.354],[0,0]],"v":[[56.395,-41.701],[71.486,-17.016],[75.231,-13.959],[75.259,-14.036]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[-2.213,-1.953],[0.584,-0.115],[-0.125,0.031]],"o":[[1.889,3.985],[-3.182,-3.193],[-1.431,0.342],[0,0]],"v":[[56.429,-41.632],[79.503,-15.629],[65.071,-26.047],[65.117,-25.987]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-2.227,-1.389],[0.544,-0.107],[-0.018,0.01]],"o":[[1.889,3.985],[-3.21,-2.265],[-1.333,0.319],[0,0]],"v":[[56.498,-41.494],[83.388,-7.983],[64.882,-26.387],[64.965,-26.055]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0,0],[-2.202,0.241],[0.22,-0.027],[0.833,-0.102]],"o":[[1.889,3.985],[-3.223,0.359],[-0.539,0.066],[0,0]],"v":[[57.048,-40.39],[74.028,7.021],[63.988,8.036],[64.36,8.022]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[-2.206,-2.234],[0,0],[1.429,-0.274]],"o":[[1.889,3.985],[-3.266,-2.378],[0,0],[0,0]],"v":[[57.426,-39.632],[71.608,-17.024],[62.339,-30.983],[62.91,-26.968]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[-0.5,-15.938],[2.662,-0.204],[2.366,-0.764]],"o":[[-2.693,9.259],[-1.354,4.853],[-2.817,0.216],[0,0]],"v":[[82.287,-80.64],[78.415,-43.038],[71.975,-36.701],[63.707,-36.712]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-1.957,-19.004],[4.555,-0.136],[4.264,-0.764]],"o":[[-8.373,17.148],[-2.44,4.853],[-4.82,0.144],[0,0]],"v":[[75.795,-98.38],[64.934,-43.038],[53.808,-36.835],[39.43,-36.992]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":37,"s":[100],"h":1},{"t":64,"s":[0],"h":1},{"t":93,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.211,"y":0},"t":12,"s":[{"i":[[0,0],[-5.595,-0.361],[-0.276,-6.773],[-15.322,-6.32]],"o":[[5.601,-0.069],[9.766,0.63],[1.92,47.202],[0,0]],"v":[[41.481,13.647],[58.464,13.439],[64.949,34.182],[117.185,107.883]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[0,0],[-4.597,-0.361],[-0.253,-6.773],[-38.146,2.95]],"o":[[4.601,-0.069],[8.024,0.63],[1.761,47.202],[0,0]],"v":[[51.334,13.641],[65.022,13.439],[70.736,34.182],[148.971,113.775]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[0,0],[-3.861,-0.361],[-0.236,-6.773],[-56.671,15.47]],"o":[[3.865,-0.069],[6.739,0.63],[1.644,47.202],[0,0]],"v":[[58.597,13.636],[69.856,13.439],[75.002,34.182],[170.569,111.06]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-3.105,-0.361],[-0.219,-6.773],[-70.205,27.931]],"o":[[3.108,-0.069],[5.419,0.63],[1.523,47.202],[0,0]],"v":[[66.062,13.631],[74.824,13.439],[79.387,34.182],[188.021,107.46]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.484,"y":0},"t":56,"s":[{"i":[[0,0],[-3.105,-0.361],[0.586,-6.751],[-58.972,51.502]],"o":[[1.608,-0.069],[5.419,0.63],[-5.227,60.182],[0,0]],"v":[[70.32,13.011],[74.824,13.439],[79.387,34.182],[206.609,95.262]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[0,0],[-2.569,-0.319],[-0.644,-6.537],[-45.167,41.624]],"o":[[1.354,-0.149],[4.581,0.579],[2.675,55.385],[0,0]],"v":[[74.347,15.174],[78.865,14.935],[85.446,32.211],[213.66,91.244]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[0,0],[-1.089,-0.202],[-4.044,-5.948],[-49.131,32.563]],"o":[[1.427,0.009],[2.266,0.439],[27.941,42.979],[0,0]],"v":[[87.228,20.108],[93.879,19.84],[101.125,27.979],[230.725,68.47]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-0.596,-0.163],[-5.177,-5.751],[-45.342,35.332]],"o":[[1.452,0.062],[1.494,0.392],[31.785,37.714],[0,0]],"v":[[91.706,20.735],[98.383,20.052],[106.653,26.407],[234.207,58.973]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[-1.19,0.129],[-4.759,-3.484],[-40.733,26.412]],"o":[[0.803,-0.173],[3.856,-0.238],[26.417,23.461],[0,0]],"v":[[93.544,21.405],[97.39,20.08],[109.397,21.507],[236.045,44.852]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[{"i":[[0,0],[-1.636,0.617],[-3.765,-2.348],[-43.905,27.992]],"o":[[1.029,-0.164],[1.994,0.069],[24.083,9.396],[0,0]],"v":[[94.961,21.797],[103.926,18.058],[113.715,19.714],[240.411,23.65]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-2.083,1.105],[-2.771,-1.212],[-47.077,29.572]],"o":[[1.255,-0.155],[0.132,0.376],[23.093,0.996],[0,0]],"v":[[96.377,22.188],[115.256,15.064],[117.28,15.283],[244.778,2.448]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[-2.35,0.963],[-2.024,-0.885],[-43.787,23.783]],"o":[[1.462,-0.208],[3.468,-0.358],[16.87,0.728],[0,0]],"v":[[96.019,20.73],[110.819,13.6],[116.159,12.892],[249.981,-6.424]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-2.616,0.82],[-1.277,-0.559],[-40.497,17.994]],"o":[[1.67,-0.26],[6.804,-1.092],[10.647,0.459],[0,0]],"v":[[92.438,14.904],[105.429,10.475],[114.14,9.429],[255.183,-15.296]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[0,0],[-2.789,0.728],[-0.793,-0.347],[-38.362,14.237]],"o":[[1.804,-0.295],[8.969,-1.568],[6.608,0.285],[0,0]],"v":[[92.884,9.032],[102.143,7.975],[112.86,6.203],[258.56,-21.054]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[0,0],[-3.072,0.576],[0,0],[-34.869,8.09]],"o":[[2.024,-0.351],[12.511,-2.347],[0,0],[0,0]],"v":[[98.434,5.62],[97.091,5.523],[111.088,2.564],[264.085,-30.475]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0,0],[-3.06,0.375],[-0.611,0.073],[-35.834,4.467]],"o":[[2.249,-0.274],[12.953,-1.589],[5.095,-0.61],[0,0]],"v":[[94.881,4.78],[95.019,4.758],[111.893,2.687],[252.946,-15.202]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[-3.122,-0.073],[-2.771,-1.212],[-40.457,28.626]],"o":[[3.108,-0.069],[14.936,-3.214],[23.093,0.996],[0,0]],"v":[[87.199,12.647],[86.714,13.115],[113.285,9.003],[239.126,-2.274]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[-3.118,-0.133],[-4.174,-4.599],[-35.358,42.582]],"o":[[3.108,-0.069],[8.242,-1.263],[23.136,20.205],[0,0]],"v":[[79.859,21.279],[86.985,19.962],[103.52,22.246],[230.384,24.959]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[-3.116,-0.163],[-4.875,-6.293],[-32.809,49.56]],"o":[[3.108,-0.069],[4.895,-0.288],[23.157,29.809],[0,0]],"v":[[75.084,22.444],[85.781,20.72],[98.637,28.867],[226.013,38.575]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":97,"s":[{"i":[[0,0],[-3.109,-0.282],[-1.868,-6.582],[-44.415,43.756]],"o":[[3.108,-0.069],[5.21,0.263],[12.71,48.91],[0,0]],"v":[[65.09,16.847],[78.559,15.876],[86.132,32.63],[214.224,77.092]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[-3.105,-0.361],[0.134,-6.775],[-61.459,49.919]],"o":[[3.108,-0.069],[5.419,0.63],[-1.25,63.262],[0,0]],"v":[[66.062,13.631],[74.824,13.439],[79.387,34.182],[206.609,95.262]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[{"i":[[0,0],[-3.177,-1.198],[0.089,-6.775],[-56.334,23.069]],"o":[[3.38,-0.069],[5.458,2.059],[-0.904,61.509],[0,0]],"v":[[63.379,13.633],[72.685,14.289],[77.811,34.182],[189.127,107.866]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":128,"s":[{"i":[[0,0],[-4.895,-0.361],[-0.161,-6.773],[-20.89,-1.835]],"o":[[4.9,-0.069],[8.545,0.63],[1.03,51.714],[0,0]],"v":[[48.386,13.642],[63.06,13.439],[69.004,34.182],[133.173,112.191]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-5.595,-0.361],[-0.276,-6.773],[-15.322,-6.32]],"o":[[5.601,-0.069],[9.766,0.63],[1.92,47.202],[0,0]],"v":[[41.481,13.647],[58.464,13.439],[64.949,34.182],[117.185,107.883]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[-0.632,46.076],[0,0],[46.548,0.389],[-3.006,-69.202],[3.78,-0.046],[0,0],[-0.905,-9.203],[0,0],[-0.177,-4.041],[-48.489,-0.183]],"o":[[0,0],[-0.57,-46.556],[-36.92,-0.309],[0.046,3.77],[0,0],[0.357,7.639],[0,0],[3.78,-0.046],[-6.08,54.575],[41.361,0.156]],"v":[[232.173,28.793],[231.125,-56.82],[146.809,-140.094],[65.079,-44.075],[57.922,-37.218],[36.796,-36.96],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[-0.501,46.076],[0,0],[36.923,0.389],[-1.668,-69.202],[2.097,-0.046],[0,0],[-19.733,0.758],[0,0],[-0.098,-4.041],[-38.463,-0.183]],"o":[[0,0],[-0.452,-46.556],[-29.286,-0.309],[0.026,3.77],[0,0],[-22.914,0.717],[0,0],[2.097,-0.046],[-3.374,54.575],[32.809,0.156]],"v":[[212.033,28.793],[211.202,-56.82],[144.32,-140.094],[78.495,-44.075],[74.524,-37.218],[66.181,-37.083],[67.492,13.552],[74.868,13.438],[78.71,20.184],[146.789,114.107]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[-0.501,46.076],[0,0],[36.923,0.389],[-1.668,-69.202],[2.097,-0.046],[0,0],[-20.385,-3.543],[0,0],[-0.098,-4.041],[-38.463,-0.183]],"o":[[0,0],[-0.452,-46.556],[-29.286,-0.309],[0.026,3.77],[0,0],[-16.932,4.379],[0,0],[2.097,-0.046],[-3.374,54.575],[32.809,0.156]],"v":[[212.033,28.793],[211.202,-56.82],[144.32,-140.094],[78.495,-44.075],[74.524,-37.218],[66.788,-36.973],[71.06,12.932],[74.868,13.438],[78.71,20.184],[146.789,114.107]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[7.493,44.572],[3.516,3.942],[34.868,-2.847],[-7.29,-58.868],[1.454,-0.254],[-0.011,-0.568],[-23.615,-9.095],[0,0],[-0.553,-3.468],[-34.505,1.367]],"o":[[-2.85,-3.652],[-10.469,-46.205],[-29.294,2.969],[-0.03,3.241],[0.081,-0.012],[-12.063,7.309],[0,0],[2.094,-0.021],[5.126,53.009],[32.9,-2.078]],"v":[[213.336,22.073],[201.899,-54.84],[126.351,-126.265],[76.908,-37.074],[74.512,-31.258],[67.73,-32.604],[75.237,13.496],[78.483,13.908],[83.069,19.215],[160.842,104.346]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[13.441,43.452],[6.132,6.875],[33.339,-5.255],[-11.474,-51.18],[0.976,-0.408],[-0.019,-0.99],[-22.432,-0.174],[0,0],[-0.891,-3.041],[-31.561,2.52]],"o":[[-4.97,-6.37],[-17.921,-45.943],[-29.299,5.408],[-0.072,2.848],[0.142,-0.021],[-12.88,2.232],[0,0],[2.091,-0.002],[11.802,50.266],[32.968,-3.74]],"v":[[214.305,17.072],[194.978,-53.367],[112.981,-115.975],[75.728,-31.865],[74.756,-26.905],[69.346,-27.975],[78.925,15.082],[81.752,15.423],[87.675,19.455],[171.205,96.713]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[25.336,41.213],[11.364,12.741],[30.282,-10.071],[-19.84,-35.804],[0.019,-0.717],[-0.034,-1.835],[-14.79,-2.156],[0,0],[-1.568,-2.188],[-25.672,4.826]],"o":[[-9.211,-11.805],[-32.826,-45.42],[-29.311,10.285],[-0.155,2.063],[0.263,-0.039],[-11.012,10.197],[0,0],[2.086,0.036],[25.155,44.779],[33.103,-7.065]],"v":[[216.244,7.071],[181.136,-50.42],[86.241,-95.396],[73.366,-21.448],[75.244,-18.201],[72.577,-18.717],[86.3,18.253],[88.29,18.454],[96.888,19.934],[191.932,81.447]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[31.284,40.093],[13.98,15.674],[28.753,-12.479],[-24.023,-28.115],[-0.46,-0.871],[0.929,-2.058],[-13.132,-1.92],[0,0],[-1.906,-1.762],[-22.728,5.979]],"o":[[-11.331,-14.522],[-40.279,-45.159],[-29.317,12.723],[-0.197,1.67],[0.323,-0.047],[-6.056,13.419],[0,0],[2.083,0.055],[31.832,42.035],[33.171,-8.727]],"v":[[217.213,2.071],[174.215,-48.947],[72.871,-85.106],[72.186,-16.239],[75.487,-13.848],[74.193,-14.087],[89.988,19.839],[91.559,19.969],[101.494,20.174],[202.295,73.814]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[24.712,27.679],[12.864,11.289],[29.455,-11.175],[-27.014,-18.223],[-0.254,0.229],[0.079,-0.195],[-13.838,-2.068],[0,0],[-2.316,-1.241],[-26.072,9.958]],"o":[[-11.41,-10.631],[-43.309,-32.993],[-29.701,11.726],[0.106,-0.045],[0.434,-0.066],[-5.329,4.304],[0,0],[2.07,-0.107],[25.758,24.796],[27.626,-8.973]],"v":[[215.026,-3.714],[165.283,-42.579],[65.957,-67.959],[75.21,-7.138],[75.022,-8.766],[75.396,-7.187],[92.566,21.452],[99.985,20.335],[105.881,19.096],[215.12,52.203]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":65,"s":[{"i":[[18.14,15.264],[11.748,6.904],[30.158,-9.871],[-19.011,-11.871],[-3.013,-0.855],[0.04,-0.097],[-12.495,-0.732],[0,0],[-2.726,-0.72],[-29.416,13.937]],"o":[[-11.489,-6.74],[-46.339,-20.827],[-30.086,10.729],[1.261,0.108],[0.545,-0.085],[-3.574,2.345],[0,0],[0.61,-0.26],[44.964,17.289],[22.081,-9.22]],"v":[[212.839,-9.498],[156.352,-36.211],[59.043,-50.813],[64.18,-8.22],[75.233,-6.118],[75.834,-5.141],[94.094,21.339],[108.061,17.683],[109.098,16.887],[227.576,29.107]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[11.568,2.849],[10.632,2.52],[30.86,-8.567],[-7.732,-2.903],[-5.772,-1.94],[0,0],[-11.152,0.604],[0,0],[-3.136,-0.2],[-32.76,17.916]],"o":[[-11.568,-2.849],[-49.369,-8.661],[-30.47,9.731],[2.417,0.261],[0.656,-0.104],[-1.82,0.387],[0,0],[-0.85,-0.414],[64.169,9.782],[16.537,-9.466]],"v":[[210.653,-15.283],[147.42,-29.843],[52.129,-33.666],[52.119,-9.643],[84.883,0.39],[79.285,-1.541],[95.622,21.226],[116.136,15.031],[112.314,14.677],[240.031,6.011]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[16.667,0.352],[7.767,1.841],[27.567,-7.443],[-12.891,-0.605],[-4.188,-0.882],[0,0],[-8.463,0.684],[0,0],[-3.409,0.066],[-31.314,14.69]],"o":[[-8.451,-2.081],[-45.569,-4.287],[-26.981,8.222],[1.811,0.186],[0.479,-0.076],[-1.168,0.212],[0,0],[-0.034,-0.453],[58.745,4.633],[16.048,-7.776]],"v":[[208.624,-15.788],[143.143,-22.211],[54.235,-20.825],[55.713,-3.568],[80.581,2.905],[79.406,1.821],[94.327,18.919],[115.031,12.775],[108.854,13.422],[246.109,-3.686]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[21.766,-2.145],[4.902,1.162],[24.273,-6.318],[-18.05,1.693],[-2.604,0.176],[0,0],[-5.774,0.764],[0,0],[-3.683,0.333],[-29.869,11.464]],"o":[[-5.333,-1.313],[-41.769,0.088],[-23.491,6.713],[1.205,0.111],[0.302,-0.048],[-0.516,0.037],[0,0],[0.781,-0.493],[53.322,-0.515],[15.559,-6.087]],"v":[[206.595,-16.294],[138.866,-14.579],[56.341,-7.984],[59.306,2.508],[78.935,4.658],[81.191,4.212],[91.347,13.643],[113.028,9.447],[104.496,11.094],[252.187,-13.383]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[30.491,-6.418],[0,0],[18.638,-4.394],[-26.876,5.624],[0,0],[0,0],[-3.798,0.205],[0,0],[-4.151,0.788],[-27.396,5.945]],"o":[[0,0],[-35.268,7.572],[-17.521,4.13],[0.168,-0.017],[0,0],[0.6,-0.262],[0,0],[2.176,-0.561],[44.042,-9.324],[14.723,-3.195]],"v":[[203.124,-17.159],[131.547,-1.522],[59.945,13.985],[65.454,12.902],[81.098,9.719],[71.516,11.884],[99.841,5.352],[110.003,2.813],[97.442,6.171],[262.585,-29.974]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[24.717,-3.018],[3.119,-0.366],[22.081,-2.731],[-16.465,1.882],[-1.694,0.197],[0,0],[-4.757,0.572],[0,0],[-3.823,0.462],[-28.518,3.548]],"o":[[-3.394,0.398],[-38.273,4.637],[-9.324,1.371],[0.826,-0.099],[0.192,-0.024],[0.26,-0.033],[0,0],[2.121,-0.262],[48.777,-5.893],[3.805,-0.581]],"v":[[203.46,-8.593],[136.356,-0.428],[58.332,9.077],[65.978,8.253],[80.86,6.448],[70.431,7.709],[94.745,4.804],[111.491,2.742],[98.324,4.34],[248.211,-14.582]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[16.828,0.502],[7.627,1.365],[27.349,-6.233],[-11.226,-0.989],[-4.141,-1.086],[0,0],[-6.198,-0.158],[0,0],[-3.411,0.065],[-30.57,9.96]],"o":[[-8.298,-1.55],[-43.142,-3.402],[-22.011,6.387],[1.781,0.117],[0.47,-0.072],[-0.222,0.038],[0,0],[2.075,-0.363],[56.274,6.547],[14.429,-6.925]],"v":[[204.705,-14.433],[142.994,-18.077],[54.61,-16.569],[65.402,0.235],[79.416,1.492],[77.057,0.971],[90.035,10.1],[112.971,6.349],[98.739,4.539],[238.918,-3.805]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[11.568,2.849],[10.632,2.52],[30.86,-8.567],[-7.732,-2.903],[-5.772,-1.94],[0,0],[-7.79,-0.381],[0,0],[-3.136,-0.2],[-31.938,14.234]],"o":[[-11.568,-2.849],[-46.388,-8.761],[-30.47,9.731],[2.417,0.261],[0.656,-0.104],[-0.543,0.085],[0,0],[2.044,-0.43],[54.676,12.024],[21.512,-11.155]],"v":[[205.535,-18.326],[147.42,-29.843],[52.129,-33.666],[65.018,-5.11],[78.453,-1.811],[74.226,-2.78],[87.834,12.893],[113.957,8.753],[103.024,6.102],[232.723,3.379]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[{"i":[[12.43,7.07],[9.35,2.726],[30.231,-9.115],[-11.103,-7.893],[-4.881,-1.773],[0.397,-0.056],[-8.947,-2.854],[0,0],[-2.931,-0.46],[-30.395,12.888]],"o":[[-10.113,-3.17],[-43.623,-13.642],[-30.271,10.245],[1.981,0.496],[0.623,-0.085],[-3.934,1.575],[0,0],[2.051,-0.349],[51.714,18.427],[22.389,-10.506]],"v":[[205.408,-14.68],[149.769,-34.392],[55.965,-44.014],[66.213,-6.965],[76.334,-5.532],[72.539,-6.84],[85.871,14.801],[109.793,11.14],[101.23,8.993],[226.34,13.297]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[13.291,11.291],[8.068,2.932],[29.601,-9.663],[-14.473,-12.884],[-3.99,-1.606],[0.795,-0.113],[-14.482,-4.097],[0,0],[-2.726,-0.721],[-28.852,11.541]],"o":[[-8.658,-3.492],[-40.857,-18.523],[-30.072,10.76],[1.546,0.73],[0.589,-0.067],[-7.326,3.066],[0,0],[2.057,-0.268],[48.752,24.83],[23.265,-9.858]],"v":[[205.28,-11.034],[152.118,-38.941],[59.8,-54.363],[67.407,-8.82],[74.214,-9.253],[70.853,-10.899],[83.908,16.709],[105.629,13.527],[99.437,11.885],[219.957,23.215]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[15.015,19.733],[5.505,3.344],[28.341,-10.759],[-21.213,-22.865],[-2.208,-1.271],[1.589,-0.225],[-18.729,-4.954],[0,0],[-2.316,-1.241],[-25.767,8.847]],"o":[[-5.748,-4.135],[-35.326,-28.286],[-29.674,11.788],[0.675,1.2],[0.523,-0.029],[-11.305,7.943],[0,0],[2.07,-0.107],[42.828,37.636],[25.019,-8.561]],"v":[[205.025,-3.742],[156.816,-48.039],[67.471,-75.059],[69.796,-12.529],[69.975,-16.694],[66.443,-18.78],[79.983,20.526],[97.3,18.301],[95.85,17.669],[207.19,43.05]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[16.738,28.175],[2.942,3.757],[27.081,-11.855],[-27.953,-32.846],[-0.426,-0.937],[2.384,-0.338],[-15.725,-3.825],[0,0],[-1.906,-1.762],[-22.681,6.154]],"o":[[-2.838,-4.778],[-29.795,-38.048],[-29.276,12.816],[-0.197,1.67],[0.456,0.008],[-8.768,8.542],[0,0],[2.083,0.055],[36.903,50.442],[26.772,-7.264]],"v":[[204.77,3.55],[161.514,-57.137],[75.142,-95.756],[72.186,-16.239],[65.736,-24.136],[62.034,-26.661],[74.952,21.193],[87.633,20.409],[90.925,20.786],[194.424,62.886]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[-0.501,46.076],[0,0],[36.923,0.389],[-1.668,-69.202],[2.097,-0.046],[0,0],[-18.464,0.618],[0,0],[-0.098,-4.041],[-38.463,-0.183]],"o":[[0,0],[-0.452,-46.556],[-29.286,-0.309],[0.026,3.77],[0,0],[-17.089,0.052],[0,0],[2.097,-0.046],[-3.374,54.575],[32.809,0.156]],"v":[[212.033,28.793],[211.202,-56.82],[144.32,-140.094],[78.495,-44.075],[74.524,-37.218],[66.181,-37.083],[67.492,13.552],[74.868,13.438],[78.71,20.184],[146.789,114.107]],"c":true}]},{"t":144,"s":[{"i":[[-0.632,46.076],[0,0],[46.548,0.389],[-3.006,-69.202],[3.78,-0.046],[0,0],[-0.905,-9.203],[0,0],[-0.177,-4.041],[-48.489,-0.183]],"o":[[0,0],[-0.57,-46.556],[-36.92,-0.309],[0.046,3.77],[0,0],[0.357,7.639],[0,0],[3.78,-0.046],[-6.08,54.575],[41.361,0.156]],"v":[[232.173,28.793],[231.125,-56.82],[146.809,-140.094],[65.079,-44.075],[57.922,-37.218],[36.796,-36.96],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[0.254901975393,0.247058823705,0.266666680574,1]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[0.176470592618,0.133333340287,0.141176477075,1]},{"t":104,"s":[0.254901975393,0.247058823705,0.266666680574,1]}]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[1.002,20.95],[2.159,17.42],[29.255,1.703],[8.64,-40.941],[-21.248,-1.237],[-2.013,-25.381],[-0.233,-10.16],[38.407,-11.077]],"o":[[-0.48,-10.048],[-6.929,-55.919],[-23.143,-1.346],[16.256,-35.839],[49.895,2.902],[1.363,17.191],[0.503,21.942],[45.903,-6.275]],"v":[[231.749,35.993],[229.638,-66.125],[148.02,-138.42],[73.302,-84.57],[148.998,-131.368],[220.612,-64.079],[221.784,37.847],[166.729,108.491]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0.795,20.95],[1.712,17.42],[23.206,1.702],[6.854,-40.941],[-16.855,-1.236],[-1.596,-25.381],[-0.185,-10.16],[30.466,-11.077]],"o":[[-0.381,-10.048],[-5.497,-55.919],[-18.357,-1.346],[12.895,-35.839],[39.578,2.902],[1.081,17.191],[0.399,21.942],[36.411,-6.275]],"v":[[211.697,35.993],[210.022,-66.125],[145.281,-138.42],[86.013,-84.57],[145.635,-131.16],[202.223,-62.19],[202.532,37.631],[160.121,108.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0.795,20.95],[1.712,17.42],[23.206,1.702],[6.854,-40.941],[-16.855,-1.236],[-1.596,-25.381],[-0.185,-10.16],[30.466,-11.077]],"o":[[-0.381,-10.048],[-5.497,-55.919],[-18.357,-1.346],[12.895,-35.839],[39.578,2.902],[1.081,17.191],[0.399,21.942],[36.411,-6.275]],"v":[[211.697,35.993],[210.022,-66.125],[145.281,-138.42],[86.013,-84.57],[145.635,-131.16],[202.223,-62.19],[202.532,37.631],[160.121,108.491]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[7.792,16.713],[11.099,12.618],[17.288,-11.242],[-8.09,-17.296],[-14.616,8.748],[-17.043,-14.221],[-4.779,-7.554],[20.597,-18.44]],"o":[[-3.737,-8.016],[-29.439,-31.206],[-11.664,7.585],[1.17,-14.786],[27.164,-13.46],[15.221,14.302],[10.869,17.18],[35.107,-23.592]],"v":[[215.587,0.24],[159.827,-64.878],[70.924,-84.377],[56.019,-45.551],[76.261,-77.882],[147.424,-62.458],[208.112,6.569],[219.742,68.071]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[10.98,14.783],[11.765,11.1],[16.866,-12.462],[-3.929,-12.185],[-17.239,6.811],[-21.018,-16.732],[-5.687,-6.998],[16.602,-22.896]],"o":[[-5.266,-7.09],[-27.441,-25.411],[-12.462,9.286],[1.44,-10.747],[27.984,-10.318],[16.377,13.788],[12.522,15.494],[27.388,-26.048]],"v":[[227.158,-4.561],[159.647,-69.453],[67.724,-82.393],[52.194,-49.113],[78.8,-77.779],[153.042,-64.085],[222.159,1.649],[227.532,61.698]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[13.459,13.281],[12.284,9.92],[16.537,-13.411],[-0.693,-8.21],[-19.279,5.304],[-24.111,-18.685],[-6.393,-6.567],[13.495,-26.362]],"o":[[-6.455,-6.37],[-25.887,-20.905],[-13.082,10.609],[1.651,-7.606],[28.623,-7.874],[17.276,13.388],[13.807,14.182],[21.384,-27.958]],"v":[[223.145,-7.926],[159.507,-73.012],[65.235,-80.85],[49.22,-51.882],[80.775,-77.699],[156.407,-64.91],[218.796,-1.23],[233.591,56.742]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[12.611,-1.346],[12.038,10.312],[17.674,-13.58],[-1.358,-9.282],[-18.834,5.554],[-23.196,-18.335],[-6.112,0.651],[14.138,-25.124]],"o":[[-6.048,0.645],[-25.997,-22.294],[-12.979,10.184],[1.471,-8.057],[28.846,-8.461],[16.918,13.618],[13.253,-1.412],[22.797,-26.664]],"v":[[222.272,-10.715],[158.676,-72.034],[65.791,-82.237],[49.917,-51.462],[79.982,-78.227],[154.669,-64.778],[217.408,-10.057],[229.721,57.139]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[10.826,14.781],[11.451,11.247],[20.387,-13.983],[-2.945,-11.84],[-17.772,6.151],[-21.015,-17.5],[-5.557,-7.07],[15.673,-22.172]],"o":[[-5.192,-7.09],[-26.257,-25.609],[-12.733,9.17],[1.043,-9.132],[29.38,-9.862],[16.062,14.167],[12.181,15.61],[26.167,-23.578]],"v":[[221.86,-2.113],[156.693,-69.704],[67.116,-85.548],[51.581,-50.46],[78.088,-79.484],[150.525,-64.465],[215.623,1.774],[220.491,58.086]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[6.443,17.278],[10.064,13.458],[26.795,-14.934],[-6.694,-17.882],[-15.263,7.562],[-15.862,-15.527],[-4.165,-7.908],[19.299,-15.196]],"o":[[-3.09,-8.287],[-26.873,-33.44],[-12.153,6.774],[0.031,-11.671],[30.64,-13.169],[14.04,15.464],[9.474,17.988],[34.128,-16.288]],"v":[[205.143,4.844],[152.01,-64.198],[70.248,-93.367],[55.511,-48.092],[73.616,-82.454],[140.735,-63.723],[195.764,4.057],[198.686,60.322]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0.795,20.95],[1.712,17.42],[23.206,1.702],[6.854,-40.941],[-16.855,-1.236],[-1.596,-25.381],[-0.185,-10.16],[30.466,-11.077]],"o":[[-0.381,-10.048],[-5.497,-55.919],[-18.357,-1.346],[12.895,-35.839],[39.578,2.902],[1.081,17.191],[0.399,21.942],[36.411,-6.275]],"v":[[211.697,35.993],[210.022,-66.125],[145.281,-138.42],[86.013,-84.57],[146.057,-131.368],[202.863,-64.079],[203.792,37.847],[160.121,108.491]],"c":true}]},{"t":144,"s":[{"i":[[1.002,20.95],[2.159,17.42],[29.255,1.703],[8.64,-40.941],[-21.248,-1.237],[-2.013,-25.381],[-0.233,-10.16],[38.407,-11.077]],"o":[[-0.48,-10.048],[-6.929,-55.919],[-23.143,-1.346],[16.256,-35.839],[49.895,2.902],[1.363,17.191],[0.503,21.942],[45.903,-6.275]],"v":[[231.749,35.993],[229.638,-66.125],[148.02,-138.42],[73.302,-84.57],[148.998,-131.368],[220.612,-64.079],[221.784,37.847],[166.729,108.491]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.12,1,1,1,0.692,0.676,0.676,0.69,1,0.353,0.353,0.38,0.12,1,0.692,0.5,1,0]}},"s":{"a":0,"k":[261.881,-160.486]},"e":{"a":0,"k":[153.457,-15.108]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":37,"s":[100],"h":1},{"t":63,"s":[0],"h":1},{"t":93,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[11.156,3.133],[0,0],[0,0],[-6.828,0.294],[-0.162,6.591]],"o":[[0,0],[0,0],[0,0],[17.119,-0.738],[0,0]],"v":[[57.919,-37.218],[38.815,-36.989],[37.107,-29.937],[56.559,-29.879],[65.057,-65.349]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[6.19,3.133],[0,0],[0,0],[-3.789,0.294],[-0.128,6.591]],"o":[[0,0],[0,0],[0,0],[9.499,-0.738],[0,0]],"v":[[74.522,-37.218],[67.301,-37.112],[62.204,-30.012],[73.908,-30.2],[79.472,-65.349]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.725,"y":0},"t":56,"s":[{"i":[[6.19,3.133],[0,0],[0,0],[-3.789,0.294],[-0.128,6.591]],"o":[[0,0],[0,0],[0,0],[9.499,-0.738],[0,0]],"v":[[74.522,-37.218],[66.203,-36.796],[62.082,-29.593],[73.908,-30.2],[79.472,-65.349]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0.71,-1.455],[0,0],[0,0],[-1.062,0.403],[4.355,10.211]],"o":[[0,0],[0,0],[0,0],[-2.74,-4.689],[-0.655,0.625]],"v":[[65.825,-23.992],[75.621,-12.299],[65.245,-22.678],[67.187,-23.581],[55.689,-42.803]],"c":true}]},{"i":{"x":0.833,"y":0.95},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0.321,-0.051],[0,0],[0,0],[-0.813,0.097],[4.441,11.213]],"o":[[0,0],[0,0],[0,0],[-2.789,0.287],[0.625,2.941]],"v":[[68.028,7.639],[67.166,7.8],[63.226,8.232],[68.82,7.551],[57.287,-40.379]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0.119,-0.716],[0,0],[0,0],[-0.688,-0.278],[4.488,11.75]],"o":[[0,0],[0,0],[0,0],[-2.836,-3.472],[1.31,4.182]],"v":[[68.295,-20.884],[62.248,-20.167],[61.177,-19.632],[68.79,-20.167],[58.143,-39.081]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[6.19,3.133],[0,0],[0,0],[-3.789,0.294],[-0.128,6.591]],"o":[[0,0],[0,0],[0,0],[9.499,-0.738],[0,0]],"v":[[74.522,-37.218],[67.301,-37.112],[62.204,-30.012],[73.908,-30.2],[79.472,-65.349]],"c":true}]},{"t":144,"s":[{"i":[[11.156,3.133],[0,0],[0,0],[-6.828,0.294],[-0.162,6.591]],"o":[[0,0],[0,0],[0,0],[17.119,-0.738],[0,0]],"v":[[57.919,-37.218],[38.815,-36.989],[37.107,-29.937],[56.559,-29.879],[65.057,-65.349]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":40},"w":{"a":0,"k":7.26},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":36,"s":[100],"h":1},{"t":64,"s":[0],"h":1},{"t":93,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[-1.384,-73.323],[3.778,-0.045],[1.436,-0.744],[-0.033,-0.782],[0,0],[0,0],[-28.258,-3.946]],"o":[[0.091,4.832],[0,0],[0.29,7.339],[0,0],[-27.544,-15.61],[-5.841,-64.988],[-52.862,-24.524]],"v":[[64.648,-46.782],[57.919,-37.218],[36.84,-36.056],[37.139,-11.632],[125.3,-12.713],[93.133,-54.82],[182.796,-132.438]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[-0.768,-73.323],[2.097,-0.045],[0.797,-0.744],[-0.979,-10],[0,0],[0,0],[-22.415,-3.946]],"o":[[0.051,4.832],[0,0],[-12.961,1.939],[0,0],[-21.849,-15.61],[-4.634,-64.988],[-40.684,-18.406]],"v":[[78.256,-46.782],[74.522,-37.218],[65.679,-36.789],[51.051,-11.236],[121.295,-12.672],[96.768,-56.225],[167.227,-133.396]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.484,"y":0},"t":56,"s":[{"i":[[-0.768,-73.323],[2.097,-0.045],[0.412,-0.744],[-0.23,-17.23],[0,0],[0,0],[-22.415,-3.946]],"o":[[0.051,4.832],[0,0],[-4.013,1.527],[0,0],[-21.849,-15.61],[-4.634,-64.988],[-40.684,-18.406]],"v":[[78.256,-46.782],[74.522,-37.218],[66.528,-36.679],[56.532,-11.578],[121.295,-12.672],[96.768,-56.225],[167.227,-133.396]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[-3.833,-63.303],[1.65,-0.425],[0.408,-0.66],[-0.798,-15.416],[0,0],[0,0],[-18.544,-2.075]],"o":[[-0.132,4.804],[0,0],[-2.971,1.608],[0,0],[-25.291,-13.133],[-4.827,-55.942],[-36.685,-14.199]],"v":[[73.764,-45.409],[74.503,-32.18],[67.358,-32.533],[58.355,-6.157],[120.806,-11.254],[90.974,-54.417],[150.154,-123.892]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[-12.3,-35.618],[0.416,-1.473],[0.395,-0.425],[-2.364,-10.404],[0,0],[0,0],[-7.846,3.096]],"o":[[-0.638,4.726],[0,0],[-0.094,1.829],[0,0],[-34.802,-6.289],[-5.36,-30.948],[-25.635,-2.574]],"v":[[61.354,-41.615],[75.207,-18.506],[69.651,-21.079],[70.708,2.397],[119.456,-7.336],[74.965,-49.42],[102.977,-97.631]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[-15.122,-26.39],[0.005,-1.822],[0.391,-0.347],[-4.358,-8.386],[0,0],[0,0],[-4.28,4.819]],"o":[[-0.807,4.701],[0,0],[0.865,1.903],[0,0],[-37.973,-4.007],[-5.538,-22.617],[-21.952,1.301]],"v":[[57.217,-40.351],[75.441,-13.948],[70.415,-17.262],[76.654,8.235],[119.006,-6.03],[69.628,-47.755],[87.251,-88.877]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[-14.664,-19.49],[-2.335,-1.087],[0.534,0.079],[-3.728,-6.538],[0,0],[0,0],[-4.996,4.827]],"o":[[0.096,3.746],[0,0],[-0.496,1.144],[0,0],[-37.164,-4.941],[-4.895,-15.411],[-21.952,1.301]],"v":[[52.675,-31.646],[62.638,-21.135],[77.383,-5.553],[79.107,-0.941],[122.447,-4.701],[64.161,-38.835],[77.855,-71.115]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[-13.746,-5.689],[0.44,-1.795],[0.82,0.931],[-5.412,-2.147],[0,0],[0,0],[-6.426,4.842]],"o":[[1.901,1.835],[0,0],[-4.42,0.635],[0,0],[-35.547,-6.81],[-3.61,-0.999],[-21.952,1.301]],"v":[[43.591,-14.236],[49.442,-10.133],[78.436,-2.609],[91.776,18.378],[129.329,-2.043],[53.225,-20.994],[59.063,-35.591]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[-11.121,-3.917],[0.44,-1.795],[0.82,0.931],[-3.577,-1.705],[0,0],[0,0],[-6.07,3.999]],"o":[[1.901,1.835],[0,0],[-2.314,1.004],[0,0],[-34.972,-3.538],[-3.114,-0.475],[-19.081,1.904]],"v":[[46.074,-6.405],[51.359,-3.683],[79.055,1.237],[90.045,17.26],[129.38,-1.644],[56.07,-11.867],[61.799,-22.799]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[-8.496,-2.145],[0.44,-1.795],[0.82,0.931],[-1.741,-1.264],[0,0],[0,0],[-5.713,3.157]],"o":[[1.901,1.835],[0,0],[-0.208,1.373],[0,0],[-34.396,-0.266],[-2.618,0.048],[-16.21,2.507]],"v":[[48.558,1.425],[53.276,2.767],[81.338,4.111],[86.629,13.174],[129.43,-1.245],[58.914,-2.74],[64.535,-10.007]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[-4.004,0.886],[0.44,-1.795],[0.82,0.931],[1.398,-0.508],[0,0],[0,0],[-5.102,1.715]],"o":[[1.901,1.835],[0,0],[-4.42,0.635],[0,0],[-33.412,5.332],[-1.77,0.944],[-11.298,3.538]],"v":[[52.806,14.823],[56.555,13.803],[66.923,11.876],[71.763,11.286],[129.517,-0.563],[63.78,12.876],[69.217,11.879]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[-2.223,0.13],[0.434,-0.075],[0.814,-0.099],[-0.374,0.033],[0,0],[0,0],[-5.354,0.674]],"o":[[1.89,-0.204],[0,0],[-4.388,0.536],[0,0],[-33.64,4.079],[-2.162,0.266],[-13.563,1.669]],"v":[[51.516,10.002],[55.703,9.5],[67.598,8.065],[72.471,7.507],[129.656,0.489],[62.111,8.69],[67.592,7.981]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[-13.746,-5.689],[0.44,-1.795],[0.82,0.931],[-2.273,-1.904],[0,0],[0,0],[-6.426,4.842]],"o":[[1.901,1.835],[0,0],[1.01,1.038],[0,0],[-35.547,-6.81],[-3.61,-0.999],[-21.952,1.301]],"v":[[43.591,-14.236],[49.442,-10.133],[72.285,-4.335],[77.883,6.167],[129.329,-2.043],[53.225,-20.994],[59.063,-35.591]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[-14.693,-26.984],[0.44,-1.795],[2.722,-1.027],[-1.9,-9.096],[0,0],[0,0],[-23.848,11.832]],"o":[[0.971,3.532],[0,0],[-2.574,0.37],[0,0],[-37.973,-4.007],[-5.538,-22.617],[-27.621,1.027]],"v":[[57.217,-40.351],[61.654,-31.392],[62.491,-26.889],[61.653,-3.467],[110.026,-10.796],[69.628,-47.755],[88.42,-97.721]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[-0.768,-73.323],[2.097,-0.045],[0.797,-0.744],[-0.979,-10],[0,0],[0,0],[-22.415,-3.946]],"o":[[0.051,4.832],[0,0],[-7.754,1.527],[0,0],[-21.849,-15.61],[-4.634,-64.988],[-40.684,-18.406]],"v":[[78.256,-46.782],[74.522,-37.218],[65.679,-36.789],[54.834,-11.259],[121.295,-12.672],[96.768,-56.225],[167.227,-133.396]],"c":true}]},{"t":144,"s":[{"i":[[-1.384,-73.323],[3.778,-0.045],[1.436,-0.744],[-0.033,-0.782],[0,0],[0,0],[-28.258,-3.946]],"o":[[0.091,4.832],[0,0],[0.29,7.339],[0,0],[-27.544,-15.61],[-5.841,-64.988],[-52.862,-24.524]],"v":[[64.648,-46.782],[57.919,-37.218],[36.84,-36.056],[37.139,-11.632],[125.3,-12.713],[93.133,-54.82],[182.796,-132.438]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":70},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.07,1,1,1,0.628,0.812,0.743,0.686,1,0.624,0.486,0.373,0.07,1,0.628,0.5,1,0]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.981},"o":{"x":0.484,"y":0},"t":56,"s":[33.628,-76.468],"to":[-3.498,7.149],"ti":[7.486,-15.303]},{"i":{"x":0.833,"y":0.999},"o":{"x":0.167,"y":0.001},"t":63,"s":[-21.741,-18.226],"to":[-3.05,6.234],"ti":[7.486,-15.303]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.001},"t":66,"s":[-21.741,-18.226],"to":[-3.05,6.234],"ti":[7.486,-15.303]},{"i":{"x":0.833,"y":0.997},"o":{"x":0.946,"y":0},"t":73,"s":[-21.741,-18.226],"to":[-3.05,6.234],"ti":[7.486,-15.303]},{"i":{"x":0.833,"y":0.999},"o":{"x":0.167,"y":0.001},"t":87,"s":[-21.741,-18.226],"to":[-3.05,6.234],"ti":[7.486,-15.303]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.03},"t":93,"s":[-21.741,-18.226],"to":[-3.05,6.234],"ti":[-9.228,9.707]},{"t":104,"s":[33.628,-76.468]}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.981},"o":{"x":0.484,"y":0},"t":56,"s":[123.27,-72.602],"to":[-6.634,4.734],"ti":[14.201,-10.133]},{"i":{"x":0.833,"y":0.994},"o":{"x":0.167,"y":0.006},"t":63,"s":[81.332,-37.646],"to":[-5.785,4.128],"ti":[14.201,-10.133]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.019},"t":66,"s":[69.854,-35.697],"to":[-5.785,4.128],"ti":[14.201,-10.133]},{"i":{"x":0.833,"y":0.948},"o":{"x":0.946,"y":0},"t":73,"s":[4.325,-23.541],"to":[-5.785,4.128],"ti":[14.201,-10.133]},{"i":{"x":0.833,"y":0.993},"o":{"x":0.167,"y":0.007},"t":87,"s":[46.349,-30.672],"to":[-5.785,4.128],"ti":[14.201,-10.133]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.03},"t":93,"s":[91.287,-40.237],"to":[-5.785,4.128],"ti":[-5.33,5.394]},{"t":104,"s":[123.27,-72.602]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[46.555,-1.015],[-23.933,36.923],[-56.535,-15.098],[2.466,4.83]],"o":[[-48.241,1.052],[-3.327,7.168],[54.159,14.463],[10.198,19.976]],"v":[[150.4,102.683],[97.762,13.845],[139.625,91.854],[205.957,38.164]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[36.928,-1.015],[-18.984,36.923],[-45.613,-12.591],[1.762,4.83]],"o":[[-38.266,1.052],[-2.639,7.168],[39.202,10.821],[9.354,21.62]],"v":[[141.832,101.623],[100.579,14.243],[131.818,92.081],[180.484,39.492]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.484,"y":0},"t":56,"s":[{"i":[[36.928,-1.015],[-18.984,36.923],[-45.613,-12.591],[1.762,4.83]],"o":[[-38.266,1.052],[-2.639,7.168],[39.202,10.821],[9.354,21.62]],"v":[[141.832,101.623],[101.107,14.402],[131.818,92.081],[180.484,39.492]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[18.152,-9.441],[4.689,38.126],[-46.849,11.478],[2.452,3.311]],"o":[[-32.457,19.081],[-1.293,5.771],[28.948,-9.256],[19.834,6.752]],"v":[[217.848,60.215],[127.785,21.963],[200.583,55.228],[203.876,10.038]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[12.07,-7.699],[7.903,4.546],[-25.28,5.181],[2.452,3.311]],"o":[[-20.459,6.966],[6.199,4.866],[15.404,-4.964],[7.672,3.192]],"v":[[217.233,5.322],[144.324,-0.036],[215.968,4.216],[210.251,-8.476]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[11.746,-2.792],[7.757,-1.519],[-24.676,5.494],[2.42,-0.41]],"o":[[-19.951,4.536],[6.093,-1.149],[15.024,-3.406],[7.522,-1.514]],"v":[[229.444,-22.578],[165.397,-8.932],[228.2,-22.347],[222.523,-21.552]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[11.728,-1.457],[7.733,-0.932],[-24.624,3.038],[2.411,-0.285]],"o":[[-21.122,2.624],[6.073,-0.728],[14.995,-1.85],[7.909,-0.964]],"v":[[226.642,-11.371],[160.248,-3.259],[223.078,-10.94],[218.756,-10.454]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[12.07,-7.699],[7.903,4.546],[-25.28,5.181],[2.452,3.311]],"o":[[-25.947,14.276],[6.199,4.866],[15.404,-4.964],[9.527,0.62]],"v":[[219.268,4.112],[142.441,2.068],[207.469,3.912],[207.767,-11.004]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[18.152,-9.441],[4.616,31.093],[-46.849,11.478],[2.452,3.311]],"o":[[-35.313,15.78],[-1.293,5.771],[28.948,-9.256],[17.663,7.625]],"v":[[196.59,53.36],[113.95,13.732],[186.748,46.997],[189.959,1.248]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[36.928,-1.015],[-18.984,36.923],[-45.613,-12.591],[1.762,4.83]],"o":[[-38.266,1.052],[-2.639,7.168],[39.202,10.821],[9.354,21.62]],"v":[[141.832,101.623],[101.107,14.402],[131.818,92.081],[180.484,39.492]],"c":true}]},{"t":144,"s":[{"i":[[46.555,-1.015],[-23.933,36.923],[-56.535,-15.098],[2.466,4.83]],"o":[[-48.241,1.052],[-3.327,7.168],[54.159,14.463],[10.198,19.976]],"v":[[150.4,102.683],[97.762,13.845],[139.625,91.854],[205.957,38.164]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":50},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.676,0.676,0.69,1,0.353,0.353,0.38,0,1,0.5,0.5,1,0]}},"s":{"a":0,"k":[142.091,106.754]},"e":{"a":0,"k":[151.105,62.547]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-4.135,-0.14],[-1.403,-5.241]],"o":[[4.136,-0.048],[5.448,0.185],[0,0]],"v":[[40.812,7.928],[53.302,7.378],[63.988,16.038]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-2.295,-0.14],[-0.778,-5.241]],"o":[[2.295,-0.048],[3.023,0.185],[0,0]],"v":[[62.058,7.727],[71.96,7.378],[77.89,16.038]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.484,"y":0},"t":56,"s":[{"i":[[0,0],[-2.295,-0.14],[-0.778,-5.241]],"o":[[1.188,-0.048],[3.023,0.185],[0,0]],"v":[[63.637,7.739],[71.96,7.378],[77.89,16.038]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-0.571,0.408],[-1.144,-2.605]],"o":[[0.218,-0.192],[0.604,-0.432],[0,0]],"v":[[88.912,16.285],[91.023,15.69],[97.573,16.431]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[-0.825,0.424],[-1.364,-0.22]],"o":[[0.717,-0.25],[1.562,-0.803],[0,0]],"v":[[89.109,17.078],[92.61,16.114],[100.121,15.801]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-2.125,0.626],[-3.413,0.851]],"o":[[1.302,0.028],[0.569,-0.168],[0,0]],"v":[[90.286,18.652],[97.994,16.832],[108.487,13.845]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[-1.673,0.45],[-2.493,0.622]],"o":[[1.302,0.028],[0.575,-0.113],[0,0]],"v":[[92.383,17.093],[95.02,16.256],[107.298,12.43]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-1.222,0.274],[-1.574,0.392]],"o":[[1.302,0.028],[0.581,-0.058],[0,0]],"v":[[92.742,11.777],[90.266,12.206],[105.138,9.094]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[0,0],[-0.449,-0.027],[0,0]],"o":[[1.302,0.028],[0.592,0.036],[0,0]],"v":[[106.949,3.42],[95.725,6.014],[102.781,4.491]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0,0],[-0.347,0.041],[0,0]],"o":[[1.005,-0.121],[0.457,-0.055],[0,0]],"v":[[100.927,4.019],[94.026,4.869],[103.05,3.76]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[0,0],[-0.139,0.017],[0,0]],"o":[[0.402,-0.048],[0.183,-0.022],[0,0]],"v":[[86.359,6.63],[88.976,6.158],[100.524,4.147]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[83.878,8.57],[86.924,8.095],[102.279,5.975]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[-0.685,-0.042],[-0.763,-1.737]],"o":[[1.075,0.003],[0.902,0.055],[0,0]],"v":[[76.837,15.695],[81.779,14.374],[93.09,16.053]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[-1.027,-0.063],[-1.144,-2.605]],"o":[[1.613,0.004],[1.353,0.083],[0,0]],"v":[[72.532,17.107],[79.67,15.838],[87.157,18.426]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[-2.295,-0.14],[-0.778,-5.241]],"o":[[2.295,-0.048],[3.023,0.185],[0,0]],"v":[[62.058,7.727],[71.96,7.378],[77.89,16.038]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-4.135,-0.14],[-1.403,-5.241]],"o":[[4.136,-0.048],[5.448,0.185],[0,0]],"v":[[40.812,7.928],[53.302,7.378],[63.988,16.038]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.776470588235,0.560784313725,0.466666666667,1]},"o":{"a":0,"k":20},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[26.048,-1.36],[-0.115,-1.164],[0,0],[0.428,-7.898],[0,0]],"o":[[0.302,-14.975],[-0.272,0.014],[0,0],[0,0],[-5.259,97.078],[-88.333,-6.282]],"v":[[76.669,18.609],[39.533,4.082],[39.158,13.675],[58.542,13.438],[65.465,20.184],[157.877,113.631]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[18.724,-1.474],[-11.844,-0.571],[0,0],[0.237,-7.898],[0,0]],"o":[[-1.047,-18.385],[-0.152,0.012],[0,0],[0,0],[-2.918,97.078],[-70.882,-6.782]],"v":[[87.13,19.355],[57.522,3.539],[67.492,13.552],[74.868,13.438],[78.71,20.184],[153.1,113.631]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0,0],[10.273,-2.846],[-6.188,0.116],[0,0],[0.237,-7.898],[0,0]],"o":[[-1.025,-17.782],[-0.078,0.022],[0,0],[0,0],[-2.918,97.078],[-70.882,-6.782]],"v":[[87.13,19.355],[61.975,5.07],[71.06,12.932],[74.868,13.438],[78.71,20.184],[153.1,113.631]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[2.727,2.561],[4.581,-1.103],[-1.854,0.45],[0,0],[-2.073,-6.975],[-12.524,12.14]],"o":[[-8.24,-12.793],[-0.136,0.03],[0,0],[0,0],[35.251,69.149],[-72.636,9.951]],"v":[[104.216,17.093],[79.944,11.431],[86.755,18.073],[87.139,16.502],[97.726,22.655],[209.095,75.212]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[3.354,3.15],[3.272,-0.703],[-0.857,0.527],[0,0],[-2.604,-6.762],[-15.404,14.933]],"o":[[-9.9,-11.646],[-0.149,0.032],[0,0],[0,0],[44.031,62.725],[-82.199,17.669]],"v":[[108.146,16.572],[84.077,12.894],[90.365,19.256],[89.961,17.207],[102.1,23.224],[221.975,66.376]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[4.161,3.155],[10.748,-3.325],[-2.286,0.344],[0,0],[-2.36,-4.658],[-15.404,14.933]],"o":[[-10.136,-11.471],[-0.063,0.019],[0,0],[0,0],[41.546,45.732],[-69.613,17.068]],"v":[[114.381,16.641],[87.476,13.639],[91.849,18.631],[93.506,17.368],[106.083,18.687],[227.622,46.142]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[7.841,1.105],[20.246,-8.15],[-6.276,-1.275],[0,0],[-1.87,-0.45],[-15.404,14.933]],"o":[[-10.186,-1.455],[-0.141,0.057],[0,0],[0,0],[36.576,11.747],[-44.441,15.865]],"v":[[124.556,7.472],[87.997,16.241],[96.124,21.006],[114.955,14.874],[117.883,15.094],[238.918,5.673]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[7.743,0.302],[16.059,-5.587],[-4.622,-0.971],[0,0],[-1.87,-0.45],[-15.486,12.01]],"o":[[-10.759,-0.981],[-0.144,0.047],[0,0],[0,0],[38.17,6.345],[-45.017,14.323]],"v":[[126.314,5.056],[87.556,15.492],[94.414,18.849],[111.852,13.354],[117.125,12.761],[242.886,-3.49]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[7.646,-0.502],[11.873,-3.023],[-2.968,-0.666],[0,0],[-1.87,-0.45],[-15.568,9.088]],"o":[[-11.333,-0.506],[-0.147,0.037],[0,0],[0,0],[39.765,0.943],[-45.593,12.781]],"v":[[128.073,2.64],[85.43,11.775],[91.021,13.724],[107.762,10.05],[115.47,9.355],[246.855,-12.652]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[7.478,-1.876],[18.687,-3.042],[-0.139,-0.146],[0,0],[-1.87,-0.45],[-15.707,4.088]],"o":[[-12.315,0.306],[-0.15,0.024],[0,0],[0,0],[42.494,-8.299],[-46.577,10.143]],"v":[[131.081,-1.493],[76.123,10.68],[98.807,5.691],[101.678,4.897],[113.039,2.587],[253.645,-28.327]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[7.186,-0.855],[16.356,-2.004],[-1.943,0.232],[0,0],[-1.857,0.224],[-14.135,1.782]],"o":[[-17.388,2.07],[-0.148,0.018],[0,0],[0,0],[44.096,-5.325],[-47.253,5.842]],"v":[[129.398,0.533],[75.97,7.078],[94.017,4.892],[96.689,4.564],[113.875,2.455],[245.383,-14.401]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[6.66,1.439],[11.21,-2.697],[-6.292,-0.242],[0,0],[-1.87,-0.45],[-10.761,12.501]],"o":[[-29.905,-6.486],[-0.148,0.036],[0,0],[0,0],[49.002,13.819],[-50.083,19.14]],"v":[[124.758,3.902],[79.446,5.096],[87.818,12.215],[89.145,12.854],[114.844,9.294],[233.933,1.849]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[5.878,5.25],[11.974,-3.778],[-6.292,-0.242],[0,0],[-2.36,-4.658],[-12.09,12.326]],"o":[[-18.058,-12.489],[-0.145,0.045],[0,0],[0,0],[45.688,46.423],[-68.323,15.011]],"v":[[111.362,16.161],[73.477,12.944],[81.018,21.082],[88.148,19.913],[102.247,20.108],[216.191,37.998]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[5.488,7.156],[12.356,-4.318],[-6.292,-0.242],[0,0],[-2.604,-6.762],[-12.755,12.238]],"o":[[-12.135,-15.491],[-0.144,0.05],[0,0],[0,0],[44.03,62.725],[-77.443,12.946]],"v":[[104.664,22.29],[68.557,15.218],[76.514,22.366],[86.311,20.777],[94.609,22.849],[207.321,56.073]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[18.288,-2.795],[-6.292,-0.242],[0,0],[0.237,-7.898],[0,0]],"o":[[0.167,-14.975],[-0.15,0.023],[0,0],[0,0],[-2.918,97.078],[-70.882,-6.782]],"v":[[87.13,19.355],[59.251,4.353],[67.492,13.552],[74.868,13.438],[78.71,20.184],[153.1,113.631]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[26.048,-1.36],[-0.115,-1.164],[0,0],[0.428,-7.898],[0,0]],"o":[[0.302,-14.975],[-0.272,0.014],[0,0],[0,0],[-5.259,97.078],[-88.333,-6.282]],"v":[[76.669,18.609],[39.533,4.082],[39.158,13.675],[58.542,13.438],[65.465,20.184],[157.877,113.631]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.160784319043,0.113725490868,0.117647059262,1]},"o":{"a":0,"k":40},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[-2.667,31.679],[8.801,7.575],[-2.64,2.425],[2.854,25.462],[25.738,-10.222],[-5.182,-17.69],[20.261,-11.085],[7.347,-27.444],[16.96,-5.513]],"o":[[2.154,-25.627],[-2.717,-2.339],[8.653,-7.948],[-4.411,-39.434],[35.422,-8.306],[8.019,27.26],[26.814,20.304],[-4.616,17.289],[16.674,-4.621]],"v":[[210.135,41.311],[187.876,-9.128],[187.726,-18.086],[208.898,-69.471],[138.351,-118.02],[199.927,-80.611],[174.745,-13.197],[201.568,53.124],[166.833,89.765]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0.311,27.399],[6.289,7.575],[-1.887,2.425],[2.035,25.463],[23.421,-9.437],[-3.718,-17.686],[14.479,-11.086],[5.236,-27.447],[21.552,-9.585]],"o":[[-0.251,-22.15],[-1.942,-2.339],[6.184,-7.948],[-3.152,-39.434],[31.213,-7.285],[5.731,27.26],[19.162,20.304],[-3.298,17.289],[26.649,-2.526]],"v":[[187.19,38.956],[166.303,-7.711],[165.565,-16.672],[184.047,-68.467],[129.583,-116.918],[176.175,-79.283],[155.237,-11.788],[177.348,54.452],[145.771,94.11]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.484,"y":0},"t":56,"s":[{"i":[[0.311,27.399],[6.289,7.575],[-1.887,2.425],[2.035,25.463],[23.421,-9.437],[-3.718,-17.686],[14.479,-11.086],[5.236,-27.447],[21.552,-9.585]],"o":[[-0.251,-22.15],[-1.942,-2.339],[6.184,-7.948],[-3.152,-39.434],[31.213,-7.285],[5.731,27.26],[19.162,20.304],[-3.298,17.289],[26.649,-2.526]],"v":[[187.19,38.956],[166.303,-7.711],[165.565,-16.672],[184.047,-68.467],[129.583,-116.918],[176.175,-79.283],[155.237,-11.788],[177.348,54.452],[145.771,94.11]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[14.802,15.017],[7.244,1.651],[-0.427,2.471],[17.029,14.935],[13.957,-25.898],[-20.586,-22.232],[5.058,-13.323],[-9.887,-14.63],[20.405,-17.347]],"o":[[-14.383,-13.015],[-2.237,-0.51],[1.401,-8.098],[-25.161,-23.135],[25.036,-23.783],[14.779,15.96],[16.997,8.551],[7.036,9.467],[18.553,-9.562]],"v":[[203.542,6.948],[168.102,-13.492],[166.629,-19.235],[148.057,-58.444],[70.29,-65.609],[149.117,-53.422],[162,-13.907],[204.84,12.887],[206.242,53.983]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[14.802,4.571],[8.355,0.503],[-0.493,0.752],[12.478,4.627],[13.957,-7.883],[-10.6,-2.836],[1.179,-1.433],[-9.887,-4.453],[20.405,-5.28]],"o":[[-14.383,-3.961],[-2.58,-0.155],[1.615,-2.465],[-25.161,-7.042],[25.036,-7.239],[16.339,4.371],[19.603,2.603],[7.036,2.882],[18.553,-2.911]],"v":[[211.192,-7.517],[160.59,-15.757],[150.531,-17.512],[134.972,-23.027],[53.919,-24.913],[130.508,-20.058],[147.611,-15.083],[206.573,-4.836],[211.749,5.876]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[16.362,-3.598],[9.242,-1.999],[-0.548,0.106],[13.791,-3.045],[15.468,-3.207],[-11.72,2.57],[1.309,-0.259],[-10.925,2.424],[22.595,-4.784]],"o":[[-15.901,3.489],[-2.854,0.617],[1.795,-0.348],[-27.816,6.105],[27.724,-5.858],[18.064,-3.961],[21.681,-4.712],[7.775,-1.721],[20.538,-4.378]],"v":[[227.037,-22.941],[179.288,-12.533],[168.164,-10.108],[150.967,-6.316],[61.564,13.419],[146.018,-5.297],[164.926,-9.449],[221.918,-21.88],[227.609,-23.277]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[15.898,-1.935],[8.978,-1.098],[-0.324,0.04],[13.4,-1.636],[13.744,-1.724],[-11.387,1.386],[1.271,-0.159],[-10.617,1.289],[21.943,-2.7]],"o":[[-15.449,1.881],[-2.772,0.339],[1.31,-0.161],[-26.065,3.182],[26.924,-3.315],[17.551,-2.137],[21.063,-2.572],[7.555,-0.917],[19.947,-2.449]],"v":[[219.705,-10.588],[174.883,-5.115],[161.536,-3.488],[144.834,-1.46],[60.553,8.872],[142.491,-1.153],[160.758,-3.387],[215.272,-10.039],[222.484,-10.882]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[14.802,4.571],[8.355,0.503],[0.447,0.781],[12.478,4.627],[8.192,-14.55],[-10.6,-2.836],[1.179,-1.433],[-9.887,-4.453],[20.405,-5.28]],"o":[[-14.383,-3.961],[-2.58,-0.155],[-0.346,0.061],[-20.805,-4.244],[25.036,-7.239],[16.339,4.371],[19.603,2.603],[7.036,2.882],[18.553,-2.911]],"v":[[196.281,-13.326],[160.203,-19.966],[138.635,-20.637],[123.11,-26.662],[53.919,-24.913],[129.799,-21.188],[146.438,-20.157],[194.099,-11.088],[206.85,2.527]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[11.001,15.334],[7.158,2.62],[-0.779,2.116],[12.331,13.383],[7.461,-10.455],[-8.078,-9.71],[7.009,-10.969],[-11.677,-16.28],[20.452,-12.503]],"o":[[-10.909,-13.505],[-2.21,-0.809],[2.553,-6.936],[-19.175,-22.595],[20.1,-11.063],[12.451,14.966],[16.144,10.284],[7.001,9.242],[24.294,-6.258]],"v":[[189.453,2.433],[157.955,-21.499],[155.906,-25.052],[137.504,-62.581],[83.69,-77.287],[133.388,-58.817],[149.733,-20.757],[187.592,9.372],[186.4,48.428]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0.311,27.399],[6.289,7.575],[-1.887,2.425],[2.035,25.463],[23.421,-9.437],[-3.718,-17.686],[14.479,-11.086],[5.236,-27.447],[21.552,-9.585]],"o":[[-0.251,-22.15],[-1.942,-2.339],[6.184,-7.948],[-3.152,-39.434],[31.213,-7.285],[5.731,27.26],[19.162,20.304],[-3.298,17.289],[26.649,-2.526]],"v":[[187.19,38.956],[166.303,-7.711],[165.565,-16.672],[184.047,-68.467],[129.583,-116.918],[176.175,-79.283],[155.237,-11.788],[177.348,54.452],[145.771,94.11]],"c":true}]},{"t":144,"s":[{"i":[[-2.667,31.679],[8.801,7.575],[-2.64,2.425],[2.854,25.462],[25.738,-10.222],[-5.182,-17.69],[20.261,-11.085],[7.347,-27.444],[16.96,-5.513]],"o":[[2.154,-25.627],[-2.717,-2.339],[8.653,-7.948],[-4.411,-39.434],[35.422,-8.306],[8.019,27.26],[26.814,20.304],[-4.616,17.289],[16.674,-4.621]],"v":[[210.135,41.311],[187.876,-9.128],[187.726,-18.086],[208.898,-69.471],[138.351,-118.02],[199.927,-80.611],[174.745,-13.197],[201.568,53.124],[166.833,89.765]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.160784313725,0.113725490196,0.117647058824,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.160784313725,0.113725490196,0.117647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 11","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-0.51,-5.184],[0,0],[-0.046,-3.77],[-94.484,-5.301],[0.285,23.278],[0,0],[46.529,1.407],[0,0],[3.78,-0.046],[0,0],[-0.29,-7.469],[0,0],[0.25,20.429],[-36,-9.56],[-5.041,-17.19],[17.992,-11.476],[7.134,-26.679],[17.19,-5.021],[0.42,34.288],[-15.653,9.556]],"o":[[0.466,11.719],[0,0],[3.78,-0.046],[0,0],[63.168,3.544],[0,0],[-0.57,-46.556],[-79.818,-2.414],[0.046,3.77],[0,0],[0.133,2.842],[0,0],[-24.694,-17.515],[-0.42,-34.287],[17.308,4.598],[7.785,26.497],[21.164,10.792],[-4.619,17.298],[-35.755,10.439],[-0.239,-19.51],[0,0]],"v":[[37.61,-16.212],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107],[232.173,28.793],[231.125,-56.82],[146.809,-140.094],[64.678,-44.131],[57.922,-37.218],[36.796,-36.96],[37.61,-16.212],[124.838,-11.724],[94.651,-62],[162.392,-113.813],[198.516,-78.612],[172.082,-13.09],[200.107,51.378],[164.856,87.452],[95.867,37.313],[124.838,-11.724]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-11.32,-0.253],[0,0],[-0.026,-3.77],[-74.947,-5.301],[0.226,23.278],[0,0],[36.908,1.407],[0,0],[2.097,-0.046],[0,0],[-0.161,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[-3.609,-17.188],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.259,11.719],[0,0],[2.097,-0.046],[0,0],[50.106,3.544],[0,0],[-0.452,-46.556],[-63.314,-2.414],[0.026,3.77],[0,0],[-14.304,2.229],[0,0],[-19.588,-17.515],[-0.333,-34.287],[13.729,4.598],[5.563,26.497],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[51.252,-11.266],[67.492,13.552],[74.868,13.438],[78.71,20.184],[146.789,114.107],[212.033,28.793],[211.202,-56.82],[144.32,-140.094],[78.273,-44.131],[74.524,-37.218],[66.181,-37.083],[51.252,-11.266],[120.928,-11.683],[97.972,-63.405],[148.083,-115.705],[175.166,-77.284],[153.334,-11.681],[179.376,52.548],[149.242,91.489],[97.074,36.797],[120.928,-11.683]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0,0],[-6.708,-0.22],[0,0],[-0.026,-3.77],[-74.947,-5.301],[0.226,23.278],[0,0],[36.908,1.407],[0,0],[2.097,-0.046],[0,0],[-0.083,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[-3.609,-17.188],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.134,11.719],[0,0],[2.097,-0.046],[0,0],[50.106,3.544],[0,0],[-0.452,-46.556],[-63.314,-2.414],[0.026,3.77],[0,0],[-9.328,4.297],[0,0],[-19.588,-17.515],[-0.333,-34.287],[13.729,4.598],[5.563,26.497],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[56.637,-11.607],[71.06,12.932],[74.868,13.438],[78.71,20.184],[146.789,114.107],[212.033,28.793],[211.202,-56.82],[144.32,-140.094],[78.273,-44.131],[74.524,-37.218],[66.788,-36.973],[56.637,-11.607],[120.928,-11.683],[97.972,-63.405],[148.083,-115.705],[175.166,-77.284],[153.335,-11.681],[179.376,52.548],[149.242,91.489],[97.074,36.797],[120.928,-11.683]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[0,0],[-5.284,-0.144],[0,0],[-0.17,-3.916],[-72.305,-1.203],[7.033,25.194],[0,0],[36.948,-2.218],[0,0],[1.628,-0.545],[0,0],[-0.616,-7.394],[0,0],[0.736,19.512],[-26.729,-6.897],[-4.742,-15.507],[10.856,-11.089],[1.355,-22.607],[18.725,-3.151],[2.656,30.935],[-9.224,9.016]],"o":[[-0.137,11.803],[0,0],[1.641,-0.11],[0,0],[46.641,0.092],[0,0],[-8.409,-44.679],[-56.068,3.065],[0.059,3.314],[0.133,0.376],[-7.954,5.62],[0,0],[-21.401,-12.664],[-0.835,-29.871],[16.921,3.533],[6.178,22.037],[15.329,10.03],[2.398,18.106],[-25.634,8.317],[-1.775,-18.18],[0,0]],"v":[[59.189,-5.918],[75.3,13.739],[78.197,13.496],[83.157,19.711],[161.139,104.425],[213.476,22.373],[201.715,-54.755],[126.354,-126.442],[73.072,-42.73],[71.533,-35.708],[67.79,-32.64],[59.204,-5.895],[121.936,-10.305],[90.965,-59.356],[135.8,-106.12],[169.425,-69.684],[155.017,-11.773],[185.338,43.041],[158.061,82.692],[105.052,34.205],[121.944,-10.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[0,0],[-2.104,0.026],[0,0],[-0.492,-4.244],[-66.409,7.945],[22.226,29.471],[0,0],[37.038,-10.31],[0,0],[0.579,-1.657],[0,0],[-1.805,-7.226],[0,0],[1.937,17.466],[-22.656,-0.942],[-7.27,-11.756],[6.388,-10.225],[-6.986,-13.512],[30.083,1.02],[7.84,23.453],[-2.1,7.81]],"o":[[-0.74,11.991],[0,0],[0.621,-0.253],[0,0],[38.905,-7.613],[0,0],[-26.169,-40.487],[-39.894,15.293],[0.132,2.297],[0.43,1.216],[-3.83,5.742],[0,0],[-25.449,-1.836],[-1.955,-20.012],[24.047,1.156],[7.552,12.083],[15.786,8.331],[15.118,19.909],[-19.546,3.582],[-5.314,-15.213],[0,0]],"v":[[70.64,2.287],[86.348,17.646],[87.367,17.122],[97.172,21.538],[193.17,82.814],[216.695,8.041],[180.541,-50.145],[86.253,-95.968],[61.463,-39.603],[64.859,-32.336],[72.772,-18.832],[70.512,2.44],[124.186,-7.23],[75.325,-50.319],[108.384,-84.727],[156.611,-52.721],[158.773,-11.976],[198.644,21.819],[177.747,63.056],[122.861,28.42],[124.211,-7.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-1.045,0.082],[0,0],[-0.6,-4.353],[-64.443,10.994],[27.291,30.896],[0,0],[37.068,-13.007],[0,0],[0.229,-2.028],[0,0],[-2.201,-7.171],[0,0],[2.337,16.785],[-21.298,1.042],[-8.113,-10.506],[4.899,-9.937],[-9.766,-10.481],[33.87,2.41],[9.568,20.959],[0.274,7.409]],"o":[[4.025,8.533],[0,0],[0.281,-0.3],[0,0],[36.326,-10.181],[0,0],[-32.089,-39.09],[-34.502,19.369],[0.157,1.958],[0.529,1.496],[-2.456,5.783],[0,0],[-26.799,1.774],[-2.329,-16.726],[26.422,0.363],[8.009,8.765],[15.938,7.764],[19.358,20.511],[-17.516,2.004],[-6.493,-14.224],[0,0]],"v":[[76.777,8.238],[90.031,18.948],[90.424,18.331],[101.844,22.147],[203.847,75.61],[217.768,3.264],[173.483,-48.608],[72.886,-85.81],[57.594,-38.56],[62.634,-31.212],[74.432,-14.23],[76.837,8.331],[124.936,-6.205],[70.112,-47.307],[99.246,-77.596],[152.339,-47.066],[160.025,-12.044],[203.079,14.745],[184.309,56.51],[128.797,26.491],[124.966,-6.338]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[0,0],[-3.628,0.49],[0,0],[-0.6,-4.353],[-57.343,14.119],[28.667,23.607],[0,0],[33.868,-12.114],[0,0],[-1.085,-2.346],[0,0],[-3.085,-5.259],[0,0],[7.418,13.175],[-21.298,1.042],[-9.362,-8.699],[3.145,-6.78],[-9.155,-7.979],[31.74,0.123],[12.986,15.018],[0.274,7.408]],"o":[[-0.526,7.052],[0,0],[0.721,-0.107],[0,0],[29.378,-10.464],[0,0],[-26.443,-26.627],[-28.7,14.018],[0.412,2.492],[1.386,1.593],[7.065,5.588],[0,0],[-26.799,1.774],[-6.884,-12.957],[23.973,-0.425],[6.539,6.542],[15.064,5.595],[18.755,14.533],[-17.516,2.004],[-6.696,-9.857],[0,0]],"v":[[75.17,-5.819],[91.849,18.631],[91.983,17.802],[106.436,18.169],[214.586,53.413],[215.491,-2.609],[164.892,-42.462],[65.998,-68.56],[50.443,-33.02],[56.104,-25.495],[62.039,-22.099],[75.189,-5.716],[124.936,-6.205],[67.018,-37.824],[90.654,-60.699],[139.515,-39.069],[158.465,-12.675],[199.925,7.295],[190.857,39.912],[133.889,17.809],[124.951,-6.419]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-13.802,-2.189],[0,0],[-3.317,-0.188],[-43.141,20.369],[31.42,9.027],[0,0],[27.467,-10.326],[0,0],[-3.714,-2.982],[0,0],[-4.854,-1.436],[0,0],[17.579,5.957],[-21.298,1.042],[-11.86,-5.084],[-0.362,-0.465],[-7.932,-2.976],[27.479,-4.451],[19.823,3.138],[0.274,7.408]],"o":[[5.495,2.21],[0,0],[2.097,-0.046],[0,0],[15.482,-11.03],[0,0],[-15.151,-1.699],[-17.096,3.318],[0.923,3.559],[3.102,1.788],[1.665,-0.687],[0,0],[-26.799,1.774],[-15.994,-5.419],[19.074,-2.001],[3.597,2.098],[13.315,1.255],[17.551,2.579],[-17.516,2.004],[-7.101,-1.124],[0,0]],"v":[[76.626,-1.977],[95.616,20.852],[95.835,20.821],[119.988,15.241],[236.065,9.02],[210.938,-14.355],[147.709,-30.17],[52.221,-34.06],[36.141,-21.94],[43.044,-14.06],[49.57,-10.648],[76.565,-1.852],[124.936,-6.205],[60.829,-18.857],[73.469,-26.904],[113.867,-23.074],[155.344,-13.936],[193.617,-7.604],[203.954,6.715],[144.074,0.445],[124.921,-6.581]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":67,"s":[{"i":[[0,0],[-10.082,-1.599],[0,0],[-2.423,-0.137],[-31.516,14.88],[22.953,6.595],[0,0],[20.066,-7.544],[0,0],[-2.713,-2.178],[0,0],[-3.546,-1.049],[0,0],[12.842,4.351],[-15.559,0.762],[-8.664,-3.714],[-0.265,-0.339],[-5.795,-2.174],[20.074,-3.252],[14.481,2.292],[0.2,5.412]],"o":[[3.806,3.222],[0,0],[1.532,-0.033],[0,0],[11.31,-8.057],[0,0],[-11.068,-1.241],[-12.489,2.424],[0.674,2.6],[2.266,1.306],[1.216,-0.502],[0,0],[-19.577,1.296],[-11.684,-3.959],[13.934,-1.462],[2.628,1.533],[9.727,0.917],[12.822,1.884],[-12.796,1.464],[-5.187,-0.821],[0,0]],"v":[[78.168,1.736],[93.89,18.685],[93.608,18.626],[120.583,12.369],[243.486,-1.559],[216.054,-16.513],[149.101,-23.779],[55.587,-21.436],[40.67,-11.866],[45.298,-6.026],[51.657,-3.962],[78.126,1.79],[125.208,-4.762],[64.256,-10.92],[74.467,-16.915],[115.85,-16.812],[155.048,-11.963],[192.458,-9.111],[199.944,1.106],[144.702,-1.258],[125.193,-5.138]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-6.363,-1.009],[0,0],[-1.529,-0.087],[-19.89,9.391],[14.486,4.162],[0,0],[12.664,-4.761],[0,0],[-1.712,-1.375],[0,0],[-2.238,-0.662],[0,0],[8.105,2.746],[-9.82,0.481],[-5.468,-2.344],[-0.167,-0.214],[-3.657,-1.372],[12.669,-2.052],[9.139,1.447],[0.127,3.416]],"o":[[2.117,4.234],[0,0],[0.967,-0.021],[0,0],[7.138,-5.085],[0,0],[-6.985,-0.783],[-7.882,1.53],[0.426,1.641],[1.43,0.825],[0.768,-0.317],[0,0],[-12.355,0.818],[-7.374,-2.499],[8.794,-0.923],[1.658,0.967],[6.139,0.579],[8.092,1.189],[-8.076,0.924],[-3.274,-0.518],[0,0]],"v":[[81.375,4.478],[90.48,13.549],[89.697,13.463],[120.084,7.424],[250.906,-12.137],[221.17,-18.672],[149.882,-14.659],[58.953,-8.812],[45.2,-1.792],[47.551,2.007],[53.744,2.725],[81.351,4.46],[125.481,-3.319],[67.683,-2.983],[75.464,-6.926],[117.833,-10.55],[154.751,-9.989],[191.298,-10.618],[195.934,-4.503],[145.329,-2.96],[125.466,-3.695]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[68.722,11.737],[106.4,3.589],[96.597,5.365],[120.165,0.738],[263.602,-30.235],[229.923,-22.365],[152.877,-6.454],[64.711,12.787],[52.949,15.443],[51.407,15.75],[57.314,14.166],[68.731,11.597],[125.948,-0.85],[73.547,10.597],[77.171,10.163],[121.226,0.164],[154.243,-6.613],[189.315,-13.196],[189.073,-14.1],[146.403,-5.874],[125.933,-1.226]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0,0],[-2.212,0.263],[0,0],[-0.178,0.005],[-12.639,1.633],[9.219,-1.076],[0,0],[8.054,-0.988],[0,0],[-1.091,0.12],[0,0],[-0.393,0.02],[0,0],[5.158,-0.598],[-5.394,0.656],[-4.448,0.53],[-0.106,0.013],[-2.327,0.276],[8.058,-0.981],[5.815,-0.688],[0.084,0.017]],"o":[[0.338,-0.008],[0,0],[0.615,-0.074],[0,0],[4.536,-0.586],[0,0],[-4.444,0.528],[-5.013,0.615],[0.272,-0.02],[0.91,-0.103],[0.488,-0.061],[0,0],[-7.859,0.952],[-4.693,0.545],[5.593,-0.68],[2.044,-0.243],[4.506,-0.544],[5.149,-0.61],[-5.136,0.625],[-2.083,0.246],[0,0]],"v":[[68.45,7.951],[99.326,4.236],[93.953,4.892],[119.319,1.787],[249.089,-14.689],[222.78,-10.961],[151.356,-2.277],[61.692,8.661],[48.756,10.285],[49.705,10.202],[55.751,9.474],[68.474,7.947],[126.91,0.794],[70.786,7.61],[76.763,6.845],[118.967,1.695],[149.665,-2.027],[189.099,-6.807],[191.312,-7.017],[145.399,-1.438],[126.894,0.792]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[-7.541,-0.848],[0,0],[-0.6,-4.353],[-43.141,20.369],[31.42,9.027],[0,0],[27.467,-10.326],[0,0],[-3.714,-2.982],[0,0],[-7.709,-1.72],[0,0],[17.579,5.957],[-18.394,-0.709],[-15.163,-2.017],[-0.362,-0.465],[-7.932,-2.976],[27.479,-4.451],[19.823,3.138],[0.274,7.408]],"o":[[1.14,8.987],[0,0],[2.097,-0.046],[0,0],[15.482,-11.03],[0,0],[-15.151,-1.699],[-17.096,3.318],[0.923,3.559],[3.102,1.788],[1.665,-0.687],[0,0],[-26.799,1.774],[-15.994,-5.419],[19.074,-2.001],[6.967,0.634],[15.364,-0.698],[17.551,2.579],[-17.516,2.004],[-7.101,-1.124],[0,0]],"v":[[71.535,-4.283],[87.818,12.215],[87.056,12.931],[116.414,9.891],[233.296,3.535],[207.501,-17.969],[147.709,-30.17],[52.221,-34.06],[36.141,-21.94],[43.044,-14.06],[49.57,-10.648],[69.738,-4.147],[128.536,-7.866],[62.136,-17.206],[73.89,-28.743],[112.738,-25.135],[138.664,-17.074],[189.483,-11.595],[197.582,5.648],[142.789,1.685],[128.521,-8.242]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[{"i":[[0,0],[-8.786,-1.21],[0,0],[-0.543,-4.296],[-46.55,18.762],[28.858,11.12],[0,0],[28.2,-10.969],[0,0],[-3.142,-2.693],[0,0],[-6.531,-2.676],[0,0],[15.868,7.381],[-19.796,-0.694],[-13.8,-3.72],[0.939,-1.549],[-7.886,-4.814],[26.116,-4.507],[17.765,5.26],[-0.391,7.932]],"o":[[2.227,5.617],[0,0],[2.097,-0.046],[0,0],[17.707,-10.093],[0,0],[-16.698,-7.016],[-21.281,5.876],[0.835,3.58],[2.796,1.612],[0.892,-0.462],[0,0],[-26.49,0.808],[-14.452,-8.262],[18.548,-1.351],[6.762,1.903],[15.201,0.567],[16.273,4.234],[-18.584,2.835],[-6.42,-2.934],[0,0]],"v":[[71.31,-5.124],[85.872,14.266],[85.596,14.976],[112.227,12.381],[226.468,13.595],[207.469,-13.928],[149.979,-34.692],[56.201,-44.327],[40.122,-24.128],[46.762,-15.804],[51.749,-13.369],[68.152,-4.901],[125.974,-8.417],[64.077,-21.125],[77.61,-37.047],[116.577,-30.288],[140.326,-17.559],[189.176,-7.764],[195.03,12.93],[138.133,4.336],[125.961,-8.756]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[-12.522,-2.298],[0,0],[-0.374,-4.124],[-56.777,13.942],[21.175,17.397],[0,0],[30.398,-12.896],[0,0],[-1.425,-1.826],[0,0],[-2.995,-5.545],[0,0],[10.734,11.656],[-24.002,-0.647],[-9.712,-8.828],[4.844,-4.801],[-7.749,-10.329],[22.028,-4.675],[11.594,11.625],[-2.387,9.502]],"o":[[-4.886,7.547],[0,0],[2.097,-0.046],[0,0],[24.381,-7.282],[0,0],[-21.339,-22.968],[-33.836,13.552],[0.57,3.642],[1.88,1.084],[-1.425,0.214],[0,0],[-25.565,-2.088],[-9.827,-16.788],[16.969,0.598],[6.148,5.71],[14.711,4.36],[12.439,9.2],[-21.787,5.326],[-4.379,-8.365],[0,0]],"v":[[63.979,-7.237],[80.033,20.42],[81.214,21.113],[99.668,19.852],[205.985,43.773],[207.371,-1.804],[156.787,-48.257],[68.139,-75.13],[52.067,-30.691],[57.913,-21.037],[58.286,-21.53],[63.396,-7.164],[118.29,-10.071],[69.9,-32.883],[88.769,-61.959],[128.097,-45.748],[145.31,-19.013],[188.257,3.731],[187.375,34.777],[124.163,12.29],[118.28,-10.298]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[-7.493,-0.563],[0,0],[-0.261,-4.008],[-63.595,10.729],[16.052,21.582],[0,0],[31.864,-14.181],[0,0],[-0.281,-1.248],[0,0],[-0.638,-7.457],[0,0],[7.312,14.505],[-26.806,-0.616],[-6.986,-12.234],[7.447,-6.969],[-7.657,-14.005],[19.302,-4.786],[7.479,15.869],[-3.718,10.549]],"o":[[0.619,10.601],[0,0],[2.097,-0.046],[0,0],[28.831,-5.408],[0,0],[-24.432,-33.602],[-42.206,18.67],[0.393,3.684],[1.269,0.732],[-2.97,0.664],[0,0],[-24.948,-4.018],[-6.743,-22.472],[15.917,1.897],[5.738,8.247],[14.384,6.889],[9.883,12.511],[-23.923,6.987],[-3.018,-11.985],[0,0]],"v":[[60.2,-8.714],[75.036,21.373],[77.188,22.054],[89.956,22.166],[192.33,63.892],[207.306,6.278],[161.327,-57.301],[76.098,-95.665],[60.03,-35.066],[65.347,-24.525],[62.644,-26.97],[60.225,-8.673],[113.167,-11.173],[73.782,-40.721],[96.208,-78.567],[135.776,-56.055],[148.633,-19.983],[187.644,11.393],[182.272,49.341],[114.85,17.592],[113.16,-11.327]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[-7.541,-0.848],[0,0],[-0.026,-3.77],[-74.947,-5.301],[0.226,23.278],[0,0],[36.908,1.407],[0,0],[2.097,-0.046],[0,0],[-0.161,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[-3.609,-17.188],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.259,11.719],[0,0],[2.097,-0.046],[0,0],[50.106,3.544],[0,0],[-0.452,-46.556],[-63.314,-2.414],[0.026,3.77],[0,0],[-9.789,2.407],[0,0],[-19.588,-17.515],[-0.333,-34.287],[13.729,4.598],[5.563,26.497],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[55.036,-11.288],[67.492,13.552],[74.868,13.438],[78.71,20.184],[146.789,114.107],[212.033,28.793],[211.202,-56.82],[144.32,-140.094],[78.273,-44.131],[74.524,-37.218],[66.181,-37.083],[55.036,-11.288],[120.928,-11.683],[97.972,-63.405],[148.083,-115.705],[175.166,-77.284],[153.335,-11.681],[179.376,52.548],[149.242,91.489],[97.074,36.797],[120.928,-11.683]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[-0.51,-5.184],[0,0],[-0.046,-3.77],[-94.484,-5.301],[0.285,23.278],[0,0],[46.529,1.407],[0,0],[3.78,-0.046],[0,0],[-0.29,-7.469],[0,0],[0.25,20.429],[-36,-9.56],[-5.041,-17.19],[17.992,-11.476],[7.134,-26.679],[17.19,-5.021],[0.42,34.288],[-15.653,9.556]],"o":[[0.466,11.719],[0,0],[3.78,-0.046],[0,0],[63.168,3.544],[0,0],[-0.57,-46.556],[-79.818,-2.414],[0.046,3.77],[0,0],[0.133,2.842],[0,0],[-24.694,-17.515],[-0.42,-34.287],[17.308,4.598],[7.785,26.497],[21.164,10.792],[-4.619,17.298],[-35.755,10.439],[-0.239,-19.51],[0,0]],"v":[[37.61,-16.212],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107],[232.173,28.793],[231.125,-56.82],[146.809,-140.094],[64.678,-44.131],[57.922,-37.218],[36.796,-36.96],[37.61,-16.212],[124.838,-11.724],[94.651,-62],[162.392,-113.813],[198.516,-78.612],[172.082,-13.09],[200.107,51.378],[164.856,87.452],[95.867,37.313],[124.838,-11.724]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":9,"k":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.6,"y":0},"t":56,"s":[0,0.22,0.192,0.196,0.225,0.276,0.263,0.275,0.45,0.333,0.333,0.353,0.565,0.292,0.296,0.325,0.68,0.251,0.259,0.298,0.79,0.363,0.361,0.388,0.9,0.475,0.463,0.478,0.95,0.406,0.4,0.424,1,0.337,0.337,0.369]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":64,"s":[0,0.22,0.192,0.196,0.225,0.276,0.263,0.275,0.45,0.333,0.333,0.353,0.565,0.292,0.296,0.325,0.68,0.251,0.259,0.298,0.79,0.251,0.259,0.298,0.9,0.251,0.259,0.298,0.95,0.251,0.259,0.298,1,0.251,0.259,0.298]},{"i":{"x":0.39,"y":1},"o":{"x":0.3,"y":0},"t":87,"s":[0,0.22,0.192,0.196,0.225,0.276,0.263,0.275,0.45,0.333,0.333,0.353,0.565,0.292,0.296,0.325,0.68,0.251,0.259,0.298,0.79,0.251,0.259,0.298,0.9,0.251,0.259,0.298,0.95,0.251,0.259,0.298,1,0.251,0.259,0.298]},{"t":104,"s":[0,0.22,0.192,0.196,0.225,0.276,0.263,0.275,0.45,0.333,0.333,0.353,0.565,0.292,0.296,0.325,0.68,0.251,0.259,0.298,0.79,0.363,0.361,0.388,0.9,0.475,0.463,0.478,0.95,0.406,0.4,0.424,1,0.337,0.337,0.369]}]}},"s":{"a":1,"k":[{"i":{"x":0.7,"y":0.7},"o":{"x":0.6,"y":0.6},"t":56,"s":[-202.986,-10.731],"to":[0,0],"ti":[0,0]},{"i":{"x":0.7,"y":0.7},"o":{"x":0.167,"y":0.167},"t":64,"s":[-202.986,-10.731],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.167,"y":0.167},"t":87,"s":[-202.986,-10.731],"to":[0,0],"ti":[0,0]},{"t":104,"s":[-202.986,-10.731]}]},"e":{"a":1,"k":[{"i":{"x":0.7,"y":0.7},"o":{"x":0.6,"y":0.6},"t":56,"s":[239.658,-13.436],"to":[0,0],"ti":[0,0]},{"i":{"x":0.7,"y":0.7},"o":{"x":0.167,"y":0.167},"t":64,"s":[239.658,-13.436],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.167,"y":0.167},"t":87,"s":[239.658,-13.436],"to":[0,0],"ti":[0,0]},{"t":104,"s":[239.658,-13.436]}]},"t":1,"nm":"Gradient Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 12","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"HEAD BACK","parent":5,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.689],"y":[0.954]},"o":{"x":[0.484],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.833],"y":[0.992]},"o":{"x":[0.167],"y":[0.008]},"t":63,"s":[-18]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.167],"y":[0.019]},"t":66,"s":[-42]},{"i":{"x":[0.833],"y":[0.961]},"o":{"x":[0.946],"y":[0]},"t":73,"s":[-65]},{"i":{"x":[0.833],"y":[0.983]},"o":{"x":[0.167],"y":[0.017]},"t":87,"s":[-40]},{"i":{"x":[0.157],"y":[1]},"o":{"x":[0.167],"y":[0.031]},"t":93,"s":[-23]},{"t":104,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[135.874,-13.765,0],"to":[2.918,-0.02,0],"ti":[-2.918,0.02,0]},{"i":{"x":0.4,"y":0.4},"o":{"x":0.4,"y":0.4},"t":37,"s":[153.384,-13.887,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.54,"y":0.654},"o":{"x":0.5,"y":0},"t":56,"s":[153.384,-13.887,0],"to":[-1.253,-2.334,0],"ti":[0,0,0]},{"i":{"x":0.55,"y":1},"o":{"x":0.236,"y":0.593},"t":66,"s":[144.637,-30.182,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[142.799,-33.604,0],"to":[0,0,0],"ti":[1.506,-3.347,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[153.384,-13.887,0],"to":[-1.506,3.347,0],"ti":[3.27,-0.06,0]},{"t":144,"s":[133.766,-13.525,0]}]},"a":{"a":0,"k":[134.486,-12.946,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[-4.752,17.797],[21.774,11.103],[-2.177,1.179],[8.009,27.261],[17.807,4.731],[-0.432,-35.277],[-17.508,-8.922],[2.167,-1.179],[-0.257,-21.018],[-36.787,10.74]],"o":[[7.34,-27.449],[-2.205,-1.125],[21.496,-11.633],[-5.187,-17.685],[-37.038,-9.836],[0.257,21.018],[2.195,1.126],[-17.285,9.349],[0.432,35.277],[17.686,-5.166]],"v":[[201.569,53.13],[173.737,-10.703],[173.671,-16.115],[199.932,-80.611],[162.765,-116.827],[93.07,-63.518],[122.931,-15.494],[122.997,-10.082],[94.321,38.66],[165.301,90.246]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[-3.637,17.796],[16.637,11.109],[-1.664,1.179],[6.11,27.264],[13.609,4.729],[-0.33,-35.277],[-13.356,-8.962],[1.659,-1.174],[-0.197,-21.018],[-28.112,10.744]],"o":[[5.609,-27.449],[-1.685,-1.125],[16.428,-11.633],[-3.964,-17.685],[-28.306,-9.836],[0.197,21.018],[1.678,1.126],[-13.209,9.349],[0.33,35.277],[13.516,-5.166]],"v":[[178.79,54.087],[154.579,-9.666],[154.528,-15.077],[177.539,-79.654],[149.135,-115.87],[95.872,-62.562],[117.222,-14.496],[117.273,-9.085],[96.828,39.616],[151.073,91.202]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.629,"y":0},"t":56,"s":[{"i":[[-3.637,17.796],[16.637,11.109],[-1.664,1.179],[6.11,27.264],[13.609,4.729],[-0.33,-35.277],[-13.356,-8.962],[1.659,-1.174],[-0.197,-21.018],[-28.112,10.744]],"o":[[5.609,-27.449],[-1.685,-1.125],[16.428,-11.633],[-3.964,-17.685],[-28.306,-9.836],[0.197,21.018],[1.678,1.126],[-13.209,9.349],[0.33,35.277],[13.516,-5.166]],"v":[[178.79,54.087],[138.002,-10.939],[150.606,-25.546],[177.539,-79.654],[149.135,-115.87],[95.872,-62.562],[118.693,-14.537],[118.743,-9.125],[96.828,39.616],[151.073,91.202]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[1.732,13.799],[17.157,1.09],[-0.74,0.681],[7.042,13.641],[8.495,0.397],[-5.731,-27.089],[-13.459,-3.827],[0.554,-0.95],[-0.628,-9.558],[-13.703,6.107]],"o":[[-2.482,-20.903],[-1.646,-0.143],[16.124,-11.684],[-8.103,-10.315],[-17.668,-0.827],[4.488,18.687],[0.833,0.577],[-2.001,1.932],[1.316,30.153],[7.253,-3.233]],"v":[[187.164,36.253],[152.182,-1.9],[154.497,-3.96],[148.15,-55.007],[114.093,-84.727],[92.346,-43.599],[129.176,-8.912],[130.337,-4.17],[124.822,25.555],[181.196,57.921]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0.259,13.717],[0,0],[0,0],[7.127,6.928],[1.805,-0.975],[-11.645,-19.616],[0,0],[0.075,-0.799],[-2.363,-3.088],[-1.789,4.22]],"o":[[-8.08,-14.819],[0,0],[0,0],[-9.863,-12.694],[-0.181,0.497],[10.931,15.19],[0,0],[1.839,2.751],[14.632,19.465],[1.584,-3.736]],"v":[[172.698,49.648],[147.935,11.565],[140.562,-1.535],[114.164,-33.369],[89.429,-58.862],[102.054,-43.625],[125.346,-12.891],[126.548,-11.492],[142.602,8.685],[182.799,66.326]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[3.46,11.482],[0,0],[0,0],[5.026,6.856],[3.182,3.162],[-11.207,-14.07],[0,0],[-0.151,-0.739],[-1.334,-1.753],[-10.675,-10.36]],"o":[[-9.018,-14.458],[0,0],[0,0],[-8.889,-11.356],[0.063,0.063],[10.126,13.893],[0,0],[1.751,2.518],[8.269,11.044],[-0.443,-2.765]],"v":[[166.231,58.18],[136.076,16.86],[127.313,4.839],[106.735,-22.151],[73.226,-59.224],[96.01,-34.64],[117.746,-6.588],[118.794,-5.31],[133.758,13.864],[182.407,81.268]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":70,"s":[{"i":[[6.662,9.247],[0,0],[0,0],[4.628,5.687],[4.559,7.3],[-10.348,-12.796],[0,0],[-0.376,-0.68],[-0.304,-0.419],[-19.562,-24.94]],"o":[[-9.956,-14.097],[0,0],[0,0],[-7.915,-10.017],[-4.67,-6.11],[9.321,12.596],[0,0],[1.663,2.285],[1.906,2.623],[-2.47,-1.794]],"v":[[159.764,66.712],[126.749,20.649],[118.073,8.628],[101.25,-13.471],[55.41,-76.99],[91.843,-25.866],[110.146,-0.284],[111.039,0.871],[124.913,19.044],[182.016,96.211]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[7.818,8.435],[0,0],[0,0],[6.373,9.848],[6.576,20.649],[-11.309,-16.043],[0,0],[-0.458,-0.655],[0,0],[-31.484,-24.808]],"o":[[-13.794,-15.623],[0,0],[0,0],[-13.253,-19.524],[2.395,10.632],[7.866,13.852],[0,0],[1.679,2.182],[0,0],[-3.126,-1.449]],"v":[[156.18,75.536],[115.459,28.866],[106.659,16.247],[91.386,-4.514],[51.696,-80.921],[82.518,-17.848],[99.686,7.861],[100.553,8.961],[114.13,27.491],[184.277,101.19]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[6.138,9.608],[0,0],[0,0],[4.967,5.746],[6.023,7.695],[-11.843,-16.5],[0,0],[-0.339,-0.687],[-0.525,-0.686],[-17.824,-16.987]],"o":[[-9.967,-14.024],[0,0],[0,0],[-8.27,-10.615],[-1.987,-1.411],[9.669,12.725],[0,0],[1.714,2.309],[3.251,4.325],[-1.984,-1.957]],"v":[[158.418,69.152],[122.909,24.299],[114.193,12.296],[95.992,-9.561],[50.525,-69.262],[84.134,-24.819],[104.948,1.099],[105.89,2.266],[121.795,23.914],[181.054,92.246]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0.259,13.717],[0,0],[0,0],[7.127,6.928],[5.63,10.352],[-11.645,-19.616],[0,0],[0.075,-0.799],[-2.363,-3.088],[-2.271,4.22]],"o":[[-8.08,-14.819],[0,0],[0,0],[-9.863,-12.694],[-6.073,-11.166],[10.931,15.19],[0,0],[1.839,2.751],[14.632,19.465],[2.011,-3.736]],"v":[[171.196,43.629],[147.935,11.565],[140.562,-1.535],[115.071,-29.625],[84.717,-56.369],[86.295,-48.191],[116.887,-15.467],[118.089,-14.067],[142.991,19.313],[186.158,67.547]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0.433,13.376],[14.909,2.27],[-0.7,0.601],[5.086,13.603],[7.393,0.987],[-2.886,-20.152],[-11.462,-4.635],[0.559,-0.873],[-2.225,-10.247],[-22.709,13.549]],"o":[[-0.532,-20.252],[-1.427,-0.255],[15.007,-10.072],[-6.273,-10.484],[-15.376,-2.053],[2.458,13.931],[0.683,0.614],[-1.9,1.713],[5.469,26.965],[10.336,-6.167]],"v":[[161.902,29.123],[134.319,-10.013],[136.504,-11.827],[140.178,-62.31],[107.52,-92.277],[89.762,-59.375],[115.693,-24.84],[116.335,-20.203],[106.504,8.172],[162.163,41.057]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[-3.637,17.796],[16.637,11.109],[-1.664,1.179],[6.11,27.264],[13.609,4.729],[-0.33,-35.277],[-13.356,-8.962],[1.659,-1.174],[-0.197,-21.018],[-28.112,10.744]],"o":[[5.609,-27.449],[-1.685,-1.125],[16.428,-11.633],[-3.964,-17.685],[-28.306,-9.836],[0.197,21.018],[1.678,1.126],[-13.209,9.349],[0.33,35.277],[13.516,-5.166]],"v":[[178.79,54.087],[138.002,-10.939],[151.887,-25.508],[177.539,-79.654],[149.135,-115.87],[95.872,-62.562],[118.693,-14.537],[118.743,-9.125],[96.828,39.616],[151.073,91.202]],"c":true}]},{"t":144,"s":[{"i":[[-4.947,18.501],[22.635,11.55],[-2.264,1.225],[8.313,28.346],[18.514,4.916],[-0.449,-36.676],[-18.179,-9.322],[2.256,-1.22],[-0.268,-21.851],[-38.244,11.17]],"o":[[7.631,-28.538],[-2.293,-1.17],[22.349,-12.094],[-5.392,-18.387],[-38.507,-10.226],[0.268,21.852],[2.282,1.17],[-17.97,9.719],[0.449,36.676],[18.387,-5.37]],"v":[[209.915,58.23],[190.667,-5.857],[190.599,-11.483],[204.372,-86.428],[163.241,-120.951],[84.842,-67.7],[108.163,-15.291],[108.231,-9.665],[83.109,43.145],[166.556,100.306]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[0.176470588235,0.176470588235,0.20000001496,1]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":73,"s":[0.176470592618,0.133333340287,0.141176477075,1]},{"t":104,"s":[0.176470588235,0.176470588235,0.20000001496,1]}]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 13","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[-0.632,46.076],[0,0],[46.548,0.389],[-3.006,-69.202],[3.78,-0.046],[0,0],[-0.905,-9.203],[0,0],[-0.177,-4.041],[-48.489,-0.183]],"o":[[0,0],[-0.57,-46.556],[-36.92,-0.309],[0.046,3.77],[0,0],[0.357,7.639],[0,0],[3.78,-0.046],[-6.08,54.575],[41.361,0.156]],"v":[[232.173,28.793],[231.125,-56.82],[146.809,-140.094],[65.079,-44.075],[57.922,-37.218],[36.796,-36.96],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[-0.501,46.076],[0,0],[45.828,0.293],[-2.385,-69.202],[2.998,-0.046],[0,0],[-0.718,-9.203],[0,0],[-0.141,-4.041],[-38.441,-1.318]],"o":[[0,0],[-0.452,-46.556],[-49.095,-0.314],[0.037,3.77],[0,0],[0.283,7.639],[0,0],[2.998,-0.046],[-4.823,54.575],[56.012,1.921]],"v":[[212.033,28.793],[211.202,-56.82],[140.538,-139.99],[70.465,-46.849],[64.788,-39.993],[57.055,-36.96],[58.929,13.675],[74.305,13.438],[79.797,20.184],[131.277,115.496]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.629,"y":0},"t":56,"s":[{"i":[[-0.501,46.076],[0,0],[50.588,-1.833],[5.356,-15.358],[2.929,-3.717],[0,0],[-0.718,-9.203],[0,0],[-0.141,-4.041],[-38.416,-1.897]],"o":[[0,0],[-0.452,-46.556],[-29.268,1.06],[0.037,3.77],[0,0],[0.283,7.639],[0,0],[2.998,-0.046],[-4.823,54.575],[45.769,2.26]],"v":[[212.033,28.793],[211.202,-56.82],[136.149,-139.748],[80.138,-105.083],[75.549,-97.28],[57.055,-36.96],[58.929,13.675],[74.305,13.438],[79.797,20.184],[140.193,114.8]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[12.837,32.053],[1.875,1.018],[38.324,-3.88],[-2.318,-21.168],[-0.953,-2.211],[0,0],[-4.392,-3.498],[0,0],[-1.928,-5.195],[-36.751,11.606]],"o":[[0,0],[-21.225,-38.452],[-20.491,2.074],[0.719,3.847],[0,0],[-4.454,4.703],[0,0],[1.706,-0.139],[10.901,47.113],[36.352,-9.614]],"v":[[215.929,22.415],[180.239,-58.866],[99.338,-106.284],[58.906,-69.824],[60.562,-68.19],[65.392,-29.319],[77.608,12.531],[85.647,11.935],[99.45,27.658],[185.151,95.647]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[18.468,28.213],[2.826,1.607],[9.999,-5.352],[-5.146,-18.362],[-2.769,-3.294],[0,0],[-6.21,-1.011],[0,0],[-2.597,-5.845],[-8.705,3.193]],"o":[[0,0],[-25.037,-28.147],[-7.092,3.796],[0.865,3.918],[0,0],[-7.263,3.048],[0,0],[1.201,-0.089],[16.325,44.083],[11.006,-5.816]],"v":[[198.793,33.508],[122.921,-69.7],[66.621,-94.733],[49.116,-66.246],[53.761,-67.468],[78.029,-35.007],[101.104,1.235],[102.403,3.985],[114.477,20.872],[190.865,78.022]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":70,"s":[{"i":[[14.096,19.712],[2.826,1.607],[0.486,-7.364],[0.036,-1.413],[-2.478,-5.451],[-6.471,-9.09],[-0.827,-0.135],[0,0],[-0.346,-0.778],[-8.877,-12.093]],"o":[[0,0],[-13.862,-18.904],[-0.216,1.417],[0.685,4.529],[12.451,17.024],[10.066,11.276],[0,0],[0.16,-0.012],[2.173,5.869],[8.057,11.64]],"v":[[209.568,64.738],[89.332,-94.552],[53.803,-83.608],[53.769,-80.311],[59.146,-70.318],[87.249,-29.05],[110.677,0.048],[110.775,0.57],[123.918,16.423],[181.462,95.216]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[13.425,18.406],[2.826,1.607],[-1.692,-7.69],[-0.053,-0.222],[-2.624,-5.683],[-7.067,-10.757],[0,0],[0,0],[0,0],[-25.808,-14.071]],"o":[[0,0],[-12.146,-17.485],[0.343,0.402],[1.094,4.538],[8.834,19.129],[7.794,11.863],[0,0],[0,0],[0,0],[8.501,8.745]],"v":[[212.392,74.045],[84.173,-98.369],[52.192,-83.22],[51.444,-80.355],[55.642,-67.349],[81.213,-19.536],[100.758,9.139],[100.672,9.319],[111.897,25.324],[184.493,100.547]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[14.546,20.586],[8.359,5.948],[0.906,-7.17],[-0.814,-2.932],[-2.912,-5.025],[-5.806,-8.156],[-0.612,-0.745],[0,0],[-0.577,-1.299],[-14.619,-3.645]],"o":[[0,0],[-14.186,-17.213],[-1.31,1.156],[1.043,4.4],[8.595,16.067],[6.944,10.107],[0,0],[0.267,-0.02],[2.563,3.942],[4.745,3.759]],"v":[[208.686,58.689],[88.494,-96.03],[49.32,-82.191],[47.711,-75.891],[51.974,-66.195],[83.951,-25.422],[107.124,4.1],[107.346,4.851],[118.47,18.314],[184.499,93.42]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[18.468,28.213],[27.726,21.145],[9.999,-5.352],[-3.474,-12.419],[-2.769,-3.294],[0,0],[-2.755,-3.352],[0,0],[-2.597,-5.845],[-3.331,3.193]],"o":[[0,0],[-21.324,-16.262],[-7.092,3.796],[0.865,3.918],[0,0],[2.437,5.009],[0,0],[1.201,-0.089],[11.532,17.742],[4.212,-5.816]],"v":[[199.81,20.726],[103.617,-87.842],[57.408,-90.579],[47.425,-67.78],[52.07,-69.003],[78.029,-35.007],[101.104,1.235],[102.403,3.985],[114.477,20.872],[189.967,67.518]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[7.727,24.111],[27.173,20.796],[19.02,-6.923],[-2.438,-15.111],[-2.066,-2.927],[0,0],[-3.025,-3.459],[0,0],[-2.157,-5.606],[-13.23,4.971]],"o":[[-2.961,-15.02],[-15.88,-13.199],[-12.422,4.62],[0.686,3.86],[0,0],[0.204,4.739],[0,0],[1.301,-0.063],[9.634,27.17],[19.97,-8.33]],"v":[[193.494,23.402],[124.538,-87.476],[67.768,-98.186],[53.752,-70.094],[57.288,-70.347],[72.225,-37.516],[90.074,0.333],[93.297,2.167],[104.958,18.787],[180.451,69.595]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[4.728,22.382],[12.073,24.099],[30.545,-9.017],[0.886,-13.7],[-0.659,-2.191],[0,0],[-3.564,-3.673],[0,0],[-1.278,-5.127],[-33.028,8.527]],"o":[[-3.61,-17.09],[-15.076,-30.093],[-24.37,7.194],[0.327,3.746],[0,0],[-4.261,4.199],[0,0],[1.502,-0.012],[5.836,46.025],[40.012,-5.557]],"v":[[192.431,6.252],[165.452,-83.07],[87.103,-114.854],[59.165,-73.037],[60.484,-71.349],[60.617,-42.534],[68.014,-1.47],[75.087,-1.47],[85.918,14.615],[159.356,78.085]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[-0.501,46.076],[0,0],[50.588,-1.833],[5.356,-15.358],[2.998,-0.046],[0,0],[-0.718,-9.203],[0,0],[-0.141,-4.041],[-38.416,-1.897]],"o":[[0,0],[-0.452,-46.556],[-29.268,1.06],[0.037,3.77],[0,0],[0.283,7.639],[0,0],[2.998,-0.046],[-4.823,54.575],[45.769,2.26]],"v":[[212.033,28.793],[211.202,-56.82],[136.149,-139.748],[73.527,-103.753],[68.939,-95.95],[70.288,-37.885],[58.929,13.675],[74.305,13.438],[79.797,20.184],[140.193,114.8]],"c":true}]},{"t":144,"s":[{"i":[[-0.586,46.076],[0,0],[43.194,0.389],[-2.79,-69.202],[3.507,-0.046],[0,0],[-0.84,-9.203],[0,0],[-0.164,-4.041],[-44.995,-0.183]],"o":[[0,0],[-0.529,-46.556],[-34.26,-0.309],[0.043,3.77],[0,0],[0.331,7.639],[0,0],[3.507,-0.046],[-5.642,54.575],[38.381,0.156]],"v":[[218.133,28.793],[217.16,-56.82],[140.88,-136.937],[75.287,-42.186],[68.646,-35.33],[68.905,-35.024],[39.025,13.675],[65.52,11.582],[71.944,18.327],[142.347,111.021]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":56,"s":[0.176470588235,0.133333333333,0.141176470588,1]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[0.265777826309,0.250370442867,0.288888961077,1]},{"t":104,"s":[0.176470588235,0.133333333333,0.141176470588,1]}]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-0.51,-5.184],[0,0],[-0.046,-3.77],[-94.484,-5.301],[0.285,23.278],[0,0],[46.529,1.407],[0,0],[3.78,-0.046],[0,0],[-0.29,-7.469],[0,0],[0.25,20.429],[-36,-9.56],[-5.041,-17.19],[17.992,-11.476],[7.134,-26.679],[17.19,-5.021],[0.42,34.288],[-15.653,9.556]],"o":[[0.466,11.719],[0,0],[3.78,-0.046],[0,0],[63.168,3.544],[0,0],[-0.57,-46.556],[-79.818,-2.414],[0.046,3.77],[0,0],[0.133,2.842],[0,0],[-24.694,-17.515],[-0.42,-34.287],[17.308,4.598],[7.785,26.497],[21.164,10.792],[-4.619,17.298],[-35.755,10.439],[-0.239,-19.51],[0,0]],"v":[[37.61,-16.212],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107],[215.142,25.643],[215.8,-56.629],[146.809,-140.094],[64.678,-44.131],[57.922,-37.218],[36.796,-36.96],[37.61,-16.212],[124.838,-11.724],[94.651,-62],[162.392,-113.813],[198.516,-78.612],[172.082,-13.09],[200.107,51.378],[164.856,87.452],[95.867,37.313],[124.838,-11.724]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-82.301,3.157],[0.226,23.278],[0,0],[26.1,-0.106],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[-3.609,-17.188],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[33.375,-1.28],[0,0],[-0.452,-46.557],[-61.769,0.251],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.288],[13.729,4.598],[5.563,26.497],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[135.106,105.845],[178.416,26.114],[183.866,-54.426],[126.189,-127.866],[70.147,-46.906],[64.788,-39.993],[57.055,-36.96],[57.701,-16.212],[120.928,-11.683],[97.972,-63.405],[148.083,-115.705],[175.166,-77.284],[153.335,-11.681],[179.376,52.548],[149.242,91.489],[97.074,36.797],[120.928,-11.683]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.629,"y":0},"t":56,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-82.301,3.157],[0.226,23.278],[0,0],[26.1,-0.106],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[-3.609,-17.188],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[33.375,-1.28],[0,0],[-0.452,-46.557],[-61.769,0.251],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.288],[13.729,4.598],[5.563,26.497],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[135.106,105.845],[178.416,26.114],[183.866,-54.426],[126.189,-127.866],[76.757,-48.236],[71.398,-41.323],[57.055,-36.96],[57.701,-16.212],[120.928,-11.683],[97.972,-63.405],[148.083,-115.705],[175.166,-77.284],[153.335,-11.681],[179.376,52.548],[149.242,91.489],[97.074,36.797],[120.928,-11.683]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-2.043,-2.568],[0,0],[-2.284,-5.774],[-47.939,9.581],[8.436,19.479],[7.759,7.544],[26.552,-2.169],[-3.124,-8.534],[-0.57,-1.823],[0,0],[-2.572,-6.25],[0,0],[5.717,17.99],[-20.028,-0.017],[16.755,-25.508],[4.027,-6.504],[-3.104,-20.883],[6.739,-2.757],[3.994,18.53],[-5.736,11.537]],"o":[[0.726,12.906],[0,0],[1.721,0.518],[11.883,22.277],[24.633,-11.393],[0,0],[-18.679,-37.729],[-12.383,2.311],[1.039,4.242],[0,0],[-2.367,6.393],[0,0],[-17.439,-7.434],[-7.833,-27.17],[9.331,0.067],[-1.126,1.565],[15.621,1.978],[3.162,15.752],[-12.572,5.188],[-2.063,-13.718],[0,0]],"v":[[65.151,-10.946],[77.317,12.683],[85.325,11.997],[98.932,27.861],[174.362,88.967],[185.085,19.911],[148.61,-51.744],[80.41,-92.272],[58.594,-70.927],[60.468,-68.195],[64.96,-29.413],[65.151,-10.946],[129.742,-7.819],[92.329,-44.53],[112.68,-84.64],[152.859,-4.104],[150.558,-2.657],[182.765,33.134],[179.674,58.207],[125.027,30.154],[129.625,-7.691]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-2.821,-1.428],[0,0],[-3.181,-6.85],[-8.315,1.351],[11.812,18.102],[11.574,11.565],[11.044,0.807],[-4.335,-12.77],[-2.195,-2.7],[0,0],[-3.506,-5.801],[0,0],[10.847,14.495],[-4.571,-1.766],[-5.681,-9.454],[0.536,-3.898],[-5.987,-18.255],[2.181,-2.041],[0,0],[7.016,9.746]],"o":[[0.189,13.495],[0,0],[1.217,0.881],[17.093,33.542],[6.767,-4.825],[0,0],[-26.496,-34.488],[-8.013,-1.245],[1.341,4.519],[0,0],[4.748,6.019],[0,0],[-5.363,-10.274],[-5.596,-8.011],[0.831,0.079],[0.099,1.208],[8.913,9.398],[5.532,15.166],[-2.205,2.064],[0,0],[0,0]],"v":[[93.157,-7.49],[100.731,1.444],[102.139,4.06],[114.06,21.144],[185.953,76.816],[175.301,52.083],[121.632,-28.85],[66.844,-71.106],[48.9,-67.864],[53.664,-67.482],[77.341,-35.17],[93.157,-7.49],[125.361,-13.013],[102.306,-45.584],[87.019,-61.979],[139.29,-1.903],[146.724,10.669],[172.481,50.188],[182.104,64.059],[142.411,9.289],[125.173,-12.831]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-1.598,-0.809],[0,0],[-1.802,-3.881],[-13.991,-12.523],[6.692,10.256],[8.614,12.063],[4.357,4.237],[-1.195,-5.605],[-2.077,-2.788],[0,0],[-1.986,-3.287],[0,0],[10.004,13.178],[0,0],[-5.706,-8.617],[-1.528,-2.069],[-3.392,-10.343],[1.236,-1.156],[5.69,7.255],[6.564,8.865]],"o":[[0.107,7.646],[0,0],[0.689,0.499],[9.684,19.004],[1.266,-4.112],[0,0],[-23.787,-29.836],[-3.435,-2.664],[2.307,3.943],[0,0],[4.297,5.468],[0,0],[-5.724,-9.375],[-5.295,-7.289],[0,0],[0.36,1.11],[5.05,5.324],[3.134,8.592],[-1.249,1.169],[-1.733,-2.21],[0,0]],"v":[[98.054,-8.656],[104.626,-0.619],[106.109,1.767],[118.283,17.436],[180.562,81.423],[167.871,59.412],[110.314,-17.602],[64.28,-69.477],[52.148,-72.305],[56.291,-69.356],[81.492,-33.361],[98.054,-8.656],[117.669,-6.649],[95.477,-35.182],[81.499,-51.819],[127.419,5.608],[135.178,15.701],[166.072,58.159],[176.986,72.957],[133.684,13.737],[117.604,-6.478]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":70,"s":[{"i":[[0,0],[-0.376,-0.19],[0,0],[-0.423,-0.912],[-19.667,-26.397],[1.573,2.41],[8.736,10.768],[3.705,6.498],[1.946,1.561],[-1.96,-2.875],[0,0],[-0.467,-0.772],[0,0],[9.162,11.861],[-1.332,-1.155],[-5.731,-7.779],[0.071,-0.519],[-0.797,-2.43],[0.29,-0.272],[11.379,14.509],[6.111,7.983]],"o":[[0.025,1.797],[0,0],[0.162,0.117],[2.276,4.465],[-4.235,-3.398],[0,0],[-21.92,-28.202],[-3.324,-3.446],[3.273,3.367],[0,0],[3.847,4.918],[0,0],[-6.086,-8.477],[-4.994,-6.568],[0.138,0.043],[0.622,1.012],[1.187,1.251],[0.736,2.019],[-0.294,0.275],[-3.466,-4.419],[0,0]],"v":[[102.951,-9.822],[108.521,-2.682],[110.078,-0.525],[122.505,13.729],[175.171,86.03],[160.441,66.741],[104.608,-9.223],[61.715,-67.849],[55.396,-76.747],[58.918,-71.23],[85.643,-31.552],[102.951,-9.822],[109.977,-0.285],[90.464,-26.24],[75.961,-43.89],[119.556,10.533],[126.165,19.226],[159.663,66.13],[171.868,81.856],[124.958,18.185],[110.036,-0.126]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[-24.934,-22.804],[0,0],[10.251,15.222],[3.194,6.986],[3.054,3.566],[-2.195,-2.7],[0,0],[0,0],[0,0],[6.462,11.444],[5.637,11.527],[-23.616,-27.919],[0,0],[0,0],[0,0],[13.127,16.737],[5.973,7.713]],"o":[[0,0],[0,0],[0,0],[0,0],[-5.925,-3.179],[0,0],[-19.284,-28.637],[-2.925,-3.448],[1.341,4.519],[0,0],[3.529,4.884],[0,0],[-6.197,-8.201],[-3.942,-6.982],[-0.022,-0.044],[0.702,0.982],[0,0],[0,0],[0,0],[-3.998,-5.098],[0,0]],"v":[[94.269,-1.554],[98.329,5.957],[99.909,8.044],[110.331,22.174],[173.102,92.721],[156.498,75.35],[94.791,-0.858],[58.073,-65.237],[55.007,-76.762],[55.305,-68.374],[78.667,-24.317],[94.269,-1.554],[99.616,7.761],[81.963,-18.586],[70.512,-38.673],[108.526,18.534],[114.708,27.559],[156.034,74.936],[169.882,89.865],[113.978,26.569],[99.712,7.916]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0,0],[-0.627,-0.317],[0,0],[-0.707,-1.522],[-20.1,-17.437],[2.625,4.022],[9.028,10.85],[4.938,5.613],[1.412,-0.064],[-2.195,-2.7],[0,0],[-0.779,-1.289],[0,0],[9.335,12.132],[-1.665,-1.217],[-5.726,-7.951],[0.119,-0.866],[-1.33,-4.057],[0.615,-0.454],[10.21,13.018],[6.204,8.165]],"o":[[0.993,1.197],[0,0],[0.27,0.196],[4.868,5.335],[-4.033,-3.545],[0,0],[-22.39,-28.848],[-4.056,-2.958],[1.341,4.519],[0,0],[3.94,5.031],[0,0],[-6.011,-8.662],[-5.056,-6.716],[0.209,0.047],[0.568,1.032],[1.981,2.088],[1.229,3.37],[-0.622,0.459],[-3.11,-3.965],[0,0]],"v":[[98.414,-5.987],[105.152,1.672],[106.694,3.876],[117.159,15.925],[175.404,87.473],[159.244,69.549],[99.862,-6.341],[53.609,-64.235],[49.447,-73.234],[51.691,-66.995],[81.68,-29.101],[98.414,-5.987],[104.897,0.994],[83.737,-25.867],[70.65,-41.517],[115.363,13.992],[122.056,23.084],[158.257,68.806],[172.275,85.023],[121.634,23.332],[104.93,1.155]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[-2.821,-1.428],[0,0],[-3.181,-6.85],[-3.182,1.351],[11.812,18.102],[11.574,11.565],[11.044,0.807],[-4.335,-12.77],[-2.195,-2.7],[0,0],[-3.506,-5.801],[0,0],[10.847,14.495],[-4.571,-1.766],[-5.681,-9.454],[0.536,-3.898],[-5.987,-18.255],[2.768,-2.041],[0,0],[7.016,9.746]],"o":[[4.469,5.389],[0,0],[1.217,0.881],[21.908,24.007],[2.59,-4.825],[0,0],[-26.496,-34.489],[-8.013,-1.245],[1.341,4.519],[0,0],[4.748,6.019],[0,0],[-5.363,-10.274],[-5.596,-8.011],[0.831,0.079],[0.099,1.208],[8.913,9.398],[5.532,15.166],[-2.8,2.064],[0,0],[0,0]],"v":[[93.157,-7.49],[100.731,1.444],[102.139,4.06],[114.06,21.144],[188.087,66.312],[173.799,46.064],[121.632,-28.85],[66.844,-71.106],[47.21,-69.399],[51.974,-69.017],[77.341,-35.17],[93.157,-7.49],[116.903,-15.588],[86.547,-50.15],[82.307,-59.486],[139.29,-1.903],[146.724,10.669],[170.979,44.169],[185.276,65.28],[142.8,19.918],[116.714,-15.406]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[-1.584,-2.612],[0,0],[-1.544,-5.709],[-42.646,5.784],[5.847,19.309],[6.19,7.798],[23.375,-0.19],[-2.061,-8.419],[-0.356,-1.791],[0,0],[-1.758,-6.186],[0,0],[3.587,13.487],[-17.502,-1.444],[16.641,-23.304],[4.029,-5.96],[-1.077,-20.278],[9.928,-4.585],[7.174,18.698],[-5.917,10.672]],"o":[[-0.377,12.447],[0,0],[1.464,0.62],[8.64,22.242],[22.421,-9.186],[0,0],[-13.369,-37.567],[-11.003,1.337],[0.575,4.148],[0,0],[-2.569,5.971],[0,0],[-14.658,-8.383],[-4.717,-20.326],[8.15,0.729],[-1.106,1.423],[13.497,3.014],[1.53,15.354],[-18.528,8.644],[-4.203,-14.565],[0,0]],"v":[[58.967,-24.906],[67.748,-1.345],[74.801,-1.432],[85.45,14.774],[146.584,78.838],[161.366,13.28],[140.324,-59.143],[78.674,-101.925],[58.978,-74.118],[60.403,-71.361],[60.247,-42.656],[58.967,-24.906],[116.101,-23.751],[89.819,-60.058],[106.278,-92.294],[135.083,-12.082],[132.959,-10.857],[158.302,25.814],[159.965,41.409],[107.491,13.115],[115.989,-23.636]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-82.301,3.157],[0.226,23.278],[0,0],[26.1,-0.106],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[-3.609,-17.188],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[33.375,-1.28],[0,0],[-0.452,-46.557],[-61.769,0.251],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.288],[13.729,4.598],[5.563,26.497],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[135.106,105.845],[178.416,26.114],[183.866,-54.426],[126.189,-127.866],[70.147,-46.906],[64.788,-39.993],[57.055,-36.96],[57.701,-16.212],[120.928,-11.683],[97.972,-63.405],[148.083,-115.705],[175.166,-77.284],[153.335,-11.681],[179.376,52.548],[149.242,91.489],[97.074,36.797],[120.928,-11.683]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[-0.51,-5.184],[0,0],[-0.046,-3.77],[-94.484,-5.301],[0.285,23.278],[0,0],[46.529,1.407],[0,0],[3.78,-0.046],[0,0],[-0.29,-7.469],[0,0],[0.25,20.429],[-36,-9.56],[-5.041,-17.19],[17.992,-11.476],[7.134,-26.679],[17.19,-5.021],[0.42,34.288],[-15.653,9.556]],"o":[[0.466,11.719],[0,0],[3.78,-0.046],[0,0],[63.168,3.544],[0,0],[-0.57,-46.556],[-79.818,-2.414],[0.046,3.77],[0,0],[0.133,2.842],[0,0],[-24.694,-17.515],[-0.42,-34.287],[17.308,4.598],[7.785,26.497],[21.164,10.792],[-4.619,17.298],[-35.755,10.439],[-0.239,-19.51],[0,0]],"v":[[37.61,-16.212],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107],[215.142,25.643],[215.8,-56.629],[146.809,-140.094],[64.678,-44.131],[57.922,-37.218],[36.796,-36.96],[37.61,-16.212],[124.838,-11.724],[94.651,-62],[162.392,-113.813],[198.516,-78.612],[172.082,-13.09],[200.107,51.378],[164.856,87.452],[95.867,37.313],[124.838,-11.724]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[0.002,0.2,0.2,0.239,0.326,0.252,0.256,0.297,0.5,0.303,0.313,0.354,0.675,0.281,0.29,0.328,1,0.259,0.267,0.302]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[0.002,0.2,0.2,0.239,0.326,0.345,0.345,0.4,0.5,0.49,0.49,0.561,0.675,0.378,0.374,0.43,1,0.265,0.258,0.299]},{"t":104,"s":[0.002,0.2,0.2,0.239,0.326,0.252,0.256,0.297,0.5,0.303,0.313,0.354,0.675,0.281,0.29,0.328,1,0.259,0.267,0.302]}]}},"s":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[185.994,165.572],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[60.923,59.248],"to":[0,0],"ti":[0,0]},{"t":104,"s":[185.994,165.572]}]},"e":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[172.008,-160.78],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[227.768,-72.555],"to":[0,0],"ti":[0,0]},{"t":104,"s":[172.008,-160.78]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Middle","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-0.51,-5.184],[0,0],[-0.046,-3.77],[-94.484,-5.301],[0.285,23.278],[0,0],[46.529,1.407],[0,0],[3.78,-0.046],[0,0],[-0.29,-7.469],[0,0],[0.25,20.429],[-36,-9.56],[-5.041,-17.19],[17.992,-11.476],[7.134,-26.679],[17.19,-5.021],[0.42,34.288],[-15.653,9.556]],"o":[[0.466,11.719],[0,0],[3.78,-0.046],[0,0],[63.168,3.544],[0,0],[-0.57,-46.556],[-79.818,-2.414],[0.046,3.77],[0,0],[0.133,2.842],[0,0],[-24.694,-17.515],[-0.42,-34.287],[17.308,4.598],[7.785,26.497],[21.164,10.792],[-4.619,17.298],[-35.755,10.439],[-0.239,-19.51],[0,0]],"v":[[37.61,-16.212],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107],[232.173,28.793],[231.125,-56.82],[146.809,-140.094],[64.678,-44.131],[57.922,-37.218],[36.796,-36.96],[37.61,-16.212],[124.838,-11.724],[94.651,-62],[162.392,-113.813],[198.516,-78.612],[172.082,-13.09],[200.107,51.378],[164.856,87.452],[95.867,37.313],[124.838,-11.724]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-74.981,-4.79],[0.226,23.278],[0,0],[45.836,0.503],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[-3.609,-17.188],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[70.827,4.525],[0,0],[-0.452,-46.556],[-63.356,-0.695],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.288],[13.729,4.598],[5.563,26.497],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[131.277,115.496],[212.033,28.793],[211.202,-56.82],[140.538,-139.99],[70.147,-46.906],[64.788,-39.993],[57.055,-36.96],[57.701,-16.212],[120.928,-11.683],[97.972,-63.405],[148.083,-115.705],[175.166,-77.284],[153.335,-11.681],[179.376,52.548],[149.242,91.489],[97.074,36.797],[120.928,-11.683]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.629,"y":0},"t":56,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-74.873,-6.263],[0.226,23.278],[0,0],[49.785,-2.696],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[59.273,-31.607],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[57.839,4.838],[0,0],[-0.452,-46.557],[-31.737,1.718],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.287],[13.729,4.598],[-4.088,2.18],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[140.193,114.8],[212.033,28.793],[211.202,-56.82],[136.149,-139.748],[79.819,-105.14],[75.549,-97.28],[57.055,-36.96],[57.701,-16.212],[122.399,-11.723],[97.972,-63.405],[148.083,-115.705],[151.061,-25.221],[138.03,-13.044],[179.376,52.548],[149.242,91.489],[97.074,36.797],[122.399,-11.723]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-2.078,-2.567],[0,0],[-2.321,-5.772],[-48.837,9.628],[8.574,19.472],[7.896,7.537],[31.832,-4.519],[-3.173,-8.531],[-0.579,-1.822],[0,0],[-2.613,-6.248],[0,0],[5.805,17.986],[-20.4,0.002],[12.164,-21.398],[4.108,-6.508],[-3.142,-20.881],[6.867,-2.763],[4.823,23.415],[-5.853,11.544]],"o":[[0.727,12.906],[0,0],[1.753,0.516],[12.082,22.266],[49.101,-14.623],[0,0],[-18.989,-37.713],[-35.826,6.061],[1.054,4.241],[0,0],[-2.417,6.395],[0,0],[-17.755,-7.418],[-7.952,-27.164],[9.504,0.058],[-1.148,1.567],[15.909,1.963],[3.206,15.75],[-12.81,5.2],[-2.088,-13.717],[0,0]],"v":[[65.193,-10.948],[77.562,12.671],[85.719,11.977],[99.563,27.829],[185.555,95.908],[215.681,21.248],[181.339,-58.607],[99.99,-106.599],[58.662,-70.931],[60.569,-68.201],[65.016,-29.416],[65.193,-10.948],[130.978,-7.883],[92.884,-44.559],[113.483,-84.68],[154.51,-4.19],[152.175,-2.741],[185.157,33.01],[180.648,58.156],[126.185,30.094],[130.859,-7.755]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-2.854,-1.428],[0,0],[-3.217,-6.849],[-26.374,9.582],[13.285,18.037],[11.709,11.562],[6.662,-2.005],[-4.384,-12.769],[-2.217,-2.7],[0,0],[-3.546,-5.8],[0,0],[7.787,17.114],[0.583,-1.068],[-7.83,-9.935],[0.559,-3.9],[-6.046,-18.254],[2.165,-2.5],[13.938,19.671],[5.246,10.319]],"o":[[0.188,13.495],[0,0],[1.234,0.881],[17.289,33.537],[22.771,-11.284],[0,0],[-22.44,-26.563],[-12.19,2.741],[1.356,4.518],[0,0],[4.08,5.973],[0,0],[-6.542,-9.484],[-9.938,-11.83],[0.314,0.146],[0.095,1.208],[7.277,9.515],[5.589,15.165],[-2.16,2.494],[-4.51,-7.394],[0,0]],"v":[[93.257,-7.49],[101.025,1.439],[102.511,4.052],[114.641,21.131],[191.266,78.292],[198.478,31.772],[124.599,-69.256],[71.18,-96.754],[48.957,-67.865],[53.771,-67.484],[77.457,-35.171],[93.257,-7.49],[126.365,-13.04],[102.747,-45.596],[86.763,-60.778],[140.594,-1.938],[148.019,10.635],[173.439,49.891],[182.333,64.039],[141.957,8.532],[126.174,-12.857]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-1.617,-0.809],[0,0],[-1.822,-3.88],[-19.645,-4.394],[12.209,16.548],[11.709,11.562],[3.784,-1.098],[-3.02,-8.344],[-2.099,-2.788],[0,0],[-2.009,-3.286],[0,0],[9.143,15.27],[0.488,-0.406],[-7.09,-9.027],[-2.045,-2.262],[-3.425,-10.342],[1.227,-1.416],[13.117,17.896],[5.667,9.418]],"o":[[0.107,7.646],[0,0],[0.699,0.499],[9.795,19.001],[17.062,0.462],[0,0],[-20.302,-21.5],[-6.337,1.831],[1.164,4.567],[0,0],[3.894,5.436],[0,0],[-6.22,-8.631],[-9.964,-12.253],[0.208,0.121],[0.358,1.11],[4.123,5.391],[3.167,8.592],[-1.224,1.413],[-4.502,-6.738],[0,0]],"v":[[98.106,-8.626],[104.791,-0.597],[106.319,1.786],[118.604,17.421],[186.565,86.888],[203.866,47.387],[107.104,-81.877],[63.195,-90.405],[52.205,-72.304],[56.398,-69.354],[81.171,-34.099],[98.106,-8.626],[118.253,-6.688],[95.732,-35.142],[81.603,-51.92],[128.176,5.556],[136.244,16.125],[166.903,58.227],[177.662,73.581],[133.267,13.071],[118.186,-6.517]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":70,"s":[{"i":[[0,0],[-0.38,-0.19],[0,0],[-0.428,-0.912],[-12.916,-18.369],[11.134,15.059],[11.709,11.562],[0.906,-0.191],[-1.657,-3.919],[-1.982,-2.877],[0,0],[-0.472,-0.772],[0,0],[10.498,13.426],[0.392,0.256],[-6.349,-8.118],[0.074,-0.519],[-0.805,-2.43],[0.288,-0.333],[12.297,16.121],[6.087,8.518]],"o":[[0.025,1.797],[0,0],[0.164,0.117],[2.302,4.465],[11.353,12.208],[0,0],[-18.165,-16.436],[-0.484,0.921],[0.971,4.616],[0,0],[3.707,4.9],[0,0],[-5.897,-7.778],[-9.989,-12.677],[0.102,0.096],[0.622,1.013],[0.969,1.267],[0.744,2.019],[-0.287,0.332],[-4.494,-6.081],[0,0]],"v":[[102.956,-9.763],[108.558,-2.633],[110.127,-0.48],[122.566,13.712],[181.864,95.485],[209.254,63.002],[89.608,-94.497],[55.21,-84.056],[55.452,-76.743],[59.024,-71.223],[84.886,-33.028],[102.956,-9.763],[110.14,-0.337],[90.533,-26.148],[76.444,-43.062],[119.767,10.465],[127.003,20.11],[160.366,66.563],[172.99,83.123],[124.577,17.61],[110.198,-0.178]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[-20.867,-11.129],[10.803,14.601],[11.709,11.562],[0,0],[-2.741,-4.048],[-2.217,-2.7],[0,0],[0,0],[0,0],[7.617,13.392],[0.346,0.473],[-23.705,-28.104],[0,0],[0,0],[0,0],[12.044,15.576],[6.217,8.242]],"o":[[0,0],[0,0],[0,0],[0,0],[10.938,10.24],[0,0],[-17.508,-14.881],[0,0],[1.356,4.518],[0,0],[3.47,4.868],[0,0],[-5.798,-7.516],[-9.511,-13.171],[0.066,0.091],[0.702,0.983],[0,0],[0,0],[0,0],[-4.492,-5.88],[0,0]],"v":[[94.259,-1.485],[98.326,6.016],[99.908,8.097],[110.312,22.158],[185.335,99.921],[212.078,72.309],[84.234,-98.373],[53.066,-83.562],[55.063,-76.764],[55.412,-68.376],[77.84,-26.052],[94.259,-1.485],[99.65,7.704],[81.979,-18.61],[71.066,-37.91],[108.57,18.46],[115.476,28.584],[156.698,75.482],[171.142,91.33],[113.609,26.022],[99.746,7.86]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0,0],[-0.634,-0.317],[0,0],[-0.715,-1.522],[-17.377,-8.337],[12.706,17.06],[13.058,11.594],[0.722,-3.418],[-3.106,-5.986],[-2.217,-2.7],[0,0],[-0.788,-1.289],[0,0],[9.684,14.141],[0.847,0.53],[-6.501,-8.305],[0.124,-0.866],[-1.344,-4.056],[0.611,-0.555],[12.465,16.486],[6.001,8.703]],"o":[[0.835,1.437],[0,0],[0.274,0.196],[4.821,5.194],[10.133,2.17],[0,0],[-17.244,-16.201],[-2.709,0.609],[1.356,4.518],[0,0],[3.745,5.01],[0,0],[-5.964,-7.953],[-11.977,-13.564],[0.124,0.101],[0.567,1.033],[1.617,2.114],[1.242,3.37],[-0.609,0.554],[-4.496,-6.216],[0,0]],"v":[[98.428,-5.934],[105.215,1.716],[106.776,3.916],[117.274,15.909],[184.846,93.689],[208.372,56.953],[88.812,-95.866],[51.013,-82.906],[49.503,-73.236],[51.798,-66.997],[81.013,-30.425],[98.428,-5.934],[105.147,0.945],[83.847,-25.889],[71.057,-40.651],[115.686,13.927],[122.941,23.873],[158.986,69.164],[173.319,86.158],[121.246,22.738],[105.179,1.106]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[-2.854,-1.428],[0,0],[-3.217,-6.849],[-5.162,1.435],[19.367,25.664],[17.778,11.706],[6.662,-2.005],[-4.384,-12.769],[-2.217,-2.7],[0,0],[-3.546,-5.8],[0,0],[7.787,17.114],[2.54,0.778],[-7.83,-9.936],[0.559,-3.899],[-6.046,-18.254],[2.748,-2.5],[13.938,19.671],[5.246,10.318]],"o":[[3.757,6.465],[0,0],[1.234,0.881],[21.694,23.374],[8.714,-11.284],[0,0],[-15.82,-18.868],[-12.19,2.741],[1.356,4.518],[0,0],[4.08,5.973],[0,0],[-6.542,-9.484],[-10.49,-24.161],[0.314,0.146],[0.095,1.208],[7.277,9.515],[5.589,15.165],[-2.742,2.494],[-4.51,-7.394],[0,0]],"v":[[93.257,-7.49],[101.025,1.439],[102.511,4.052],[114.641,21.131],[190.12,67.787],[199.495,18.99],[104.834,-87.091],[61.967,-92.6],[47.266,-69.4],[52.081,-69.019],[77.457,-35.171],[93.257,-7.49],[117.906,-15.615],[86.988,-50.161],[82.051,-58.285],[140.594,-1.938],[148.019,10.635],[171.937,43.872],[185.567,65.261],[142.346,19.16],[117.716,-15.432]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[-2.441,-1.823],[0,0],[-2.67,-6.469],[-17.919,2.878],[14.9,23.546],[21.134,14.9],[14.588,-4.436],[-3.624,-11.32],[-1.599,-2.397],[0,0],[-2.962,-5.929],[0,0],[6.413,15.905],[-4.25,0.034],[-1.118,-13.185],[1.74,-4.585],[-4.401,-18.929],[5.202,-3.193],[11.22,19.85],[1.491,10.435]],"o":[[2.379,8.459],[0,0],[1.32,0.794],[17.401,22.998],[20.495,-11.038],[0,0],[-11.815,-17.84],[-19.513,5.446],[1.1,4.395],[0,0],[1.849,5.972],[0,0],[-9.34,-9.12],[-8.601,-22.883],[2.977,0.341],[-0.312,1.28],[9.435,7.35],[4.249,15.228],[-8.117,4.54],[-4.415,-9.783],[0,0]],"v":[[81.839,-13.295],[90.004,0.513],[93.39,2.227],[105.095,19.016],[177.757,68.864],[190.877,18.152],[125.843,-86.035],[71.007,-99.626],[53.604,-71.534],[57.298,-70.36],[71.736,-37.665],[81.839,-13.295],[117.666,-18.318],[88.094,-53.457],[90.361,-69.615],[139.24,-5.308],[143.472,3.482],[165.715,35.373],[175.119,54.828],[131.059,17.076],[117.501,-18.158]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[-1.615,-2.613],[0,0],[-1.576,-5.709],[-43.435,5.765],[5.967,19.312],[3.741,9.804],[25.588,-9.782],[-2.105,-8.42],[-0.363,-1.791],[0,0],[-1.794,-6.187],[0,0],[3.665,13.489],[-17.828,-1.453],[12.307,-19.684],[4.1,-5.958],[-1.11,-20.279],[10.11,-4.579],[5.783,20.208],[-6.02,10.669]],"o":[[-0.376,12.447],[0,0],[1.491,0.621],[8.815,22.246],[38.172,-9.4],[0,0],[-12.239,-32.639],[-25.498,7.922],[0.589,4.148],[0,0],[-2.613,5.97],[0,0],[-14.936,-8.39],[-4.822,-20.327],[8.302,0.733],[-1.126,1.423],[13.75,3.02],[1.568,15.355],[-18.868,8.633],[-4.225,-14.561],[0,0]],"v":[[59.004,-24.905],[67.963,-1.339],[75.147,-1.424],[86.004,14.787],[160.163,78.509],[190.345,2.19],[166.931,-80.249],[87.722,-115.146],[59.038,-74.117],[60.491,-71.359],[60.296,-42.654],[59.004,-24.905],[117.187,-23.724],[90.306,-60.049],[106.983,-92.276],[136.533,-12.047],[134.379,-10.822],[160.402,25.866],[161.354,41.453],[108.486,12.908],[117.073,-23.61]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-74.873,-6.263],[0.226,23.278],[0,0],[49.785,-2.696],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[59.273,-31.607],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[57.839,4.838],[0,0],[-0.452,-46.557],[-31.737,1.718],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.287],[13.729,4.598],[-4.088,2.18],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[140.193,114.8],[212.033,28.793],[211.202,-56.82],[136.149,-139.748],[73.209,-103.81],[68.939,-95.95],[70.288,-37.885],[57.701,-16.212],[122.399,-11.723],[97.972,-63.405],[148.083,-115.705],[152.342,-25.183],[138.03,-13.044],[179.376,52.548],[149.242,91.489],[97.074,36.797],[122.399,-11.723]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[-0.473,-5.184],[0,0],[-0.043,-3.77],[-87.676,-5.301],[0.264,23.278],[0,0],[43.176,1.407],[0,0],[3.507,-0.046],[0,0],[-0.269,-7.469],[0,0],[0.232,20.429],[-33.404,-9.565],[14.597,-60.199],[16.696,-11.476],[6.611,-26.682],[15.952,-5.019],[0.39,34.288],[-14.525,9.556]],"o":[[0.432,11.719],[0,0],[3.507,-0.046],[0,0],[58.616,3.544],[0,0],[-0.529,-46.556],[-74.067,-2.414],[0.043,3.77],[0,0],[0.123,2.842],[0,0],[-22.915,-17.515],[-0.39,-34.287],[16.06,4.598],[-2.568,10.59],[19.639,10.792],[-4.286,17.298],[-33.179,10.439],[-0.222,-19.51],[0,0]],"v":[[37.589,-16.212],[39.025,13.675],[65.52,11.582],[71.944,18.327],[142.347,111.021],[218.133,28.793],[217.16,-56.82],[140.88,-136.937],[74.915,-42.243],[68.646,-35.33],[68.905,-35.024],[37.589,-16.212],[105.852,-11.416],[85.008,-64.171],[161.252,-119.689],[206.097,-30.301],[186.411,-9.015],[204.337,58.052],[156.297,93.424],[83.321,39.756],[105.852,-11.416]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0.35,0.783,0.699,0.711,0.424,0.758,0.716,0.728,0.498,0.733,0.733,0.745,0.574,0.759,0.716,0.727,0.65,0.784,0.698,0.71,0.35,0,0.447,0.5,0.5,1,0.575,0.51,0.65,0.02]}},"s":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[208.665,162.065],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[202.111,93.978],"to":[0,0],"ti":[0,0]},{"t":104,"s":[238.189,129.722]}]},"e":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[213.426,-121.828],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[-7.579,-183.786],"to":[0,0],"ti":[0,0]},{"t":104,"s":[228.174,-152.638]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.51],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.71],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":67,"s":[100]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":87,"s":[100]},{"t":100,"s":[0]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 14","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-0.51,-5.184],[0,0],[-0.046,-3.77],[-94.484,-5.301],[0.285,23.278],[0,0],[46.529,1.407],[0,0],[3.78,-0.046],[0,0],[-0.29,-7.469],[0,0],[0.25,20.429],[-36,-9.56],[-5.041,-17.19],[17.992,-11.476],[7.134,-26.679],[17.19,-5.021],[0.42,34.288],[-15.653,9.556]],"o":[[0.466,11.719],[0,0],[3.78,-0.046],[0,0],[63.168,3.544],[0,0],[-0.57,-46.556],[-79.818,-2.414],[0.046,3.77],[0,0],[0.133,2.842],[0,0],[-24.694,-17.515],[-0.42,-34.287],[17.308,4.598],[7.785,26.497],[21.164,10.792],[-4.619,17.298],[-35.755,10.439],[-0.239,-19.51],[0,0]],"v":[[37.61,-16.212],[39.158,13.675],[58.542,13.438],[65.465,20.184],[149.922,114.107],[232.173,28.793],[231.125,-56.82],[146.809,-140.094],[64.678,-44.131],[57.922,-37.218],[36.796,-36.96],[37.61,-16.212],[124.838,-11.724],[94.651,-62],[162.392,-113.813],[198.516,-78.612],[172.082,-13.09],[200.107,51.378],[164.856,87.452],[95.867,37.313],[124.838,-11.724]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-74.981,-4.79],[0.226,23.278],[0,0],[45.836,0.503],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[-3.609,-17.188],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[70.827,4.525],[0,0],[-0.452,-46.556],[-63.356,-0.695],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.288],[13.729,4.598],[5.563,26.497],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[131.277,115.496],[212.033,28.793],[211.202,-56.82],[140.538,-139.99],[70.147,-46.906],[64.788,-39.993],[57.055,-36.96],[57.701,-16.212],[120.928,-11.683],[97.972,-63.405],[148.083,-115.705],[175.166,-77.284],[153.335,-11.681],[179.376,52.548],[149.242,91.489],[97.074,36.797],[120.928,-11.683]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.629,"y":0},"t":56,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-74.873,-6.263],[0.226,23.278],[0,0],[49.785,-2.696],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[59.273,-31.607],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[57.839,4.838],[0,0],[-0.452,-46.557],[-31.737,1.718],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.287],[13.729,4.598],[-4.088,2.18],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[140.193,114.8],[212.033,28.793],[211.202,-56.82],[136.149,-139.748],[79.819,-105.14],[75.549,-97.28],[57.055,-36.96],[57.701,-16.212],[122.399,-11.723],[97.972,-63.405],[148.083,-115.705],[151.061,-25.221],[138.03,-13.044],[179.376,52.548],[149.242,91.489],[97.074,36.797],[122.399,-11.723]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[{"i":[[0,0],[-2.078,-2.567],[0,0],[-2.321,-5.772],[-48.837,9.628],[8.574,19.472],[7.896,7.537],[31.832,-4.519],[-3.173,-8.531],[-0.579,-1.822],[0,0],[-2.613,-6.248],[0,0],[5.805,17.986],[-20.4,0.002],[11.999,-20.421],[4.108,-6.508],[-3.142,-20.881],[6.867,-2.763],[4.823,23.415],[-5.853,11.544]],"o":[[0.727,12.906],[0,0],[1.753,0.516],[12.082,22.266],[49.101,-14.623],[0,0],[-18.989,-37.713],[-35.826,6.061],[1.054,4.241],[0,0],[-2.417,6.395],[0,0],[-17.755,-7.418],[-7.952,-27.164],[9.504,0.058],[-1.148,1.567],[15.909,1.963],[3.206,15.75],[-12.81,5.2],[-2.088,-13.717],[0,0]],"v":[[65.193,-10.948],[77.562,12.671],[85.719,11.977],[99.563,27.829],[185.555,95.908],[215.681,21.248],[181.339,-58.607],[99.99,-106.599],[58.662,-70.931],[60.569,-68.201],[65.016,-29.416],[65.193,-10.948],[130.978,-7.883],[92.884,-44.559],[113.483,-84.68],[154.51,-4.19],[152.175,-2.741],[185.157,33.01],[180.648,58.156],[126.185,30.094],[130.859,-7.755]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[{"i":[[0,0],[-2.854,-1.428],[0,0],[-3.217,-6.849],[-26.374,9.582],[14.331,20.126],[11.709,11.562],[8.142,-1.102],[-4.384,-12.769],[-2.217,-2.7],[0,0],[-3.546,-5.8],[0,0],[7.787,17.114],[2.762,-0.537],[-7.211,-13.329],[0.559,-3.9],[-6.046,-18.254],[2.191,-2.235],[15.789,22.106],[5.27,10.043]],"o":[[0.188,13.495],[0,0],[1.234,0.881],[17.289,33.537],[19.402,-9.567],[0,0],[-21.583,-27.491],[-9.137,3.444],[1.356,4.518],[0,0],[5.302,7.299],[0,0],[-6.813,-10.23],[-5.07,-9.585],[0.925,0.809],[0.095,1.208],[7.736,10.665],[5.589,15.165],[-2.255,2.3],[-3.982,-7.072],[0,0]],"v":[[93.257,-7.49],[101.025,1.439],[102.511,4.052],[114.641,21.131],[191.266,78.292],[198.478,31.772],[124.599,-69.256],[71.18,-96.754],[48.957,-67.865],[53.771,-67.484],[77.457,-35.171],[93.257,-7.49],[126.365,-13.04],[102.747,-45.596],[86.763,-60.778],[140.594,-1.938],[148.019,10.635],[172.46,49.501],[182.333,64.039],[141.928,9.53],[126.174,-12.857]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-1.617,-0.809],[0,0],[-1.822,-3.88],[-17.261,-0.615],[13.957,20.423],[11.709,11.562],[4.617,-0.579],[-3.086,-8.127],[-2.099,-2.788],[0,0],[-2.009,-3.286],[0,0],[8.862,15.634],[1.862,0.083],[-7.575,-12.159],[-2.118,-1.948],[-3.426,-10.342],[1.241,-1.266],[14.815,20.109],[5.612,9.164]],"o":[[0.107,7.646],[0,0],[0.699,0.499],[9.795,19.001],[14.401,0.729],[0,0],[-18.39,-23.504],[-5.194,1.899],[1.164,4.567],[0,0],[4.944,6.638],[0,0],[-6.565,-9.313],[-4.571,-6.786],[0.694,0.676],[0.358,1.111],[4.383,6.042],[3.167,8.592],[-1.278,1.303],[-4.111,-6.449],[0,0]],"v":[[98.053,-8.694],[104.739,-0.664],[106.267,1.718],[118.551,17.354],[186.565,86.888],[203.866,47.387],[106.997,-81.662],[63.54,-91.066],[52.205,-72.304],[56.398,-69.354],[81.11,-33.83],[98.053,-8.694],[118.253,-6.688],[95.732,-35.142],[81.603,-51.92],[128.176,5.556],[136.049,15.829],[166.257,57.923],[177.726,73.399],[133.5,13.99],[118.186,-6.517]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":70,"s":[{"i":[[0,0],[-0.38,-0.19],[0,0],[-0.428,-0.912],[-8.148,-10.811],[13.583,20.721],[11.709,11.562],[1.092,-0.055],[-1.788,-3.484],[-1.982,-2.877],[0,0],[-0.472,-0.772],[0,0],[9.936,14.155],[0.963,0.704],[-7.94,-10.99],[0.074,-0.519],[-0.805,-2.43],[0.292,-0.298],[13.84,18.112],[5.953,8.286]],"o":[[0.025,1.797],[0,0],[0.164,0.117],[2.302,4.465],[9.4,11.025],[0,0],[-15.196,-19.518],[-1.251,0.354],[0.971,4.616],[0,0],[4.585,5.978],[0,0],[-6.318,-8.396],[-4.071,-3.988],[0.463,0.543],[0.622,1.013],[1.03,1.42],[0.744,2.019],[-0.3,0.306],[-4.24,-5.826],[0,0]],"v":[[102.85,-9.898],[108.453,-2.768],[110.022,-0.616],[122.461,13.577],[181.864,95.485],[209.254,63.002],[89.394,-94.067],[55.901,-85.378],[55.452,-76.743],[59.024,-71.223],[84.763,-32.489],[102.85,-9.898],[110.14,-0.337],[90.532,-26.148],[76.444,-43.062],[119.767,10.464],[126.613,19.517],[160.054,66.344],[173.118,82.758],[125.072,18.45],[110.198,-0.178]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.946,"y":0},"t":73,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[-15.083,-6.298],[13.468,20.812],[11.709,11.562],[0,0],[-1.72,-1.87],[-2.217,-2.7],[0,0],[0,0],[0,0],[7.572,13.448],[0.653,0.92],[-25.832,-30.371],[0,0],[0,0],[0,0],[13.541,17.499],[6.058,8.016]],"o":[[0,0],[0,0],[0,0],[0,0],[6.76,8.554],[0,0],[-14.215,-18.293],[0,0],[1.356,4.518],[0,0],[4.257,5.938],[0,0],[-6.242,-8.115],[-5.495,-7.86],[0.373,0.517],[0.702,0.983],[0,0],[0,0],[0,0],[-4.279,-5.635],[0,0]],"v":[[94.138,-1.641],[98.205,5.86],[99.787,7.941],[110.19,22.002],[185.335,99.921],[212.078,72.309],[83.987,-97.877],[53.731,-85.149],[55.063,-76.764],[55.412,-68.376],[77.675,-25.435],[94.138,-1.641],[99.65,7.704],[81.979,-18.61],[70.998,-37.985],[108.57,18.46],[115.026,27.9],[156.488,75.289],[171.29,90.909],[114.184,26.838],[99.746,7.86]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":82,"s":[{"i":[[0,0],[-0.634,-0.317],[0,0],[-0.715,-1.522],[-12.868,-4.849],[14.982,22.401],[12.88,11.461],[1.809,-0.245],[-2.312,-4.292],[-2.217,-2.7],[0,0],[-0.788,-1.289],[0,0],[9.715,14.459],[1.148,0.577],[-7.865,-11.23],[0.124,-0.867],[-1.344,-4.056],[0.618,-0.497],[14.041,18.523],[5.883,8.466]],"o":[[0.958,1.443],[0,0],[0.274,0.196],[4.568,5.304],[3.737,1.005],[0,0],[-14.483,-18.687],[-2.03,0.765],[1.356,4.518],[0,0],[4.659,6.113],[0,0],[-6.369,-8.585],[-5.626,-8.079],[0.511,0.57],[0.568,1.033],[1.719,2.37],[1.242,3.37],[-0.636,0.511],[-4.213,-5.954],[0,0]],"v":[[98.334,-6.056],[105.121,1.595],[106.682,3.794],[117.179,15.788],[184.846,93.689],[208.372,56.953],[88.62,-95.481],[51.53,-84.14],[49.503,-73.236],[51.798,-66.997],[80.903,-29.941],[98.334,-6.056],[105.147,0.945],[83.847,-25.889],[71.057,-40.651],[115.686,13.927],[122.591,23.341],[158.605,68.927],[173.434,85.83],[121.687,23.594],[105.179,1.106]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[-2.854,-1.428],[0,0],[-3.217,-6.849],[-5.115,0.221],[20.284,27.964],[16.979,11.107],[8.142,-1.102],[-4.384,-12.769],[-2.217,-2.7],[0,0],[-3.546,-5.8],[0,0],[7.787,17.114],[2.762,-0.537],[-7.211,-13.329],[0.559,-3.899],[-6.046,-18.254],[2.782,-2.235],[15.789,22.106],[5.27,10.043]],"o":[[4.31,6.495],[0,0],[1.234,0.881],[20.558,23.867],[7.425,-9.567],[0,0],[-15.421,-20.066],[-9.137,3.444],[1.356,4.518],[0,0],[5.302,7.299],[0,0],[-6.813,-10.23],[-5.07,-9.585],[0.925,0.809],[0.095,1.208],[7.736,10.665],[5.589,15.165],[-2.863,2.3],[-3.982,-7.072],[0,0]],"v":[[93.257,-7.49],[101.025,1.439],[102.511,4.052],[114.641,21.13],[190.12,67.787],[199.495,18.99],[104.834,-87.091],[61.967,-92.6],[47.266,-69.4],[52.081,-69.019],[77.457,-35.171],[93.257,-7.49],[117.906,-15.615],[86.988,-50.161],[82.051,-58.285],[140.594,-1.938],[148.019,10.635],[170.959,43.482],[185.567,65.261],[142.317,20.158],[117.716,-15.432]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[{"i":[[0,0],[-2.441,-1.823],[0,0],[-2.67,-6.469],[-17.888,2.069],[15.512,25.08],[22.541,13.102],[15.575,-3.834],[-3.624,-11.32],[-1.599,-2.397],[0,0],[-2.962,-5.929],[0,0],[6.413,15.905],[-4.102,-0.842],[-0.778,-15.138],[1.74,-4.586],[-4.401,-18.929],[5.225,-3.016],[13.295,22.971],[1.506,10.251]],"o":[[2.748,8.479],[0,0],[1.32,0.794],[16.644,23.327],[19.636,-9.893],[0,0],[-12.251,-17.5],[-17.478,5.914],[1.1,4.395],[0,0],[2.664,6.856],[0,0],[-9.52,-9.617],[-4.987,-13.166],[3.384,0.783],[-0.312,1.28],[9.741,8.117],[4.249,15.228],[-8.198,4.411],[-4.063,-9.568],[0,0]],"v":[[81.839,-13.295],[90.004,0.513],[93.39,2.227],[105.095,19.016],[177.757,68.864],[190.877,18.152],[125.843,-86.035],[71.007,-99.626],[53.604,-71.534],[57.298,-70.36],[71.736,-37.665],[81.839,-13.295],[117.666,-18.318],[88.094,-53.457],[90.361,-69.615],[139.24,-5.308],[143.472,3.482],[165.062,35.113],[175.119,54.828],[131.04,17.742],[117.501,-18.158]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[-1.615,-2.613],[0,0],[-1.576,-5.709],[-43.435,5.765],[5.967,19.312],[4.141,10.832],[31.883,-10.851],[-2.105,-8.42],[-0.363,-1.791],[0,0],[-1.794,-6.187],[0,0],[3.665,13.489],[-17.828,-1.453],[12.087,-18.757],[4.1,-5.958],[-1.11,-20.279],[10.11,-4.579],[8.306,24.699],[-6.02,10.669]],"o":[[-0.376,12.447],[0,0],[1.491,0.62],[8.815,22.246],[44.057,-10.544],[0,0],[-13.618,-31.505],[-26.159,8.358],[0.589,4.148],[0,0],[-2.613,5.97],[0,0],[-14.936,-8.39],[-4.822,-20.327],[8.302,0.733],[-1.126,1.423],[13.75,3.02],[1.568,15.355],[-18.868,8.633],[-4.225,-14.561],[0,0]],"v":[[59.004,-24.905],[67.963,-1.339],[75.147,-1.424],[86.004,14.787],[160.163,78.509],[190.345,2.19],[166.931,-80.249],[87.722,-115.146],[59.038,-74.117],[60.491,-71.359],[60.296,-42.654],[59.004,-24.905],[117.187,-23.724],[90.306,-60.049],[106.983,-92.276],[136.533,-12.047],[134.379,-10.822],[160.402,25.866],[161.354,41.453],[108.486,12.908],[117.073,-23.61]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.8,"y":0},"t":104,"s":[{"i":[[0,0],[-0.404,-5.184],[0,0],[-0.037,-3.77],[-74.873,-6.263],[0.226,23.278],[0,0],[49.785,-2.696],[0,0],[2.998,-0.046],[0,0],[-0.23,-7.469],[0,0],[0.198,20.429],[-28.554,-9.564],[59.273,-31.607],[12.858,-11.476],[5.091,-26.681],[13.636,-5.019],[0.333,34.288],[-12.416,9.556]],"o":[[0.37,11.719],[0,0],[2.998,-0.046],[0,0],[57.839,4.838],[0,0],[-0.452,-46.557],[-31.737,1.718],[0.037,3.77],[0,0],[0.105,2.842],[0,0],[-19.588,-17.515],[-0.333,-34.287],[13.729,4.598],[-4.088,2.18],[15.124,10.792],[-3.301,17.298],[-28.362,10.439],[-0.189,-19.51],[0,0]],"v":[[57.701,-16.212],[58.929,13.675],[74.305,13.438],[79.797,20.184],[140.193,114.8],[212.033,28.793],[211.202,-56.82],[136.149,-139.748],[73.209,-103.81],[68.939,-95.95],[70.288,-37.885],[57.701,-16.212],[122.399,-11.723],[97.972,-63.405],[148.083,-115.705],[152.342,-25.183],[138.03,-13.044],[179.376,52.548],[149.242,91.489],[97.074,36.797],[122.399,-11.723]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[-0.473,-5.184],[0,0],[-0.043,-3.77],[-87.676,-5.301],[0.264,23.278],[0,0],[43.176,1.407],[0,0],[3.507,-0.046],[0,0],[-0.269,-7.469],[0,0],[0.232,20.429],[-33.404,-9.565],[14.597,-60.199],[16.696,-11.476],[6.611,-26.682],[15.952,-5.019],[0.39,34.288],[-14.525,9.556]],"o":[[0.432,11.719],[0,0],[3.507,-0.046],[0,0],[58.616,3.544],[0,0],[-0.529,-46.556],[-74.067,-2.414],[0.043,3.77],[0,0],[0.123,2.842],[0,0],[-22.915,-17.515],[-0.39,-34.287],[16.06,4.598],[-2.568,10.59],[19.639,10.792],[-4.286,17.298],[-33.179,10.439],[-0.222,-19.51],[0,0]],"v":[[37.589,-16.212],[39.025,13.675],[65.52,11.582],[71.944,18.327],[142.347,111.021],[218.133,28.793],[217.16,-56.82],[140.88,-136.937],[74.915,-42.243],[68.646,-35.33],[68.905,-35.024],[37.589,-16.212],[105.852,-11.416],[85.008,-64.171],[161.252,-119.689],[206.097,-30.301],[186.411,-9.015],[204.337,58.052],[156.297,93.424],[83.321,39.756],[105.852,-11.416]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.171,0.146,0.15,0.5,0.348,0.331,0.359,1,0.524,0.517,0.569]}},"s":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[177.972,155.7],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[79.289,76.833],"to":[0,0],"ti":[0,0]},{"t":104,"s":[177.972,155.7]}]},"e":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[171.761,-122.342],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[167.328,-45.102],"to":[0,0],"ti":[0,0]},{"t":104,"s":[171.761,-122.342]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 12","bm":0,"hd":false}],"ip":12,"op":145,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Middle circles 2","parent":9,"sr":1,"ks":{"p":{"a":0,"k":[8.089,-11.266,0]},"a":{"a":0,"k":[8.089,-11.266,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[0.947,-1.656],[-13.48,-13.938]],"o":[[0,0],[-3.246,5.677],[3.821,3.951]],"v":[[39.212,-27.894],[39.153,-27.622],[46.222,12.374]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0.546,-1.09],[-12.115,-14.974]],"o":[[0.361,0.345],[-3.497,4.467],[3.448,4.261]],"v":[[38.848,-27.089],[39.237,-27.047],[45.336,12.171]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[1.514,-1.852],[-12.406,-14.753]],"o":[[-0.187,0.59],[-4.199,4.843],[3.527,4.195]],"v":[[41.496,-29.137],[40.381,-27.953],[45.525,12.214]],"c":false}]},{"i":{"x":0.003,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[3.625,-3.515],[-13.04,-14.272]],"o":[[-1.383,1.124],[-5.731,5.663],[3.701,4.051]],"v":[[37.584,-26.223],[35.45,-25.003],[45.936,12.309]],"c":false}]},{"t":104,"s":[{"i":[[0,0],[5.087,-4.667],[-13.48,-13.938]],"o":[[-2.211,1.495],[-6.792,6.231],[3.821,3.951]],"v":[[48.659,-37.786],[41.99,-32.384],[46.222,12.374]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.207843139768,0.188235297799,0.184313729405,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.008]},"t":63,"s":[100]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[0]},{"t":104,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[4.618,3.916],[-9.932,11.605],[0,0],[0,0],[0,0],[-0.881,1.088],[-21.042,-5.515],[3.349,-1.058],[0,0]],"o":[[-15.948,-13.522],[0.104,-0.315],[0,0],[3.724,4.964],[0,0],[-5.389,8.371],[0.139,2.479],[-1.829,0.578],[-3.686,-0.348]],"v":[[31.363,20.585],[28.356,-42.43],[28.712,-42.386],[31.392,-38.211],[38.861,-28.556],[39.432,-29.071],[56.47,17.799],[49.041,23.542],[43.587,24.472]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[4.687,3.916],[-13.967,12.86],[-0.237,-0.309],[-1.832,0.043],[6.511,-9.704],[13.898,-4.081],[-20.329,-5.25],[3.399,-1.058],[0,0]],"o":[[-16.185,-13.522],[1.621,-1.788],[0,0],[7.881,-1.543],[-0.192,-1.117],[-20.305,7.996],[-3.852,12.872],[-1.856,0.578],[-3.74,-0.348]],"v":[[30.998,20.585],[29.954,-44.032],[36.949,-47.691],[39.476,-47.964],[57.078,-28.884],[43.631,-35.476],[64.026,7.307],[48.939,23.542],[43.403,24.472]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":87,"s":[{"i":[[4.687,3.916],[-13.967,12.86],[-0.237,-0.309],[-1.832,0.043],[6.511,-9.704],[13.898,-4.081],[-20.329,-5.25],[3.399,-1.058],[0,0]],"o":[[-16.185,-13.522],[1.621,-1.788],[0,0],[7.881,-1.543],[-0.192,-1.117],[-20.305,7.996],[0.141,2.479],[-1.856,0.578],[-3.74,-0.348]],"v":[[30.998,20.585],[29.954,-44.032],[36.949,-47.691],[39.476,-47.964],[57.078,-28.884],[43.631,-35.476],[55.739,18.338],[48.939,23.542],[43.403,24.472]],"c":true}]},{"i":{"x":0.003,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[4.645,3.916],[-13.842,12.86],[-2.529,-0.118],[0,0],[-5.275,-9.438],[2.224,-2.609],[-20.833,-5.429],[3.368,-1.058],[0,0]],"o":[[-16.04,-13.522],[0.762,0.193],[0,0],[0.413,2.081],[-3.899,-0.871],[-6.182,11.495],[0.14,2.479],[-1.84,0.578],[-3.707,-0.348]],"v":[[31.222,20.585],[29.116,-42.592],[27.901,-41.468],[28.287,-40.833],[38.764,-25.137],[36.029,-26.439],[55.74,18.338],[49.001,23.542],[43.516,24.472]],"c":true}]},{"t":104,"s":[{"i":[[4.624,3.916],[-13.782,12.86],[-3.618,-0.028],[0,0],[-2.602,-6.623],[3.237,-3.904],[-21.072,-5.515],[3.353,-1.058],[0,0]],"o":[[-15.97,-13.522],[4.371,-4.078],[0,0],[3.619,0.028],[-5.659,-0.754],[-10.868,13.108],[0.139,2.479],[-1.832,0.578],[-3.691,-0.348]],"v":[[31.328,20.585],[30.298,-44.032],[41.905,-48.744],[46.043,-48.713],[55.613,-38.088],[42.221,-32.751],[55.741,18.338],[49.031,23.542],[43.569,24.472]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[53.02,18.668],[33.146,22.176]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[52.977,18.668],[32.807,22.176]],"c":false}]},{"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[53.016,18.668],[33.114,22.176]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.776470588235,0.560784313725,0.466666666667,1]},"o":{"a":0,"k":20},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[4.602,5.806],[-8.41,9.656],[0,0],[-0.096,0.448],[-18.488,-7.547]],"o":[[-16.776,-21.166],[0.251,-0.008],[0,0],[-6.901,10.749],[-6.056,7.882]],"v":[[30.781,20.327],[28.278,-42.742],[38.842,-28.98],[39.167,-28.955],[55.911,18.181]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[4.67,5.806],[-10.214,11.983],[2.814,-17.496],[0.261,0.072],[-15.206,-6.395]],"o":[[-17.025,-21.166],[6.981,-8.189],[0.042,0.01],[-20.215,18.759],[-6.819,10.926]],"v":[[30.408,20.327],[29.882,-43.928],[57.578,-28.951],[43.401,-35.29],[58.356,15.293]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":87,"s":[{"i":[[4.67,5.806],[-10.214,11.983],[2.814,-17.496],[0.261,0.072],[-18.449,-7.42]],"o":[[-17.025,-21.166],[6.981,-8.189],[0.042,0.01],[-20.215,18.759],[-8.233,10.654]],"v":[[30.408,20.327],[29.882,-43.928],[57.578,-28.951],[43.401,-35.29],[55.896,17.973]],"c":true}]},{"i":{"x":0.003,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[4.628,5.806],[-14.001,7.037],[-1.525,-7.404],[2.069,-2.271],[-18.493,-7.506]],"o":[[-16.872,-21.166],[1.594,-0.801],[-3.675,0.37],[-10.644,13.812],[-8.159,10.654]],"v":[[30.637,20.327],[27.533,-42.382],[38.074,-25.729],[35.775,-26.3],[55.896,17.973]],"c":true}]},{"t":104,"s":[{"i":[[4.608,5.806],[-11.328,10.776],[-1.938,-10.049],[2.928,-3.384],[-18.514,-7.547]],"o":[[-16.799,-21.166],[6.396,-6.084],[-5.441,0.541],[-11.426,13.205],[-8.124,10.654]],"v":[[30.746,20.327],[28.722,-43.821],[54.454,-38.851],[41.956,-32.635],[55.896,17.973]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":7,"k":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.008},"t":63,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[0,0.307,0.303,0.346,0.125,0.431,0.417,0.439,0.25,0.556,0.531,0.531,0.425,0.364,0.363,0.387,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"t":104,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]}]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.096},"t":63,"s":[31.218,-45.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[32.232,-44.322],"to":[0,0],"ti":[0,0]},{"t":104,"s":[31.218,-45.185]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":0.2},"o":{"x":0.167,"y":0.167},"t":63,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.8,"y":0.8},"t":73,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"t":104,"s":[31.782,22.889]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[3.173,11.222],[-2.827,4.432],[0,0],[-4.876,-5.411],[-19.489,-19.967]],"o":[[0.65,0.206],[-1.233,-4.36],[3.369,-5.281],[0,0],[-0.71,0.359],[-2.764,0.568]],"v":[[27.609,15.258],[24.652,4.013],[21.63,-28.011],[28.133,-41.96],[42.449,-24.593],[51.964,14.706]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[3.22,11.222],[-2.869,4.432],[0,0],[-3.995,-0.409],[-17.416,-11.744]],"o":[[0.659,0.206],[-1.251,-4.36],[3.419,-5.281],[0,0],[-7.562,2.283],[-2.805,0.568]],"v":[[27.188,15.258],[24.187,4.013],[21.12,-28.011],[25.61,-35.822],[42.893,-25.491],[50.284,15.09]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":87,"s":[{"i":[[0,0],[3.211,11.222],[-2.861,4.432],[0,0],[-3.984,-0.409],[-17.479,-11.866]],"o":[[0.657,0.206],[-1.248,-4.36],[3.409,-5.281],[0,0],[-7.54,2.283],[-2.798,0.568]],"v":[[27.27,15.258],[24.277,4.013],[21.218,-28.011],[25.696,-35.822],[45.199,-27.766],[53.096,14.836]],"c":true}]},{"i":{"x":0.003,"y":1},"o":{"x":0.167,"y":0.167},"t":93,"s":[{"i":[[0,0],[3.191,11.222],[-2.844,4.432],[0,0],[-3.959,-0.409],[-19.879,-17.462]],"o":[[0.653,0.206],[-1.24,-4.36],[3.388,-5.281],[0,0],[-7.494,2.283],[-2.78,0.568]],"v":[[27.447,15.258],[24.472,4.013],[21.433,-28.011],[25.883,-35.822],[40.56,-23.185],[52.424,14.759]],"c":true}]},{"t":104,"s":[{"i":[[0,0],[3.178,11.222],[-2.831,4.432],[0,0],[-3.942,-0.409],[-21.542,-21.339]],"o":[[0.651,0.206],[-1.235,-4.36],[3.374,-5.281],[0,0],[-7.461,2.283],[-2.768,0.568]],"v":[[27.57,15.258],[24.608,4.013],[21.582,-28.011],[26.012,-35.822],[51.103,-37.253],[51.958,14.706]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647058824,0.082352941176,0.082352941176,1]},"o":{"a":0,"k":50},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.082352943718,0.082352943718,1]},"o":{"a":0,"k":50},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":70},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[26.186,-11.378]},"a":{"a":0,"k":[26.304,-11.396]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[4.188,-5.487],[-13.48,-13.938]],"o":[[-2.211,1.495],[-5.879,7.702],[3.821,3.951]],"v":[[50.752,-36.851],[45.679,-31.831],[50.201,11.285]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[4.188,-5.487],[-13.48,-13.938]],"o":[[-2.211,1.495],[-5.879,7.702],[3.821,3.951]],"v":[[50.752,-36.851],[45.679,-31.831],[49.797,11.313]],"c":false}]},{"t":104,"s":[{"i":[[0,0],[4.188,-5.487],[-11.489,-11.798]],"o":[[-2.211,1.495],[-5.879,7.702],[3.835,3.938]],"v":[[50.752,-36.851],[46.106,-31.523],[49.778,11.044]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.207843139768,0.188235297799,0.184313729405,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0.008]},"t":63,"s":[100]},{"i":{"x":[0.39],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":73,"s":[60]},{"t":104,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[3.662,4.092],[-11.489,10.83],[-3.393,-0.024],[0,0],[-2.439,-5.85],[-25.197,-5.381],[3.144,-0.934],[0,0]],"o":[[-14.699,-16.428],[3.972,-3.744],[0,0],[3.393,0.024],[-21.603,-2.529],[0.13,2.19],[-1.718,0.51],[-3.461,-0.308]],"v":[[37.12,16.609],[36.355,-40.756],[45.45,-44.735],[49.33,-44.707],[58.718,-38.963],[58.91,16.44],[52.619,21.038],[47.501,21.092]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[3.581,4.211],[-11.66,10.83],[-3.443,-0.024],[0,0],[-2.476,-5.85],[-25.572,-5.381],[3.191,-0.934],[0,0]],"o":[[-12.095,-14.222],[4.031,-3.744],[0,0],[3.443,0.024],[-21.924,-2.529],[0.132,2.19],[-1.743,0.51],[-3.512,-0.308]],"v":[[36.301,16.609],[35.524,-40.756],[44.754,-44.735],[48.692,-44.707],[58.22,-38.963],[58.415,16.44],[52.03,21.038],[46.836,21.092]],"c":true}]},{"t":104,"s":[{"i":[[3.667,4.092],[-11.506,10.83],[-3.398,-0.024],[0,0],[-2.443,-5.85],[-25.232,-5.381],[3.149,-0.934],[0,0]],"o":[[-14.72,-16.428],[3.978,-3.744],[0,0],[3.398,0.024],[-21.633,-2.529],[0.131,2.19],[-1.72,0.51],[-3.465,-0.308]],"v":[[37.043,16.609],[36.276,-40.756],[45.384,-44.735],[49.27,-44.707],[58.671,-38.963],[58.864,16.44],[52.563,21.038],[47.439,21.092]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.355,16.732],[38.795,18.014]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[55.822,16.732],[38,18.014]],"c":false}]},{"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[56.305,16.732],[38.72,18.014]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.776470588235,0.560784313725,0.466666666667,1]},"o":{"a":0,"k":20},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[3.962,5.361],[-8.926,8.453],[-1.817,-8.876],[-26.647,-9.576]],"o":[[-11.381,-15.398],[5.842,-5.532],[-18.728,2.552],[-7.617,9.411]],"v":[[36.575,16.381],[34.877,-40.57],[57.632,-39.637],[59.056,16.118]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[4.021,5.361],[-9.059,8.453],[-1.844,-8.876],[-27.044,-9.576]],"o":[[-11.551,-15.398],[5.929,-5.532],[-19.007,2.552],[-7.731,9.411]],"v":[[35.747,16.381],[34.023,-40.57],[57.117,-39.637],[58.562,16.118]],"c":true}]},{"t":104,"s":[{"i":[[3.968,5.361],[-8.939,8.453],[-1.82,-8.876],[-26.685,-9.576]],"o":[[-11.397,-15.398],[5.85,-5.532],[-18.754,2.552],[-7.628,9.411]],"v":[[36.497,16.381],[34.796,-40.57],[57.583,-39.637],[59.009,16.118]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":7,"k":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.008},"t":63,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[0,0.307,0.303,0.346,0.125,0.431,0.417,0.439,0.25,0.556,0.531,0.531,0.425,0.364,0.363,0.387,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]},{"t":104,"s":[0,0.482,0.459,0.447,0.125,0.598,0.58,0.575,0.25,0.714,0.702,0.702,0.425,0.443,0.449,0.473,0.6,0.173,0.196,0.243,0.8,0.278,0.271,0.284,1,0.384,0.345,0.325]}]}},"s":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.008},"t":63,"s":[31.218,-45.185],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[28.486,-30.125],"to":[0,0],"ti":[0,0]},{"t":104,"s":[31.218,-45.185]}]},"e":{"a":1,"k":[{"i":{"x":0.2,"y":0.2},"o":{"x":0.167,"y":0.167},"t":63,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.8,"y":0.8},"t":73,"s":[31.782,22.889],"to":[0,0],"ti":[0,0]},{"t":104,"s":[31.782,22.889]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.05},"t":63,"s":[{"i":[[0,0],[2.355,6.066],[-1.235,3.399],[0,0],[0,0],[-17.953,-25.236]],"o":[[0,0],[-3.841,-9.892],[1.912,-5.262],[0,0],[0,0],[-2.596,0.502]],"v":[[36.085,10.989],[31.256,0.876],[29.802,-25.338],[32.685,-32.773],[49.597,-33.523],[52.891,11.642]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[0,0],[2.39,6.066],[-1.254,3.399],[0,0],[0,0],[-18.221,-25.236]],"o":[[0,0],[-3.898,-9.892],[1.941,-5.262],[0,0],[0,0],[-2.634,0.502]],"v":[[35.249,10.989],[30.349,0.876],[28.873,-25.338],[31.8,-32.773],[48.963,-33.523],[52.306,11.642]],"c":true}]},{"t":104,"s":[{"i":[[0,0],[2.359,6.066],[-1.237,3.399],[0,0],[0,0],[-17.979,-25.236]],"o":[[0,0],[-3.846,-9.892],[1.915,-5.262],[0,0],[0,0],[-2.599,0.502]],"v":[[36.006,10.989],[31.17,0.876],[29.714,-25.338],[32.602,-32.773],[49.537,-33.523],[52.836,11.642]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647058824,0.082352941176,0.082352941176,1]},"o":{"a":0,"k":50},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647059262,0.082352943718,0.082352943718,1]},"o":{"a":0,"k":50},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":70},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-10.123,-10.829]},"a":{"a":0,"k":[26.304,-11.396]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[31.912,-9.829],[3.44,-9.26],[9.41,-33.815],[30.383,-33.82]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":30},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.25,1,1,1,0.812,0.676,0.676,0.69,1,0.353,0.353,0.38,0.25,1,0.812,0.5,1,0]}},"s":{"a":0,"k":[18.407,-37.482]},"e":{"a":0,"k":[19.577,-9.715]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 11","bm":0,"hd":false}],"ip":66,"op":89,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"MASK","parent":12,"sr":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":43,"s":[100],"h":1},{"t":118,"s":[0],"h":1}]},"p":{"a":0,"k":[216.646,165.23,0]},"a":{"a":0,"k":[216.646,165.23,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.39,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[0,0],[4.318,3.66],[-6.143,8.162],[-13.684,-1.723]],"o":[[0,0],[0,0],[0,0],[-11.423,-9.682],[4.972,-6.606],[5.022,0.632]],"v":[[231.835,216.631],[220.815,219.925],[211.666,169.188],[200.842,161.755],[198.106,127.834],[227.097,118.196]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[4.318,3.66],[-6.143,8.162],[-13.684,-1.723]],"o":[[0,0],[0,0],[0,0],[-11.423,-9.682],[4.972,-6.606],[5.022,0.632]],"v":[[231.962,216.619],[220.815,219.925],[211.666,169.188],[200.842,161.755],[198.106,127.834],[227.097,118.196]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":114,"s":[{"i":[[0,0],[0,0],[0,0],[4.246,3.743],[-7.437,7.728],[-7.504,1.276]],"o":[[0,0],[0,0],[0,0],[-12.979,-11.442],[7.392,-7.681],[4.991,-0.848]],"v":[[238.395,215.289],[221.095,220.011],[211.945,169.274],[201.121,161.841],[196.84,127.391],[219.161,116.275]],"c":false}]},{"t":115,"s":[{"i":[[0,0],[0,0],[0,0],[4.246,3.743],[-7.437,7.728],[-10.169,-1.222]],"o":[[0,0],[0,0],[0,0],[-12.979,-11.442],[7.392,-7.681],[5.026,0.604]],"v":[[225.02,217.975],[221.095,220.011],[211.945,169.274],[201.121,161.841],[196.84,127.391],[224.872,119.36]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470588235,0.133333333333,0.141176470588,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[217,164.5]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":36,"s":[{"i":[[0.503,2.235],[0,0],[0,0],[0.943,-7.648],[-6.585,4.859],[0,0],[0,0],[0,0],[1.823,-4.485]],"o":[[-1.546,-5.427],[0,0],[0,0],[10.876,0.729],[6.503,-4.798],[0,0],[0,0],[0,0],[-1.781,4.382]],"v":[[-82.32,33.05],[-89.105,-11.953],[-95.37,-15.813],[-90.388,55.875],[-63.598,47.037],[-53.267,37.293],[-64.955,-14.07],[-68.141,-12.265],[-63.691,29.078]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0.503,2.235],[0,0],[0,0],[0.943,-7.648],[-7.716,5.812],[0,0],[0,0],[0,0],[1.823,-4.485]],"o":[[-1.546,-5.427],[0,0],[0,0],[17.884,8.127],[14.831,-11.171],[0,0],[0,0],[0,0],[-1.781,4.382]],"v":[[-82.32,33.05],[-89.105,-11.953],[-97.661,-16.958],[-101.948,50.158],[-64.757,47.175],[-45.676,26.543],[-59.703,-16.49],[-68.081,-15.093],[-63.691,29.078]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.8,"y":0},"t":74,"s":[{"i":[[1.129,2.94],[0,0],[0,0],[0.943,-7.648],[-11.165,7.032],[0,0],[0,0],[0,0],[-0.198,-3.778]],"o":[[-2.154,-2.525],[0,0],[0,0],[22.29,32.05],[23.139,-14.573],[0,0],[0,0],[0,0],[-0.15,3.974]],"v":[[-81.136,33.92],[-88.787,-12.796],[-105.757,-27.307],[-118.046,31.817],[-64.911,47.418],[-37.905,0.759],[-49.178,-21.988],[-67.795,-13.716],[-63.116,26.619]],"c":true}]},{"t":104,"s":[{"i":[[0.503,2.235],[0,0],[0,0],[0.943,-7.648],[-7.716,5.812],[0,0],[0,0],[0,0],[1.823,-4.485]],"o":[[-1.546,-5.427],[0,0],[0,0],[20.9,11.701],[14.831,-11.171],[0,0],[0,0],[0,0],[-1.781,4.382]],"v":[[-82.32,33.05],[-89.105,-11.953],[-100.537,-19.252],[-104.323,48.412],[-64.757,47.175],[-45.207,23.56],[-56.041,-17.216],[-68.081,-15.093],[-63.691,29.078]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.31,0.27,0.302,0.075,0.282,0.253,0.276,0.5,0.255,0.235,0.251,0.921,0.282,0.253,0.276,0.995,0.31,0.271,0.302,0,0,0.075,0.5,0.5,1,0.925,0.5,1,0]}},"s":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[-98.928,18.08],"to":[-2.9,-1.982],"ti":[0.853,0.507]},{"i":{"x":0.4,"y":1},"o":{"x":0.8,"y":0},"t":74,"s":[-116.326,6.186],"to":[-0.853,-0.507],"ti":[-2.046,-1.475]},{"t":104,"s":[-104.048,15.036]}]},"e":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[-52.777,14.025],"to":[2.546,-0.731],"ti":[-0.66,0.564]},{"i":{"x":0.4,"y":1},"o":{"x":0.8,"y":0},"t":74,"s":[-37.503,9.64],"to":[0.66,-0.564],"ti":[1.886,-0.166]},{"t":104,"s":[-48.817,10.639]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[211.85,195.64]},"a":{"a":0,"k":[-87.679,12.685]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0.017]},"t":36,"s":[0]},{"i":{"x":[0.718],"y":[1.012]},"o":{"x":[0.469],"y":[0]},"t":56,"s":[70]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.214],"y":[0.014]},"t":74,"s":[65]},{"i":{"x":[0.6],"y":[0.973]},"o":{"x":[0.7],"y":[0.017]},"t":102,"s":[70]},{"t":121,"s":[0]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shadow","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":44,"s":[{"i":[[0,0],[0,0],[0,0],[3.552,4.484],[-8.572,10.091],[-7.266,-0.777]],"o":[[0,0],[0,0],[0,0],[-7.3,-9.215],[5.435,-6.398],[5.035,0.538]],"v":[[231.318,216.473],[221.2,220.174],[213.342,170.017],[199.587,156.752],[200.463,124.076],[221.726,114.221]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[0,0],[4.218,3.865],[-6.143,8.357],[-7.266,-0.777]],"o":[[0,0],[0,0],[0,0],[-8.166,-7.483],[4.972,-6.764],[5.035,0.538]],"v":[[229.332,216.795],[223.805,218.229],[214.207,168.219],[201.772,159.334],[197.901,124.808],[221.726,114.221]],"c":false}]},{"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[4.218,3.865],[-6.143,8.357],[-7.266,-0.777]],"o":[[0,0],[0,0],[0,0],[-8.166,-7.483],[4.972,-6.764],[5.035,0.538]],"v":[[229.332,216.795],[223.805,218.229],[214.207,168.219],[201.772,159.334],[197.901,124.808],[221.726,114.221]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.690196078431,0.678431372549,0.682352941176,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[211.881,166.436]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":43,"s":[{"i":[[5.879,-5.674],[-3.587,-3.671],[0,0],[0.253,1.262],[-2.656,68.805],[-14.839,-36.51]],"o":[[-10.396,10.033],[3.587,3.671],[0,0],[6.969,49.805],[1.691,-43.811],[-8.831,5.121]],"v":[[203.927,128.259],[201.584,158.238],[212.891,167.871],[218.543,207.299],[172.516,162.184],[226.511,118.442]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[6.383,-6.246],[-12.485,-8.625],[0,0],[0.253,1.262],[-2.656,68.805],[-15.729,-34.993]],"o":[[-6.383,6.246],[5.541,3.828],[0,0],[4.706,36.301],[1.691,-43.811],[-8.928,1.834]],"v":[[202.223,128.856],[203.718,160.982],[213.291,169.226],[220.094,214.065],[174.878,162.842],[226.803,119.846]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":104,"s":[{"i":[[6.383,-6.246],[-12.485,-8.625],[0,0],[0.253,1.262],[-2.656,68.805],[-15.729,-34.993]],"o":[[-6.383,6.246],[5.541,3.828],[0,0],[4.706,36.301],[1.691,-43.811],[-8.928,1.834]],"v":[[202.223,128.856],[203.718,160.982],[213.291,169.226],[220.094,214.065],[174.878,162.842],[226.803,119.846]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[9.761,-6.585],[-6.04,-8.38],[0,0],[0.253,1.262],[1.965,75.655],[-19.359,-41.32]],"o":[[-13.58,9.123],[2.898,4.038],[0,0],[6.541,46.553],[-1.3,-49.857],[-5.084,-0.565]],"v":[[202.436,128.378],[202.313,159.819],[212.666,168.773],[218.619,207.628],[170.886,165.084],[224.02,116.891]],"c":true}]},{"t":115,"s":[{"i":[[9.934,-6.602],[-5.711,-8.368],[0,0],[0.253,1.262],[2.201,76.005],[-19.544,-41.643]],"o":[[-13.948,9.27],[2.764,4.049],[0,0],[6.634,47.076],[-1.453,-50.166],[-4.887,-0.688]],"v":[[202.447,128.353],[202.242,159.76],[212.634,168.75],[218.543,207.299],[170.683,165.198],[224.08,120.22]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.741,0.733,0.733,0.275,0.606,0.596,0.604,0.55,0.471,0.459,0.475,0.775,0.363,0.361,0.388,1,0.255,0.263,0.302]}},"s":{"a":0,"k":[194.055,105.823]},"e":{"a":0,"k":[244.571,237.496]},"t":1,"nm":"Gradient Fill 44","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":184,"st":4,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"BODY","parent":2,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":37,"s":[29.133,-9.871,0],"to":[3.699,-0.259,0],"ti":[-3.699,0.259,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.4,"y":0.4},"t":56,"s":[51.328,-11.423,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.6,"y":0},"t":104,"s":[51.328,-11.423,0],"to":[-3.699,0.259,0],"ti":[3.699,-0.259,0]},{"t":120,"s":[29.133,-9.871,0]}]},"a":{"a":0,"k":[29.133,-9.871,0]},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"i":{"x":[0.39,0.39,0.39],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":56,"s":[90,90,100]},{"i":{"x":[0.6,0.6,0.6],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":104,"s":[90,90,100]},{"t":120,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.582,-36.22],[24.126,-36.804]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-7.523,-35.866],[56.94,-40.624]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-7.569,-34.873],[56.555,-39.226]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.7,"y":0},"t":56,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-28.106,-33.305],[55.156,-38.332]],"c":false}]},{"i":{"x":0.6,"y":0.837},"o":{"x":0.6,"y":0},"t":104,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-28.106,-33.305],[55.156,-38.332]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-40.917,-37.434],[56.94,-42.857]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.582,-36.22],[24.126,-36.804]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-16.991,-4.039],[-89.45,1.047]],"o":[[1.791,13.149],[89.803,-1.196],[0,0]],"v":[[-251.333,-22.701],[-240.803,17.068],[26.853,13.826]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-8.398,-3.408],[-58.538,1.24]],"o":[[-6.393,15.131],[44.385,-1.009],[0,0]],"v":[[-136.737,-17.676],[-125.644,13.162],[57.725,19.352]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[-8.398,-3.253],[-58.538,1.183]],"o":[[-3.209,16.266],[44.385,-0.963],[0,0]],"v":[[-136.267,-17.837],[-125.174,11.593],[57.725,18.01]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.7,"y":0},"t":56,"s":[{"i":[[0,0],[-8.597,-3.246],[-58.482,2.806]],"o":[[-2.121,19.257],[1.932,-0.061],[0,0]],"v":[[-48.66,-18.211],[-35.632,15.501],[58.512,16.976]],"c":false}]},{"i":{"x":0.6,"y":0.837},"o":{"x":0.6,"y":0},"t":104,"s":[{"i":[[0,0],[-8.597,-3.246],[-58.482,2.806]],"o":[[-2.121,19.257],[1.932,-0.061],[0,0]],"v":[[-48.66,-18.211],[-35.632,15.501],[58.512,16.976]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[-8.327,-1.916],[-58.538,1.272]],"o":[[-3.915,18.513],[44.385,-1.058],[0,0]],"v":[[-144.928,-20.128],[-133.161,12.376],[57.725,18.681]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-16.991,-4.039],[-89.45,1.047]],"o":[[1.791,13.149],[89.803,-1.196],[0,0]],"v":[[-251.333,-22.701],[-240.803,17.068],[26.853,13.826]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470592618,0.133333340287,0.141176477075,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0.462,8.059],[0,0],[-0.072,-5.92],[0,0],[-5.929,0.073],[0,0]],"o":[[0,0],[-5.929,0.072],[0,0],[0.073,5.93],[0,0],[-0.861,-8.781]],"v":[[26.827,-36.837],[-240.736,-33.561],[-251.333,-22.701],[-250.976,6.487],[-240.115,17.095],[29.133,13.798]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0.302,9.547],[0,0],[3.933,-7.734],[-3.497,-6.927],[-2.931,0.061],[0,0]],"o":[[0,0],[-2.931,0.061],[-3.284,6.457],[3.516,6.965],[0,0],[-0.564,-10.401]],"v":[[57.708,-40.661],[-125.611,-29.564],[-136.991,-18.916],[-136.289,2.092],[-125.304,13.185],[59.217,19.319]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0.302,9.111],[0,0],[3.259,-7.472],[-2.763,-6.88],[-2.931,0.059],[0,0]],"o":[[0,0],[-2.931,0.058],[-2.154,4.938],[2.792,6.953],[0,0],[-0.564,-9.926]],"v":[[57.708,-39.262],[-125.141,-29.182],[-135.889,-18.432],[-135.193,1.141],[-124.834,11.615],[59.217,17.979]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.7,"y":0},"t":56,"s":[{"i":[[0.552,8.803],[0,0],[2.755,-8.965],[-3.215,-7.869],[-2.921,0.264],[0,0]],"o":[[0,0],[-2.921,0.264],[-1.821,5.925],[3.249,7.953],[0,0],[-0.836,-9.585]],"v":[[56.922,-38.418],[-38.311,-32.236],[-48.322,-18.933],[-46.325,3.934],[-35.291,15.503],[60.003,16.903]],"c":true}]},{"i":{"x":0.6,"y":0.837},"o":{"x":0.6,"y":0},"t":104,"s":[{"i":[[0.552,8.803],[0,0],[2.755,-8.965],[-3.215,-7.869],[-2.921,0.264],[0,0]],"o":[[0,0],[-2.921,0.264],[-1.821,5.925],[3.249,7.953],[0,0],[-0.836,-9.585]],"v":[[56.922,-38.418],[-38.311,-32.236],[-48.322,-18.933],[-46.325,3.934],[-35.291,15.503],[60.003,16.903]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0.302,9.795],[0,0],[3.656,-8.341],[-3.384,-7.404],[-2.931,0.064],[0,0]],"o":[[0,0],[-2.931,0.064],[-2.343,5.345],[3.38,7.395],[0,0],[-0.564,-10.672]],"v":[[57.708,-42.895],[-133.128,-32.408],[-144.732,-20.859],[-143.875,0.965],[-132.821,12.4],[59.217,18.647]],"c":true}]},{"t":144,"s":[{"i":[[0.462,8.059],[0,0],[-0.072,-5.92],[0,0],[-5.929,0.073],[0,0]],"o":[[0,0],[-5.929,0.072],[0,0],[0.073,5.93],[0,0],[-0.861,-8.781]],"v":[[26.827,-36.837],[-240.736,-33.561],[-251.333,-22.701],[-250.976,6.487],[-240.115,17.095],[29.133,13.798]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.254901975393,0.247058823705,0.266666680574,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[-0.135,-10.991]],"o":[[0,0],[-2.436,0.017],[0,0]],"v":[[-14.915,-29.69],[-242.532,-26.382],[-251.237,-14.83]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[1.331,-8.445]],"o":[[0,0],[-1.204,0.014],[0,0]],"v":[[6.138,-31.558],[-126.493,-24.88],[-137.044,-15.651]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[0,0],[1.331,-8.059]],"o":[[0,0],[-1.204,0.014],[0,0]],"v":[[5.104,-30.387],[-126.022,-24.712],[-135.948,-15.792]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.7,"y":0},"t":56,"s":[{"i":[[0,0],[0,0],[0.792,-9.524]],"o":[[0,0],[-1.201,0.096],[0,0]],"v":[[2.89,-29.852],[-38.894,-26.945],[-48.205,-15.838]],"c":false}]},{"i":{"x":0.6,"y":0.837},"o":{"x":0.6,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[0.792,-9.524]],"o":[[0,0],[-1.201,0.096],[0,0]],"v":[[2.89,-29.852],[-38.894,-26.945],[-48.205,-15.838]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[0,0],[1.331,-8.851]],"o":[[0,0],[-1.204,0.015],[0,0]],"v":[[6.138,-33.554],[-134.009,-27.499],[-143.935,-17.701]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0],[-0.135,-10.991]],"o":[[0,0],[-2.436,0.017],[0,0]],"v":[[-14.915,-29.69],[-242.532,-26.382],[-251.237,-14.83]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":40},"w":{"a":0,"k":7.26},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":104,"s":[0]},{"t":120,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[2.642,-0.236],[0,0],[0,0],[0,0]],"o":[[-14.301,1.278],[0,0],[0,0],[0,0]],"v":[[-240.736,-33.561],[-250.84,-1.517],[-1.857,-5.477],[-1.036,-36.108]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[1.289,-0.289],[0,0],[0,0],[0,0]],"o":[[-14.215,3.183],[0,0],[0,0],[0,0]],"v":[[-125.611,-29.564],[-136.98,-2.677],[8.936,-3.552],[9.462,-37.335]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[1.289,-0.275],[0,0],[0,0],[0,0]],"o":[[-14.215,3.037],[0,0],[0,0],[0,0]],"v":[[-125.141,-29.182],[-136.509,-3.523],[8.463,-4.066],[8.085,-36.341]],"c":true}]},{"i":{"x":0.231,"y":1},"o":{"x":0.457,"y":0},"t":56,"s":[{"i":[[1.268,-0.409],[0,0],[0,0],[0,0]],"o":[[-13.984,4.506],[0,0],[0,0],[0,0]],"v":[[-38.311,-32.236],[-47.95,-1.437],[7.923,-2.449],[5.124,-35.753]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[{"i":[[1.268,-0.409],[0,0],[0,0],[0,0]],"o":[[-13.984,4.506],[0,0],[0,0],[0,0]],"v":[[-37.811,-32.271],[-46.921,6.601],[8.451,5.624],[5.124,-35.753]],"c":true}]},{"i":{"x":0.6,"y":0.837},"o":{"x":0.6,"y":0},"t":104,"s":[{"i":[[1.268,-0.409],[0,0],[0,0],[0,0]],"o":[[-13.984,4.506],[0,0],[0,0],[0,0]],"v":[[-38.311,-32.236],[-47.95,-1.437],[7.923,-2.449],[5.124,-35.753]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[1.293,-0.282],[0,0],[0,0],[0,0]],"o":[[-18.105,3.948],[0,0],[0,0],[0,0]],"v":[[-133.128,-32.408],[-144.496,-4.226],[8.936,-4.819],[9.462,-39.482]],"c":true}]},{"t":144,"s":[{"i":[[2.642,-0.236],[0,0],[0,0],[0,0]],"o":[[-14.301,1.278],[0,0],[0,0],[0,0]],"v":[[-240.736,-33.561],[-250.84,-1.517],[-1.857,-5.477],[-1.036,-36.108]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":50},"r":1,"bm":0,"g":{"p":5,"k":{"a":1,"k":[{"i":{"x":0.231,"y":1},"o":{"x":0.457,"y":0},"t":56,"s":[0,1,1,1,0.125,1,1,1,0.25,1,1,1,0.812,0.676,0.676,0.69,1,0.353,0.353,0.38,0.006,1,0.128,1,0.25,1,0.812,0.5,1,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[0,0.525,0.518,0.541,0.125,0.69,0.686,0.697,0.25,0.854,0.854,0.854,0.812,0.603,0.603,0.617,1,0.353,0.353,0.38,0.006,1,0.128,1,0.25,1,0.812,0.5,1,0]},{"t":104,"s":[0,1,1,1,0.125,1,1,1,0.25,1,1,1,0.812,0.676,0.676,0.69,1,0.353,0.353,0.38,0.006,1,0.128,1,0.25,1,0.812,0.5,1,0]}]}},"s":{"a":1,"k":[{"i":{"x":0.231,"y":1},"o":{"x":0.457,"y":0},"t":56,"s":[-126.735,-42.122],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[-129.408,-29.364],"to":[0,0],"ti":[0,0]},{"t":104,"s":[-126.735,-42.122]}]},"e":{"a":1,"k":[{"i":{"x":0.231,"y":1},"o":{"x":0.457,"y":0},"t":56,"s":[-126.745,-2.538],"to":[0,0],"ti":[0,0]},{"i":{"x":0.39,"y":1},"o":{"x":0.8,"y":0},"t":73,"s":[-126.626,9.743],"to":[0,0],"ti":[0,0]},{"t":104,"s":[-126.745,-2.538]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[-3.148,-0.356],[-29.809,0.312]],"o":[[1.783,3.291],[5.351,0.606],[0,0]],"v":[[-251.01,3.693],[-242.586,9.464],[26.228,7.695]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[-4.701,-0.836],[-19.508,0.369]],"o":[[0.881,2.778],[2.652,0.472],[0,0]],"v":[[-136.063,1.865],[-128.91,8.626],[57.316,12.09]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0,0],[-4.701,-0.798],[-19.508,0.353]],"o":[[0.881,2.651],[2.652,0.45],[0,0]],"v":[[-134.719,0.801],[-127.44,7.372],[57.316,11.079]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.7,"y":0},"t":56,"s":[{"i":[[0,0],[-4.745,-0.62],[-19.49,0.895]],"o":[[1.056,3.044],[2.677,0.35],[0,0]],"v":[[-45.875,3.505],[-38.173,10.71],[57.913,10.284]],"c":false}]},{"i":{"x":0.6,"y":0.837},"o":{"x":0.6,"y":0},"t":104,"s":[{"i":[[0,0],[-4.745,-0.62],[-19.49,0.895]],"o":[[1.056,3.044],[2.677,0.35],[0,0]],"v":[[-45.875,3.505],[-38.173,10.71],[57.913,10.284]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[-4.701,-0.876],[-19.508,0.379]],"o":[[0.881,2.911],[2.652,0.494],[0,0]],"v":[[-142.706,0.524],[-135.426,7.74],[57.316,11.229]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[-3.148,-0.356],[-29.809,0.312]],"o":[[1.783,3.291],[5.351,0.606],[0,0]],"v":[[-251.01,3.693],[-242.586,9.464],[26.228,7.695]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.776470588235,0.560784313725,0.466666666667,1]},"o":{"a":0,"k":20},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0.462,8.059],[0,0],[-0.072,-5.92],[0,0],[-5.929,0.073],[0,0]],"o":[[0,0],[-5.929,0.072],[0,0],[0.073,5.93],[0,0],[-0.861,-8.781]],"v":[[26.827,-36.837],[-240.736,-33.561],[-251.333,-22.701],[-250.976,6.487],[-240.115,17.095],[29.133,13.798]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0.302,9.547],[0,0],[-0.036,-4.996],[0,0],[-2.931,0.061],[0,0]],"o":[[0,0],[-2.931,0.061],[0,0],[2.43,4.94],[0,0],[-0.564,-10.401]],"v":[[57.708,-40.661],[-125.611,-29.564],[-135.986,-17.798],[-135.914,2.458],[-125.304,13.185],[59.217,19.319]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":44,"s":[{"i":[[0.302,9.111],[0,0],[-0.036,-4.767],[0,0],[-2.931,0.059],[0,0]],"o":[[0,0],[-2.931,0.058],[0,0],[2.43,4.715],[0,0],[-0.564,-9.926]],"v":[[57.708,-39.262],[-125.141,-29.182],[-135.516,-17.953],[-135.444,1.378],[-124.834,11.615],[59.217,17.979]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.7,"y":0},"t":56,"s":[{"i":[[0.552,8.803],[0,0],[-0.353,-5.579],[0,0],[-2.921,0.264],[0,0]],"o":[[0,0],[-2.921,0.264],[0,0],[2.739,5.357],[0,0],[-0.836,-9.585]],"v":[[56.922,-38.418],[-38.311,-32.236],[-47.918,-18.397],[-46.56,4.229],[-35.291,15.503],[60.003,16.903]],"c":true}]},{"i":{"x":0.6,"y":0.837},"o":{"x":0.6,"y":0},"t":104,"s":[{"i":[[0.552,8.803],[0,0],[-0.353,-5.579],[0,0],[-2.921,0.264],[0,0]],"o":[[0,0],[-2.921,0.264],[0,0],[2.739,5.357],[0,0],[-0.836,-9.585]],"v":[[56.922,-38.418],[-38.311,-32.236],[-47.918,-18.397],[-46.56,4.229],[-35.291,15.503],[60.003,16.903]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0.302,9.795],[0,0],[-0.036,-5.236],[0,0],[-2.931,0.064],[0,0]],"o":[[0,0],[-2.931,0.064],[0,0],[2.43,5.178],[0,0],[-0.564,-10.672]],"v":[[57.708,-42.895],[-133.128,-32.408],[-143.503,-20.075],[-143.431,1.157],[-132.821,12.4],[59.217,18.647]],"c":true}]},{"t":144,"s":[{"i":[[0.462,8.059],[0,0],[-0.072,-5.92],[0,0],[-5.929,0.073],[0,0]],"o":[[0,0],[-5.929,0.072],[0,0],[0.073,5.93],[0,0],[-0.861,-8.781]],"v":[[26.827,-36.837],[-240.736,-33.561],[-251.333,-22.701],[-250.976,6.487],[-240.115,17.095],[29.133,13.798]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":9,"k":{"a":0,"k":[0,0.22,0.192,0.196,0.225,0.276,0.263,0.275,0.45,0.333,0.333,0.353,0.565,0.292,0.296,0.325,0.68,0.251,0.259,0.298,0.79,0.363,0.361,0.388,0.9,0.475,0.463,0.478,0.95,0.406,0.4,0.424,1,0.337,0.337,0.369]}},"s":{"a":0,"k":[-202.986,-10.731]},"e":{"a":0,"k":[239.658,-13.436]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Leg","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"t":6,"s":[100],"h":1},{"t":47,"s":[0],"h":1},{"t":114,"s":[100],"h":1}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-189.877,16.189,0],"to":[15.315,-0.52,0],"ti":[-15.315,0.52,0]},{"i":{"x":0.384,"y":0.384},"o":{"x":0.6,"y":0.6},"t":37,"s":[-97.986,13.069,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.818,"y":0.546},"o":{"x":0.581,"y":0},"t":104,"s":[-97.986,13.069,0],"to":[-1.364,-0.253,0],"ti":[7.82,0.125,0]},{"i":{"x":0.653,"y":0.793},"o":{"x":0.346,"y":0.164},"t":114,"s":[-99.55,10.88,0],"to":[-0.762,-0.012,0],"ti":[1.723,-0.104,0]},{"i":{"x":0.6,"y":0.958},"o":{"x":0.251,"y":0.326},"t":116,"s":[-104.31,6.043,0],"to":[-1.421,0.086,0],"ti":[1.045,-0.035,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.024},"t":120,"s":[-107.623,11.28,0],"to":[-15.315,0.52,0],"ti":[13.709,-0.818,0]},{"t":144,"s":[-189.877,16.189,0]}]},"a":{"a":0,"k":[-189.877,16.189,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0.115,0.001],[2.511,1.979],[0,0],[3.276,-2.85],[0,0],[0,0],[0.451,-0.31],[2.881,-0.035],[0,0],[0.041,3.365],[0,0],[-3.365,0.041],[-0.128,12.855],[0,0],[0,0],[0,0]],"o":[[-0.115,0.001],[-3.191,-0.037],[0,0],[-3.411,-2.688],[0,0],[0,0],[-0.416,0.362],[-2.354,1.618],[0,0],[-3.365,0.041],[0,0],[-0.041,-3.365],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-159.049,98.868],[-159.393,98.868],[-168.188,95.762],[-184.616,82.817],[-196.143,83.097],[-210.54,95.624],[-211.045,96.063],[-212.347,97.072],[-220.373,99.619],[-235.35,99.802],[-241.518,93.784],[-241.915,61.367],[-235.897,55.2],[-216.127,43.425],[-216.453,16.804],[-166.251,16.189],[-166.084,29.86]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[1.108,0.064],[1.259,2.092],[0,0],[4.568,-2.758],[2.341,-3.363],[0,0],[8.629,0.938],[1.471,-0.033],[0,0],[0.016,3.05],[0,0],[-2.354,-0.362],[-0.212,2.955],[0,0],[0,0],[0,0]],"o":[[-0.131,0.003],[-3.248,-0.188],[0,0],[-1.918,-2.257],[0,0],[8.046,1.691],[-0.166,0.265],[-0.279,-0.14],[0,0],[-1.339,0.037],[0,0],[-0.016,-3.049],[2.354,0.362],[0,0],[0,0],[0,0],[0,0]],"v":[[-149.412,80.151],[-162.041,84.244],[-183.031,78.593],[-189.519,66.094],[-198.27,60.902],[-207.426,75.969],[-189.098,70.446],[-206.911,76.034],[-209.82,75.934],[-215.037,74.625],[-217.492,69.171],[-217.65,44.551],[-215.255,38.962],[-205.844,35.153],[-206.154,11.689],[-176.828,11.173],[-176.809,11.329]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":42,"s":[{"i":[[0,0],[1.108,0.064],[1.259,2.092],[0,0],[4.568,-2.758],[2.341,-3.363],[0,0],[8.629,0.938],[1.471,-0.033],[0,0],[0.016,3.05],[0,0],[-2.354,-0.362],[-0.212,2.955],[0,0],[0,0],[0,0]],"o":[[-0.131,0.003],[-3.248,-0.188],[0,0],[-1.918,-2.257],[0,0],[8.046,1.691],[-0.166,0.265],[-0.279,-0.14],[0,0],[-1.339,0.037],[0,0],[-0.016,-3.049],[2.354,0.362],[0,0],[0,0],[0,0],[0,0]],"v":[[-149.37,79.747],[-161.999,83.84],[-183.066,78.903],[-189.519,66.094],[-198.27,60.902],[-207.426,75.969],[-189.098,70.446],[-206.911,76.034],[-209.82,75.934],[-215.037,74.625],[-217.492,69.171],[-217.665,43.303],[-215.27,37.713],[-205.86,33.904],[-206.154,11.689],[-176.828,11.173],[-176.809,11.329]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[1.108,0.053],[1.259,1.718],[0,0],[4.568,-2.265],[2.341,-2.762],[0,0],[8.629,0.771],[1.471,-0.027],[0,0],[0.016,2.505],[0,0],[-2.354,-0.297],[-0.212,2.427],[0,0],[0,0],[0,0]],"o":[[-0.131,0.002],[-3.248,-0.154],[0,0],[-1.917,-1.854],[0,0],[8.045,1.389],[-0.166,0.218],[-0.279,-0.115],[0,0],[-1.339,0.031],[0,0],[-0.016,-2.505],[2.354,0.297],[0,0],[0,0],[0,0],[0,0]],"v":[[-149.179,69.465],[-161.807,72.827],[-182.972,66.942],[-189.517,56.254],[-198.268,51.989],[-207.423,64.365],[-189.096,59.829],[-206.908,64.418],[-209.817,64.336],[-215.036,63.261],[-217.49,58.781],[-217.663,37.534],[-215.268,32.944],[-205.859,29.815],[-206.153,11.568],[-176.828,11.145],[-176.809,11.273]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[1.101,0.053],[1.252,1.742],[0,0],[1.539,-2.297],[0.789,-2.801],[0,0],[2.908,0.781],[0.496,-0.028],[0,0],[0.006,2.54],[0,0],[-0.793,-0.301],[-0.072,2.461],[0,0],[0,0],[0,0]],"o":[[-0.13,0.002],[-3.23,-0.157],[0,0],[-0.646,-1.88],[0,0],[2.711,1.408],[-0.056,0.221],[-0.094,-0.116],[0,0],[-0.451,0.031],[0,0],[-0.006,-2.54],[0.793,0.301],[0,0],[0,0],[0,0],[0,0]],"v":[[-149.6,65.054],[-162.157,68.463],[-182.868,65.622],[-188.732,56.877],[-191.68,52.553],[-194.765,65.101],[-188.59,60.501],[-194.592,65.154],[-195.572,65.071],[-197.385,63.989],[-198.212,59.447],[-198.27,37.904],[-197.463,33.249],[-194.292,30.077],[-194.392,11.576],[-176.866,11.147],[-176.848,11.277]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[1.01,0.064],[1.148,2.092],[0,0],[4.166,-2.758],[2.135,-3.363],[0,0],[7.869,0.938],[1.341,-0.033],[0,0],[0.015,3.05],[0,0],[-2.147,-0.362],[-0.194,2.955],[0,0],[0,0],[0,0]],"o":[[-0.12,0.003],[-2.962,-0.188],[0,0],[-1.749,-2.257],[0,0],[7.337,1.691],[-0.151,0.265],[-0.254,-0.14],[0,0],[-1.221,0.037],[0,0],[-0.015,-3.049],[2.147,0.362],[0,0],[0,0],[0,0],[0,0]],"v":[[-152.419,75.905],[-163.934,79.997],[-180.573,76.478],[-186.494,65.978],[-194.474,60.785],[-202.823,75.853],[-186.11,70.33],[-202.354,75.917],[-205.007,75.818],[-212.269,74.625],[-214.507,69.171],[-214.665,43.303],[-212.481,37.713],[-203.9,33.904],[-204.168,11.689],[-177.425,11.173],[-177.408,11.329]],"c":false}]},{"i":{"x":0.6,"y":0.565},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[0,0],[1.101,0.053],[1.252,1.742],[0,0],[1.539,-2.297],[0.789,-2.801],[0,0],[2.908,0.781],[0.496,-0.028],[0,0],[0.006,2.54],[0,0],[-0.793,-0.301],[-0.072,2.461],[0,0],[0,0],[0,0]],"o":[[-0.13,0.002],[-3.23,-0.157],[0,0],[-0.646,-1.88],[0,0],[2.711,1.408],[-0.056,0.221],[-0.094,-0.116],[0,0],[-0.451,0.031],[0,0],[-0.006,-2.54],[0.793,0.301],[0,0],[0,0],[0,0],[0,0]],"v":[[-149.889,59.641],[-162.142,64.439],[-182.311,61.789],[-188.732,56.877],[-191.68,52.553],[-194.765,65.101],[-188.032,56.669],[-194.592,65.154],[-195.572,65.071],[-197.385,63.989],[-198.212,59.447],[-198.27,37.904],[-197.463,33.249],[-194.292,30.077],[-194.392,11.576],[-176.866,11.147],[-176.848,11.277]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[0.083,0.001],[1.267,2.331],[0,0],[2.564,-2.929],[0,0],[0,0],[0.213,-0.298],[1.36,-0.034],[0,0],[0.016,3.238],[0,0],[-2.256,-0.384],[-0.204,3.138],[0,0],[0,0],[0,0]],"o":[[-0.054,0.001],[-2.314,-0.033],[0,0],[-1.838,-2.397],[0,0],[0,0],[-0.197,0.349],[-1.111,1.557],[0,0],[-1.284,0.04],[0,0],[-0.016,-3.238],[2.256,0.384],[0,0],[0,0],[0,0],[0,0]],"v":[[-163.548,88.913],[-163.755,88.913],[-180.418,85.526],[-186.641,74.376],[-194.122,68.863],[-201.439,80.978],[-201.696,81.403],[-202.311,82.374],[-206.1,84.824],[-213.733,83.558],[-216.085,77.767],[-216.251,50.299],[-213.956,44.364],[-204.936,40.32],[-205.218,16.73],[-177.109,16.183],[-177.202,17.474]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0.115,0.001],[2.511,1.979],[0,0],[3.276,-2.85],[0,0],[0,0],[0.451,-0.31],[2.881,-0.035],[0,0],[0.041,3.365],[0,0],[-3.365,0.041],[-0.128,12.855],[0,0],[0,0],[0,0]],"o":[[-0.115,0.001],[-3.191,-0.037],[0,0],[-3.411,-2.688],[0,0],[0,0],[-0.416,0.362],[-2.354,1.618],[0,0],[-3.365,0.041],[0,0],[-0.041,-3.365],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-159.049,98.868],[-159.393,98.868],[-168.188,95.762],[-184.616,82.817],[-196.143,83.097],[-210.54,95.624],[-211.045,96.063],[-212.347,97.072],[-220.373,99.619],[-235.35,99.802],[-241.518,93.784],[-241.915,61.367],[-235.897,55.2],[-216.127,43.425],[-216.453,16.804],[-166.251,16.189],[-166.084,29.86]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.160784319043,0.113725490868,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[-0.041,-3.365],[0,0],[-3.365,0.041],[0,0],[-2.59,2.253],[0,0],[-3.411,-2.688],[0,0],[-3.312,0.041],[0,0],[0.041,3.365],[0,0],[3.365,-0.041],[0.8,14.901],[0,0]],"o":[[0,0],[-0.312,13.437],[-3.365,0.041],[0,0],[0.041,3.365],[0,0],[3.432,-0.042],[0,0],[3.276,-2.85],[0,0],[2.602,2.05],[0,0],[3.365,-0.041],[0,0],[-0.041,-3.365],[0,0],[0,0],[0,0]],"v":[[-216.453,16.804],[-216.127,43.425],[-235.897,55.2],[-241.915,61.367],[-241.518,93.784],[-235.35,99.802],[-220.373,99.619],[-211.045,96.063],[-196.143,83.097],[-184.616,82.817],[-168.188,95.762],[-159.049,98.868],[-143.858,98.682],[-137.839,92.514],[-138.236,60.097],[-144.404,54.079],[-165.925,42.811],[-166.251,16.189]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[0,0],[-0.016,-3.049],[0,0],[-1.339,0.037],[0,0],[-1.275,2.042],[0,0],[-1.918,-2.257],[0,0],[-1.943,-0.437],[0,0],[0.023,3.049],[0,0],[1.772,0.61],[0.446,13.504],[0,0]],"o":[[0,0],[-0.174,12.177],[-1.339,0.037],[0,0],[0.016,3.049],[0,0],[1.691,-0.038],[0,0],[4.152,-2.755],[0,0],[1.281,1.858],[0,0],[1.876,-0.037],[0,0],[-0.1,-2.502],[0,0],[0,0],[0,0]],"v":[[-206.154,11.689],[-205.994,28.699],[-215.255,38.962],[-217.65,44.551],[-217.492,69.171],[-215.037,74.625],[-209.82,75.934],[-205.226,72.712],[-198.27,60.902],[-189.519,66.094],[-183.591,77.659],[-179.089,80.474],[-162.174,83.965],[-158.815,78.688],[-159.729,45.977],[-161.528,40.929],[-176.552,28.817],[-176.828,11.173]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":42,"s":[{"i":[[0,0],[0,0],[0,0],[-0.016,-3.049],[0,0],[-1.339,0.037],[0,0],[-1.275,2.042],[0,0],[-1.918,-2.257],[0,0],[-1.943,-0.437],[0,0],[0.023,3.049],[0,0],[1.772,0.61],[0.446,13.504],[0,0]],"o":[[0,0],[-0.174,12.177],[-1.339,0.037],[0,0],[0.016,3.049],[0,0],[1.691,-0.038],[0,0],[4.152,-2.755],[0,0],[1.281,1.858],[0,0],[1.876,-0.037],[0,0],[-0.1,-2.502],[0,0],[0,0],[0,0]],"v":[[-206.154,11.689],[-205.994,28.699],[-215.27,37.713],[-217.665,43.303],[-217.492,69.171],[-215.037,74.625],[-209.82,75.934],[-205.226,72.712],[-198.27,60.902],[-189.519,66.094],[-183.626,77.968],[-179.125,80.783],[-162.132,83.561],[-158.773,78.284],[-159.729,45.977],[-161.528,40.929],[-176.552,28.817],[-176.828,11.173]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[0,0],[-0.016,-2.505],[0,0],[-1.339,0.031],[0,0],[-1.275,1.677],[0,0],[-1.917,-1.854],[0,0],[-1.943,-0.359],[0,0],[0.023,2.505],[0,0],[1.772,0.501],[0.446,11.091],[0,0]],"o":[[0,0],[-0.174,10.002],[-1.339,0.031],[0,0],[0.016,2.505],[0,0],[1.69,-0.031],[0,0],[4.152,-2.263],[0,0],[1.281,1.526],[0,0],[1.876,-0.031],[0,0],[-0.1,-2.055],[0,0],[0,0],[0,0]],"v":[[-206.153,11.568],[-205.993,25.54],[-215.268,32.944],[-217.663,37.534],[-217.49,58.781],[-215.036,63.261],[-209.817,64.336],[-205.223,61.69],[-198.268,51.989],[-189.517,56.254],[-183.532,66.174],[-179.031,68.486],[-161.94,72.598],[-158.581,68.264],[-159.73,39.731],[-161.529,35.584],[-176.552,25.636],[-176.828,11.145]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[-0.006,-2.54],[0,0],[-0.451,0.031],[0,0],[-0.43,1.701],[0,0],[-0.646,-1.88],[0,0],[-1.932,-0.364],[0,0],[0.023,2.54],[0,0],[1.762,0.508],[0.443,11.246],[0,0]],"o":[[0,0],[-0.059,10.141],[-0.451,0.031],[0,0],[0.006,2.54],[0,0],[0.57,-0.032],[0,0],[1.399,-2.295],[0,0],[1.274,1.547],[0,0],[1.865,-0.031],[0,0],[-0.1,-2.084],[0,0],[0,0],[0,0]],"v":[[-194.392,11.576],[-194.338,25.742],[-197.463,33.249],[-198.27,37.904],[-198.212,59.447],[-197.385,63.989],[-195.572,65.071],[-194.024,62.388],[-191.68,52.553],[-188.732,56.877],[-183.425,64.844],[-178.949,67.188],[-162.289,68.23],[-158.949,63.836],[-159.864,40.131],[-161.654,35.927],[-176.592,25.84],[-176.866,11.147]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[0,0],[-0.015,-3.049],[0,0],[-1.221,0.037],[0,0],[-1.163,2.042],[0,0],[-1.749,-2.257],[0,0],[-1.772,-0.437],[0,0],[0.021,3.049],[0,0],[1.616,0.61],[0.407,13.504],[0,0]],"o":[[0,0],[-0.159,12.177],[-1.221,0.037],[0,0],[0.015,3.049],[0,0],[1.542,-0.038],[0,0],[3.787,-2.755],[0,0],[1.169,1.858],[0,0],[1.711,-0.037],[0,0],[-0.092,-2.502],[0,0],[0,0],[0,0]],"v":[[-204.168,11.689],[-204.023,28.699],[-212.481,37.713],[-214.665,43.303],[-214.507,69.171],[-212.269,74.625],[-205.007,75.818],[-200.817,72.596],[-194.474,60.785],[-186.494,65.978],[-181.084,75.544],[-176.979,78.359],[-164.056,79.719],[-160.993,74.442],[-161.832,45.977],[-163.473,40.929],[-177.174,28.817],[-177.425,11.173]],"c":true}]},{"i":{"x":0.6,"y":0.565},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[0,0],[0,0],[0,0],[-0.006,-2.54],[0,0],[-0.451,0.031],[0,0],[-0.43,1.701],[0,0],[-0.646,-1.88],[0,0],[-1.932,-0.364],[0,0],[0.023,2.54],[0,0],[1.762,0.508],[0.443,11.246],[0,0]],"o":[[0,0],[-0.059,10.141],[-0.451,0.031],[0,0],[0.006,2.54],[0,0],[0.57,-0.032],[0,0],[1.399,-2.295],[0,0],[1.274,1.547],[0,0],[1.865,-0.031],[0,0],[-0.1,-2.084],[0,0],[0,0],[0,0]],"v":[[-194.392,11.576],[-194.338,25.742],[-197.463,33.249],[-198.27,37.904],[-198.212,59.447],[-197.385,63.989],[-195.572,65.071],[-194.024,62.388],[-191.68,52.553],[-188.732,56.877],[-182.867,61.011],[-178.391,63.355],[-162.275,64.207],[-158.935,59.812],[-159.864,40.131],[-161.654,35.927],[-176.592,25.84],[-176.866,11.147]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[-0.016,-3.238],[0,0],[-1.284,0.04],[0,0],[-1.223,2.168],[0,0],[-1.838,-2.397],[0,0],[-1.863,-0.464],[0,0],[0.022,3.238],[0,0],[1.698,0.648],[0.427,14.339],[0,0]],"o":[[0,0],[-0.167,12.93],[-1.284,0.04],[0,0],[0.016,3.238],[0,0],[1.62,-0.04],[0,0],[2.331,-2.926],[0,0],[1.228,1.973],[0,0],[1.798,-0.04],[0,0],[-0.096,-2.657],[0,0],[0,0],[0,0]],"v":[[-205.218,16.73],[-205.065,34.793],[-213.956,44.364],[-216.251,50.299],[-216.085,77.767],[-213.733,83.558],[-206.1,84.824],[-201.696,81.403],[-194.122,68.863],[-186.641,74.376],[-180.955,84.534],[-176.64,87.523],[-163.053,89.298],[-159.838,83.363],[-160.72,53.138],[-162.445,47.778],[-176.845,34.917],[-177.109,16.183]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[0,0],[-0.041,-3.365],[0,0],[-3.365,0.041],[0,0],[-2.59,2.253],[0,0],[-3.411,-2.688],[0,0],[-3.312,0.041],[0,0],[0.041,3.365],[0,0],[3.365,-0.041],[0.8,14.901],[0,0]],"o":[[0,0],[-0.312,13.437],[-3.365,0.041],[0,0],[0.041,3.365],[0,0],[3.432,-0.042],[0,0],[3.276,-2.85],[0,0],[2.602,2.05],[0,0],[3.365,-0.041],[0,0],[-0.041,-3.365],[0,0],[0,0],[0,0]],"v":[[-216.453,16.804],[-216.127,43.425],[-235.897,55.2],[-241.915,61.367],[-241.518,93.784],[-235.35,99.802],[-220.373,99.619],[-211.045,96.063],[-196.143,83.097],[-184.616,82.817],[-168.188,95.762],[-159.049,98.868],[-143.858,98.682],[-137.839,92.514],[-138.236,60.097],[-144.404,54.079],[-165.925,42.811],[-166.251,16.189]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.207843139768,0.20000000298,0.219607844949,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[7.729,5.824],[0.355,4.226],[0.002,0.081],[0,0],[-0.034,-2.006],[0,0],[0,0],[2.005,0.004]],"o":[[-4.325,-3.259],[-0.006,-0.081],[0,0],[-0.034,-2.004],[0,0],[7.732,10.312],[2.006,0.002],[0,0]],"v":[[-166.332,60.017],[-173.014,47.552],[-173.026,47.311],[-173.53,18.107],[-167.346,18.021],[-164.754,47.607],[-140.43,56.063],[-140.442,63.322]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[4.309,5.278],[0.198,3.83],[0.001,0.073],[0,0],[-0.019,-1.818],[0,0],[0,0],[1.049,0.382]],"o":[[-2.411,-2.953],[-0.004,-0.073],[0,0],[-0.019,-1.816],[0,0],[4.31,9.345],[2.651,0.779],[0,0]],"v":[[-177.144,44.414],[-181.356,33.122],[-181.363,32.903],[-181.982,12.932],[-177.438,12.833],[-175.899,33.164],[-160.859,40.853],[-161.52,48.225]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":42,"s":[{"i":[[4.309,5.278],[0.198,3.83],[0.001,0.073],[0,0],[-0.019,-1.818],[0,0],[0,0],[1.049,0.382]],"o":[[-2.411,-2.953],[-0.004,-0.073],[0,0],[-0.019,-1.816],[0,0],[4.31,9.345],[2.651,0.779],[0,0]],"v":[[-177.144,44.414],[-181.356,33.122],[-181.363,32.903],[-181.982,12.932],[-177.438,12.833],[-175.899,33.164],[-160.859,40.853],[-161.52,48.225]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[4.308,4.335],[0.198,3.146],[0.001,0.06],[0,0],[-0.019,-1.493],[0,0],[0,0],[1.049,0.314]],"o":[[-2.411,-2.426],[-0.004,-0.06],[0,0],[-0.019,-1.492],[0,0],[4.31,7.675],[2.651,0.639],[0,0]],"v":[[-177.144,38.447],[-181.356,29.173],[-181.363,28.993],[-181.982,12.589],[-177.439,12.508],[-175.899,29.207],[-160.86,35.523],[-161.522,41.578]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[4.284,4.396],[0.197,3.189],[0.001,0.061],[0,0],[-0.019,-1.514],[0,0],[0,0],[1.043,0.318]],"o":[[-2.397,-2.459],[-0.004,-0.061],[0,0],[-0.019,-1.513],[0,0],[4.286,7.782],[2.636,0.648],[0,0]],"v":[[-177.181,38.83],[-181.369,29.426],[-181.376,29.243],[-181.991,12.611],[-177.473,12.529],[-175.943,29.46],[-160.988,35.864],[-161.646,42.003]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[3.929,5.278],[0.181,3.83],[0.001,0.073],[0,0],[-0.017,-1.818],[0,0],[0,0],[0.956,0.382]],"o":[[-2.198,-2.953],[-0.003,-0.073],[0,0],[-0.017,-1.816],[0,0],[3.931,9.345],[2.417,0.779],[0,0]],"v":[[-177.714,44.414],[-181.555,33.122],[-181.561,32.903],[-182.125,12.932],[-177.982,12.833],[-176.578,33.164],[-162.863,40.853],[-163.466,48.225]],"c":true}]},{"i":{"x":0.6,"y":0.565},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[4.284,4.396],[0.197,3.189],[0.001,0.061],[0,0],[-0.019,-1.514],[0,0],[0,0],[1.043,0.318]],"o":[[-2.397,-2.459],[-0.004,-0.061],[0,0],[-0.019,-1.513],[0,0],[4.286,7.782],[2.636,0.648],[0,0]],"v":[[-177.181,38.83],[-181.369,29.426],[-181.376,29.243],[-181.991,12.611],[-177.473,12.529],[-175.943,29.46],[-160.988,35.864],[-161.646,42.003]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[4.13,5.605],[0.19,4.067],[0.001,0.078],[0,0],[-0.018,-1.93],[0,0],[0,0],[1.005,0.406]],"o":[[-2.311,-3.136],[-0.003,-0.078],[0,0],[-0.018,-1.929],[0,0],[4.131,9.923],[2.541,0.827],[0,0]],"v":[[-177.412,51.479],[-181.45,39.489],[-181.456,39.257],[-182.049,18.05],[-177.695,17.945],[-176.219,39.533],[-161.803,47.698],[-162.437,55.526]],"c":true}]},{"t":144,"s":[{"i":[[7.729,5.824],[0.355,4.226],[0.002,0.081],[0,0],[-0.034,-2.006],[0,0],[0,0],[2.005,0.004]],"o":[[-4.325,-3.259],[-0.006,-0.081],[0,0],[-0.034,-2.004],[0,0],[7.732,10.312],[2.006,0.002],[0,0]],"v":[[-166.332,60.017],[-173.014,47.552],[-173.026,47.311],[-173.53,18.107],[-167.346,18.021],[-164.754,47.607],[-140.43,56.063],[-140.442,63.322]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":50},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.25,1,1,1,0.812,0.676,0.676,0.69,1,0.353,0.353,0.38,0.25,1,0.812,0.5,1,0]}},"s":{"a":0,"k":[-176.698,74.812]},"e":{"a":0,"k":[-156.74,37.493]},"t":1,"nm":"Gradient Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[-2.004,0.026],[-5.824,0.891],[-6.044,-1.825],[9.784,-1.879],[0.514,-0.007]],"o":[[0.12,-0.001],[9.187,-1.405],[0.148,1.821],[-6.419,1.232],[-0.836,0.011]],"v":[[-240.289,56.994],[-225.081,54.052],[-212.509,43.13],[-221.126,62.848],[-240.196,64.254]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[-0.798,0.023],[-3.247,0.807],[-3.369,-1.654],[6.921,-4.186],[0.204,-0.006]],"o":[[0.048,-0.001],[5.121,-1.274],[0.082,1.65],[-3.261,1.972],[-0.333,0.01]],"v":[[-217.003,40.589],[-210.343,37.958],[-202.661,26.534],[-206.738,45.912],[-216.966,47.168]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":42,"s":[{"i":[[-0.798,0.023],[-3.247,0.807],[-3.369,-1.654],[6.921,-4.186],[0.204,-0.006]],"o":[[0.048,-0.001],[5.121,-1.274],[0.082,1.65],[-3.261,1.972],[-0.333,0.01]],"v":[[-217.018,39.34],[-210.359,36.709],[-202.661,26.534],[-206.754,44.664],[-216.981,45.919]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[-0.797,0.019],[-3.247,0.663],[-3.369,-1.358],[6.921,-3.438],[0.204,-0.005]],"o":[[0.048,-0.001],[5.121,-1.046],[0.082,1.355],[-3.261,1.62],[-0.333,0.008]],"v":[[-217.016,34.279],[-210.357,32.119],[-202.66,23.761],[-206.752,38.652],[-216.979,39.683]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[-0.269,0.019],[-1.094,0.672],[-1.135,-1.377],[2.332,-3.486],[0.069,-0.005]],"o":[[0.016,-0.001],[1.726,-1.061],[0.028,1.374],[-1.099,1.642],[-0.112,0.008]],"v":[[-198.052,34.604],[-195.808,32.413],[-193.215,23.939],[-194.594,39.037],[-198.04,40.083]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[-0.727,0.023],[-2.961,0.807],[-3.073,-1.654],[6.312,-4.186],[0.186,-0.006]],"o":[[0.043,-0.001],[4.67,-1.274],[0.075,1.65],[-2.974,1.972],[-0.303,0.01]],"v":[[-214.075,39.34],[-208.002,36.709],[-200.983,26.534],[-204.715,44.664],[-214.041,45.919]],"c":true}]},{"i":{"x":0.6,"y":0.565},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[-0.269,0.019],[-1.094,0.672],[-1.135,-1.377],[2.332,-3.486],[0.069,-0.005]],"o":[[0.016,-0.001],[1.726,-1.061],[0.028,1.374],[-1.099,1.642],[-0.112,0.008]],"v":[[-198.052,34.604],[-195.808,32.413],[-193.215,23.939],[-194.594,39.037],[-198.04,40.083]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[-0.764,0.025],[-3.112,0.857],[-3.23,-1.756],[6.634,-4.445],[0.196,-0.006]],"o":[[0.046,-0.001],[4.909,-1.352],[0.079,1.752],[-3.126,2.094],[-0.319,0.01]],"v":[[-215.631,46.091],[-209.248,43.298],[-201.871,32.494],[-205.793,51.744],[-215.596,53.077]],"c":true}]},{"t":144,"s":[{"i":[[-2.004,0.026],[-5.824,0.891],[-6.044,-1.825],[9.784,-1.879],[0.514,-0.007]],"o":[[0.12,-0.001],[9.187,-1.405],[0.148,1.821],[-6.419,1.232],[-0.836,0.011]],"v":[[-240.289,56.994],[-225.081,54.052],[-212.509,43.13],[-221.126,62.848],[-240.196,64.254]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":50},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.25,1,1,1,0.812,0.676,0.676,0.69,1,0.353,0.353,0.38,0.25,1,0.812,0.5,1,0]}},"s":{"a":0,"k":[-255.459,79.634]},"e":{"a":0,"k":[-218.224,52.203]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[-2.468,2.146],[0,0],[-5.284,-4.176],[0,0],[-3.072,0.126],[0,0]],"o":[[0,0],[3.27,-0.039],[0,0],[5.082,-4.42],[0,0],[2.412,1.906],[0,0],[0,0]],"v":[[-237.426,93.916],[-223.318,93.749],[-214.429,90.364],[-199.731,77.58],[-181.856,77.159],[-166.315,89.443],[-157.815,92.202],[-140.837,91.508]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[-1.215,1.945],[0,0],[-3.825,-5.708],[0,0],[-1.498,-0.231],[0,0]],"o":[[0,0],[1.823,-0.035],[0,0],[3.374,-3.001],[0,0],[1.188,1.728],[0,0],[0,0]],"v":[[-215.001,69.899],[-210.493,70.546],[-205.306,67.764],[-197.841,55.967],[-188.618,60.061],[-182.124,71.573],[-174.756,74.658],[-160.544,78.011]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":42,"s":[{"i":[[0,0],[0,0],[-1.215,1.945],[0,0],[-3.825,-5.708],[0,0],[-1.498,-0.231],[0,0]],"o":[[0,0],[1.823,-0.035],[0,0],[3.374,-3.001],[0,0],[1.188,1.728],[0,0],[0,0]],"v":[[-215.001,69.899],[-210.493,70.546],[-205.306,67.764],[-197.841,55.967],[-188.618,60.061],[-182.16,71.882],[-174.792,74.967],[-160.502,77.608]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[-1.215,1.598],[0,0],[-3.824,-4.688],[0,0],[-1.498,-0.19],[0,0]],"o":[[0,0],[1.823,-0.029],[0,0],[3.374,-2.465],[0,0],[1.188,1.419],[0,0],[0,0]],"v":[[-215,59.379],[-210.49,59.911],[-205.304,57.625],[-197.839,47.936],[-188.617,51.299],[-182.066,61.175],[-174.699,63.709],[-160.31,67.708]],"c":false}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[-0.41,1.62],[0,0],[-1.289,-4.753],[0,0],[-1.49,-0.193],[0,0]],"o":[[0,0],[0.614,-0.029],[0,0],[1.137,-2.499],[0,0],[1.181,1.439],[0,0],[0,0]],"v":[[-197.373,60.053],[-195.799,60.585],[-194.051,58.267],[-191.536,48.443],[-188.428,51.852],[-181.967,59.775],[-174.802,62.352],[-160.668,63.273]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[-1.108,1.945],[0,0],[-3.488,-5.708],[0,0],[-1.366,-0.231],[0,0]],"o":[[0,0],[1.663,-0.035],[0,0],[3.077,-3.001],[0,0],[1.083,1.728],[0,0],[0,0]],"v":[[-212.236,69.899],[-205.62,70.43],[-200.891,67.647],[-194.083,55.85],[-185.673,59.944],[-179.747,69.458],[-175.532,72.66],[-162.57,73.765]],"c":false}]},{"i":{"x":0.6,"y":0.565},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[0,0],[0,0],[-0.41,1.62],[0,0],[-1.289,-4.753],[0,0],[-1.49,-0.193],[0,0]],"o":[[0,0],[0.614,-0.029],[0,0],[1.137,-2.499],[0,0],[1.181,1.439],[0,0],[0,0]],"v":[[-197.373,60.053],[-195.799,60.585],[-194.051,58.267],[-191.536,48.443],[-188.428,51.852],[-181.409,55.943],[-174.245,58.519],[-160.654,59.249]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[0,0],[-1.165,2.065],[0,0],[-3.666,-6.061],[0,0],[-1.436,-0.246],[0,0]],"o":[[0,0],[1.747,-0.037],[0,0],[1.894,-3.186],[0,0],[1.139,1.835],[0,0],[0,0]],"v":[[-213.698,78.539],[-206.745,79.104],[-201.773,76.149],[-193.882,63.622],[-185.778,67.97],[-179.549,78.072],[-175.12,81.471],[-161.495,82.645]],"c":false}]},{"t":144,"s":[{"i":[[0,0],[0,0],[-2.468,2.146],[0,0],[-5.284,-4.176],[0,0],[-3.072,0.126],[0,0]],"o":[[0,0],[3.27,-0.039],[0,0],[5.082,-4.42],[0,0],[2.412,1.906],[0,0],[0,0]],"v":[[-237.426,93.916],[-223.318,93.749],[-214.429,90.364],[-199.731,77.58],[-181.856,77.159],[-166.315,89.443],[-157.815,92.202],[-140.837,91.508]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.776470588235,0.560784313725,0.466666666667,1]},"o":{"a":0,"k":20},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[6.119,0.12],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-6.327,0.458],[0,0],[0,0],[0,0]],"v":[[-168.037,28.288],[-177.769,22.878],[-206.519,23.586],[-216.212,29.826],[-216.354,18.334],[-168.173,17.245]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[3.411,0.109],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-3.527,0.415],[0,0],[0,0],[0,0]],"v":[[-165.014,21.641],[-177.916,22.858],[-200.559,21.625],[-205.962,27.28],[-206.099,13.076],[-164.603,12.454]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":42,"s":[{"i":[[0,0],[3.411,0.109],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-3.527,0.415],[0,0],[0,0],[0,0]],"v":[[-165.014,21.641],[-177.916,22.858],[-200.559,21.625],[-205.962,27.28],[-206.099,13.076],[-164.603,12.454]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[3.411,0.089],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-3.527,0.341],[0,0],[0,0],[0,0]],"v":[[-165.015,19.742],[-177.916,20.742],[-200.558,19.729],[-205.961,24.374],[-206.098,12.708],[-164.604,12.197]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[3.392,0.091],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-1.188,0.345],[0,0],[0,0],[0,0]],"v":[[-165.12,19.864],[-177.948,20.878],[-192.506,19.851],[-194.327,24.56],[-194.373,12.731],[-164.711,12.213]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[3.111,0.109],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-3.216,0.415],[0,0],[0,0],[0,0]],"v":[[-166.652,21.641],[-178.418,22.858],[-199.066,21.625],[-203.993,27.28],[-204.118,13.076],[-166.277,12.454]],"c":true}]},{"i":{"x":0.6,"y":0.565},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[0,0],[3.392,0.091],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-1.188,0.345],[0,0],[0,0],[0,0]],"v":[[-165.12,19.864],[-177.948,20.878],[-192.506,19.851],[-194.327,24.56],[-194.373,12.731],[-164.711,12.213]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[3.27,0.116],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-3.38,0.44],[0,0],[0,0],[0,0]],"v":[[-178.064,27.825],[-183.264,22.619],[-199.971,21.874],[-205.077,28.512],[-205.165,18.203],[-178.136,17.199]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[6.119,0.12],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-6.327,0.458],[0,0],[0,0],[0,0]],"v":[[-168.037,28.288],[-177.769,22.878],[-206.519,23.586],[-216.212,29.826],[-216.354,18.334],[-168.173,17.245]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647058824,0.082352941176,0.082352941176,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647058824,0.082352941176,0.082352941176,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[6.368,-0.078],[0,0],[-0.041,-3.365],[0,0],[-3.365,0.041],[0,0],[-2.59,2.253],[0,0],[-3.411,-2.688],[0,0],[-3.312,0.041],[0,0],[0.041,3.365],[0,0],[3.365,-0.041],[0,0],[0.078,6.368],[0,0]],"o":[[0,0],[0.078,6.368],[0,0],[-3.365,0.041],[0,0],[0.041,3.365],[0,0],[3.432,-0.042],[0,0],[3.276,-2.85],[0,0],[2.602,2.05],[0,0],[3.365,-0.041],[0,0],[-0.041,-3.365],[0,0],[-6.368,0.078],[0,0],[0,0]],"v":[[-216.453,16.804],[-216.127,43.425],[-227.516,55.097],[-235.897,55.2],[-241.915,61.367],[-241.518,93.784],[-235.35,99.802],[-220.373,99.619],[-211.045,96.063],[-196.143,83.097],[-184.616,82.817],[-168.188,95.762],[-159.049,98.868],[-143.858,98.682],[-137.839,92.514],[-138.236,60.097],[-144.404,54.079],[-154.254,54.2],[-165.925,42.811],[-166.251,16.189]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[0,0],[3.55,-0.071],[0,0],[-0.016,-3.049],[0,0],[-1.339,0.037],[0,0],[-1.275,2.042],[0,0],[-1.918,-2.257],[0,0],[-1.974,-0.466],[0,0],[0.023,3.049],[0,0],[1.772,0.61],[0,0],[0.043,5.771],[0,0]],"o":[[0,0],[0.043,5.771],[0,0],[-1.339,0.037],[0,0],[0.016,3.049],[0,0],[1.691,-0.038],[0,0],[4.251,-2.991],[0,0],[1.281,1.858],[0,0],[1.876,-0.037],[0,0],[0.778,-2.178],[0,0],[-3.353,-1.155],[0,0],[0,0]],"v":[[-206.154,11.689],[-205.994,28.699],[-212.132,38.557],[-215.255,38.962],[-217.65,44.551],[-217.492,69.171],[-215.037,74.625],[-209.82,75.934],[-205.226,72.712],[-198.27,60.902],[-189.519,66.094],[-183.591,77.659],[-179.089,80.474],[-162.17,84.277],[-158.815,78.688],[-159.729,45.977],[-161.528,40.929],[-168.826,39.738],[-176.552,28.817],[-176.828,11.173]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":42,"s":[{"i":[[0,0],[0,0],[3.55,-0.071],[0,0],[-0.016,-3.049],[0,0],[-1.339,0.037],[0,0],[-1.275,2.042],[0,0],[-1.918,-2.257],[0,0],[-1.974,-0.466],[0,0],[0.023,3.049],[0,0],[1.772,0.61],[0,0],[0.043,5.771],[0,0]],"o":[[0,0],[0.043,5.771],[0,0],[-1.339,0.037],[0,0],[0.016,3.049],[0,0],[1.691,-0.038],[0,0],[4.251,-2.991],[0,0],[1.281,1.858],[0,0],[1.876,-0.037],[0,0],[0.778,-2.178],[0,0],[-3.353,-1.155],[0,0],[0,0]],"v":[[-206.154,11.689],[-205.994,28.699],[-212.147,37.308],[-215.27,37.713],[-217.665,43.303],[-217.492,69.171],[-215.037,74.625],[-209.82,75.934],[-205.226,72.712],[-198.27,60.902],[-189.519,66.094],[-183.626,77.968],[-179.125,80.783],[-162.128,83.874],[-158.773,78.284],[-159.729,45.977],[-161.528,40.929],[-168.826,39.738],[-176.552,28.817],[-176.828,11.173]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[0,0],[3.55,-0.058],[0,0],[-0.016,-2.505],[0,0],[-1.339,0.031],[0,0],[-1.275,1.677],[0,0],[-1.917,-1.854],[0,0],[-1.974,-0.382],[0,0],[0.023,2.505],[0,0],[1.772,0.501],[0,0],[0.043,4.74],[0,0]],"o":[[0,0],[0.043,4.74],[0,0],[-1.339,0.031],[0,0],[0.016,2.505],[0,0],[1.69,-0.031],[0,0],[4.251,-2.457],[0,0],[1.281,1.526],[0,0],[1.876,-0.031],[0,0],[0.778,-1.789],[0,0],[-3.353,-0.948],[0,0],[0,0]],"v":[[-206.153,11.568],[-205.993,25.54],[-212.146,32.61],[-215.268,32.944],[-217.663,37.534],[-217.49,58.781],[-215.036,63.261],[-209.817,64.336],[-205.223,61.69],[-198.268,51.989],[-189.517,56.254],[-183.532,66.174],[-179.031,68.486],[-161.936,72.854],[-158.581,68.264],[-159.73,39.731],[-161.529,35.584],[-168.826,34.607],[-176.552,25.636],[-176.828,11.145]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[0,0],[1.196,-0.059],[0,0],[-0.006,-2.54],[0,0],[-0.451,0.031],[0,0],[-0.43,1.701],[0,0],[-0.646,-1.88],[0,0],[-1.963,-0.388],[0,0],[0.023,2.54],[0,0],[1.762,0.508],[0,0],[0.043,4.806],[0,0]],"o":[[0,0],[0.015,4.806],[0,0],[-0.451,0.031],[0,0],[0.006,2.54],[0,0],[0.57,-0.032],[0,0],[1.432,-2.491],[0,0],[1.274,1.547],[0,0],[1.865,-0.031],[0,0],[0.774,-1.814],[0,0],[-3.334,-0.962],[0,0],[0,0]],"v":[[-194.392,11.576],[-194.338,25.742],[-196.411,32.911],[-197.463,33.249],[-198.27,37.904],[-198.212,59.447],[-197.385,63.989],[-195.572,65.071],[-194.024,62.388],[-191.68,52.553],[-188.732,56.877],[-183.425,64.844],[-178.949,67.188],[-162.285,68.491],[-158.949,63.836],[-159.864,40.131],[-161.654,35.927],[-168.91,34.936],[-176.592,25.84],[-176.866,11.147]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[3.237,-0.071],[0,0],[-0.015,-3.049],[0,0],[-1.221,0.037],[0,0],[-1.163,2.042],[0,0],[-1.749,-2.257],[0,0],[-1.8,-0.466],[0,0],[0.021,3.049],[0,0],[1.616,0.61],[0,0],[0.04,5.771],[0,0]],"o":[[0,0],[0.04,5.771],[0,0],[-1.221,0.037],[0,0],[0.015,3.049],[0,0],[1.542,-0.038],[0,0],[3.877,-2.991],[0,0],[1.169,1.858],[0,0],[1.711,-0.037],[0,0],[0.71,-2.178],[0,0],[-3.058,-1.155],[0,0],[0,0]],"v":[[-204.168,11.689],[-204.023,28.699],[-209.633,37.308],[-212.481,37.713],[-214.665,43.303],[-214.507,69.171],[-212.269,74.625],[-205.007,75.818],[-200.817,72.596],[-194.474,60.785],[-186.494,65.978],[-181.084,75.544],[-176.979,78.359],[-164.052,80.031],[-160.993,74.442],[-161.832,45.977],[-163.473,40.929],[-170.128,39.738],[-177.174,28.817],[-177.425,11.173]],"c":true}]},{"i":{"x":0.6,"y":0.565},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[0,0],[0,0],[1.196,-0.059],[0,0],[-0.006,-2.54],[0,0],[-0.451,0.031],[0,0],[-0.43,1.701],[0,0],[-0.646,-1.88],[0,0],[-1.963,-0.388],[0,0],[0.023,2.54],[0,0],[1.762,0.508],[0,0],[0.043,4.806],[0,0]],"o":[[0,0],[0.015,4.806],[0,0],[-0.451,0.031],[0,0],[0.006,2.54],[0,0],[0.57,-0.032],[0,0],[1.432,-2.491],[0,0],[1.274,1.547],[0,0],[1.865,-0.031],[0,0],[0.774,-1.814],[0,0],[-3.334,-0.962],[0,0],[0,0]],"v":[[-194.392,11.576],[-194.338,25.742],[-196.411,32.911],[-197.463,33.249],[-198.27,37.904],[-198.212,59.447],[-197.385,63.989],[-195.572,65.071],[-194.024,62.388],[-191.68,52.553],[-188.732,56.877],[-182.867,61.011],[-178.391,63.355],[-162.27,64.467],[-158.935,59.812],[-159.864,40.131],[-161.654,35.927],[-168.91,34.936],[-176.592,25.84],[-176.866,11.147]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[0,0],[3.403,-0.075],[0,0],[-0.016,-3.238],[0,0],[-1.284,0.04],[0,0],[-1.223,2.168],[0,0],[-1.838,-2.397],[0,0],[-1.892,-0.494],[0,0],[0.022,3.238],[0,0],[1.698,0.648],[0,0],[0.042,6.128],[0,0]],"o":[[0,0],[0.042,6.128],[0,0],[-1.284,0.04],[0,0],[0.016,3.238],[0,0],[1.62,-0.04],[0,0],[2.387,-3.176],[0,0],[1.228,1.973],[0,0],[1.798,-0.04],[0,0],[0.746,-2.312],[0,0],[-3.214,-1.226],[0,0],[0,0]],"v":[[-205.218,16.73],[-205.065,34.793],[-210.963,43.933],[-213.956,44.364],[-216.251,50.299],[-216.085,77.767],[-213.733,83.558],[-206.1,84.824],[-201.696,81.403],[-194.122,68.863],[-186.641,74.376],[-180.955,84.534],[-176.64,87.523],[-163.053,89.298],[-159.838,83.363],[-160.72,53.138],[-162.445,47.778],[-169.439,46.514],[-176.845,34.917],[-177.109,16.183]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[0,0],[6.368,-0.078],[0,0],[-0.041,-3.365],[0,0],[-3.365,0.041],[0,0],[-2.59,2.253],[0,0],[-3.411,-2.688],[0,0],[-3.312,0.041],[0,0],[0.041,3.365],[0,0],[3.365,-0.041],[0,0],[0.078,6.368],[0,0]],"o":[[0,0],[0.078,6.368],[0,0],[-3.365,0.041],[0,0],[0.041,3.365],[0,0],[3.432,-0.042],[0,0],[3.276,-2.85],[0,0],[2.602,2.05],[0,0],[3.365,-0.041],[0,0],[-0.041,-3.365],[0,0],[-6.368,0.078],[0,0],[0,0]],"v":[[-216.453,16.804],[-216.127,43.425],[-227.516,55.097],[-235.897,55.2],[-241.915,61.367],[-241.518,93.784],[-235.35,99.802],[-220.373,99.619],[-211.045,96.063],[-196.143,83.097],[-184.616,82.817],[-168.188,95.762],[-159.049,98.868],[-143.858,98.682],[-137.839,92.514],[-138.236,60.097],[-144.404,54.079],[-154.254,54.2],[-165.925,42.811],[-166.251,16.189]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.2,0.349,0.349,0.4,0.6,0.318,0.304,0.331,1,0.286,0.259,0.263]}},"s":{"a":0,"k":[-159.836,91.174]},"e":{"a":0,"k":[-204.588,58.778]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Leg BACK","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"t":6,"s":[100],"h":1},{"t":47,"s":[0],"h":1},{"t":114,"s":[100],"h":1}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[-189.877,16.189,0],"to":[17.235,-0.127,0],"ti":[-17.235,0.127,0]},{"i":{"x":0.384,"y":0.384},"o":{"x":0.6,"y":0.6},"t":37,"s":[-86.467,15.426,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.818,"y":0.671},"o":{"x":0.581,"y":0},"t":104,"s":[-86.467,15.426,0],"to":[-0.872,-0.339,0],"ti":[7.43,0.423,0]},{"i":{"x":0.653,"y":0.689},"o":{"x":0.346,"y":0.296},"t":114,"s":[-87.103,7.988,0],"to":[-0.833,-0.048,0],"ti":[1.084,-1.429,0]},{"i":{"x":0.6,"y":0.957},"o":{"x":0.251,"y":0.264},"t":116,"s":[-90.452,6.032,0],"to":[-0.783,1.033,0],"ti":[1.171,-0.009,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.024},"t":120,"s":[-92.713,12.997,0],"to":[-17.235,0.127,0],"ti":[16.194,-0.532,0]},{"t":144,"s":[-189.877,16.189,0]}]},"a":{"a":0,"k":[-189.877,16.189,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":12,"s":[{"i":[[0,0],[1.215,-8.714],[-0.018,-1.43],[-3.365,0.041],[0,0],[-5.303,-0.548],[-3.312,0.041],[0,0],[0.041,3.365],[2.043,8.192],[0.531,-0.007],[-0.225,15.434],[0,0]],"o":[[0,0],[1.579,11.704],[0,0],[0,0],[3.432,-0.042],[5.303,0.548],[0,0],[3.365,-0.041],[0,0],[-0.383,-1.536],[0,0],[0,0],[0,0]],"v":[[-216.453,16.804],[-216.343,44.593],[-240.557,57.654],[-238.712,98.405],[-218.772,99.615],[-189.201,79.995],[-163.228,98.097],[-143.858,98.682],[-137.839,92.514],[-139.988,58.307],[-141.354,55.868],[-165.925,42.811],[-166.251,16.189]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":37,"s":[{"i":[[0,0],[3.183,-8.727],[-0.007,-1.256],[-1.3,0.037],[0,0],[0,0],[-1.917,-0.464],[0,0],[0.022,3.042],[0.199,1.989],[4.516,1.238],[0.177,7.785],[0,0]],"o":[[0,0],[-2.238,6.135],[0,0],[0,0],[1.642,-0.038],[4.128,-2.984],[0,0],[1.634,-0.708],[0,0],[-0.299,-2.985],[-3.353,-0.919],[0,0],[0,0]],"v":[[-206.094,11.697],[-213.137,30.249],[-217.272,43.233],[-215.013,73.924],[-207.469,69.763],[-195.771,60.673],[-175.294,80.997],[-163.988,78.468],[-160.73,72.893],[-161.768,46.957],[-165.75,40.278],[-176.135,33.637],[-177.615,11.183]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[{"i":[[0,0],[3.18,-8.727],[-0.007,-1.256],[-1.299,0.037],[0,0],[0,0],[-1.915,-0.464],[0,0],[0.022,3.042],[0.199,1.989],[4.511,1.238],[0.177,7.785],[0,0]],"o":[[0,0],[-2.235,6.135],[0,0],[0,0],[1.64,-0.038],[4.124,-2.984],[0,0],[1.632,-0.708],[0,0],[-0.299,-2.985],[-3.349,-0.919],[0,0],[0,0]],"v":[[-206.075,11.697],[-213.11,30.249],[-217.24,43.233],[-214.984,73.924],[-207.448,69.763],[-195.763,60.673],[-175.134,80.452],[-163.84,77.924],[-160.586,72.348],[-161.798,46.957],[-165.776,40.278],[-176.149,33.637],[-177.628,11.183]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[{"i":[[0,0],[3.175,-7.151],[-0.007,-1.029],[-1.297,0.031],[0,0],[0,0],[-1.912,-0.381],[0,0],[0.022,2.492],[0.199,1.629],[4.504,1.014],[0.177,6.378],[0,0]],"o":[[0,0],[-2.232,5.027],[0,0],[0,0],[1.637,-0.031],[4.117,-2.445],[0,0],[1.63,-0.58],[0,0],[-0.299,-2.446],[-3.344,-0.753],[0,0],[0,0]],"v":[[-206.048,11.604],[-213.072,26.805],[-217.196,37.443],[-214.943,62.59],[-207.419,59.181],[-195.753,51.733],[-175.002,69.848],[-163.726,67.776],[-160.477,63.208],[-161.841,40.495],[-165.813,35.022],[-176.169,29.581],[-177.646,11.183]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[1.326,-7.252],[-0.003,-1.043],[-0.541,0.031],[0,0],[0,0],[-1.902,-0.386],[0,0],[0.022,2.528],[0.198,1.652],[4.479,1.029],[0.176,6.468],[0,0]],"o":[[0,0],[-0.932,5.098],[0,0],[0,0],[0.684,-0.032],[1.719,-2.48],[0,0],[1.621,-0.588],[0,0],[-0.297,-2.481],[-3.326,-0.764],[0,0],[0,0]],"v":[[-197.638,11.61],[-200.571,27.026],[-202.292,37.814],[-201.352,63.316],[-198.211,59.859],[-193.34,52.305],[-175.368,65.976],[-164.154,63.875],[-160.923,59.243],[-161.99,40.909],[-165.94,35.359],[-176.239,29.841],[-177.708,11.183]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[0,0],[2.902,-8.727],[-0.006,-1.256],[-1.186,0.037],[0,0],[0,0],[-1.748,-0.464],[0,0],[0.02,3.042],[0.182,1.989],[4.117,1.238],[0.161,7.785],[0,0]],"o":[[0,0],[-2.04,6.135],[0,0],[0,0],[1.497,-0.038],[3.764,-2.984],[0,0],[1.49,-0.708],[0,0],[-0.273,-2.985],[-3.057,-0.919],[0,0],[0,0]],"v":[[-204.583,11.697],[-211.005,30.249],[-214.775,43.233],[-212.715,73.924],[-205.837,69.763],[-195.171,60.673],[-176.466,77.125],[-166.158,74.597],[-163.187,69.021],[-164.169,46.957],[-167.8,40.278],[-177.268,33.637],[-178.617,11.183]],"c":true}]},{"i":{"x":0.6,"y":0.565},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[0,0],[1.326,-7.252],[-0.003,-1.043],[-0.541,0.031],[0,0],[0,0],[-1.902,-0.386],[0,0],[0.022,2.528],[0.198,1.652],[4.479,1.029],[0.176,6.468],[0,0]],"o":[[0,0],[-0.932,5.098],[0,0],[0,0],[0.684,-0.032],[1.719,-2.48],[0,0],[1.621,-0.588],[0,0],[-0.297,-2.481],[-3.326,-0.764],[0,0],[0,0]],"v":[[-197.638,11.61],[-200.571,27.026],[-202.292,37.814],[-201.352,63.316],[-198.211,59.859],[-193.34,52.305],[-175.368,65.976],[-164.154,63.875],[-160.923,59.243],[-161.99,40.909],[-165.94,35.359],[-176.239,29.841],[-177.708,11.183]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.15,"y":0.061},"t":120,"s":[{"i":[[0,0],[3.142,-9.29],[-0.006,-1.337],[-1.284,0.04],[0,0],[0,0],[-1.892,-0.494],[0,0],[0.022,3.238],[0.414,8.426],[0.042,0.25],[0.854,10.056],[0,0]],"o":[[0,0],[-2.209,6.531],[0,0],[0,0],[1.62,-0.04],[2.387,-3.176],[0,0],[1.798,-0.04],[0,0],[-0.078,-1.58],[0.022,-3.078],[0,0],[0,0]],"v":[[-205.218,16.73],[-212.17,36.478],[-216.251,50.299],[-220.366,83.394],[-208.49,83.375],[-201.183,67.785],[-177.243,87.223],[-167.668,85.912],[-164.453,79.977],[-165.671,47.865],[-165.855,44.992],[-181.765,35.269],[-182.009,16.285]],"c":true}]},{"t":144,"s":[{"i":[[0,0],[1.215,-8.714],[-0.018,-1.43],[-3.365,0.041],[0,0],[-5.303,-0.548],[-3.312,0.041],[0,0],[0.041,3.365],[2.043,8.192],[0.531,-0.007],[-0.225,15.434],[0,0]],"o":[[0,0],[1.579,11.704],[0,0],[0,0],[3.432,-0.042],[5.303,0.548],[0,0],[3.365,-0.041],[0,0],[-0.383,-1.536],[0,0],[0,0],[0,0]],"v":[[-216.453,16.804],[-216.343,44.593],[-240.557,57.654],[-238.712,98.405],[-218.772,99.615],[-189.201,79.995],[-163.228,98.097],[-143.858,98.682],[-137.839,92.514],[-139.988,58.307],[-141.354,55.868],[-165.925,42.811],[-166.251,16.189]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.207843152214,0.20000001496,0.219607858097,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.49,0.482,0.529,0.5,0.373,0.357,0.388,1,0.255,0.231,0.247]}},"s":{"a":0,"k":[-152.972,74.677]},"e":{"a":0,"k":[-207.276,76.368]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Keyhole","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":115,"s":[100]},{"t":127,"s":[0]}]},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.38],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[7]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":122,"s":[7]},{"t":144,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":0.535},"o":{"x":0.256,"y":0},"t":10,"s":[-225.202,16.614,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0.045},"t":36,"s":[-201.922,-17.886,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.39,"y":0.39},"o":{"x":0.4,"y":0.4},"t":55,"s":[-92.042,-14.636,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":0.737},"o":{"x":0.7,"y":0.044},"t":102,"s":[-92.042,-14.636,0],"to":[-74.458,-23.614,0],"ti":[0,0,0]},{"i":{"x":0.559,"y":1},"o":{"x":0.2,"y":0.521},"t":122,"s":[-202.962,-11.636,0],"to":[0,0,0],"ti":[0,0,0]},{"t":142,"s":[-225.742,5.114,0]}]},"a":{"a":0,"k":[216.646,165.23,0]},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.38,0.38,0.38],"y":[0,0,0]},"t":10,"s":[30,111,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":36,"s":[72.017,82,100]},{"i":{"x":[0.39,0.39,0.39],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":55,"s":[117.625,125,100]},{"i":{"x":[0.85,0.85,0.85],"y":[1,1,1]},"o":{"x":[0.7,0.7,0.7],"y":[0,0,0]},"t":102,"s":[117.625,125,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":122,"s":[70.147,82,100]},{"t":137,"s":[30,92,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[{"i":[[3.798,-10.434],[34.313,3.143]],"o":[[-10.08,27.691],[-27.63,-2.531]],"v":[[260.63,200.234],[196.005,242.348]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[3.798,-10.434],[17.709,-0.216]],"o":[[-10.08,27.691],[-27.743,0.338]],"v":[[260.63,200.234],[214.496,240.557]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[{"i":[[3.798,-10.434],[21.515,1.476]],"o":[[-10.08,27.691],[-27.68,-1.899]],"v":[[260.63,200.234],[209.239,240.723]],"c":false}]},{"t":65,"s":[{"i":[[3.798,-10.434],[34.313,3.143]],"o":[[-10.08,27.691],[-27.63,-2.531]],"v":[[260.63,200.234],[196.005,242.348]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470588235,0.133333333333,0.141176470588,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.424,-41.622],[27.729,0.949],[-1.424,41.622],[-27.729,-0.949]],"o":[[-1.424,41.622],[-27.729,-0.949],[1.424,-41.622],[27.729,0.949]],"v":[[266.854,166.948],[214.068,240.593],[166.438,163.512],[219.224,89.867]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.254901960784,0.247058838489,0.266666666667,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.167,41.324],[-32.263,3.618],[1.675,-48.668]],"o":[[-8.195,-65.544],[27.572,-3.092],[-1.432,41.621]],"v":[[165.373,191.822],[216.611,89.634],[269.04,171.086]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.798101806641,0.798101806641,0.806536027497,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[21.5,5.25]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[90.702,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":36,"s":[{"i":[[1.196,9.164],[11.586,-2.213],[-0.695,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.689,-12.942],[-9.804,1.873],[0.621,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[5.023,-4.345]],"v":[[232.28,135.184],[210.268,115.146],[194.24,138.103],[210.066,161.136],[217.338,214.878],[221.953,218.776],[230.471,216.212],[233.907,211.396],[226.745,156.315]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[1.196,9.164],[11.586,-2.213],[-0.695,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.689,-12.942],[-9.804,1.873],[0.621,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[5.023,-4.345]],"v":[[234.614,135.121],[210.268,115.146],[192.139,138.326],[210.474,164.778],[217.338,214.878],[221.953,218.776],[230.471,216.212],[233.907,211.396],[227.153,159.957]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":104,"s":[{"i":[[1.079,9.164],[12.009,-2.213],[-0.721,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.524,-12.942],[-10.162,1.873],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[2.441,-3.313]],"v":[[230.89,137.18],[207.408,119.775],[192.667,140.434],[209.082,163.502],[217.338,214.878],[221.953,218.776],[230.471,216.212],[233.907,211.396],[226.745,156.315]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":110,"s":[{"i":[[3.535,8.523],[12.009,-2.213],[-0.721,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-4.998,-12.05],[-10.162,1.873],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[2.441,-3.313]],"v":[[233.852,131.13],[207.408,119.775],[192.667,140.434],[209.082,163.502],[217.338,214.878],[221.953,218.776],[230.471,216.212],[233.907,211.396],[226.745,156.315]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[3.352,9.591],[12.009,-2.213],[-0.721,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-4.382,-12.262],[-10.162,1.873],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[3.851,-4.118]],"v":[[234.424,130.4],[205.566,120.432],[188.701,146.571],[207.906,168.789],[217.338,214.878],[221.953,218.776],[230.471,216.212],[233.907,211.396],[227.873,159.737]],"c":true}]},{"t":122,"s":[{"i":[[3.077,11.191],[12.009,-2.213],[-0.721,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-3.459,-12.579],[-10.162,1.873],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[5.964,-5.323]],"v":[[235.282,129.306],[205.467,115.578],[187.71,138.89],[209.164,162.651],[217.338,214.878],[221.953,218.776],[230.471,216.212],[233.907,211.396],[226.745,156.315]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470588235,0.133333333333,0.141176470588,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.22068602618,0.224271901449,0.26013063917,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[219.5,164.5]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":36,"s":[{"i":[[1.239,9.164],[12.009,-2.213],[-0.721,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.75,-12.942],[-10.162,1.873],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[6.774,-4.356]],"v":[[239.037,135.184],[216.136,115.146],[200.105,139.215],[217.573,165.4],[224.199,213.523],[226.953,218.776],[235.471,216.212],[238.907,211.396],[231.745,156.315]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.4,"y":0},"t":56,"s":[{"i":[[1.196,9.164],[11.586,-2.213],[0.462,-11.194],[-17.581,-7.608],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.689,-12.942],[-9.804,1.873],[-0.433,10.496],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[6.774,-4.356]],"v":[[239.872,135.121],[215.525,115.146],[196.743,140.063],[215.994,172.059],[222.858,222.158],[226.953,218.776],[235.471,216.212],[238.907,211.396],[232.153,159.957]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":104,"s":[{"i":[[1.079,9.164],[12.009,-2.213],[-0.721,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.524,-12.942],[-10.162,1.873],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[6.774,-4.356]],"v":[[238.031,135.605],[216.136,115.146],[199.523,138.103],[215.066,161.136],[222.338,214.878],[226.953,218.776],[235.471,216.212],[238.907,211.396],[231.745,156.315]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":110,"s":[{"i":[[1.079,9.164],[16.986,-4.471],[-0.721,-11.182],[-8.221,-2.874],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.524,-12.942],[-9.993,2.631],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[6.774,-4.356]],"v":[[247.388,131.225],[215.715,115.073],[198.36,138.577],[215.066,161.136],[222.338,214.878],[226.953,218.776],[235.471,216.212],[238.907,211.396],[231.745,156.315]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":115,"s":[{"i":[[1.079,9.164],[16.986,-4.471],[-0.721,-11.182],[-9.601,-4.782],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.524,-12.942],[-9.993,2.631],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[6.774,-4.356]],"v":[[247.388,131.225],[213.908,119.371],[196.682,146.319],[216.628,172.235],[224.04,214.241],[228.19,218.454],[235.471,216.212],[240.142,211.614],[233.265,156.708]],"c":true}]},{"t":122,"s":[{"i":[[1.079,9.164],[16.986,-4.471],[-0.721,-11.182],[-11.669,-7.641],[0,0],[-2.223,0.254],[0,0],[0.325,2.407],[0,0]],"o":[[-1.524,-12.942],[-9.993,2.631],[0.644,9.987],[0,0],[0.325,2.407],[0,0],[2.223,-0.254],[0,0],[6.774,-4.356]],"v":[[247.388,131.225],[215.322,113.93],[196.148,136.767],[217.826,165.086],[226.591,213.287],[230.043,217.972],[235.471,216.212],[241.993,211.941],[235.543,157.298]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.690196078431,0.678431372549,0.682352941176,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.25,164.5]},"a":{"a":0,"k":[217,164.5]},"s":{"a":0,"k":[83.251,90.651]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":-1,"s":[100],"h":1},{"t":56,"s":[0],"h":1},{"t":90,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.424,-41.622],[27.729,0.949],[-1.424,41.622],[-27.729,-0.949]],"o":[[-1.424,41.622],[-27.729,-0.949],[1.424,-41.622],[27.729,0.949]],"v":[[266.854,166.948],[214.068,240.593],[166.438,163.512],[219.224,89.867]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.741,0.733,0.733,0.275,0.606,0.596,0.604,0.55,0.471,0.459,0.475,0.775,0.363,0.361,0.388,1,0.255,0.263,0.302]}},"s":{"a":0,"k":[194.055,105.823]},"e":{"a":0,"k":[244.571,237.496]},"t":1,"nm":"Gradient Fill 44","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":-1,"op":183,"st":3,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Keyhole Wave","parent":12,"sr":1,"ks":{"o":{"a":0,"k":80},"p":{"a":0,"k":[188.051,168.741,0]},"a":{"a":0,"k":[216.646,165.23,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.1,"y":0},"t":58,"s":[{"i":[[0.991,-35.898],[19.301,0.818],[-0.991,35.898],[-19.301,-0.818]],"o":[[-0.991,35.898],[-19.301,-0.818],[0.991,-35.898],[19.301,0.818]],"v":[[260.186,166.711],[223.444,230.228],[190.291,163.748],[227.033,100.232]],"c":true}]},{"t":99,"s":[{"i":[[-7.401,-70.306],[48.763,-4.736],[7.401,70.306],[-48.763,4.736]],"o":[[7.401,70.306],[-48.763,4.736],[-7.401,-70.306],[48.763,-4.736]],"v":[[304.939,156.655],[230.047,292.531],[128.353,173.805],[203.246,37.929]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.1],"y":[0]},"t":58,"s":[30]},{"t":99,"s":[0]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":62,"op":186,"st":6,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Keyhole BACK","parent":12,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.29],"y":[0]},"t":115,"s":[100]},{"t":127,"s":[0]}]},"p":{"a":0,"k":[197.613,167.567,0]},"a":{"a":0,"k":[216.646,165.23,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.38,"y":0},"t":10,"s":[{"i":[[2.444,-41.559],[28.96,-0.532],[-0.098,41.646],[-42.654,-2.052]],"o":[[-3.689,65.103],[-30.978,0.621],[0.097,-41.148],[26.351,0.861]],"v":[[284.896,163.8],[219.795,239.868],[169.474,163.38],[229.19,88.32]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0},"t":36,"s":[{"i":[[2.444,-41.559],[28.96,-0.532],[-0.098,41.646],[-42.654,-2.052]],"o":[[-3.689,65.103],[-30.978,0.621],[0.097,-41.148],[26.351,0.861]],"v":[[284.896,163.8],[219.795,239.868],[169.474,163.38],[229.19,88.32]],"c":true}]},{"i":{"x":0.39,"y":1},"o":{"x":0.4,"y":0},"t":55,"s":[{"i":[[2.77,-41.554],[27.738,0.639],[-0.112,41.646],[-47.199,-0.456]],"o":[[-5.431,81.474],[-35.801,-0.825],[0.11,-41.148],[36.113,0.349]],"v":[[272.043,160.363],[217.399,240.184],[163.544,163.388],[229.511,87.162]],"c":true}]},{"i":{"x":0.699,"y":1},"o":{"x":0.7,"y":0},"t":104,"s":[{"i":[[2.903,-41.545],[22.11,-0.019],[-0.112,41.646],[-47.199,-0.456]],"o":[[-5.175,74.043],[-35.811,0.031],[0.11,-41.148],[36.113,0.349]],"v":[[277.204,163.328],[217.399,240.184],[163.544,163.388],[229.511,87.162]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.2,"y":0},"t":122,"s":[{"i":[[2.903,-41.545],[22.109,0.223],[-0.112,41.646],[-44.016,-0.845]],"o":[[-5.175,74.043],[-28.892,-0.292],[0.11,-41.148],[36.108,0.693]],"v":[[285.247,164.326],[217.399,240.184],[168.503,162.848],[229.511,87.162]],"c":true}]},{"t":139,"s":[{"i":[[2.77,-41.554],[27.738,0.639],[-0.112,41.646],[-47.199,-0.456]],"o":[[-5.431,81.474],[-35.801,-0.825],[0.11,-41.148],[36.113,0.349]],"v":[[284.97,164.054],[217.399,240.184],[163.544,163.388],[229.511,87.162]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.176470588235,0.133333333333,0.141176470588,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.546,0.537,0.595,0.497,0.4,0.386,0.423,0.995,0.255,0.235,0.251]}},"s":{"a":0,"k":[202.073,99.588]},"e":{"a":0,"k":[194.559,234.045]},"t":1,"nm":"Gradient Fill 44457","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":184,"st":4,"bm":0}]} \ No newline at end of file diff --git a/messenger-client/app/src/main/assets/key_lock.json b/messenger-client/app/src/main/assets/key_lock.json new file mode 100644 index 0000000..71f17a4 --- /dev/null +++ b/messenger-client/app/src/main/assets/key_lock.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":180,"w":512,"h":512,"nm":"key","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"Null 1117","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[242.5,283.5,0]},"a":{"a":0,"k":[126.923,113.462,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[104,104,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[103,103,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":95,"s":[103,103,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":137,"s":[103,103,100]},{"t":179,"s":[104,104,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":2,"sr":1,"ks":{"r":{"a":0,"k":-49.844},"p":{"a":0,"k":[-36.5,21.5,0]},"a":{"a":0,"k":[139,-42,0]},"s":{"a":0,"k":[90,90,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[139,-42],[139,-123]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[6]},{"t":82,"s":[0]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[124,-32]},"a":{"a":0,"k":[139,-42]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":-35},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[139,-42],[139,-123]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[6]},{"t":82,"s":[0]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[109,-22]},"a":{"a":0,"k":[139,-42]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":-70},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[139,-42],[139,-123]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[6]},{"t":82,"s":[0]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[169,-22]},"a":{"a":0,"k":[139,-42]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":70},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[139,-42],[139,-123]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[6]},{"t":82,"s":[0]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[154,-32]},"a":{"a":0,"k":[139,-42]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":35},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[139,-42],[139,-123]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[6]},{"t":82,"s":[0]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0]},{"t":82,"s":[100]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"t":77.5,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":66,"op":82,"st":-24,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"click","parent":2,"sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":64,"s":[136.5,78.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[140.5,80.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":69,"s":[136.5,78.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112,"s":[136.5,78.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":114,"s":[140.5,80.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":117,"s":[136.5,78.5,0]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":3,"nm":"master","parent":4,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.33],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.33],"y":[0]},"t":48,"s":[-45]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.33],"y":[0]},"t":120,"s":[-45]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.33],"y":[0]},"t":123,"s":[-45]},{"t":180,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":0,"s":[-42,72,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":0.3},"o":{"x":0.33,"y":0.33},"t":35,"s":[-52,-34,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":120,"s":[-52,-34,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.33,"y":0},"t":130,"s":[-84,-38,0],"to":[0,0,0],"ti":[0,0,0]},{"t":169,"s":[-42,72,0]}]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":40,"s":[75,75,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":120,"s":[75,75,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.33,0.33,0.33],"y":[0,0,0]},"t":130,"s":[75,75,100]},{"t":150,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":3,"nm":"key RL","parent":5,"sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[150,-63,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":0.3},"o":{"x":0.33,"y":0.33},"t":40,"s":[10,-63,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":126,"s":[10,-63,0],"to":[0,0,0],"ti":[0,0,0]},{"t":150,"s":[150,-63,0]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":3,"nm":"key updown","parent":6,"sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.67,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":10,"s":[0,-20,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":40,"s":[0,380,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":60,"s":[0,192,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120,"s":[0,192,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":130,"s":[0,370,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":150,"s":[0,-20,0],"to":[0,0,0],"ti":[0,0,0]},{"t":160,"s":[0,0,0]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"side key 3","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"t":59,"s":[0],"h":1},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"t":121,"s":[0],"h":1}]},"r":{"a":0,"k":-180},"p":{"a":0,"k":[369.877,260.324,0]},"a":{"a":0,"k":[-37.125,202.75,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,-6.5],[-1,-12.5],[-91.25,-5.5],[0.125,-0.125],[-70.25,55.75],[-8.75,4],[0,0]],"o":[[0,0],[0,0],[0,0],[-8.25,6],[-70.5,55],[3.041,0.064],[-95,-3.75],[0,-13],[-0.75,-41.75],[0,0]],"v":[[-31.75,13.125],[-31.75,13.125],[-65.25,48.75],[-66.25,202],[-78.5,224.5],[-34.125,390.875],[-32.094,390.938],[-78.25,224.25],[-66,202.25],[-65.125,48.75]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-31.75,13.5],[-52.5,14],[-52.5,46],[-52.5,204],[-52.5,221],[-52.5,392],[-31.75,392],[-31.75,220.75],[-31.75,203],[-31.75,45.25]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-31.75,13.5],[-52.5,14],[-52.5,46],[-52.5,204],[-52.5,221],[-52.5,392],[-31.75,392],[-31.75,220.75],[-31.75,203],[-31.75,45.25]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,-6.5],[-1,-12.5],[-91.25,-5.5],[0.125,-0.125],[-70.25,55.75],[-8.75,4],[0,0]],"o":[[0,0],[0,0],[0,0],[-8.25,6],[-70.5,55],[3.041,0.064],[-95,-3.75],[0,-13],[-0.75,-41.75],[0,0]],"v":[[-31.75,13.125],[-31.75,13.125],[-65.25,48.75],[-66.25,202],[-78.5,224.5],[-34.125,390.875],[-32.094,390.938],[-78.25,224.25],[-66,202.25],[-65.125,48.75]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.666666686535,0.435294121504,0.027450980619,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.721568644047,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":129,"op":180,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"key 3","parent":7,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[-14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":40,"s":[180]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":126,"s":[180]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.33],"y":[0]},"t":154,"s":[-14]},{"t":167,"s":[0]}]},"p":{"a":0,"k":[0.376,-5.463,0]},"a":{"a":0,"k":[364.376,259.537,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,22.832],[-9.901,13.36]],"o":[[-15.289,-14.63],[0,-17.905],[0,0]],"v":[[12.405,52.937],[-12.405,-5.134],[3.351,-52.937]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,22.832],[0.042,13.36]],"o":[[0.064,-14.63],[0,-17.905],[0,0]],"v":[[67.016,52.937],[67.121,-5.134],[67.055,-52.937]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,22.832],[0.042,13.36]],"o":[[0.064,-14.63],[0,-17.905],[0,0]],"v":[[67.016,52.937],[67.121,-5.134],[67.055,-52.937]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[0,22.832],[-9.901,13.36]],"o":[[-15.289,-14.63],[0,-17.905],[0,0]],"v":[[12.405,52.937],[-12.405,-5.134],[3.351,-52.937]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[297.588,164.947]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[-2.272,1.494]],"o":[[2.103,-1.71],[0,0]],"v":[[-3.283,2.405],[3.283,-2.405]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0.01,1.494]],"o":[[-0.009,-1.71],[0,0]],"v":[[46.411,2.405],[46.383,-2.405]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0.01,1.494]],"o":[[-0.009,-1.71],[0,0]],"v":[[46.411,2.405],[46.383,-2.405]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-2.272,1.494]],"o":[[2.103,-1.71],[0,0]],"v":[[-3.283,2.405],[3.283,-2.405]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[318.173,95.017]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[318.173,95.017]},"a":{"a":0,"k":[318.173,95.017]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-4.003,-2.592],[-5.276,-3.791],[2.654,-2.585],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.826,0.969],[0,0],[0,5.276],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,4.891],[2.138,1.384],[3.009,2.162],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.067],[0,0],[4.661,-2.472],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-44.232,-5.583],[-20.826,11.587],[-20.151,20.687],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.103,-2.573],[38.581,-3.888],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.017,-2.592],[0.022,-3.791],[-0.011,-2.585],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.969],[0,0],[0,5.276],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,4.891],[-0.009,1.384],[-0.013,2.162],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.067],[0,0],[-0.02,-2.472],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.62,-5.583],[-0.718,11.587],[-0.721,20.687],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.573],[-0.968,-3.888],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.017,-2.592],[0.022,-3.791],[-0.011,-2.585],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.969],[0,0],[0,5.276],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,4.891],[-0.009,1.384],[-0.013,2.162],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.067],[0,0],[-0.02,-2.472],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.62,-5.583],[-0.718,11.587],[-0.721,20.687],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.573],[-0.968,-3.888],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"t":120,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-4.003,-2.592],[-5.276,-3.791],[2.654,-2.585],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.826,0.969],[0,0],[0,5.276],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,4.891],[2.138,1.384],[3.009,2.162],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.067],[0,0],[4.661,-2.472],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-44.232,-5.583],[-20.826,11.587],[-20.151,20.687],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.103,-2.573],[38.581,-3.888],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.666666686535,0.435294121504,0.027450980619,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,260.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[3.272,-80.647],[3.5,81.262],[-3.5,74.062],[-3.5,42.102],[1.99,37.212],[1.99,31.422],[-3.5,26.522],[-3.5,-4.358],[1.92,-9.668],[1.84,-15.548],[-3.5,-20.478],[-3.5,-75.658],[0.49,-80.305]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[16.96,-80.647],[16.959,81.262],[16.989,74.062],[16.989,42.102],[16.966,37.212],[16.966,31.422],[16.989,26.522],[16.989,-4.358],[16.966,-9.668],[16.966,-15.548],[16.989,-20.478],[16.989,-75.658],[16.972,-80.305]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[16.96,-80.647],[16.959,81.262],[16.989,74.062],[16.989,42.102],[16.966,37.212],[16.966,31.422],[16.989,26.522],[16.989,-4.358],[16.966,-9.668],[16.966,-15.548],[16.989,-20.478],[16.989,-75.658],[16.972,-80.305]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[3.272,-80.647],[3.5,81.262],[-3.5,74.062],[-3.5,42.102],[1.99,37.212],[1.99,31.422],[-3.5,26.522],[-3.5,-4.358],[1.92,-9.668],[1.84,-15.548],[-3.5,-20.478],[-3.5,-75.658],[0.49,-80.305]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.529411792755,0.360784322023,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[347.473,356.925]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[1.19,-1.27]],"v":[[6.272,-80.78],[6.5,80.787],[-0.5,73.587],[-6.5,67.417],[-6.5,46.977],[-0.5,41.627],[4.99,36.737],[4.99,30.947],[-0.5,26.047],[-6.5,20.697],[-6.5,1.037],[-0.5,-4.833],[4.92,-10.143],[4.84,-16.023],[-0.5,-20.953],[-6.5,-26.493],[-6.5,-69.743],[-0.5,-76.133],[1.42,-78.183]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.005,-1.27]],"v":[[19.96,-80.78],[19.959,80.787],[19.989,73.587],[20.014,67.417],[20.014,46.977],[19.989,41.627],[19.966,36.737],[19.966,30.947],[19.989,26.047],[20.014,20.697],[20.014,1.037],[19.989,-4.833],[19.966,-10.143],[19.966,-16.023],[19.989,-20.953],[20.014,-26.493],[20.014,-69.743],[19.989,-76.133],[19.981,-78.183]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.005,-1.27]],"v":[[19.96,-80.78],[19.959,80.787],[19.989,73.587],[20.014,67.417],[20.014,46.977],[19.989,41.627],[19.966,36.737],[19.966,30.947],[19.989,26.047],[20.014,20.697],[20.014,1.037],[19.989,-4.833],[19.966,-10.143],[19.966,-16.023],[19.989,-20.953],[20.014,-26.493],[20.014,-69.743],[19.989,-76.133],[19.981,-78.183]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[1.19,-1.27]],"v":[[6.272,-80.78],[6.5,80.787],[-0.5,73.587],[-6.5,67.417],[-6.5,46.977],[-0.5,41.627],[4.99,36.737],[4.99,30.947],[-0.5,26.047],[-6.5,20.697],[-6.5,1.037],[-0.5,-4.833],[4.92,-10.143],[4.84,-16.023],[-0.5,-20.953],[-6.5,-26.493],[-6.5,-69.743],[-0.5,-76.133],[1.42,-78.183]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[344.473,357.4]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[344.473,357.4]},"a":{"a":0,"k":[344.473,357.4]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[-1.93,0],[-0.18,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[1.82,0],[0.01,0.12]],"v":[[3.5,-82.67],[3.5,78.96],[-3.5,86.17],[-3.5,-82.67],[0,-86.17],[3.48,-83.03]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0.008,0],[0.001,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[-0.008,0],[0,0.12]],"v":[[-17.184,-82.67],[-17.184,78.96],[-17.154,86.17],[-17.154,-82.67],[-17.169,-86.17],[-17.184,-83.03]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0.008,0],[0.001,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[-0.008,0],[0,0.12]],"v":[[-17.184,-82.67],[-17.184,78.96],[-17.154,86.17],[-17.154,-82.67],[-17.169,-86.17],[-17.184,-83.03]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[-1.93,0],[-0.18,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[1.82,0],[0.01,0.12]],"v":[[3.5,-82.67],[3.5,78.96],[-3.5,86.17],[-3.5,-82.67],[0,-86.17],[3.48,-83.03]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.529411792755,0.360784322023,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[381.473,349.667]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[-3.59,0],[-0.18,-3.43]],"o":[[0,0],[0,0],[0,0],[-0.1,-0.45],[0,0],[0,-3.59],[3.47,0],[0.01,0.12]],"v":[[6.5,-84.18],[6.5,77.45],[-0.5,84.66],[-6.35,90.68],[-6.5,89.29],[-6.5,-84.18],[0,-90.68],[6.48,-84.54]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[0.015,0],[0.001,-3.43]],"o":[[0,0],[0,0],[0,0],[0,-0.45],[0,0],[0,-3.59],[-0.015,0],[0,0.12]],"v":[[-14.184,-84.18],[-14.184,77.45],[-14.154,84.66],[-14.13,90.68],[-14.129,89.29],[-14.129,-84.18],[-14.157,-90.68],[-14.184,-84.54]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[0.015,0],[0.001,-3.43]],"o":[[0,0],[0,0],[0,0],[0,-0.45],[0,0],[0,-3.59],[-0.015,0],[0,0.12]],"v":[[-14.184,-84.18],[-14.184,77.45],[-14.154,84.66],[-14.13,90.68],[-14.129,89.29],[-14.129,-84.18],[-14.157,-90.68],[-14.184,-84.54]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[-3.59,0],[-0.18,-3.43]],"o":[[0,0],[0,0],[0,0],[-0.1,-0.45],[0,0],[0,-3.59],[3.47,0],[0.01,0.12]],"v":[[6.5,-84.18],[6.5,77.45],[-0.5,84.66],[-6.35,90.68],[-6.5,89.29],[-6.5,-84.18],[0,-90.68],[6.48,-84.54]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[378.473,351.177]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[378.473,351.177]},"a":{"a":0,"k":[378.473,351.177]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-41.193],[41.193,0],[0,41.193],[-41.193,0]],"o":[[0,41.193],[-41.193,0],[0,-41.193],[41.193,0]],"v":[[74.586,0],[0,74.586],[-74.586,0],[0,-74.586]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-41.193],[-0.173,0],[0,41.193],[0.173,0]],"o":[[0,41.193],[0.173,0],[0,-41.193],[-0.173,0]],"v":[[-1.119,0],[-0.805,74.586],[-0.491,0],[-0.805,-74.586]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-41.193],[-0.173,0],[0,41.193],[0.173,0]],"o":[[0,41.193],[0.173,0],[0,-41.193],[-0.173,0]],"v":[[-1.119,0],[-0.805,74.586],[-0.491,0],[-0.805,-74.586]],"c":true}]},{"t":120,"s":[{"i":[[0,-41.193],[41.193,0],[0,41.193],[-41.193,0]],"o":[[0,41.193],[-41.193,0],[0,-41.193],[41.193,0]],"v":[[74.586,0],[0,74.586],[-74.586,0],[0,-74.586]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.686274528503,0.482352942228,0.070588238537,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,159.627]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":80},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[41.87,0],[0,41.858],[-41.858,0],[0,-41.858]],"o":[[-41.858,0],[0,-41.858],[41.87,0],[0,41.858]],"v":[[-0.006,75.802],[-75.796,0],[-0.006,-75.802],[75.796,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.176,0],[0,41.858],[0.176,0],[0,-41.858]],"o":[[0.176,0],[0,-41.858],[-0.176,0],[0,41.858]],"v":[[0,75.802],[0.319,0],[0,-75.802],[-0.319,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.176,0],[0,41.858],[0.176,0],[0,-41.858]],"o":[[0.176,0],[0,-41.858],[-0.176,0],[0,41.858]],"v":[[0,75.802],[0.319,0],[0,-75.802],[-0.319,0]],"c":true}]},{"t":120,"s":[{"i":[[41.87,0],[0,41.858],[-41.858,0],[0,-41.858]],"o":[[-41.858,0],[0,-41.858],[41.87,0],[0,41.858]],"v":[[-0.006,75.802],[-75.796,0],[-0.006,-75.802],[75.796,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[49.33,0],[0,-49.318],[-49.317,0],[0,49.317]],"o":[[-49.317,0],[0,49.317],[49.33,0],[0,-49.318]],"v":[[-0.006,-89.308],[-89.302,0],[-0.006,89.308],[89.302,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.208,0],[0,-49.317],[0.208,0],[0,49.318]],"o":[[0.208,0],[0,49.317],[-0.208,0],[0,-49.318]],"v":[[0,-89.308],[0.376,0],[0,89.308],[-0.376,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.208,0],[0,-49.317],[0.208,0],[0,49.318]],"o":[[0.208,0],[0,49.317],[-0.208,0],[0,-49.318]],"v":[[0,-89.308],[0.376,0],[0,89.308],[-0.376,0]],"c":true}]},{"t":120,"s":[{"i":[[49.33,0],[0,-49.318],[-49.317,0],[0,49.317]],"o":[[-49.317,0],[0,49.317],[49.33,0],[0,-49.318]],"v":[[-0.006,-89.308],[-89.302,0],[-0.006,89.308],[89.302,0]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.686274528503,0.482352942228,0.070588238537,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[364.376,158.825]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":14},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.76,-10.27],[0,0],[0,0],[0,5.82],[0,0],[1.66,1.76],[0,0]],"o":[[0,0],[0,0],[-5.4,-2.17],[0,0],[0.07,-2.44],[0,0],[6.05,8.41]],"v":[[68.765,-46.565],[-52.585,74.775],[-57.425,73.095],[-66.365,59.875],[-66.255,55.885],[-68.765,49.365],[55.375,-74.775]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.913725495338,0.701960802078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[380.808,183.492]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.7,-3.88],[0,0],[2.94,4.55],[0,0],[-10.11,11.14],[0,0],[0,0]],"o":[[0,0],[-3.62,-3.97],[0,0],[0,0],[12.12,-13.354],[0,0],[4.35,3.14]],"v":[[67.445,-57.23],[-57.585,67.8],[-67.445,54.98],[-3.655,-8.8],[22.072,-14.527],[28.697,-41.152],[55.345,-67.8]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.913725495338,0.701960802078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[361.038,156.637]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[361.038,156.637]},"a":{"a":0,"k":[361.038,156.637]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":142,"s":[0]},{"t":164,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"light","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-10.59],[-25.805,-36.4],[-0.005,-62.2],[25.805,-36.4]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-10.59],[-0.697,-36.4],[-0.806,-62.2],[-0.915,-36.4]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-10.59],[-0.697,-36.4],[-0.806,-62.2],[-0.915,-36.4]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-10.59],[-25.805,-36.4],[-0.005,-62.2],[25.805,-36.4]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[34.97,0],[0,-34.96],[-34.96,0],[0,34.96]],"o":[[-34.96,0],[0,34.96],[34.97,0],[0,-34.96]],"v":[[-0.005,-63.31],[-63.305,0],[-0.005,63.31],[63.305,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.147,0],[0,-34.96],[0.147,0],[0,34.96]],"o":[[0.147,0],[0,34.96],[-0.147,0],[0,-34.96]],"v":[[-0.806,-63.31],[-0.539,0],[-0.806,63.31],[-1.072,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.147,0],[0,-34.96],[0.147,0],[0,34.96]],"o":[[0.147,0],[0,34.96],[-0.147,0],[0,-34.96]],"v":[[-0.806,-63.31],[-0.539,0],[-0.806,63.31],[-1.072,0]],"c":true}]},{"t":120,"s":[{"i":[[34.97,0],[0,-34.96],[-34.96,0],[0,34.96]],"o":[[-34.96,0],[0,34.96],[34.97,0],[0,-34.96]],"v":[[-0.005,-63.31],[-63.305,0],[-0.005,63.31],[63.305,0]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745285,0.780392169952,0.349019616842,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,159.627]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-5.4,-2.17],[2.763,-4.183],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.83,0.97],[0,0],[0,5.27],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,5.82],[0,0],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.07],[0,0],[4.66,-2.47],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-41.795,-4.32],[-19.285,18.31],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.115,-2.58],[38.585,-3.89],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.023,-2.17],[-0.012,-4.183],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.97],[0,0],[0,5.27],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,5.82],[0,0],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.07],[0,0],[-0.02,-2.47],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.63,-4.32],[-0.725,18.31],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.58],[-0.968,-3.89],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.023,-2.17],[-0.012,-4.183],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.97],[0,0],[0,5.27],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,5.82],[0,0],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.07],[0,0],[-0.02,-2.47],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.63,-4.32],[-0.725,18.31],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.58],[-0.968,-3.89],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"t":120,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-5.4,-2.17],[2.763,-4.183],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.83,0.97],[0,0],[0,5.27],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,5.82],[0,0],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.07],[0,0],[4.66,-2.47],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-41.795,-4.32],[-19.285,18.31],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.115,-2.58],[38.585,-3.89],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.721568644047,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,260.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false}],"ip":129,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"side key","parent":11,"sr":1,"ks":{"o":{"a":1,"k":[{"t":59,"s":[0],"h":1},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"t":121,"s":[0],"h":1}]},"r":{"a":0,"k":-180},"p":{"a":0,"k":[369.877,260.324,0]},"a":{"a":0,"k":[-37.125,202.75,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,-6.5],[-1,-12.5],[-91.25,-5.5],[0.125,-0.125],[-70.25,55.75],[-8.75,4],[0,0]],"o":[[0,0],[0,0],[0,0],[-8.25,6],[-70.5,55],[3.041,0.064],[-95,-3.75],[0,-13],[-0.75,-41.75],[0,0]],"v":[[-31.75,13.125],[-31.75,13.125],[-65.25,48.75],[-66.25,202],[-78.5,224.5],[-34.125,390.875],[-32.094,390.938],[-78.25,224.25],[-66,202.25],[-65.125,48.75]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-31.75,13.5],[-52.5,14],[-52.5,46],[-52.5,204],[-52.5,221],[-52.5,392],[-31.75,392],[-31.75,220.75],[-31.75,203],[-31.75,45.25]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-31.75,13.5],[-52.5,14],[-52.5,46],[-52.5,204],[-52.5,221],[-52.5,392],[-31.75,392],[-31.75,220.75],[-31.75,203],[-31.75,45.25]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,-6.5],[-1,-12.5],[-91.25,-5.5],[0.125,-0.125],[-70.25,55.75],[-8.75,4],[0,0]],"o":[[0,0],[0,0],[0,0],[-8.25,6],[-70.5,55],[3.041,0.064],[-95,-3.75],[0,-13],[-0.75,-41.75],[0,0]],"v":[[-31.75,13.125],[-31.75,13.125],[-65.25,48.75],[-66.25,202],[-78.5,224.5],[-34.125,390.875],[-32.094,390.938],[-78.25,224.25],[-66,202.25],[-65.125,48.75]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.666666686535,0.435294121504,0.027450980619,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.721568644047,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"key","parent":7,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[-14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":40,"s":[180]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":126,"s":[180]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.33],"y":[0]},"t":154,"s":[-14]},{"t":167,"s":[0]}]},"p":{"a":0,"k":[0.376,-5.463,0]},"a":{"a":0,"k":[364.376,259.537,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,22.832],[-9.901,13.36]],"o":[[-15.289,-14.63],[0,-17.905],[0,0]],"v":[[12.405,52.937],[-12.405,-5.134],[3.351,-52.937]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,22.832],[0.042,13.36]],"o":[[0.064,-14.63],[0,-17.905],[0,0]],"v":[[67.016,52.937],[67.121,-5.134],[67.055,-52.937]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,22.832],[0.042,13.36]],"o":[[0.064,-14.63],[0,-17.905],[0,0]],"v":[[67.016,52.937],[67.121,-5.134],[67.055,-52.937]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[0,22.832],[-9.901,13.36]],"o":[[-15.289,-14.63],[0,-17.905],[0,0]],"v":[[12.405,52.937],[-12.405,-5.134],[3.351,-52.937]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[297.588,164.947]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[-2.272,1.494]],"o":[[2.103,-1.71],[0,0]],"v":[[-3.283,2.405],[3.283,-2.405]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0.01,1.494]],"o":[[-0.009,-1.71],[0,0]],"v":[[46.411,2.405],[46.383,-2.405]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0.01,1.494]],"o":[[-0.009,-1.71],[0,0]],"v":[[46.411,2.405],[46.383,-2.405]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-2.272,1.494]],"o":[[2.103,-1.71],[0,0]],"v":[[-3.283,2.405],[3.283,-2.405]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[318.173,95.017]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[318.173,95.017]},"a":{"a":0,"k":[318.173,95.017]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-4.003,-2.592],[-5.276,-3.791],[2.654,-2.585],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.826,0.969],[0,0],[0,5.276],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,4.891],[2.138,1.384],[3.009,2.162],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.067],[0,0],[4.661,-2.472],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-44.232,-5.583],[-20.826,11.587],[-20.151,20.687],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.103,-2.573],[38.581,-3.888],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.017,-2.592],[0.022,-3.791],[-0.011,-2.585],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.969],[0,0],[0,5.276],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,4.891],[-0.009,1.384],[-0.013,2.162],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.067],[0,0],[-0.02,-2.472],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.62,-5.583],[-0.718,11.587],[-0.721,20.687],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.573],[-0.968,-3.888],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.017,-2.592],[0.022,-3.791],[-0.011,-2.585],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.969],[0,0],[0,5.276],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,4.891],[-0.009,1.384],[-0.013,2.162],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.067],[0,0],[-0.02,-2.472],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.62,-5.583],[-0.718,11.587],[-0.721,20.687],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.573],[-0.968,-3.888],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"t":120,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-4.003,-2.592],[-5.276,-3.791],[2.654,-2.585],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.826,0.969],[0,0],[0,5.276],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,4.891],[2.138,1.384],[3.009,2.162],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.067],[0,0],[4.661,-2.472],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-44.232,-5.583],[-20.826,11.587],[-20.151,20.687],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.103,-2.573],[38.581,-3.888],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.666666686535,0.435294121504,0.027450980619,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,260.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[3.272,-80.647],[3.5,81.262],[-3.5,74.062],[-3.5,42.102],[1.99,37.212],[1.99,31.422],[-3.5,26.522],[-3.5,-4.358],[1.92,-9.668],[1.84,-15.548],[-3.5,-20.478],[-3.5,-75.658],[0.49,-80.305]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[16.96,-80.647],[16.959,81.262],[16.989,74.062],[16.989,42.102],[16.966,37.212],[16.966,31.422],[16.989,26.522],[16.989,-4.358],[16.966,-9.668],[16.966,-15.548],[16.989,-20.478],[16.989,-75.658],[16.972,-80.305]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[16.96,-80.647],[16.959,81.262],[16.989,74.062],[16.989,42.102],[16.966,37.212],[16.966,31.422],[16.989,26.522],[16.989,-4.358],[16.966,-9.668],[16.966,-15.548],[16.989,-20.478],[16.989,-75.658],[16.972,-80.305]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[3.272,-80.647],[3.5,81.262],[-3.5,74.062],[-3.5,42.102],[1.99,37.212],[1.99,31.422],[-3.5,26.522],[-3.5,-4.358],[1.92,-9.668],[1.84,-15.548],[-3.5,-20.478],[-3.5,-75.658],[0.49,-80.305]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.529411792755,0.360784322023,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[347.473,356.925]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[1.19,-1.27]],"v":[[6.272,-80.78],[6.5,80.787],[-0.5,73.587],[-6.5,67.417],[-6.5,46.977],[-0.5,41.627],[4.99,36.737],[4.99,30.947],[-0.5,26.047],[-6.5,20.697],[-6.5,1.037],[-0.5,-4.833],[4.92,-10.143],[4.84,-16.023],[-0.5,-20.953],[-6.5,-26.493],[-6.5,-69.743],[-0.5,-76.133],[1.42,-78.183]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.005,-1.27]],"v":[[19.96,-80.78],[19.959,80.787],[19.989,73.587],[20.014,67.417],[20.014,46.977],[19.989,41.627],[19.966,36.737],[19.966,30.947],[19.989,26.047],[20.014,20.697],[20.014,1.037],[19.989,-4.833],[19.966,-10.143],[19.966,-16.023],[19.989,-20.953],[20.014,-26.493],[20.014,-69.743],[19.989,-76.133],[19.981,-78.183]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.005,-1.27]],"v":[[19.96,-80.78],[19.959,80.787],[19.989,73.587],[20.014,67.417],[20.014,46.977],[19.989,41.627],[19.966,36.737],[19.966,30.947],[19.989,26.047],[20.014,20.697],[20.014,1.037],[19.989,-4.833],[19.966,-10.143],[19.966,-16.023],[19.989,-20.953],[20.014,-26.493],[20.014,-69.743],[19.989,-76.133],[19.981,-78.183]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[1.19,-1.27]],"v":[[6.272,-80.78],[6.5,80.787],[-0.5,73.587],[-6.5,67.417],[-6.5,46.977],[-0.5,41.627],[4.99,36.737],[4.99,30.947],[-0.5,26.047],[-6.5,20.697],[-6.5,1.037],[-0.5,-4.833],[4.92,-10.143],[4.84,-16.023],[-0.5,-20.953],[-6.5,-26.493],[-6.5,-69.743],[-0.5,-76.133],[1.42,-78.183]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[344.473,357.4]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[344.473,357.4]},"a":{"a":0,"k":[344.473,357.4]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[-1.93,0],[-0.18,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[1.82,0],[0.01,0.12]],"v":[[3.5,-82.67],[3.5,78.96],[-3.5,86.17],[-3.5,-82.67],[0,-86.17],[3.48,-83.03]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0.008,0],[0.001,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[-0.008,0],[0,0.12]],"v":[[-17.184,-82.67],[-17.184,78.96],[-17.154,86.17],[-17.154,-82.67],[-17.169,-86.17],[-17.184,-83.03]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0.008,0],[0.001,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[-0.008,0],[0,0.12]],"v":[[-17.184,-82.67],[-17.184,78.96],[-17.154,86.17],[-17.154,-82.67],[-17.169,-86.17],[-17.184,-83.03]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[-1.93,0],[-0.18,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[1.82,0],[0.01,0.12]],"v":[[3.5,-82.67],[3.5,78.96],[-3.5,86.17],[-3.5,-82.67],[0,-86.17],[3.48,-83.03]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.529411792755,0.360784322023,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[381.473,349.667]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[-3.59,0],[-0.18,-3.43]],"o":[[0,0],[0,0],[0,0],[-0.1,-0.45],[0,0],[0,-3.59],[3.47,0],[0.01,0.12]],"v":[[6.5,-84.18],[6.5,77.45],[-0.5,84.66],[-6.35,90.68],[-6.5,89.29],[-6.5,-84.18],[0,-90.68],[6.48,-84.54]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[0.015,0],[0.001,-3.43]],"o":[[0,0],[0,0],[0,0],[0,-0.45],[0,0],[0,-3.59],[-0.015,0],[0,0.12]],"v":[[-14.184,-84.18],[-14.184,77.45],[-14.154,84.66],[-14.13,90.68],[-14.129,89.29],[-14.129,-84.18],[-14.157,-90.68],[-14.184,-84.54]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[0.015,0],[0.001,-3.43]],"o":[[0,0],[0,0],[0,0],[0,-0.45],[0,0],[0,-3.59],[-0.015,0],[0,0.12]],"v":[[-14.184,-84.18],[-14.184,77.45],[-14.154,84.66],[-14.13,90.68],[-14.129,89.29],[-14.129,-84.18],[-14.157,-90.68],[-14.184,-84.54]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[-3.59,0],[-0.18,-3.43]],"o":[[0,0],[0,0],[0,0],[-0.1,-0.45],[0,0],[0,-3.59],[3.47,0],[0.01,0.12]],"v":[[6.5,-84.18],[6.5,77.45],[-0.5,84.66],[-6.35,90.68],[-6.5,89.29],[-6.5,-84.18],[0,-90.68],[6.48,-84.54]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[378.473,351.177]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[378.473,351.177]},"a":{"a":0,"k":[378.473,351.177]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-41.193],[41.193,0],[0,41.193],[-41.193,0]],"o":[[0,41.193],[-41.193,0],[0,-41.193],[41.193,0]],"v":[[74.586,0],[0,74.586],[-74.586,0],[0,-74.586]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-41.193],[-0.173,0],[0,41.193],[0.173,0]],"o":[[0,41.193],[0.173,0],[0,-41.193],[-0.173,0]],"v":[[-1.119,0],[-0.805,74.586],[-0.491,0],[-0.805,-74.586]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-41.193],[-0.173,0],[0,41.193],[0.173,0]],"o":[[0,41.193],[0.173,0],[0,-41.193],[-0.173,0]],"v":[[-1.119,0],[-0.805,74.586],[-0.491,0],[-0.805,-74.586]],"c":true}]},{"t":120,"s":[{"i":[[0,-41.193],[41.193,0],[0,41.193],[-41.193,0]],"o":[[0,41.193],[-41.193,0],[0,-41.193],[41.193,0]],"v":[[74.586,0],[0,74.586],[-74.586,0],[0,-74.586]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.686274528503,0.482352942228,0.070588238537,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,159.627]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":80},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[41.87,0],[0,41.858],[-41.858,0],[0,-41.858]],"o":[[-41.858,0],[0,-41.858],[41.87,0],[0,41.858]],"v":[[-0.006,75.802],[-75.796,0],[-0.006,-75.802],[75.796,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.176,0],[0,41.858],[0.176,0],[0,-41.858]],"o":[[0.176,0],[0,-41.858],[-0.176,0],[0,41.858]],"v":[[0,75.802],[0.319,0],[0,-75.802],[-0.319,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.176,0],[0,41.858],[0.176,0],[0,-41.858]],"o":[[0.176,0],[0,-41.858],[-0.176,0],[0,41.858]],"v":[[0,75.802],[0.319,0],[0,-75.802],[-0.319,0]],"c":true}]},{"t":120,"s":[{"i":[[41.87,0],[0,41.858],[-41.858,0],[0,-41.858]],"o":[[-41.858,0],[0,-41.858],[41.87,0],[0,41.858]],"v":[[-0.006,75.802],[-75.796,0],[-0.006,-75.802],[75.796,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[49.33,0],[0,-49.318],[-49.317,0],[0,49.317]],"o":[[-49.317,0],[0,49.317],[49.33,0],[0,-49.318]],"v":[[-0.006,-89.308],[-89.302,0],[-0.006,89.308],[89.302,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.208,0],[0,-49.317],[0.208,0],[0,49.318]],"o":[[0.208,0],[0,49.317],[-0.208,0],[0,-49.318]],"v":[[0,-89.308],[0.376,0],[0,89.308],[-0.376,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.208,0],[0,-49.317],[0.208,0],[0,49.318]],"o":[[0.208,0],[0,49.317],[-0.208,0],[0,-49.318]],"v":[[0,-89.308],[0.376,0],[0,89.308],[-0.376,0]],"c":true}]},{"t":120,"s":[{"i":[[49.33,0],[0,-49.318],[-49.317,0],[0,49.317]],"o":[[-49.317,0],[0,49.317],[49.33,0],[0,-49.318]],"v":[[-0.006,-89.308],[-89.302,0],[-0.006,89.308],[89.302,0]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.686274528503,0.482352942228,0.070588238537,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[364.376,158.825]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":14},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.76,-10.27],[0,0],[0,0],[0,5.82],[0,0],[1.66,1.76],[0,0]],"o":[[0,0],[0,0],[-5.4,-2.17],[0,0],[0.07,-2.44],[0,0],[6.05,8.41]],"v":[[68.765,-46.565],[-52.585,74.775],[-57.425,73.095],[-66.365,59.875],[-66.255,55.885],[-68.765,49.365],[55.375,-74.775]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.913725495338,0.701960802078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[380.808,183.492]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.7,-3.88],[0,0],[2.94,4.55],[0,0],[-10.11,11.14],[0,0],[0,0]],"o":[[0,0],[-3.62,-3.97],[0,0],[0,0],[12.12,-13.354],[0,0],[4.35,3.14]],"v":[[67.445,-57.23],[-57.585,67.8],[-67.445,54.98],[-3.655,-8.8],[22.072,-14.527],[28.697,-41.152],[55.345,-67.8]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.913725495338,0.701960802078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[361.038,156.637]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[361.038,156.637]},"a":{"a":0,"k":[361.038,156.637]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":142,"s":[0]},{"t":164,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"light","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-10.59],[-25.805,-36.4],[-0.005,-62.2],[25.805,-36.4]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-10.59],[-0.697,-36.4],[-0.806,-62.2],[-0.915,-36.4]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-10.59],[-0.697,-36.4],[-0.806,-62.2],[-0.915,-36.4]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-10.59],[-25.805,-36.4],[-0.005,-62.2],[25.805,-36.4]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[34.97,0],[0,-34.96],[-34.96,0],[0,34.96]],"o":[[-34.96,0],[0,34.96],[34.97,0],[0,-34.96]],"v":[[-0.005,-63.31],[-63.305,0],[-0.005,63.31],[63.305,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.147,0],[0,-34.96],[0.147,0],[0,34.96]],"o":[[0.147,0],[0,34.96],[-0.147,0],[0,-34.96]],"v":[[-0.806,-63.31],[-0.539,0],[-0.806,63.31],[-1.072,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.147,0],[0,-34.96],[0.147,0],[0,34.96]],"o":[[0.147,0],[0,34.96],[-0.147,0],[0,-34.96]],"v":[[-0.806,-63.31],[-0.539,0],[-0.806,63.31],[-1.072,0]],"c":true}]},{"t":120,"s":[{"i":[[34.97,0],[0,-34.96],[-34.96,0],[0,34.96]],"o":[[-34.96,0],[0,34.96],[34.97,0],[0,-34.96]],"v":[[-0.005,-63.31],[-63.305,0],[-0.005,63.31],[63.305,0]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745285,0.780392169952,0.349019616842,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,159.627]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-5.4,-2.17],[2.763,-4.183],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.83,0.97],[0,0],[0,5.27],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,5.82],[0,0],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.07],[0,0],[4.66,-2.47],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-41.795,-4.32],[-19.285,18.31],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.115,-2.58],[38.585,-3.89],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.023,-2.17],[-0.012,-4.183],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.97],[0,0],[0,5.27],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,5.82],[0,0],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.07],[0,0],[-0.02,-2.47],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.63,-4.32],[-0.725,18.31],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.58],[-0.968,-3.89],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.023,-2.17],[-0.012,-4.183],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.97],[0,0],[0,5.27],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,5.82],[0,0],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.07],[0,0],[-0.02,-2.47],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.63,-4.32],[-0.725,18.31],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.58],[-0.968,-3.89],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"t":120,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-5.4,-2.17],[2.763,-4.183],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.83,0.97],[0,0],[0,5.27],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,5.82],[0,0],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.07],[0,0],[4.66,-2.47],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-41.795,-4.32],[-19.285,18.31],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.115,-2.58],[38.585,-3.89],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.721568644047,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,260.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"locker","parent":13,"sr":1,"ks":{"p":{"a":0,"k":[217.962,157.612,0]},"a":{"a":0,"k":[217.962,157.612,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-14.147,21.084]],"o":[[0,0],[0,0]],"v":[[-7.373,22.756],[7.373,-22.756]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":78,"s":[{"i":[[0,0],[-14.147,21.084]],"o":[[0,0],[0,0]],"v":[[-7.373,-37.244],[7.373,-82.756]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.33,"y":0},"t":100,"s":[{"i":[[0,0],[-14.147,21.084]],"o":[[0,0],[0,0]],"v":[[-7.373,-37.244],[7.373,-82.756]],"c":false}]},{"t":110,"s":[{"i":[[0,0],[-14.147,21.084]],"o":[[0,0],[0,0]],"v":[[-7.373,22.756],[7.373,-22.756]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.913725495338,0.964705884457,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[115.235,170.342]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,0],[-2.262,1.918]],"o":[[1.978,-2.101],[0,0]],"v":[[-2.189,1.971],[2.189,-1.971]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":78,"s":[{"i":[[0,0],[-2.262,1.918]],"o":[[1.978,-2.101],[0,0]],"v":[[-2.189,-58.029],[2.189,-61.971]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.33,"y":0},"t":100,"s":[{"i":[[0,0],[-2.262,1.918]],"o":[[1.978,-2.101],[0,0]],"v":[[-2.189,-58.029],[2.189,-61.971]],"c":false}]},{"t":110,"s":[{"i":[[0,0],[-2.262,1.918]],"o":[[1.978,-2.101],[0,0]],"v":[[-2.189,1.971],[2.189,-1.971]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.913725495338,0.964705884457,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[139.438,125.257]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,-67.46],[0,0],[2.262,0],[0,0],[0,2.262],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.6,0.005],[0,-44.889],[0,0],[2.262,0],[0,0],[0,2.262],[0,0],[-19.47,21.67],[-0.01,0.01],[-12.97,6.81],[-20.05,0.17],[-0.36,0]],"o":[[0,0],[0,2.262],[0,0],[-2.262,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.582,-0.104],[-44.889,-0.14],[0,0],[0,2.262],[0,0],[-2.262,0],[0,0],[0,-31.36],[0,-0.01],[9.71,-10.81],[16.66,-8.76],[0.36,-0.01],[67.46,0]],"v":[[122.345,45.745],[122.345,72.509],[118.249,76.605],[85.441,76.605],[81.345,72.509],[81.345,45.745],[66.655,-0.825],[37.865,-26.245],[5.115,-35.435],[5.045,-35.445],[0.271,-35.605],[-81.345,46.559],[-81.345,72.509],[-85.441,76.605],[-118.249,76.605],[-122.345,72.509],[-122.345,45.745],[-91.015,-35.925],[-90.995,-35.945],[-56.705,-62.645],[-1.085,-76.595],[0.005,-76.605]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":78,"s":[{"i":[[0,-67.46],[0,0],[2.262,0],[0,0],[0,2.262],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.6,0.005],[0,-44.889],[0,0],[2.262,0],[0,0],[0,2.262],[0,0],[-19.47,21.67],[-0.01,0.01],[-12.97,6.81],[-20.05,0.17],[-0.36,0]],"o":[[0,0],[0,2.262],[0,0],[-2.262,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.582,-0.104],[-44.889,-0.14],[0,0],[0,2.262],[0,0],[-2.262,0],[0,0],[0,-31.36],[0,-0.01],[9.71,-10.81],[16.66,-8.76],[0.36,-0.01],[67.46,0]],"v":[[122.345,-14.255],[122.345,72.509],[118.249,76.605],[85.441,76.605],[81.345,72.509],[81.345,-14.255],[66.655,-60.825],[37.865,-86.245],[5.115,-95.435],[5.045,-95.445],[0.271,-95.605],[-81.345,-13.441],[-81.345,12.509],[-85.441,16.605],[-118.249,16.605],[-122.345,12.509],[-122.345,-14.255],[-91.015,-95.925],[-90.995,-95.945],[-56.705,-122.645],[-1.085,-136.595],[0.005,-136.605]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.33,"y":0},"t":100,"s":[{"i":[[0,-67.46],[0,0],[2.262,0],[0,0],[0,2.262],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.6,0.005],[0,-44.889],[0,0],[2.262,0],[0,0],[0,2.262],[0,0],[-19.47,21.67],[-0.01,0.01],[-12.97,6.81],[-20.05,0.17],[-0.36,0]],"o":[[0,0],[0,2.262],[0,0],[-2.262,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.582,-0.104],[-44.889,-0.14],[0,0],[0,2.262],[0,0],[-2.262,0],[0,0],[0,-31.36],[0,-0.01],[9.71,-10.81],[16.66,-8.76],[0.36,-0.01],[67.46,0]],"v":[[122.345,-14.255],[122.345,72.509],[118.249,76.605],[85.441,76.605],[81.345,72.509],[81.345,-14.255],[66.655,-60.825],[37.865,-86.245],[5.115,-95.435],[5.045,-95.445],[0.271,-95.605],[-81.345,-13.441],[-81.345,12.509],[-85.441,16.605],[-118.249,16.605],[-122.345,12.509],[-122.345,-14.255],[-91.015,-95.925],[-90.995,-95.945],[-56.705,-122.645],[-1.085,-136.595],[0.005,-136.605]],"c":true}]},{"t":110,"s":[{"i":[[0,-67.46],[0,0],[2.262,0],[0,0],[0,2.262],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.6,0.005],[0,-44.889],[0,0],[2.262,0],[0,0],[0,2.262],[0,0],[-19.47,21.67],[-0.01,0.01],[-12.97,6.81],[-20.05,0.17],[-0.36,0]],"o":[[0,0],[0,2.262],[0,0],[-2.262,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.582,-0.104],[-44.889,-0.14],[0,0],[0,2.262],[0,0],[-2.262,0],[0,0],[0,-31.36],[0,-0.01],[9.71,-10.81],[16.66,-8.76],[0.36,-0.01],[67.46,0]],"v":[[122.345,45.745],[122.345,72.509],[118.249,76.605],[85.441,76.605],[81.345,72.509],[81.345,45.745],[66.655,-0.825],[37.865,-26.245],[5.115,-35.435],[5.045,-35.445],[0.271,-35.605],[-81.345,46.559],[-81.345,72.509],[-85.441,76.605],[-118.249,76.605],[-122.345,72.509],[-122.345,45.745],[-91.015,-35.925],[-90.995,-35.945],[-56.705,-62.645],[-1.085,-76.595],[0.005,-76.605]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.415686279535,0.490196079016,0.61960786581,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[217.962,157.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,-67.46],[0,0],[0,0],[0,0],[43.714,28.249],[40.114,-8.59],[0.88,-0.68],[-13.4,6.39],[-3.55,1.35],[-11.47,0.17],[-0.36,0]],"o":[[0,0],[0,0],[0,0],[-0.74,-13.33],[-10.123,-6.542],[-25.83,5.531],[8.43,-11.53],[3.48,-1.67],[16.69,-6.34],[0.36,-0.01],[67.46,0]],"v":[[106.67,45.745],[106.67,76.605],[78.67,76.605],[78.67,45.745],[28.224,-51.305],[-49.947,-64.185],[-106.67,-35.945],[-72.38,-62.645],[-61.81,-67.165],[-16.76,-76.595],[-15.67,-76.605]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":78,"s":[{"i":[[0,-67.46],[0,0],[0,0],[0,0],[43.714,28.249],[40.114,-8.59],[0.88,-0.68],[-13.4,6.39],[-3.55,1.35],[-11.47,0.17],[-0.36,0]],"o":[[0,0],[0,0],[0,0],[-0.74,-13.33],[-10.123,-6.542],[-25.83,5.531],[8.43,-11.53],[3.48,-1.67],[16.69,-6.34],[0.36,-0.01],[67.46,0]],"v":[[106.67,-14.255],[106.67,76.605],[78.67,76.605],[78.67,-14.255],[28.224,-111.305],[-49.947,-124.185],[-106.67,-95.945],[-72.38,-122.645],[-61.81,-127.165],[-16.76,-136.595],[-15.67,-136.605]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.33,"y":0},"t":100,"s":[{"i":[[0,-67.46],[0,0],[0,0],[0,0],[43.714,28.249],[40.114,-8.59],[0.88,-0.68],[-13.4,6.39],[-3.55,1.35],[-11.47,0.17],[-0.36,0]],"o":[[0,0],[0,0],[0,0],[-0.74,-13.33],[-10.123,-6.542],[-25.83,5.531],[8.43,-11.53],[3.48,-1.67],[16.69,-6.34],[0.36,-0.01],[67.46,0]],"v":[[106.67,-14.255],[106.67,76.605],[78.67,76.605],[78.67,-14.255],[28.224,-111.305],[-49.947,-124.185],[-106.67,-95.945],[-72.38,-122.645],[-61.81,-127.165],[-16.76,-136.595],[-15.67,-136.605]],"c":true}]},{"t":110,"s":[{"i":[[0,-67.46],[0,0],[0,0],[0,0],[43.714,28.249],[40.114,-8.59],[0.88,-0.68],[-13.4,6.39],[-3.55,1.35],[-11.47,0.17],[-0.36,0]],"o":[[0,0],[0,0],[0,0],[-0.74,-13.33],[-10.123,-6.542],[-25.83,5.531],[8.43,-11.53],[3.48,-1.67],[16.69,-6.34],[0.36,-0.01],[67.46,0]],"v":[[106.67,45.745],[106.67,76.605],[78.67,76.605],[78.67,45.745],[28.224,-51.305],[-49.947,-64.185],[-106.67,-35.945],[-72.38,-62.645],[-61.81,-67.165],[-16.76,-76.595],[-15.67,-76.605]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439215689898,0.639215707779,0.839215695858,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[233.637,157.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,-44.09],[0,0],[0,0],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.69,0],[0,-44.86],[0,0],[0,0],[0,0],[-52.15,0],[-7.46,-2.03]],"o":[[0,0],[0,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.67,-0.11],[-44.86,0],[0,0],[0,0],[0,0],[0,-52.14],[8.05,0],[40.9,11.08]],"v":[[94.57,33.605],[94.57,63.955],[81.34,63.955],[81.34,33.095],[66.65,-13.475],[37.86,-38.895],[5.11,-48.085],[5.04,-48.095],[0,-48.255],[-81.35,33.095],[-81.35,63.955],[-94.57,63.955],[-94.57,33.605],[0,-63.955],[23.34,-60.845]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":78,"s":[{"i":[[0,-44.09],[0,0],[0,0],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.69,0],[0,-44.86],[0,0],[0,0],[0,0],[-52.15,0],[-7.46,-2.03]],"o":[[0,0],[0,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.67,-0.11],[-44.86,0],[0,0],[0,0],[0,0],[0,-52.14],[8.05,0],[40.9,11.08]],"v":[[94.57,-26.395],[94.57,63.955],[81.34,63.955],[81.34,-26.905],[66.65,-73.475],[37.86,-98.895],[5.11,-108.085],[5.04,-108.095],[0,-108.255],[-81.35,-26.905],[-81.35,3.955],[-94.57,3.955],[-94.57,-26.395],[0,-123.955],[23.34,-120.845]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.33,"y":0},"t":100,"s":[{"i":[[0,-44.09],[0,0],[0,0],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.69,0],[0,-44.86],[0,0],[0,0],[0,0],[-52.15,0],[-7.46,-2.03]],"o":[[0,0],[0,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.67,-0.11],[-44.86,0],[0,0],[0,0],[0,0],[0,-52.14],[8.05,0],[40.9,11.08]],"v":[[94.57,-26.395],[94.57,63.955],[81.34,63.955],[81.34,-26.905],[66.65,-73.475],[37.86,-98.895],[5.11,-108.085],[5.04,-108.095],[0,-108.255],[-81.35,-26.905],[-81.35,3.955],[-94.57,3.955],[-94.57,-26.395],[0,-123.955],[23.34,-120.845]],"c":true}]},{"t":110,"s":[{"i":[[0,-44.09],[0,0],[0,0],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.69,0],[0,-44.86],[0,0],[0,0],[0,0],[-52.15,0],[-7.46,-2.03]],"o":[[0,0],[0,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.67,-0.11],[-44.86,0],[0,0],[0,0],[0,0],[0,-52.14],[8.05,0],[40.9,11.08]],"v":[[94.57,33.605],[94.57,63.955],[81.34,63.955],[81.34,33.095],[66.65,-13.475],[37.86,-38.895],[5.11,-48.085],[5.04,-48.095],[0,-48.255],[-81.35,33.095],[-81.35,63.955],[-94.57,63.955],[-94.57,33.605],[0,-63.955],[23.34,-60.845]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.368627458811,0.305882364511,0.254901975393,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[217.967,170.262]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":68,"s":[{"i":[[0,-67.46],[0,0],[0,0],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.69,0],[0,-44.86],[0,0],[0,0],[0,0],[-19.47,21.67],[-0.01,0.01],[-12.97,6.81],[-20.05,0.17],[-0.36,0]],"o":[[0,0],[0,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.67,-0.11],[-44.86,0],[0,0],[0,0],[0,0],[0,-31.36],[0,-0.01],[9.71,-10.81],[16.66,-8.76],[0.36,-0.01],[67.46,0]],"v":[[122.345,45.745],[122.345,76.605],[81.345,76.605],[81.345,45.745],[66.655,-0.825],[37.865,-26.245],[5.115,-35.435],[5.045,-35.445],[0.005,-35.605],[-81.345,45.745],[-81.345,76.605],[-122.345,76.605],[-122.345,45.745],[-91.015,-35.925],[-90.995,-35.945],[-56.705,-62.645],[-1.085,-76.595],[0.005,-76.605]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":78,"s":[{"i":[[0,-67.46],[0,0],[0,0],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.69,0],[0,-44.86],[0,0],[0,0],[0,0],[-19.47,21.67],[-0.01,0.01],[-12.97,6.81],[-20.05,0.17],[-0.36,0]],"o":[[0,0],[0,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.67,-0.11],[-44.86,0],[0,0],[0,0],[0,0],[0,-31.36],[0,-0.01],[9.71,-10.81],[16.66,-8.76],[0.36,-0.01],[67.46,0]],"v":[[122.345,-14.255],[122.345,76.605],[81.345,76.605],[81.345,-14.255],[66.655,-60.825],[37.865,-86.245],[5.115,-95.435],[5.045,-95.445],[0.005,-95.605],[-81.345,-14.255],[-81.345,16.605],[-122.345,16.605],[-122.345,-14.255],[-91.015,-95.925],[-90.995,-95.945],[-56.705,-122.645],[-1.085,-136.595],[0.005,-136.605]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.33,"y":0},"t":100,"s":[{"i":[[0,-67.46],[0,0],[0,0],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.69,0],[0,-44.86],[0,0],[0,0],[0,0],[-19.47,21.67],[-0.01,0.01],[-12.97,6.81],[-20.05,0.17],[-0.36,0]],"o":[[0,0],[0,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.67,-0.11],[-44.86,0],[0,0],[0,0],[0,0],[0,-31.36],[0,-0.01],[9.71,-10.81],[16.66,-8.76],[0.36,-0.01],[67.46,0]],"v":[[122.345,-14.255],[122.345,76.605],[81.345,76.605],[81.345,-14.255],[66.655,-60.825],[37.865,-86.245],[5.115,-95.435],[5.045,-95.445],[0.005,-95.605],[-81.345,-14.255],[-81.345,16.605],[-122.345,16.605],[-122.345,-14.255],[-91.015,-95.925],[-90.995,-95.945],[-56.705,-122.645],[-1.085,-136.595],[0.005,-136.605]],"c":true}]},{"t":110,"s":[{"i":[[0,-67.46],[0,0],[0,0],[0,0],[9.26,13.2],[11.5,6.08],[11.76,0.72],[0.02,0],[1.69,0],[0,-44.86],[0,0],[0,0],[0,0],[-19.47,21.67],[-0.01,0.01],[-12.97,6.81],[-20.05,0.17],[-0.36,0]],"o":[[0,0],[0,0],[0,0],[0,-17.31],[-7.41,-10.59],[-9.89,-5.22],[-0.02,-0.01],[-1.67,-0.11],[-44.86,0],[0,0],[0,0],[0,0],[0,-31.36],[0,-0.01],[9.71,-10.81],[16.66,-8.76],[0.36,-0.01],[67.46,0]],"v":[[122.345,45.745],[122.345,76.605],[81.345,76.605],[81.345,45.745],[66.655,-0.825],[37.865,-26.245],[5.115,-35.435],[5.045,-35.445],[0.005,-35.605],[-81.345,45.745],[-81.345,76.605],[-122.345,76.605],[-122.345,45.745],[-91.015,-35.925],[-90.995,-35.945],[-56.705,-62.645],[-1.085,-76.595],[0.005,-76.605]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.729411780834,0.850980401039,0.96862745285,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[217.962,157.612]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"base","parent":5,"sr":1,"ks":{"p":{"a":0,"k":[1.239,7.025,0]},"a":{"a":0,"k":[215.239,335.025,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[3.349,0],[0,0],[1.664,2.462]],"o":[[-1.625,2.664],[0,0],[-3.195,0],[0,0]],"v":[[148.062,-2.331],[140.027,2.331],[-140.099,2.331],[-148.062,-2.201]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.227450981736,0.196078434587,0.066666670144,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.275,433.506]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.113,0],[0,0],[0,5.113],[0,0],[-5.113,0],[0,0],[0,-5.113],[0,0]],"o":[[0,0],[-5.113,0],[0,0],[0,-5.113],[0,0],[5.113,0],[0,0],[0,5.113]],"v":[[140.063,100.812],[-140.063,100.812],[-149.321,91.555],[-149.321,-91.555],[-140.063,-100.812],[140.063,-100.812],[149.321,-91.555],[149.321,91.555]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.556862771511,0.51372551918,0.258823543787,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.239,335.025]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.057,0],[0,0],[0,5.057],[0,0],[-5.067,0],[0,0],[0,-5.067]],"o":[[0,5.057],[0,0],[-5.067,0],[0,0],[0,-5.067],[0,0],[5.057,0],[0,0]],"v":[[134.153,76.864],[124.999,86.028],[-124.989,86.028],[-134.153,76.864],[-134.153,-74.261],[-124.989,-83.425],[124.999,-83.425],[134.153,-74.261]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[5.057,0],[0,0],[0,-5.057],[0,0],[-5.057,0],[0,0],[0,5.067],[0,0]],"o":[[0,0],[-5.057,0],[0,0],[0,5.067],[0,0],[5.057,0],[0,0],[0,-5.057]],"v":[[138.616,-99.764],[-138.606,-99.764],[-147.77,-90.61],[-147.77,90.6],[-138.606,99.764],[138.616,99.764],[147.77,90.6],[147.77,-90.61]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.486274510622,0.439215689898,0.219607844949,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,335.027]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":30},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[5.11,0],[0,0],[0,0],[0,0],[0.05,-1.85],[0,0],[-5.4,-2.17],[2.76,-4.18],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.98,1.52],[0,0],[0,5.82],[0,0],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[0,0],[0,0],[0,0],[0,-5.11]],"v":[[29.58,-100.81],[14.58,-100.81],[-26.42,-100.81],[-38.83,-100.81],[-37.38,-95.65],[-37.49,-91.66],[-28.55,-78.44],[-6.04,-55.81],[-22.65,-38.1],[-24.6,-33.16],[-24.6,-17.1],[-22.02,-11.57],[-2.62,6.35],[-2.54,12.23],[-22.01,31.29],[-22.01,35.89],[-2.47,53.32],[-2.47,59.11],[-22.2,76.7],[-22.36,81.15],[-3.25,100.81],[26.04,100.81],[38.83,87.64],[38.83,-91.56]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[5.11,0],[0,0],[0,0],[0,0],[-0.289,-1.828],[0,0],[-5.706,-1.148],[1.951,-4.613],[0,0],[-0.334,-1.799],[0,0],[-1.853,-1.05],[0,0],[1.463,-1.868],[0,0],[-1.581,-0.958],[0,0],[1.42,-1.83],[0,0],[-1.429,-1.016],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.98,1.52],[0,0],[1.062,5.722],[0,0],[0,0],[-0.985,1.546],[0,0],[0.39,2.104],[0,0],[2.069,1.172],[0,0],[-1.134,1.451],[0,0],[1.982,1.199],[0,0],[-1.075,1.39],[0,0],[0,0],[0,0],[0,0],[0,-5.11]],"v":[[29.58,-100.81],[14.58,-100.81],[-26.42,-100.81],[-38.83,-100.81],[-50.908,-98.123],[-50.289,-94.18],[-37.945,-76.269],[-11.684,-58.126],[-24.784,-37.682],[-25.8,-32.469],[-22.87,-16.679],[-19.324,-11.713],[3.02,2.367],[4.171,8.134],[-11.495,30.426],[-10.655,34.949],[11.737,48.521],[12.793,54.214],[-3.396,75.109],[-2.742,79.513],[19.635,95.356],[26.04,100.81],[38.83,87.64],[38.83,-91.56]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":154,"s":[{"i":[[5.11,0],[0,0],[0,0],[0,0],[-0.289,-1.828],[0,0],[-5.706,-1.148],[1.951,-4.613],[0,0],[-0.334,-1.799],[0,0],[-1.853,-1.05],[0,0],[1.463,-1.868],[0,0],[-1.581,-0.958],[0,0],[1.42,-1.83],[0,0],[-1.429,-1.016],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.98,1.52],[0,0],[1.062,5.722],[0,0],[0,0],[-0.985,1.546],[0,0],[0.39,2.104],[0,0],[2.069,1.172],[0,0],[-1.134,1.451],[0,0],[1.982,1.199],[0,0],[-1.075,1.39],[0,0],[0,0],[0,0],[0,0],[0,-5.11]],"v":[[29.58,-100.81],[14.58,-100.81],[-26.42,-100.81],[-38.83,-100.81],[-36.375,-97.938],[-35.756,-93.995],[-23.412,-76.084],[2.849,-57.94],[-10.251,-37.497],[-11.267,-32.284],[-8.337,-16.494],[-4.791,-11.527],[17.553,2.552],[18.704,8.319],[3.039,30.611],[3.878,35.134],[26.27,48.707],[27.326,54.399],[11.137,75.294],[11.791,79.698],[34.168,95.542],[26.04,100.81],[38.83,87.64],[38.83,-91.56]],"c":true}]},{"t":167,"s":[{"i":[[5.11,0],[0,0],[0,0],[0,0],[0.05,-1.85],[0,0],[-5.4,-2.17],[2.76,-4.18],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.98,1.52],[0,0],[0,5.82],[0,0],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[0,0],[0,0],[0,0],[0,-5.11]],"v":[[29.58,-100.81],[14.58,-100.81],[-26.42,-100.81],[-38.83,-100.81],[-37.38,-95.65],[-37.49,-91.66],[-28.55,-78.44],[-6.04,-55.81],[-22.65,-38.1],[-24.6,-33.16],[-24.6,-17.1],[-22.02,-11.57],[-2.62,6.35],[-2.54,12.23],[-22.01,31.29],[-22.01,35.89],[-2.47,53.32],[-2.47,59.11],[-22.2,76.7],[-22.36,81.15],[-3.25,100.81],[26.04,100.81],[38.83,87.64],[38.83,-91.56]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.486274510622,0.439215689898,0.219607844949,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[325.727,335.027]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":147,"s":[0]},{"t":155,"s":[30]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-5.109],[0,0],[5.11,0],[0,0],[0,0],[0,6.903],[0,0],[5.15,3.259],[0,0],[0,0],[0,0]],"o":[[0,0],[0,5.12],[0,0],[0,0],[6.253,-2.924],[0,0],[0,-6.095],[0,0],[0,0],[0,0],[5.109,0]],"v":[[81.515,-91.56],[81.515,91.55],[72.265,100.81],[-81.355,100.81],[-59.654,90.663],[-49.405,74.556],[-49.405,-70.391],[-57.677,-85.415],[-81.355,-100.4],[-81.515,-100.81],[72.265,-100.81]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.486274510622,0.439215689898,0.219607844949,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[283.042,335.027]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":30},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.65,2.11],[-10.54,0],[0,0],[-5.46,-6.897],[3.22,0],[0,0]],"o":[[5.46,-6.897],[0,0],[10.55,0],[-1.66,2.11],[0,0],[-3.22,0]],"v":[[-147.77,3.97],[-122.48,-7.469],[122.47,-7.469],[147.77,3.97],[140.06,7.469],[-140.07,7.469]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317647069693,0.270588248968,0.137254908681,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,428.367]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.607843160629,0.568627476692,0.341176480055,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,367.298]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.607843160629,0.568627476692,0.341176480055,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,308.945]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.847058832645,0.819607853889,0.57647061348,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,370.298]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 11","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.847058832645,0.819607853889,0.57647061348,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,311.945]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 12","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.847058832645,0.819607853889,0.57647061348,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,396.475]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 13","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.847058832645,0.819607853889,0.57647061348,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,338.121]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 14","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.345098048449,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":9},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,393.137]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":20},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 15","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.345098048449,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":9},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,335.121]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":20},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 16","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.847058832645,0.819607853889,0.57647061348,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,279.501]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 17","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[10.54,0],[0,0],[5.46,8.14]],"o":[[-5.46,8.14],[0,0],[-10.55,0],[0,0]],"v":[[147.77,-6.75],[122.48,6.75],[-122.47,6.75],[-147.77,-6.75]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.917647063732,0.886274516582,0.654901981354,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,248.097]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 18","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.65,-2.49],[10.54,0],[0,0],[5.46,8.14],[-3.22,0],[0,0]],"o":[[-5.46,8.14],[0,0],[-10.55,0],[1.66,-2.49],[0,0],[3.22,0]],"v":[[147.77,-4.685],[122.48,8.815],[-122.47,8.815],[-147.77,-4.685],[-140.06,-8.815],[140.07,-8.815]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.956862747669,0.913725495338,0.670588254929,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,246.032]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 19","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[19.63,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-17.592,0],[0,0]],"v":[[147.77,-3.338],[122.48,3.338],[-122.47,3.338],[-147.77,-3.338]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.40000000596,0.345098048449,0.180392161012,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":9},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.237,276.292]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":20},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 20","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.113,0],[0,0],[0,5.113],[0,0],[-5.113,0],[0,0],[0,-5.113],[0,0]],"o":[[0,0],[-5.113,0],[0,0],[0,-5.113],[0,0],[5.113,0],[0,0],[0,5.113]],"v":[[140.063,100.812],[-140.063,100.812],[-149.321,91.555],[-149.321,-91.555],[-140.063,-100.812],[140.063,-100.812],[149.321,-91.555],[149.321,91.555]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.764705896378,0.737254917622,0.470588237047,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[215.239,335.025]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 21","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"side key 2","parent":15,"sr":1,"ks":{"o":{"a":1,"k":[{"t":59,"s":[0],"h":1},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"t":121,"s":[0],"h":1}]},"r":{"a":0,"k":-180},"p":{"a":0,"k":[369.877,260.324,0]},"a":{"a":0,"k":[-37.125,202.75,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,-6.5],[-1,-12.5],[-91.25,-5.5],[0.125,-0.125],[-70.25,55.75],[-8.75,4],[0,0]],"o":[[0,0],[0,0],[0,0],[-8.25,6],[-70.5,55],[3.041,0.064],[-95,-3.75],[0,-13],[-0.75,-41.75],[0,0]],"v":[[-31.75,13.125],[-31.75,13.125],[-65.25,48.75],[-66.25,202],[-78.5,224.5],[-34.125,390.875],[-32.094,390.938],[-78.25,224.25],[-66,202.25],[-65.125,48.75]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-31.75,13.5],[-52.5,14],[-52.5,46],[-52.5,204],[-52.5,221],[-52.5,392],[-31.75,392],[-31.75,220.75],[-31.75,203],[-31.75,45.25]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-31.75,13.5],[-52.5,14],[-52.5,46],[-52.5,204],[-52.5,221],[-52.5,392],[-31.75,392],[-31.75,220.75],[-31.75,203],[-31.75,45.25]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,-6.5],[-1,-12.5],[-91.25,-5.5],[0.125,-0.125],[-70.25,55.75],[-8.75,4],[0,0]],"o":[[0,0],[0,0],[0,0],[-8.25,6],[-70.5,55],[3.041,0.064],[-95,-3.75],[0,-13],[-0.75,-41.75],[0,0]],"v":[[-31.75,13.125],[-31.75,13.125],[-65.25,48.75],[-66.25,202],[-78.5,224.5],[-34.125,390.875],[-32.094,390.938],[-78.25,224.25],[-66,202.25],[-65.125,48.75]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.666666686535,0.435294121504,0.027450980619,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.721568644047,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":40,"op":129,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"key 2","parent":7,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[-14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":40,"s":[180]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":126,"s":[180]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.33],"y":[0]},"t":154,"s":[-14]},{"t":167,"s":[0]}]},"p":{"a":0,"k":[0.376,-5.463,0]},"a":{"a":0,"k":[364.376,259.537,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,22.832],[-9.901,13.36]],"o":[[-15.289,-14.63],[0,-17.905],[0,0]],"v":[[12.405,52.937],[-12.405,-5.134],[3.351,-52.937]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,22.832],[0.042,13.36]],"o":[[0.064,-14.63],[0,-17.905],[0,0]],"v":[[67.016,52.937],[67.121,-5.134],[67.055,-52.937]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,22.832],[0.042,13.36]],"o":[[0.064,-14.63],[0,-17.905],[0,0]],"v":[[67.016,52.937],[67.121,-5.134],[67.055,-52.937]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[0,22.832],[-9.901,13.36]],"o":[[-15.289,-14.63],[0,-17.905],[0,0]],"v":[[12.405,52.937],[-12.405,-5.134],[3.351,-52.937]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[297.588,164.947]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[-2.272,1.494]],"o":[[2.103,-1.71],[0,0]],"v":[[-3.283,2.405],[3.283,-2.405]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0.01,1.494]],"o":[[-0.009,-1.71],[0,0]],"v":[[46.411,2.405],[46.383,-2.405]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0.01,1.494]],"o":[[-0.009,-1.71],[0,0]],"v":[[46.411,2.405],[46.383,-2.405]],"c":false}]},{"t":120,"s":[{"i":[[0,0],[-2.272,1.494]],"o":[[2.103,-1.71],[0,0]],"v":[[-3.283,2.405],[3.283,-2.405]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[318.173,95.017]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[318.173,95.017]},"a":{"a":0,"k":[318.173,95.017]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-4.003,-2.592],[-5.276,-3.791],[2.654,-2.585],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.826,0.969],[0,0],[0,5.276],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,4.891],[2.138,1.384],[3.009,2.162],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.067],[0,0],[4.661,-2.472],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-44.232,-5.583],[-20.826,11.587],[-20.151,20.687],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.103,-2.573],[38.581,-3.888],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.017,-2.592],[0.022,-3.791],[-0.011,-2.585],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.969],[0,0],[0,5.276],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,4.891],[-0.009,1.384],[-0.013,2.162],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.067],[0,0],[-0.02,-2.472],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.62,-5.583],[-0.718,11.587],[-0.721,20.687],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.573],[-0.968,-3.888],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.017,-2.592],[0.022,-3.791],[-0.011,-2.585],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.969],[0,0],[0,5.276],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,4.891],[-0.009,1.384],[-0.013,2.162],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.067],[0,0],[-0.02,-2.472],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.62,-5.583],[-0.718,11.587],[-0.721,20.687],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.573],[-0.968,-3.888],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"t":120,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-4.003,-2.592],[-5.276,-3.791],[2.654,-2.585],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.826,0.969],[0,0],[0,5.276],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,4.891],[2.138,1.384],[3.009,2.162],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.067],[0,0],[4.661,-2.472],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-44.232,-5.583],[-20.826,11.587],[-20.151,20.687],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.103,-2.573],[38.581,-3.888],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.666666686535,0.435294121504,0.027450980619,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,260.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[3.272,-80.647],[3.5,81.262],[-3.5,74.062],[-3.5,42.102],[1.99,37.212],[1.99,31.422],[-3.5,26.522],[-3.5,-4.358],[1.92,-9.668],[1.84,-15.548],[-3.5,-20.478],[-3.5,-75.658],[0.49,-80.305]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[16.96,-80.647],[16.959,81.262],[16.989,74.062],[16.989,42.102],[16.966,37.212],[16.966,31.422],[16.989,26.522],[16.989,-4.358],[16.966,-9.668],[16.966,-15.548],[16.989,-20.478],[16.989,-75.658],[16.972,-80.305]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[16.96,-80.647],[16.959,81.262],[16.989,74.062],[16.989,42.102],[16.966,37.212],[16.966,31.422],[16.989,26.522],[16.989,-4.358],[16.966,-9.668],[16.966,-15.548],[16.989,-20.478],[16.989,-75.658],[16.972,-80.305]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0]],"o":[[0,41.471],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,-1.93]],"v":[[3.272,-80.647],[3.5,81.262],[-3.5,74.062],[-3.5,42.102],[1.99,37.212],[1.99,31.422],[-3.5,26.522],[-3.5,-4.358],[1.92,-9.668],[1.84,-15.548],[-3.5,-20.478],[-3.5,-75.658],[0.49,-80.305]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.529411792755,0.360784322023,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[347.473,356.925]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[1.19,-1.27]],"v":[[6.272,-80.78],[6.5,80.787],[-0.5,73.587],[-6.5,67.417],[-6.5,46.977],[-0.5,41.627],[4.99,36.737],[4.99,30.947],[-0.5,26.047],[-6.5,20.697],[-6.5,1.037],[-0.5,-4.833],[4.92,-10.143],[4.84,-16.023],[-0.5,-20.953],[-6.5,-26.493],[-6.5,-69.743],[-0.5,-76.133],[1.42,-78.183]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.005,-1.27]],"v":[[19.96,-80.78],[19.959,80.787],[19.989,73.587],[20.014,67.417],[20.014,46.977],[19.989,41.627],[19.966,36.737],[19.966,30.947],[19.989,26.047],[20.014,20.697],[20.014,1.037],[19.989,-4.833],[19.966,-10.143],[19.966,-16.023],[19.989,-20.953],[20.014,-26.493],[20.014,-69.743],[19.989,-76.133],[19.981,-78.183]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.008,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.007,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.005,-1.27]],"v":[[19.96,-80.78],[19.959,80.787],[19.989,73.587],[20.014,67.417],[20.014,46.977],[19.989,41.627],[19.966,36.737],[19.966,30.947],[19.989,26.047],[20.014,20.697],[20.014,1.037],[19.989,-4.833],[19.966,-10.143],[19.966,-16.023],[19.989,-20.953],[20.014,-26.493],[20.014,-69.743],[19.989,-76.133],[19.981,-78.183]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.82,1.53],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.73,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[1.78,-1.57],[0,0],[0,0],[0,0],[0,0],[0,0],[1.19,-1.27]],"v":[[6.272,-80.78],[6.5,80.787],[-0.5,73.587],[-6.5,67.417],[-6.5,46.977],[-0.5,41.627],[4.99,36.737],[4.99,30.947],[-0.5,26.047],[-6.5,20.697],[-6.5,1.037],[-0.5,-4.833],[4.92,-10.143],[4.84,-16.023],[-0.5,-20.953],[-6.5,-26.493],[-6.5,-69.743],[-0.5,-76.133],[1.42,-78.183]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[344.473,357.4]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[344.473,357.4]},"a":{"a":0,"k":[344.473,357.4]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[-1.93,0],[-0.18,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[1.82,0],[0.01,0.12]],"v":[[3.5,-82.67],[3.5,78.96],[-3.5,86.17],[-3.5,-82.67],[0,-86.17],[3.48,-83.03]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0.008,0],[0.001,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[-0.008,0],[0,0.12]],"v":[[-17.184,-82.67],[-17.184,78.96],[-17.154,86.17],[-17.154,-82.67],[-17.169,-86.17],[-17.184,-83.03]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0.008,0],[0.001,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[-0.008,0],[0,0.12]],"v":[[-17.184,-82.67],[-17.184,78.96],[-17.154,86.17],[-17.154,-82.67],[-17.169,-86.17],[-17.184,-83.03]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[-1.93,0],[-0.18,-1.76]],"o":[[0,0],[0,0],[0,0],[0,-1.93],[1.82,0],[0.01,0.12]],"v":[[3.5,-82.67],[3.5,78.96],[-3.5,86.17],[-3.5,-82.67],[0,-86.17],[3.48,-83.03]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.529411792755,0.360784322023,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[381.473,349.667]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[-3.59,0],[-0.18,-3.43]],"o":[[0,0],[0,0],[0,0],[-0.1,-0.45],[0,0],[0,-3.59],[3.47,0],[0.01,0.12]],"v":[[6.5,-84.18],[6.5,77.45],[-0.5,84.66],[-6.35,90.68],[-6.5,89.29],[-6.5,-84.18],[0,-90.68],[6.48,-84.54]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[0.015,0],[0.001,-3.43]],"o":[[0,0],[0,0],[0,0],[0,-0.45],[0,0],[0,-3.59],[-0.015,0],[0,0.12]],"v":[[-14.184,-84.18],[-14.184,77.45],[-14.154,84.66],[-14.13,90.68],[-14.129,89.29],[-14.129,-84.18],[-14.157,-90.68],[-14.184,-84.54]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[0.015,0],[0.001,-3.43]],"o":[[0,0],[0,0],[0,0],[0,-0.45],[0,0],[0,-3.59],[-0.015,0],[0,0.12]],"v":[[-14.184,-84.18],[-14.184,77.45],[-14.154,84.66],[-14.13,90.68],[-14.129,89.29],[-14.129,-84.18],[-14.157,-90.68],[-14.184,-84.54]],"c":true}]},{"t":120,"s":[{"i":[[0,-0.12],[0,0],[0,0],[0,0],[0,0.48],[0,0],[-3.59,0],[-0.18,-3.43]],"o":[[0,0],[0,0],[0,0],[-0.1,-0.45],[0,0],[0,-3.59],[3.47,0],[0.01,0.12]],"v":[[6.5,-84.18],[6.5,77.45],[-0.5,84.66],[-6.35,90.68],[-6.5,89.29],[-6.5,-84.18],[0,-90.68],[6.48,-84.54]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.858823537827,0.270588248968,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[378.473,351.177]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[378.473,351.177]},"a":{"a":0,"k":[378.473,351.177]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[0,-41.193],[41.193,0],[0,41.193],[-41.193,0]],"o":[[0,41.193],[-41.193,0],[0,-41.193],[41.193,0]],"v":[[74.586,0],[0,74.586],[-74.586,0],[0,-74.586]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[0,-41.193],[-0.173,0],[0,41.193],[0.173,0]],"o":[[0,41.193],[0.173,0],[0,-41.193],[-0.173,0]],"v":[[-1.119,0],[-0.805,74.586],[-0.491,0],[-0.805,-74.586]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[0,-41.193],[-0.173,0],[0,41.193],[0.173,0]],"o":[[0,41.193],[0.173,0],[0,-41.193],[-0.173,0]],"v":[[-1.119,0],[-0.805,74.586],[-0.491,0],[-0.805,-74.586]],"c":true}]},{"t":120,"s":[{"i":[[0,-41.193],[41.193,0],[0,41.193],[-41.193,0]],"o":[[0,41.193],[-41.193,0],[0,-41.193],[41.193,0]],"v":[[74.586,0],[0,74.586],[-74.586,0],[0,-74.586]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.686274528503,0.482352942228,0.070588238537,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,159.627]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":80},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[41.87,0],[0,41.858],[-41.858,0],[0,-41.858]],"o":[[-41.858,0],[0,-41.858],[41.87,0],[0,41.858]],"v":[[-0.006,75.802],[-75.796,0],[-0.006,-75.802],[75.796,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.176,0],[0,41.858],[0.176,0],[0,-41.858]],"o":[[0.176,0],[0,-41.858],[-0.176,0],[0,41.858]],"v":[[0,75.802],[0.319,0],[0,-75.802],[-0.319,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.176,0],[0,41.858],[0.176,0],[0,-41.858]],"o":[[0.176,0],[0,-41.858],[-0.176,0],[0,41.858]],"v":[[0,75.802],[0.319,0],[0,-75.802],[-0.319,0]],"c":true}]},{"t":120,"s":[{"i":[[41.87,0],[0,41.858],[-41.858,0],[0,-41.858]],"o":[[-41.858,0],[0,-41.858],[41.87,0],[0,41.858]],"v":[[-0.006,75.802],[-75.796,0],[-0.006,-75.802],[75.796,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[49.33,0],[0,-49.318],[-49.317,0],[0,49.317]],"o":[[-49.317,0],[0,49.317],[49.33,0],[0,-49.318]],"v":[[-0.006,-89.308],[-89.302,0],[-0.006,89.308],[89.302,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.208,0],[0,-49.317],[0.208,0],[0,49.318]],"o":[[0.208,0],[0,49.317],[-0.208,0],[0,-49.318]],"v":[[0,-89.308],[0.376,0],[0,89.308],[-0.376,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.208,0],[0,-49.317],[0.208,0],[0,49.318]],"o":[[0.208,0],[0,49.317],[-0.208,0],[0,-49.318]],"v":[[0,-89.308],[0.376,0],[0,89.308],[-0.376,0]],"c":true}]},{"t":120,"s":[{"i":[[49.33,0],[0,-49.318],[-49.317,0],[0,49.317]],"o":[[-49.317,0],[0,49.317],[49.33,0],[0,-49.318]],"v":[[-0.006,-89.308],[-89.302,0],[-0.006,89.308],[89.302,0]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.686274528503,0.482352942228,0.070588238537,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[364.376,158.825]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":14},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.76,-10.27],[0,0],[0,0],[0,5.82],[0,0],[1.66,1.76],[0,0]],"o":[[0,0],[0,0],[-5.4,-2.17],[0,0],[0.07,-2.44],[0,0],[6.05,8.41]],"v":[[68.765,-46.565],[-52.585,74.775],[-57.425,73.095],[-66.365,59.875],[-66.255,55.885],[-68.765,49.365],[55.375,-74.775]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.913725495338,0.701960802078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[380.808,183.492]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.7,-3.88],[0,0],[2.94,4.55],[0,0],[-10.11,11.14],[0,0],[0,0]],"o":[[0,0],[-3.62,-3.97],[0,0],[0,0],[12.12,-13.354],[0,0],[4.35,3.14]],"v":[[67.445,-57.23],[-57.585,67.8],[-67.445,54.98],[-3.655,-8.8],[22.072,-14.527],[28.697,-41.152],[55.345,-67.8]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.913725495338,0.701960802078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[361.038,156.637]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[361.038,156.637]},"a":{"a":0,"k":[361.038,156.637]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":142,"s":[0]},{"t":164,"s":[100]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"light","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-10.59],[-25.805,-36.4],[-0.005,-62.2],[25.805,-36.4]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-10.59],[-0.697,-36.4],[-0.806,-62.2],[-0.915,-36.4]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-10.59],[-0.697,-36.4],[-0.806,-62.2],[-0.915,-36.4]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-10.59],[-25.805,-36.4],[-0.005,-62.2],[25.805,-36.4]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[34.97,0],[0,-34.96],[-34.96,0],[0,34.96]],"o":[[-34.96,0],[0,34.96],[34.97,0],[0,-34.96]],"v":[[-0.005,-63.31],[-63.305,0],[-0.005,63.31],[63.305,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.147,0],[0,-34.96],[0.147,0],[0,34.96]],"o":[[0.147,0],[0,34.96],[-0.147,0],[0,-34.96]],"v":[[-0.806,-63.31],[-0.539,0],[-0.806,63.31],[-1.072,0]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.147,0],[0,-34.96],[0.147,0],[0,34.96]],"o":[[0.147,0],[0,34.96],[-0.147,0],[0,-34.96]],"v":[[-0.806,-63.31],[-0.539,0],[-0.806,63.31],[-1.072,0]],"c":true}]},{"t":120,"s":[{"i":[[34.97,0],[0,-34.96],[-34.96,0],[0,34.96]],"o":[[-34.96,0],[0,34.96],[34.97,0],[0,-34.96]],"v":[[-0.005,-63.31],[-63.305,0],[-0.005,63.31],[63.305,0]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745285,0.780392169952,0.349019616842,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,159.627]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.06,0],[0,14.26],[0.06,0],[0,-14.25]],"o":[[0.06,0],[0,-14.25],[-0.06,0],[0,14.26]],"v":[[-0.806,-111.87],[-0.697,-137.68],[-0.806,-163.48],[-0.914,-137.68]],"c":true}]},{"t":120,"s":[{"i":[[14.26,0],[0,14.26],[-14.25,0],[0,-14.25]],"o":[[-14.25,0],[0,-14.25],[14.26,0],[0,14.26]],"v":[[-0.005,-111.87],[-25.805,-137.68],[-0.005,-163.48],[25.805,-137.68]],"c":true}]}]},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":60,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-5.4,-2.17],[2.763,-4.183],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.83,0.97],[0,0],[0,5.27],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,5.82],[0,0],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.07],[0,0],[4.66,-2.47],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-41.795,-4.32],[-19.285,18.31],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.115,-2.58],[38.585,-3.89],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":70,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.023,-2.17],[-0.012,-4.183],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.97],[0,0],[0,5.27],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,5.82],[0,0],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.07],[0,0],[-0.02,-2.47],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.63,-4.32],[-0.725,18.31],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.58],[-0.968,-3.89],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.33,"y":0},"t":110,"s":[{"i":[[-0.203,0],[0,-48.25],[0.085,-17.71],[0,-2.75],[0,0],[0.023,-2.17],[-0.012,-4.183],[0,0],[0,-1.83],[0,0],[0.007,-1.37],[0,0],[-0.007,-1.57],[0,0],[0.006,-1.23],[0,0],[-0.007,-1.54],[0,0],[0.005,-1.26],[0,0],[0.005,1.24],[0,0],[0,0.8],[0,0],[0.008,0.97],[0,0],[0,5.27],[0,0],[0.009,1.74],[0,29.76]],"o":[[0.203,0],[0,27.86],[-0.009,1.81],[0,0],[0,5.82],[0,0],[0,0],[0.005,1.34],[0,0],[0,2.14],[0,0],[-0.008,1.53],[0,0],[0.006,1.22],[0,0],[-0.007,1.54],[0,0],[0.006,1.17],[0,0],[-0.005,1.24],[0,0],[-0.002,-0.58],[0,0],[0,-2.07],[0,0],[-0.02,-2.47],[0,0],[0,-2.85],[-0.096,-17.53],[0,-48.25]],"v":[[-0.806,-188.65],[-0.438,-101.28],[-0.579,-28.7],[-0.593,-21.53],[-0.592,-17.54],[-0.63,-4.32],[-0.725,18.31],[-0.655,36.02],[-0.646,40.96],[-0.646,57.02],[-0.657,62.55],[-0.739,80.47],[-0.739,86.35],[-0.657,105.41],[-0.657,110.01],[-0.74,127.44],[-0.74,133.23],[-0.657,150.82],[-0.656,155.27],[-0.789,187.72],[-0.807,187.72],[-0.942,154.89],[-0.945,152.74],[-0.945,2.36],[-0.958,-2.58],[-0.968,-3.89],[-1,-16.48],[-1,-18.18],[-1.015,-25.43],[-1.173,-101.28]],"c":true}]},{"t":120,"s":[{"i":[[48.26,0],[0,-48.25],[-20.32,-17.71],[0.08,-2.75],[0,0],[-5.4,-2.17],[2.763,-4.183],[0,0],[0,-1.83],[0,0],[-1.63,-1.37],[0,0],[1.78,-1.57],[0,0],[-1.38,-1.23],[0,0],[1.73,-1.54],[0,0],[-1.22,-1.26],[0,0],[-1.21,1.24],[0,0],[0,0.8],[0,0],[-1.83,0.97],[0,0],[0,5.27],[0,0],[-2.26,1.74],[0,29.76]],"o":[[-48.25,0],[0,27.86],[2.07,1.81],[0,0],[0,5.82],[0,0],[0,0],[-1.25,1.34],[0,0],[0,2.14],[0,0],[1.82,1.53],[0,0],[-1.38,1.22],[0,0],[1.73,1.54],[0,0],[-1.31,1.17],[0,0],[1.21,1.24],[0,0],[0.56,-0.58],[0,0],[0,-2.07],[0,0],[4.66,-2.47],[0,0],[0,-2.85],[22.72,-17.53],[0,-48.25]],"v":[[-0.005,-188.65],[-87.375,-101.28],[-53.805,-28.7],[-50.625,-21.53],[-50.735,-17.54],[-41.795,-4.32],[-19.285,18.31],[-35.895,36.02],[-37.845,40.96],[-37.845,57.02],[-35.265,62.55],[-15.865,80.47],[-15.785,86.35],[-35.255,105.41],[-35.255,110.01],[-15.715,127.44],[-15.715,133.23],[-35.445,150.82],[-35.605,155.27],[-4.055,187.72],[0.365,187.72],[32.265,154.89],[33.135,152.74],[33.135,2.36],[36.115,-2.58],[38.585,-3.89],[46.155,-16.48],[46.155,-18.18],[49.765,-25.43],[87.375,-101.28]],"c":true}]}]},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.721568644047,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[365.178,260.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false}],"ip":40,"op":129,"st":0,"bm":0}]} \ No newline at end of file diff --git a/messenger-client/app/src/main/assets/phone_apple.json b/messenger-client/app/src/main/assets/phone_apple.json new file mode 100644 index 0000000..ea8433b --- /dev/null +++ b/messenger-client/app/src/main/assets/phone_apple.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":139,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Режим изоляции 25","sr":1,"ks":{"p":{"a":0,"k":[279.244,361.486,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Режим изоляции 24","sr":1,"ks":{"p":{"a":0,"k":[232.977,361.486,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352954149,0.301960796118,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Режим изоляции 23","sr":1,"ks":{"p":{"a":0,"k":[186.711,361.486,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.760784327984,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Режим изоляции 22","sr":1,"ks":{"p":{"a":0,"k":[325.51,310.975,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.631372570992,0.592156887054,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Режим изоляции 21","sr":1,"ks":{"p":{"a":0,"k":[279.244,310.975,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.478431373835,0.478431373835,0.478431373835,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Режим изоляции 20","sr":1,"ks":{"p":{"a":0,"k":[232.977,310.975,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.972549021244,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Режим изоляции 19","sr":1,"ks":{"p":{"a":0,"k":[186.711,310.975,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Режим изоляции 18","sr":1,"ks":{"p":{"a":0,"k":[325.51,260.464,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.945098042488,0.219607844949,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Режим изоляции 17","sr":1,"ks":{"p":{"a":0,"k":[279.244,260.464,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.760784327984,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Режим изоляции 16","sr":1,"ks":{"p":{"a":0,"k":[232.977,260.464,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.223529413342,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Режим изоляции 15","sr":1,"ks":{"p":{"a":0,"k":[186.711,260.464,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.949019610882,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Режим изоляции 14","sr":1,"ks":{"p":{"a":0,"k":[325.51,209.952,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.478431373835,0.478431373835,0.478431373835,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Режим изоляции 13","sr":1,"ks":{"p":{"a":0,"k":[279.244,209.952,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.282352954149,0.301960796118,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Режим изоляции 12","sr":1,"ks":{"p":{"a":0,"k":[232.977,209.952,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Режим изоляции 11","sr":1,"ks":{"p":{"a":0,"k":[186.711,209.952,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.972549021244,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Режим изоляции 10","sr":1,"ks":{"p":{"a":0,"k":[325.51,159.441,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.949019610882,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Режим изоляции 9","sr":1,"ks":{"p":{"a":0,"k":[279.244,159.441,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.89411765337,0.75686275959,0.623529434204,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Режим изоляции 8","sr":1,"ks":{"p":{"a":0,"k":[232.977,159.441,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.478431373835,0.478431373835,0.478431373835,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Режим изоляции 7","sr":1,"ks":{"p":{"a":0,"k":[186.711,159.441,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.776470601559,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Режим изоляции 6","sr":1,"ks":{"p":{"a":0,"k":[325.51,108.93,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.65098041296,0.631372570992,0.592156887054,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Режим изоляции 5","sr":1,"ks":{"p":{"a":0,"k":[279.244,108.93,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.956862747669,0.607843160629,0.933333337307,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Режим изоляции 4","sr":1,"ks":{"p":{"a":0,"k":[232.977,108.93,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Режим изоляции 2","sr":1,"ks":{"p":{"a":0,"k":[186.711,108.93,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[93,93,100]},{"t":123,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.945098042488,0.219607844949,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"NULL Null 1","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[256.111,258.234,0]},"a":{"a":0,"k":[50,50,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[95,95,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":47,"s":[101,101,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":68,"s":[93,93,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":79,"s":[102,102,100]},{"t":94,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null 1","parent":2,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":21,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[7]},{"t":78,"s":[0]}]},"p":{"a":0,"k":[50,50,0]},"a":{"a":0,"k":[50,122,0]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Camera front","parent":11,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[0]},{"t":48,"s":[100]}]},"p":{"a":0,"k":[256.403,65.197,0]},"a":{"a":0,"k":[256.403,65.197,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.939,0],[0,0.665],[-0.939,0],[0,-0.665]],"o":[[-0.939,0],[0,-0.665],[0.939,0],[0,0.665]],"v":[[0,1.204],[-1.701,0],[0,-1.204],[1.701,0]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.572549045086,0.301960796118,0.600000023842,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[278.599,63.993]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.45],[0.45,0],[0,0.45],[-0.45,0]],"o":[[0,0.45],[-0.45,0],[0,-0.45],[0.45,0]],"v":[[0.815,0],[0,0.815],[-0.815,0],[0,-0.815]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[278.68,66.993]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.748],[1.748,0],[0,1.748],[-1.748,0]],"o":[[0,1.748],[-1.748,0],[0,-1.748],[1.748,0]],"v":[[3.164,0],[0,3.164],[-3.164,0],[0,-3.164]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.011764706112,0.1254902035,0.247058823705,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[278.599,65.197]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[4.706,0],[0,0],[0,4.706],[0,0],[-4.706,0],[0,0],[0,-4.706],[0,0]],"o":[[0,0],[-4.706,0],[0,0],[0,-4.706],[0,0],[4.706,0],[0,0],[0,4.706]],"v":[[22.197,8.521],[-22.197,8.521],[-30.718,0],[-30.718,0],[-22.197,-8.521],[22.197,-8.521],[30.718,0],[30.718,0]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.403,65.197]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Front 2","parent":11,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":71,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":78,"s":[0]},{"t":85,"s":[8]}]},"p":{"a":0,"k":[256.111,257.234,0]},"a":{"a":0,"k":[256.111,257.234,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,13.886],[0,0],[-13.886,0],[0,0],[0,-13.886],[0,0],[13.886,0]],"o":[[-13.886,0],[0,0],[0,-13.886],[0,0],[13.886,0],[0,0],[0,13.886],[0,0]],"v":[[-71.119,204.557],[-96.262,179.414],[-96.262,-179.414],[-71.119,-204.557],[71.119,-204.557],[96.262,-179.414],[96.262,179.414],[71.119,204.557]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1,0,0.77,0.717,0.385,1,0]}},"s":{"a":0,"k":[-102,-245.5]},"e":{"a":0,"k":[34.5,-48]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.111,257.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"games","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[0]},{"t":48,"s":[100]}]},"a":{"a":0,"k":[256.111,433.734,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[325.51,433.734]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.945098042488,0.219607844949,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[279.244,433.734]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.949019610882,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[232.977,433.734]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.548,0],[0,0],[0,3.548],[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0]],"o":[[0,0],[-3.548,0],[0,0],[0,-3.548],[0,0],[3.548,0],[0,0],[0,3.548]],"v":[[7.785,14.209],[-7.785,14.209],[-14.209,7.785],[-14.209,-7.785],[-7.785,-14.209],[7.785,-14.209],[14.209,-7.785],[14.209,7.785]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.945098042488,0.219607844949,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[186.711,433.734]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Down games","parent":11,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[0]},{"t":48,"s":[100]}]},"p":{"a":0,"k":[256.111,456.234,0]},"a":{"a":0,"k":[0,22.5,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":78,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":90,"s":[88,112,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":103,"s":[103,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":117,"s":[98,102,100]},{"t":131,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,9.5],[0,0],[-9.5,0],[0,0],[0,-9.5],[0,0],[9.5,0]],"o":[[-9.5,0],[0,0],[0,-9.5],[0,0],[9.5,0],[0,0],[0,9.5],[0,0]],"v":[[-74.034,23.057],[-91.262,5.829],[-91.262,-5.829],[-74.034,-23.057],[74.034,-23.057],[91.262,-5.829],[91.262,5.829],[74.034,23.057]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352941185236,0.301960796118,0.396078437567,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":3,"nm":"Null 2","parent":11,"sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[255.861,235.208,0]},"a":{"a":0,"k":[50,50,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.872]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":77,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.274,0.274,0.167],"y":[0.22,0.22,0.038]},"t":78,"s":[1180,1180,100]},{"i":{"x":[0.141,0.141,0.667],"y":[1,1,1]},"o":{"x":[0.247,0.247,0.333],"y":[0,0,0]},"t":98,"s":[96,96,100]},{"t":129,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Front 3","parent":11,"td":1,"sr":1,"ks":{"p":{"a":0,"k":[256.111,257.234,0]},"a":{"a":0,"k":[256.111,257.234,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,13.886],[0,0],[-13.886,0],[0,0],[0,-13.886],[0,0],[13.886,0]],"o":[[-13.886,0],[0,0],[0,-13.886],[0,0],[13.886,0],[0,0],[0,13.886],[0,0]],"v":[[-71.119,204.557],[-96.262,179.414],[-96.262,-179.414],[-71.119,-204.557],[71.119,-204.557],[96.262,-179.414],[96.262,179.414],[71.119,204.557]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.945097979377,0.262744978362,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.111,257.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Pre-comp 1","parent":8,"tt":1,"refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.836],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":77,"s":[0]},{"t":78,"s":[100]}]},"r":{"a":0,"k":-0.017},"p":{"a":0,"k":[49.89,70.821,0]},"a":{"a":0,"k":[256,256,0]},"s":{"a":0,"k":[98.708,98.708,100]}},"ao":0,"w":512,"h":512,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Front","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[0]},{"t":48,"s":[100]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[50.25,121,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[67.75,121,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[33.75,121,0],"to":[0,0,0],"ti":[0,0,0]},{"t":71,"s":[50.25,121,0]}]},"a":{"a":0,"k":[256.111,257.234,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[0,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0,0]},"t":48,"s":[0,100,100]},{"t":71,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,13.886],[0,0],[-13.886,0],[0,0],[0,-13.886],[0,0],[13.886,0]],"o":[[-13.886,0],[0,0],[0,-13.886],[0,0],[13.886,0],[0,0],[0,13.886],[0,0]],"v":[[-71.119,204.557],[-96.262,179.414],[-96.262,-179.414],[-71.119,-204.557],[71.119,-204.557],[96.262,-179.414],[96.262,179.414],[71.119,204.557]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[0.254901975393,0.227450981736,0.278431385756,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[0.113725490868,0.113725490868,0.113725490868,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":78,"s":[0.113725490868,0.113725490868,0.113725490868,1]},{"t":85,"s":[0.254901975393,0.227450981736,0.278431385756,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.111,257.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[19.684,0],[0,0],[0,19.684],[0,0],[-19.684,0],[0,0],[0,-19.684],[0,0]],"o":[[0,0],[-19.684,0],[0,0],[0,-19.684],[0,0],[19.684,0],[0,0],[0,19.684]],"v":[[72.622,216.557],[-72.622,216.557],[-108.262,180.917],[-108.262,-180.917],[-72.622,-216.557],[72.622,-216.557],[108.262,-180.917],[108.262,180.917]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.635294139385,0.600000023842,0.68235296011,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[256.111,257.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Режим изоляции 3","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"t":25,"s":[100]}]},"p":{"a":0,"k":[159.61,65.207,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[1.277,0],[0,0],[0,3.597],[0,0],[-1.277,0],[0,0],[0,-3.597],[0,0]],"o":[[0,0],[-1.277,0],[0,0],[0,-3.597],[0,0],[1.277,0],[0,0],[0,3.597]],"v":[[0.966,21.234],[0.966,21.234],[-1.346,16.719],[-1.346,-16.719],[0.966,-21.234],[0.966,-21.234],[3.279,-16.719],[3.279,16.719]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[0.863,0],[0,0],[0,3.597],[0,0],[-0.863,0],[0,0],[0,-3.597],[0,0]],"o":[[0,0],[-0.863,0],[0,0],[0,-3.597],[0,0],[0.863,0],[0,0],[0,3.597]],"v":[[-113.909,21.234],[-113.909,21.234],[-115.471,16.719],[-115.471,-16.719],[-113.909,-21.234],[-113.909,-21.234],[-112.346,-16.719],[-112.346,16.719]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[1.569,0],[0,0],[0,3.597],[0,0],[-1.569,0],[0,0],[0,-3.597],[0,0]],"o":[[0,0],[-1.569,0],[0,0],[0,-3.597],[0,0],[1.569,0],[0,0],[0,3.597]],"v":[[-219.688,21.234],[-219.688,21.234],[-222.529,16.719],[-222.529,-16.719],[-219.688,-21.234],[-219.688,-21.234],[-216.846,-16.719],[-216.846,16.719]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[3.288,0],[0,0],[0,3.288],[0,0],[-3.288,0],[0,0],[0,-3.288],[0,0]],"o":[[0,0],[-3.288,0],[0,0],[0,-3.288],[0,0],[3.288,0],[0,0],[0,3.288]],"v":[[-109,21.234],[-109,21.234],[-114.953,15.281],[-114.953,-15.281],[-109,-21.234],[-109,-21.234],[-103.047,-15.281],[-103.047,15.281]],"c":true}]},{"t":71,"s":[{"i":[[1.277,0],[0,0],[0,3.597],[0,0],[-1.277,0],[0,0],[0,-3.597],[0,0]],"o":[[0,0],[-1.277,0],[0,0],[0,-3.597],[0,0],[1.277,0],[0,0],[0,3.597]],"v":[[0.966,21.234],[0.966,21.234],[-1.346,16.719],[-1.346,-16.719],[0.966,-21.234],[0.966,-21.234],[3.279,-16.719],[3.279,16.719]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.592156887054,0.549019634724,0.643137276173,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811737060547,0.741149902344,0.839599609375,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"buttons 2","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[0]},{"t":60,"s":[100]}]},"p":{"a":0,"k":[146.5,178.607,0]},"a":{"a":0,"k":[146.5,178.607,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-0.865,0],[0,0],[0,3.803],[0,0],[0.865,0],[0,0],[0,-3.803],[0,0]],"o":[[0,0],[0.865,0],[0,0],[0,-3.803],[0,0],[-0.865,0],[0,0],[0,3.803]],"v":[[-0.567,14.705],[-0.567,14.705],[1,10.121],[1,-10.118],[-0.567,-14.702],[-0.567,-14.702],[-2.133,-10.118],[-2.133,10.121]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-3.281,0],[0,0],[0,3.288],[0,0],[3.281,0],[0,0],[0,-3.288],[0,0]],"o":[[0,0],[3.281,0],[0,0],[0,-3.288],[0,0],[-3.281,0],[0,0],[0,3.288]],"v":[[110.308,14.705],[110.308,14.705],[116.25,8.752],[116.25,-8.748],[110.308,-14.702],[110.308,-14.702],[104.367,-8.748],[104.367,8.752]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[-0.311,0],[0,0],[0,3.803],[0,0],[0.311,0],[0,0],[0,-3.803],[0,0]],"o":[[0,0],[0.311,0],[0,0],[0,-3.803],[0,0],[-0.311,0],[0,0],[0,3.803]],"v":[[221.687,14.705],[221.687,14.705],[222.25,10.121],[222.25,-10.118],[221.687,-14.702],[221.687,-14.702],[221.125,-10.118],[221.125,10.121]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-0.311,0],[0,0],[0,3.803],[0,0],[0.311,0],[0,0],[0,-3.803],[0,0]],"o":[[0,0],[0.311,0],[0,0],[0,-3.803],[0,0],[-0.311,0],[0,0],[0,3.803]],"v":[[123.437,14.705],[123.437,14.705],[124,10.121],[124,-10.118],[123.437,-14.702],[123.437,-14.702],[122.875,-10.118],[122.875,10.121]],"c":true}]},{"t":71,"s":[{"i":[[-0.865,0],[0,0],[0,3.803],[0,0],[0.865,0],[0,0],[0,-3.803],[0,0]],"o":[[0,0],[0.865,0],[0,0],[0,-3.803],[0,0],[-0.865,0],[0,0],[0,3.803]],"v":[[-0.567,14.705],[-0.567,14.705],[1,10.121],[1,-10.118],[-0.567,-14.702],[-0.567,-14.702],[-2.133,-10.118],[-2.133,10.121]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[146.5,173.045]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-0.865,0],[0,0],[0,3.883],[0,0],[0.865,0],[0,0],[0,-3.901],[0,0]],"o":[[0,0],[0.865,0],[0,0],[0,-3.883],[0,0],[-0.865,0],[0,0],[0,3.901]],"v":[[-0.567,14.705],[-0.567,14.705],[1,10.336],[1,-10.333],[-0.567,-14.702],[-0.567,-14.702],[-2.133,-10.379],[-2.133,10.383]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-3.281,0],[0,0],[0,3.288],[0,0],[3.281,0],[0,0],[0,-3.288],[0,0]],"o":[[0,0],[3.281,0],[0,0],[0,-3.288],[0,0],[-3.281,0],[0,0],[0,3.288]],"v":[[110.308,14.705],[110.308,14.705],[116.25,8.752],[116.25,-8.748],[110.308,-14.702],[110.308,-14.702],[104.367,-8.748],[104.367,8.752]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[-0.311,0],[0,0],[0,3.883],[0,0],[0.311,0],[0,0],[0,-3.901],[0,0]],"o":[[0,0],[0.311,0],[0,0],[0,-3.883],[0,0],[-0.311,0],[0,0],[0,3.901]],"v":[[221.687,14.705],[221.687,14.705],[222.25,10.336],[222.25,-10.333],[221.687,-14.702],[221.687,-14.702],[221.125,-10.379],[221.125,10.383]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-0.311,0],[0,0],[0,3.883],[0,0],[0.311,0],[0,0],[0,-3.901],[0,0]],"o":[[0,0],[0.311,0],[0,0],[0,-3.883],[0,0],[-0.311,0],[0,0],[0,3.901]],"v":[[123.437,14.705],[123.437,14.705],[124,10.336],[124,-10.333],[123.437,-14.702],[123.437,-14.702],[122.875,-10.379],[122.875,10.383]],"c":true}]},{"t":71,"s":[{"i":[[-0.865,0],[0,0],[0,3.883],[0,0],[0.865,0],[0,0],[0,-3.901],[0,0]],"o":[[0,0],[0.865,0],[0,0],[0,-3.883],[0,0],[-0.865,0],[0,0],[0,3.901]],"v":[[-0.567,14.705],[-0.567,14.705],[1,10.336],[1,-10.333],[-0.567,-14.702],[-0.567,-14.702],[-2.133,-10.379],[-2.133,10.383]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[146.5,215.341]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-0.396,0],[0,0],[0,1.395],[0,0],[0.396,0],[0,0],[0,-1.395],[0,0]],"o":[[0,0],[0.396,0],[0,0],[0,-1.395],[0,0],[-0.396,0],[0,0],[0,1.395]],"v":[[-0.722,5.731],[-0.722,5.731],[-0.005,4.255],[-0.005,-4.254],[-0.722,-5.731],[-0.722,-5.731],[-1.438,-4.254],[-1.438,4.255]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-1.177,0],[0,0],[0,1.179],[0,0],[1.177,0],[0,0],[0,-1.179],[0,0]],"o":[[0,0],[1.177,0],[0,0],[0,-1.179],[0,0],[-1.177,0],[0,0],[0,1.179]],"v":[[110.306,5.731],[110.306,5.731],[112.438,3.596],[112.438,-3.595],[110.306,-5.731],[110.306,-5.731],[108.175,-3.595],[108.175,3.596]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[-0.142,0],[0,0],[0,1.395],[0,0],[0.142,0],[0,0],[0,-1.395],[0,0]],"o":[[0,0],[0.142,0],[0,0],[0,-1.395],[0,0],[-0.142,0],[0,0],[0,1.395]],"v":[[221.632,5.731],[221.632,5.731],[221.889,4.255],[221.889,-4.254],[221.632,-5.731],[221.632,-5.731],[221.374,-4.254],[221.374,4.255]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-0.142,0],[0,0],[0,1.395],[0,0],[0.142,0],[0,0],[0,-1.395],[0,0]],"o":[[0,0],[0.142,0],[0,0],[0,-1.395],[0,0],[-0.142,0],[0,0],[0,1.395]],"v":[[123.382,5.731],[123.382,5.731],[123.639,4.255],[123.639,-4.254],[123.382,-5.731],[123.382,-5.731],[123.124,-4.254],[123.124,4.255]],"c":true}]},{"t":71,"s":[{"i":[[-0.396,0],[0,0],[0,1.395],[0,0],[0.396,0],[0,0],[0,-1.395],[0,0]],"o":[[0,0],[0.396,0],[0,0],[0,-1.395],[0,0],[-0.396,0],[0,0],[0,1.395]],"v":[[-0.722,5.731],[-0.722,5.731],[-0.005,4.255],[-0.005,-4.254],[-0.722,-5.731],[-0.722,-5.731],[-1.438,-4.254],[-1.438,4.255]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[146.5,132.9]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[22]},{"t":30,"s":[0]}]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[44]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[-169]},{"t":30,"s":[-346]}]},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"buttons","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[0]},{"t":60,"s":[100]}]},"p":{"a":0,"k":[-59.61,42.372,0]},"a":{"a":0,"k":[146.5,178.607,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-0.865,0],[0,0],[0,3.803],[0,0],[0.865,0],[0,0],[0,-3.803],[0,0]],"o":[[0,0],[0.865,0],[0,0],[0,-3.803],[0,0],[-0.865,0],[0,0],[0,3.803]],"v":[[-0.567,14.705],[-0.567,14.705],[1,10.121],[1,-10.118],[-0.567,-14.702],[-0.567,-14.702],[-2.133,-10.118],[-2.133,10.121]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-3.281,0],[0,0],[0,3.288],[0,0],[3.281,0],[0,0],[0,-3.288],[0,0]],"o":[[0,0],[3.281,0],[0,0],[0,-3.288],[0,0],[-3.281,0],[0,0],[0,3.288]],"v":[[110.308,14.705],[110.308,14.705],[116.25,8.752],[116.25,-8.748],[110.308,-14.702],[110.308,-14.702],[104.367,-8.748],[104.367,8.752]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[-0.311,0],[0,0],[0,3.803],[0,0],[0.311,0],[0,0],[0,-3.803],[0,0]],"o":[[0,0],[0.311,0],[0,0],[0,-3.803],[0,0],[-0.311,0],[0,0],[0,3.803]],"v":[[221.687,14.705],[221.687,14.705],[222.25,10.121],[222.25,-10.118],[221.687,-14.702],[221.687,-14.702],[221.125,-10.118],[221.125,10.121]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-0.311,0],[0,0],[0,3.803],[0,0],[0.311,0],[0,0],[0,-3.803],[0,0]],"o":[[0,0],[0.311,0],[0,0],[0,-3.803],[0,0],[-0.311,0],[0,0],[0,3.803]],"v":[[123.437,14.705],[123.437,14.705],[124,10.121],[124,-10.118],[123.437,-14.702],[123.437,-14.702],[122.875,-10.118],[122.875,10.121]],"c":true}]},{"t":71,"s":[{"i":[[-0.865,0],[0,0],[0,3.803],[0,0],[0.865,0],[0,0],[0,-3.803],[0,0]],"o":[[0,0],[0.865,0],[0,0],[0,-3.803],[0,0],[-0.865,0],[0,0],[0,3.803]],"v":[[-0.567,14.705],[-0.567,14.705],[1,10.121],[1,-10.118],[-0.567,-14.702],[-0.567,-14.702],[-2.133,-10.118],[-2.133,10.121]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.592156887054,0.549019634724,0.643137276173,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811737060547,0.741149902344,0.839599609375,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[146.5,173.045]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-0.865,0],[0,0],[0,3.883],[0,0],[0.865,0],[0,0],[0,-3.901],[0,0]],"o":[[0,0],[0.865,0],[0,0],[0,-3.883],[0,0],[-0.865,0],[0,0],[0,3.901]],"v":[[-0.567,14.705],[-0.567,14.705],[1,10.336],[1,-10.333],[-0.567,-14.702],[-0.567,-14.702],[-2.133,-10.379],[-2.133,10.383]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-3.281,0],[0,0],[0,3.288],[0,0],[3.281,0],[0,0],[0,-3.288],[0,0]],"o":[[0,0],[3.281,0],[0,0],[0,-3.288],[0,0],[-3.281,0],[0,0],[0,3.288]],"v":[[110.308,14.705],[110.308,14.705],[116.25,8.752],[116.25,-8.748],[110.308,-14.702],[110.308,-14.702],[104.367,-8.748],[104.367,8.752]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[-0.311,0],[0,0],[0,3.883],[0,0],[0.311,0],[0,0],[0,-3.901],[0,0]],"o":[[0,0],[0.311,0],[0,0],[0,-3.883],[0,0],[-0.311,0],[0,0],[0,3.901]],"v":[[221.687,14.705],[221.687,14.705],[222.25,10.336],[222.25,-10.333],[221.687,-14.702],[221.687,-14.702],[221.125,-10.379],[221.125,10.383]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-0.311,0],[0,0],[0,3.883],[0,0],[0.311,0],[0,0],[0,-3.901],[0,0]],"o":[[0,0],[0.311,0],[0,0],[0,-3.883],[0,0],[-0.311,0],[0,0],[0,3.901]],"v":[[123.437,14.705],[123.437,14.705],[124,10.336],[124,-10.333],[123.437,-14.702],[123.437,-14.702],[122.875,-10.379],[122.875,10.383]],"c":true}]},{"t":71,"s":[{"i":[[-0.865,0],[0,0],[0,3.883],[0,0],[0.865,0],[0,0],[0,-3.901],[0,0]],"o":[[0,0],[0.865,0],[0,0],[0,-3.883],[0,0],[-0.865,0],[0,0],[0,3.901]],"v":[[-0.567,14.705],[-0.567,14.705],[1,10.336],[1,-10.333],[-0.567,-14.702],[-0.567,-14.702],[-2.133,-10.379],[-2.133,10.383]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.592156887054,0.549019634724,0.643137276173,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811737060547,0.741149902344,0.839599609375,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[146.5,215.341]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-0.396,0],[0,0],[0,1.395],[0,0],[0.396,0],[0,0],[0,-1.395],[0,0]],"o":[[0,0],[0.396,0],[0,0],[0,-1.395],[0,0],[-0.396,0],[0,0],[0,1.395]],"v":[[-0.722,5.731],[-0.722,5.731],[-0.005,4.255],[-0.005,-4.254],[-0.722,-5.731],[-0.722,-5.731],[-1.438,-4.254],[-1.438,4.255]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[-1.177,0],[0,0],[0,1.179],[0,0],[1.177,0],[0,0],[0,-1.179],[0,0]],"o":[[0,0],[1.177,0],[0,0],[0,-1.179],[0,0],[-1.177,0],[0,0],[0,1.179]],"v":[[110.306,5.731],[110.306,5.731],[112.438,3.596],[112.438,-3.595],[110.306,-5.731],[110.306,-5.731],[108.175,-3.595],[108.175,3.596]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[-0.142,0],[0,0],[0,1.395],[0,0],[0.142,0],[0,0],[0,-1.395],[0,0]],"o":[[0,0],[0.142,0],[0,0],[0,-1.395],[0,0],[-0.142,0],[0,0],[0,1.395]],"v":[[221.632,5.731],[221.632,5.731],[221.889,4.255],[221.889,-4.254],[221.632,-5.731],[221.632,-5.731],[221.374,-4.254],[221.374,4.255]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[-0.142,0],[0,0],[0,1.395],[0,0],[0.142,0],[0,0],[0,-1.395],[0,0]],"o":[[0,0],[0.142,0],[0,0],[0,-1.395],[0,0],[-0.142,0],[0,0],[0,1.395]],"v":[[123.382,5.731],[123.382,5.731],[123.639,4.255],[123.639,-4.254],[123.382,-5.731],[123.382,-5.731],[123.124,-4.254],[123.124,4.255]],"c":true}]},{"t":71,"s":[{"i":[[-0.396,0],[0,0],[0,1.395],[0,0],[0.396,0],[0,0],[0,-1.395],[0,0]],"o":[[0,0],[0.396,0],[0,0],[0,-1.395],[0,0],[-0.396,0],[0,0],[0,1.395]],"v":[[-0.722,5.731],[-0.722,5.731],[-0.005,4.255],[-0.005,-4.254],[-0.722,-5.731],[-0.722,-5.731],[-1.438,-4.254],[-1.438,4.255]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.592156887054,0.549019634724,0.643137276173,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.811737060547,0.741149902344,0.839599609375,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[146.5,132.9]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Logo","parent":18,"sr":1,"ks":{"p":{"a":0,"k":[-231.92,257.234,0]},"a":{"a":0,"k":[-231.92,257.234,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[18.485,0],[2.408,-0.551],[0,0],[0,14.1]],"o":[[-2.575,0],[0,0],[12.341,-4.929],[0,-18.484]],"v":[[-12.991,-32.277],[-20.479,-31.425],[-0.586,32.277],[20.479,1.192]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1,0,0,0.5,0.15,1,0.3]}},"s":{"a":0,"k":[26.929,-12.042]},"e":{"a":0,"k":[-12.318,0.664]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-218.929,256.042]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":41,"s":[0]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.683,0.669],[-3.459,1.439],[-1.337,0.024],[-0.426,-0.346],[-0.047,-0.277],[0.047,-0.493],[1.178,-6.298],[0.95,-0.087],[2,1.311],[3.038,2.002],[-2.001,2.078],[-0.176,0.751],[0.208,0.185],[0.221,-0.05],[9.686,-6.538],[1.152,0.025],[1.816,0.59],[-0.154,1.229]],"o":[[10.366,-4.516],[9.875,-4.108],[0.294,-0.005],[0.36,0.292],[0.047,0.277],[-0.535,5.623],[-0.498,2.665],[-2.065,0.19],[-3.13,-2.052],[-3.511,-2.314],[0.524,-0.544],[0.022,-0.094],[-0.208,-0.185],[-0.314,0.071],[-1.419,0.975],[-1.27,-0.027],[-2.227,-0.724],[0.08,-0.64]],"v":[[-16.654,-2.224],[4.084,-11.157],[17.348,-16.002],[18.726,-15.588],[19.232,-14.625],[19.292,-13.225],[15.263,12.34],[12.833,15.986],[7.2,13.31],[-0.736,7.98],[0.03,2.316],[9.828,-7.254],[9.663,-7.883],[8.926,-7.954],[-6.073,1.96],[-9.929,3.384],[-15.457,2.076],[-19.3,-0.26]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54509806633,0.498039215803,0.568627476692,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-235.138,258.433]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-18.484],[18.484,0],[0,18.484],[-18.484,0]],"o":[[0,18.484],[-18.484,0],[0,-18.484],[18.484,0]],"v":[[33.469,0],[0,33.469],[-33.469,0],[0,-33.469]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.176470592618,0.227450981736,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-231.92,257.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Camera","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":51,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[22.719,-21,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[14.219,-21,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[79.219,-21,0]}]},"a":{"a":0,"k":[-267.92,115.234,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[100,100,100]},{"t":48,"s":[0,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.638,0],[0,0],[0,0],[0,0],[0,14.638],[0,0]],"o":[[0,0],[0,0],[0,0],[14.638,0],[0,0],[0,-14.638]],"v":[[13.165,-57.557],[-39.669,-57.557],[-3.722,57.557],[13.165,57.557],[39.669,31.053],[39.669,-31.053]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,1,1,1,1,1,1,1,0,0.77,0.717,0.385,1,0]}},"s":{"a":0,"k":[70.327,-27.234]},"e":{"a":0,"k":[-17.621,2.271]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-252.327,115.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"t":41,"s":[0]}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,10.227],[-10.227,0],[0,-10.227],[10.227,0]],"o":[[0,-10.227],[10.227,0],[0,10.227],[-10.227,0]],"v":[[-18.547,0],[0,-18.546],[18.547,0],[0,18.546]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,14.087],[14.086,0],[0,-14.086],[-14.086,0]],"o":[[0,-14.086],[-14.086,0],[0,14.087],[14.086,0]],"v":[[25.547,0],[0,-25.546],[-25.547,0],[0,25.546]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.596078455448,0.701960802078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-241.36,114.882]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[12.627,1.537],[0,0],[0,-8.317],[2.472,-3.152],[0,0],[0,7.575]],"o":[[0,0],[7.556,2.345],[0,4.307],[0,0],[5.254,-4.682],[0,-13.035]],"v":[[-11.221,-22.21],[-8.837,-14.576],[4.221,3.141],[0.26,14.558],[2.65,22.21],[11.221,3.141]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.596078455448,0.701960802078,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-279.649,83.49]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.227,0],[0,-10.227],[-10.227,0],[0,10.227]],"o":[[-10.227,0],[0,10.227],[10.227,0],[0,-10.227]],"v":[[0,-18.546],[-18.547,0],[0,18.546],[18.547,0]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[14.086,0],[0,14.087],[-14.086,0],[0,-14.086]],"o":[[-14.086,0],[0,-14.086],[14.086,0],[0,14.087]],"v":[[0,25.546],[-25.547,0],[0,-25.546],[25.547,0]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176470592618,0.152941182256,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-241.36,114.882]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.227,0],[0,-10.227],[-10.227,0],[0,10.227]],"o":[[-10.227,0],[0,10.227],[10.227,0],[0,-10.227]],"v":[[0,-18.546],[-18.547,0],[0,18.546],[18.547,0]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[14.086,0],[0,14.086],[-14.086,0],[0,-14.087]],"o":[[-14.086,0],[0,-14.087],[14.086,0],[0,14.086]],"v":[[0,25.546],[-25.547,0],[0,-25.546],[25.547,0]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176470592618,0.152941182256,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-293.975,143.133]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.227,0],[0,-10.227],[-10.227,0],[0,10.227]],"o":[[-10.227,0],[0,10.227],[10.227,0],[0,-10.227]],"v":[[0,-18.546],[-18.547,0],[0,18.546],[18.547,0]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[14.086,0],[0,14.087],[-14.086,0],[0,-14.086]],"o":[[-14.086,0],[0,-14.086],[14.086,0],[0,14.087]],"v":[[0,25.546],[-25.547,0],[0,-25.546],[25.547,0]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176470592618,0.152941182256,0.223529413342,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-293.975,86.631]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.377],[0.865,0],[0,1.377],[-0.865,0]],"o":[[0,1.377],[-0.865,0],[0,-1.377],[0.865,0]],"v":[[1.566,0],[0,2.494],[-1.566,0],[0,-2.494]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.61960786581,0.611764729023,0.658823549747,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-242.928,114.882]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.586],[0.586,0],[0,0.586],[-0.586,0]],"o":[[0,0.586],[-0.586,0],[0,-0.586],[0.586,0]],"v":[[1.061,0],[0,1.061],[-1.061,0],[0,-1.061]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-239.567,116.158]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-2.274],[2.274,0],[0,2.274],[-2.274,0]],"o":[[0,2.274],[-2.274,0],[0,-2.274],[2.274,0]],"v":[[4.118,0],[0,4.118],[-4.118,0],[0,-4.118]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.007843137719,0.043137256056,0.098039217293,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-241.36,114.882]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.377],[0.865,0],[0,1.377],[-0.865,0]],"o":[[0,1.377],[-0.865,0],[0,-1.377],[0.865,0]],"v":[[1.566,0],[0,2.494],[-1.566,0],[0,-2.494]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.61960786581,0.611764729023,0.658823549747,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-295.541,143.133]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.586],[0.586,0],[0,0.586],[-0.586,0]],"o":[[0,0.586],[-0.586,0],[0,-0.586],[0.586,0]],"v":[[1.061,0],[0,1.061],[-1.061,0],[0,-1.061]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-292.179,144.409]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 11","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-1.377],[0.865,0],[0,1.377],[-0.865,0]],"o":[[0,1.377],[-0.865,0],[0,-1.377],[0.865,0]],"v":[[1.566,0],[0,2.494],[-1.566,0],[0,-2.494]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.61960786581,0.611764729023,0.658823549747,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-295.541,86.631]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 12","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.586],[0.586,0],[0,0.586],[-0.586,0]],"o":[[0,0.586],[-0.586,0],[0,-0.586],[0.586,0]],"v":[[1.061,0],[0,1.061],[-1.061,0],[0,-1.061]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-292.179,87.907]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 13","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-2.274],[2.274,0],[0,2.274],[-2.274,0]],"o":[[0,2.274],[-2.274,0],[0,-2.274],[2.274,0]],"v":[[4.118,0],[0,4.118],[-4.118,0],[0,-4.118]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.007843137719,0.043137256056,0.098039217293,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-293.975,86.631]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 14","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-2.274],[2.274,0],[0,2.274],[-2.274,0]],"o":[[0,2.274],[-2.274,0],[0,-2.274],[2.274,0]],"v":[[4.118,0],[0,4.118],[-4.118,0],[0,-4.118]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.007843137719,0.043137256056,0.098039217293,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-293.975,143.133]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 15","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-4.279],[4.279,0],[0,4.279],[-4.279,0]],"o":[[0,4.279],[-4.279,0],[0,-4.279],[4.279,0]],"v":[[7.748,0],[0,7.748],[-7.748,0],[0,-7.748]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.082352943718,0.105882354081,0.156862750649,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-293.975,143.133]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 16","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-4.279],[4.279,0],[0,4.279],[-4.279,0]],"o":[[0,4.279],[-4.279,0],[0,-4.279],[4.279,0]],"v":[[7.748,0],[0,7.748],[-7.748,0],[0,-7.748]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.082352943718,0.105882354081,0.156862750649,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-293.975,86.631]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 17","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-4.279],[4.279,0],[0,4.279],[-4.279,0]],"o":[[0,4.279],[-4.279,0],[0,-4.279],[4.279,0]],"v":[[7.748,0],[0,7.748],[-7.748,0],[0,-7.748]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.082352943718,0.105882354081,0.156862750649,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-241.36,114.882]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 18","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,5.138],[5.138,0],[0,-5.138],[-5.138,0]],"o":[[0,-5.138],[-5.138,0],[0,5.138],[5.138,0]],"v":[[9.304,0],[0,-9.304],[-9.304,0],[0,9.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.086274512112,0.086274512112,0.082352943718,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-241.36,155.24]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 19","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-2.079],[2.079,0],[0,2.079],[-2.079,0]],"o":[[0,2.079],[-2.079,0],[0,-2.079],[2.079,0]],"v":[[3.763,0],[0,3.763],[-3.763,0],[0,-3.763]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-241.36,71.193]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 20","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-5.138],[5.138,0],[0,5.138],[-5.138,0]],"o":[[0,5.138],[-5.138,0],[0,-5.138],[5.138,0]],"v":[[9.304,0],[0,9.304],[-9.304,0],[0,-9.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.741176486015,0.698039233685,0.713725507259,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-241.36,74.523]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 21","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-12.176],[12.176,0],[0,12.176],[-12.176,0]],"o":[[0,12.176],[-12.176,0],[0,-12.176],[12.176,0]],"v":[[22.047,0],[0,22.047],[-22.047,0],[0,-22.047]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.011764706112,0.027450980619,0.011764706112,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-241.36,114.882]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 22","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-12.176],[12.176,0],[0,12.176],[-12.176,0]],"o":[[0,12.176],[-12.176,0],[0,-12.176],[12.176,0]],"v":[[22.047,0],[0,22.047],[-22.047,0],[0,-22.047]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.011764706112,0.027450980619,0.011764706112,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-293.975,143.133]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 23","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-12.176],[12.176,0],[0,12.176],[-12.176,0]],"o":[[0,12.176],[-12.176,0],[0,-12.176],[12.176,0]],"v":[[22.047,0],[0,22.047],[-22.047,0],[0,-22.047]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.011764706112,0.027450980619,0.011764706112,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[-293.975,86.631]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 24","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-0.834],[0.834,0],[0,0.834],[-0.834,0]],"o":[[0,0.834],[-0.834,0],[0,-0.834],[0.834,0]],"v":[[1.51,0],[0,1.51],[-1.51,0],[0,-1.51]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.086274512112,0.086274512112,0.082352943718,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-226.214,143.671]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 25","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,14.638],[0,0],[-14.638,0],[0,0],[0,-14.638],[0,0],[14.638,0]],"o":[[-14.638,0],[0,0],[0,-14.638],[0,0],[14.638,0],[0,0],[0,14.638],[0,0]],"v":[[-28.758,57.557],[-55.262,31.053],[-55.262,-31.053],[-28.758,-57.557],[28.758,-57.557],[55.262,-31.053],[55.262,31.053],[28.758,57.557]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.443,0.384,0.498,0.5,0.318,0.276,0.365,1,0.192,0.169,0.231]}},"s":{"a":0,"k":[-22.08,-62.234]},"e":{"a":0,"k":[22.744,60.917]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-267.92,115.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 26","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,16.412],[0,0],[16.412,0],[0,0],[0,-16.412],[0,0],[-16.412,0],[0,0]],"o":[[0,0],[0,-16.412],[0,0],[-16.412,0],[0,0],[0,16.412],[0,0],[16.412,0]],"v":[[59.852,32.62],[59.852,-32.62],[30.135,-62.337],[-30.135,-62.337],[-59.852,-32.62],[-59.852,32.62],[-30.135,62.337],[30.135,62.337]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0.221,0.725,0.682,0.737,0.611,0.539,0.492,0.567,1,0.353,0.302,0.396]}},"s":{"a":0,"k":[3791.08,-63.234]},"e":{"a":0,"k":[3791.08,-187.908]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-267.92,115.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 27","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Режим изоляции","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":51,"s":[0]}]},"p":{"a":0,"k":[1.192,22.157,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[0,0],[0,4.213],[0,0],[-0.062,0],[0,0],[0,-4.213],[0,0],[0.018,0]],"o":[[-0.062,0],[0,0],[0,-4.213],[0,0],[0.018,0],[0,0],[0,4.213],[0,0]],"v":[[13.914,18.984],[13.803,11.355],[13.803,-97.513],[13.914,-105.141],[14.414,-105.141],[14.447,-97.513],[14.447,11.355],[14.414,18.984]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[0,0],[0,4.213],[0,0],[-1.029,0],[0,0],[0,-3.444],[0,0],[0.304,0]],"o":[[-1.029,0],[0,0],[0,-4.213],[0,0],[0.304,0],[0,0],[0,3.444],[0,0]],"v":[[20.667,18.984],[18.803,11.355],[18.803,-97.513],[20.667,-105.141],[29.021,-105.141],[29.572,-87.573],[29.572,1.415],[29.021,18.984]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0.795,15.345],[0,0],[-8.959,-1.25],[0,0],[0,-15.846],[0,0],[4.784,0]],"o":[[-7.965,0.375],[0,0],[0.298,-16.643],[0,0],[5.381,0],[0,0],[0,15.423],[0,0]],"v":[[29.467,17.139],[13.947,-5.832],[14.146,-78.843],[29.467,-103.486],[49.222,-103.486],[70.822,-74.295],[70.822,-11.689],[49.222,17.139]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,0],[1.084,15.345],[0,0],[-12.21,-1.25],[0,0],[0,-15.846],[0,0],[6.521,0]],"o":[[-14.378,0.875],[0,0],[0.406,-16.643],[0,0],[7.333,0],[0,0],[0,15.423],[0,0]],"v":[[-6.172,17.234],[-37.418,-8.236],[-37.553,-78.748],[-6.172,-103.391],[10.251,-103.391],[24.697,-74.295],[24.697,-11.689],[10.251,17.234]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[0,0],[0,4.213],[0,0],[-0.838,0],[0,0],[0,-4.162],[0,0],[0.194,0]],"o":[[-0.838,0],[0,0],[0,-4.213],[0,0],[0.194,0],[0,0],[0,4.162],[0,0]],"v":[[70.195,18.984],[69.553,11.355],[69.553,-97.513],[70.32,-105.141],[77.197,-104.391],[78.186,-96.855],[78.186,10.697],[77.197,18.234]],"c":true}]},{"t":50,"s":[{"i":[[0,0],[0,4.213],[0,0],[-0.011,0],[0,0],[0,-4.162],[0,0],[0.003,0]],"o":[[-0.011,0],[0,0],[0,-4.213],[0,0],[0.003,0],[0,0],[0,4.162],[0,0]],"v":[[79.395,18.984],[79.387,11.355],[79.387,-97.513],[79.397,-105.141],[79.486,-104.391],[79.498,-96.855],[79.498,10.697],[79.486,18.234]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.254901975393,0.227450981736,0.278431385756,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Back","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"t":49,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.333},"t":0,"s":[34.219,121,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[34.219,121,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[50.219,121,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[68.219,121,0]}]},"a":{"a":0,"k":[-231.92,257.234,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[0,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[100,100,100]},{"t":48,"s":[0,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,15.818],[0,0],[-15.818,0],[0,0],[0,-15.818],[0,0],[15.818,0]],"o":[[-15.818,0],[0,0],[0,-15.818],[0,0],[15.818,0],[0,0],[0,15.818],[0,0]],"v":[[-72.622,209.557],[-101.262,180.916],[-101.262,-180.916],[-72.622,-209.557],[72.621,-209.557],[101.262,-180.916],[101.262,180.916],[72.622,209.557]],"c":true}},"nm":"Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0.604,0.514,0.631,0.5,0.429,0.371,0.455,1,0.255,0.227,0.278]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0.604,0.514,0.631,0.5,0.429,0.371,0.455,1,0.255,0.227,0.278]},{"t":48,"s":[0,0.604,0.514,0.631,0.5,0.429,0.371,0.455,1,0.255,0.227,0.278]}]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[-137.08,-164.234],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[-47.561,68.787],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[-137.08,-164.234],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[132.441,-151.543],"to":[0,0],"ti":[0,0]},{"t":49,"s":[251.486,73.144]}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[84.991,-172.003],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[103.718,-124.105],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[137.919,163.497],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[-85.267,112.224],"to":[0,0],"ti":[0,0]},{"t":49,"s":[-184.884,-119.414]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-231.92,257.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[19.684,0],[0,0],[0,19.684],[0,0],[-19.684,0],[0,0],[0,-19.684],[0,0]],"o":[[0,0],[-19.684,0],[0,0],[0,-19.684],[0,0],[19.684,0],[0,0],[0,19.684]],"v":[[72.622,216.557],[-72.622,216.557],[-108.262,180.917],[-108.262,-180.917],[-72.622,-216.557],[72.622,-216.557],[108.262,-180.917],[108.262,180.917]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.635294139385,0.600000023842,0.68235296011,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.090196080506,0.145098045468,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-231.92,257.234]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Side","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":71,"s":[0]}]},"p":{"a":0,"k":[50.575,121,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,14.802],[0,0],[0,0],[0,39.458]],"o":[[0,-34.052],[0,0],[0,0],[0,-16.292]],"v":[[-108.992,-179.182],[-75.56,-215.984],[-72.435,216.683],[-108.974,175.807]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[{"i":[[-1.811,8.661],[0,0],[11.471,-0.385],[0.926,27.552]],"o":[[5.807,-27.768],[0,0],[-11.471,0.385],[-0.327,-9.733]],"v":[[-76.992,-194.216],[-34.326,-216.195],[-30.694,216.174],[-73.518,192.743]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.007,-216.557],[17.007,-216.557],[17.007,216.557],[-17.007,216.557]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[-22.324,0],[0,-20.378],[0,-19.464],[15.626,0]],"o":[[22.324,0],[0,17.967],[0,21.592],[-15.626,0]],"v":[[26.962,-216.29],[63.8,-195.607],[63.815,197.424],[26.962,216.557]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0,-38.5],[0,-41.708],[0,0]],"o":[[0,0],[0,38.5],[0,41.708],[0,0]],"v":[[73.493,-215.984],[107.45,-176.484],[107.45,175.557],[73.493,216.557]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,14.802],[0,0],[0,0],[0,39.458]],"o":[[0,-34.052],[0,0],[0,0],[0,-16.292]],"v":[[-101.742,-179.182],[-68.31,-215.984],[-65.185,216.683],[-101.724,175.807]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[{"i":[[0,7.836],[-14.665,0],[8.924,0],[0,30.532]],"o":[[0,-30.714],[14.665,0],[-21.63,0],[0,-8.625]],"v":[[-64.685,-189.021],[-28.975,-216.254],[-27.224,216.624],[-64.669,188.484]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.007,-216.557],[17.007,-216.557],[17.007,216.557],[-17.007,216.557]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[-18.306,0],[0,-28.434],[0,-25.507],[22.62,0]],"o":[[22.889,0],[0,23.545],[0,25.507],[-15.123,0]],"v":[[39.669,-216.207],[76.315,-186.05],[76.311,191.483],[39.669,216.557]],"c":true}]},{"t":71,"s":[{"i":[[0,0],[0,-38.5],[0,-41.708],[0,0]],"o":[[0,0],[0,38.5],[0,41.708],[0,0]],"v":[[73.493,-215.984],[107.45,-176.484],[107.45,175.557],[73.493,216.557]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[21]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[4.091]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[16.045]},{"t":79,"s":[0]}]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[-33]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[36.4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[-111.782]},{"t":79,"s":[177.4]}]},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,14.802],[0,0],[0,0],[0,39.458]],"o":[[0,-34.052],[0,0],[0,0],[0,-16.292]],"v":[[-108.992,-179.182],[-75.56,-215.984],[-72.435,216.683],[-108.974,175.807]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[{"i":[[-1.811,8.661],[0,0],[11.471,-0.385],[0.926,27.552]],"o":[[5.807,-27.768],[0,0],[-11.471,0.385],[-0.327,-9.733]],"v":[[-76.992,-194.216],[-34.326,-216.195],[-30.694,216.174],[-73.518,192.743]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.007,-216.557],[17.007,-216.557],[17.007,216.557],[-17.007,216.557]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[-22.324,0],[0,-20.378],[0,-19.464],[15.626,0]],"o":[[22.324,0],[0,17.967],[0,21.592],[-15.626,0]],"v":[[26.962,-216.29],[63.8,-195.607],[63.815,197.424],[26.962,216.557]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0,-38.5],[0,-41.708],[0,0]],"o":[[0,0],[0,38.5],[0,41.708],[0,0]],"v":[[73.493,-215.984],[107.45,-176.484],[107.45,175.557],[73.493,216.557]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,14.802],[0,0],[0,0],[0,39.458]],"o":[[0,-34.052],[0,0],[0,0],[0,-16.292]],"v":[[-101.742,-179.182],[-68.31,-215.984],[-65.185,216.683],[-101.724,175.807]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[{"i":[[0,7.836],[-14.665,0],[8.924,0],[0,30.532]],"o":[[0,-30.714],[14.665,0],[-21.63,0],[0,-8.625]],"v":[[-64.685,-189.021],[-28.975,-216.254],[-27.224,216.624],[-64.669,188.484]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-17.007,-216.557],[17.007,-216.557],[17.007,216.557],[-17.007,216.557]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":59,"s":[{"i":[[-18.306,0],[0,-28.434],[0,-25.507],[22.62,0]],"o":[[22.889,0],[0,23.545],[0,25.507],[-15.123,0]],"v":[[39.669,-216.207],[76.315,-186.05],[76.311,191.483],[39.669,216.557]],"c":true}]},{"t":71,"s":[{"i":[[0,0],[0,-38.5],[0,-41.708],[0,0]],"o":[[0,0],[0,38.5],[0,41.708],[0,0]],"v":[[73.493,-215.984],[107.45,-176.484],[107.45,175.557],[73.493,216.557]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.635294139385,0.600000023842,0.68235296011,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":15,"k":{"a":0,"k":[0,1,1,1,0.075,0.804,0.778,0.835,0.15,0.608,0.557,0.671,0.239,0.804,0.731,0.827,0.329,1,0.906,0.984,0.397,0.982,0.888,0.98,0.465,0.965,0.871,0.976,0.543,0.89,0.808,0.91,0.621,0.816,0.745,0.843,0.726,0.798,0.727,0.827,0.832,0.78,0.71,0.812,0.865,0.763,0.692,0.796,0.897,0.745,0.675,0.78,0.949,0.843,0.788,0.869,1,0.941,0.902,0.957]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[-4.935,61.766],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0.065,215.766],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[-4.935,61.766],"to":[0,0],"ti":[0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[0.065,215.766],"to":[0,0],"ti":[0,0]},{"t":71,"s":[-4.935,61.766]}]},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":0,"s":[10.065,-358.349],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0.065,-217.349],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[10.065,-358.349],"to":[0,0],"ti":[0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48,"s":[0.065,-217.349],"to":[0,0],"ti":[0,0]},{"t":71,"s":[10.065,-358.349]}]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0}]} \ No newline at end of file diff --git a/messenger-client/app/src/main/assets/search_out.json b/messenger-client/app/src/main/assets/search_out.json new file mode 100644 index 0000000..6572fc8 --- /dev/null +++ b/messenger-client/app/src/main/assets/search_out.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2.2","fr":60,"ip":0,"op":180,"w":512,"h":512,"nm":"_016_SRCH_OUT","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":3,"ty":4,"nm":"lupa11","parent":4,"sr":1,"ks":{"o":{"a":0,"k":50},"r":{"a":0,"k":180},"s":{"a":0,"k":[100,102.141,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[-0.881,2.494],[-7.829,1.937]],"o":[[2.657,-7.518],[1.846,-0.457]],"v":[[-22.559,-7.972],[-5.765,-23.22]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[-0.002,2.181],[-2.688,2.11]],"o":[[0.006,-6.576],[0.634,-0.498]],"v":[[-26.253,-6.948],[-21.953,-20.95]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[-0.002,2.181],[-2.688,2.11]],"o":[[0.006,-6.576],[0.634,-0.498]],"v":[[-26.253,-6.948],[-21.953,-20.95]],"c":false}]},{"t":158,"s":[{"i":[[-0.881,2.494],[-7.829,1.937]],"o":[[2.657,-7.518],[1.846,-0.457]],"v":[[-22.559,-7.972],[-5.765,-23.22]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[0]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[95]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"lupa10","parent":6,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":68,"s":[0]},{"t":80,"s":[21],"h":1},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[21]},{"t":114,"s":[0],"h":1}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[-0.53,1.978],[-7.467,2.569]],"o":[[2.059,-7.69],[2.441,-0.84]],"v":[[-23.107,-6.202],[-7.786,-22.624]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[0.379,1.578],[-2,3.001]],"o":[[-1.474,-6.136],[0.654,-0.981]],"v":[[-23.147,12.142],[-22.278,-2.492]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0.379,1.578],[-2,3.001]],"o":[[-1.474,-6.136],[0.654,-0.981]],"v":[[-23.147,12.142],[-22.278,-2.492]],"c":false}]},{"t":158,"s":[{"i":[[-0.53,1.978],[-7.467,2.569]],"o":[[2.059,-7.69],[2.441,-0.84]],"v":[[-23.107,-6.202],[-7.786,-22.624]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":240,"s":[20]},{"t":252,"s":[0]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[70]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[70]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[70]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":240,"s":[100]},{"t":252,"s":[95]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"lupa12","parent":6,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[13.639,6.224],[5.844,0],[4.004,-17.574]],"o":[[-4.99,-2.277],[-18.786,0],[-0.24,1.053]],"v":[[16.381,-35.954],[0,-39.5],[-38.514,-8.811]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[13.639,6.224],[5.844,0],[4.004,-17.574]],"o":[[-4.99,-2.277],[-18.786,0],[-0.24,1.053]],"v":[[16.381,-35.954],[0,-39.5],[-38.514,-8.811]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[13.639,6.224],[5.844,0],[4.004,-17.574]],"o":[[-4.99,-2.277],[-18.786,0],[-0.24,1.053]],"v":[[16.381,-35.954],[0,-39.5],[-38.514,-8.811]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[13.07,5.995],[5.81,0.629],[5.365,-12.351]],"o":[[-4.782,-2.194],[-18.677,-2.022],[-0.321,0.74]],"v":[[18.741,-17.799],[2.734,-22.142],[-37.973,-3.967]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[13.07,5.995],[5.81,0.629],[5.365,-12.351]],"o":[[-4.782,-2.194],[-18.677,-2.022],[-0.321,0.74]],"v":[[18.741,-17.799],[2.734,-22.142],[-37.973,-3.967]],"c":false}]},{"t":158,"s":[{"i":[[13.639,6.224],[5.844,0],[4.004,-17.574]],"o":[[-4.99,-2.277],[-18.786,0],[-0.24,1.053]],"v":[[16.381,-35.954],[0,-39.5],[-38.514,-8.811]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.244577205882,0.244577205882,0.244577205882,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"lupa1","parent":34,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":68,"s":[-95.431]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":86,"s":[-95.431]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[-95.431]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":114,"s":[-10.978]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-10.978]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":158,"s":[-10.978]},{"i":{"x":[0.413],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":164,"s":[-15.895]},{"i":{"x":[0.119],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":210,"s":[-15.895]},{"t":230,"s":[-95.431]}]},"p":{"a":0,"k":[0,-74.75,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[21.12,2.689],[-2.689,21.12],[-21.12,-2.689],[2.689,-21.12]],"o":[[-21.12,-2.689],[2.689,-21.12],[21.12,2.689],[-2.689,21.12]],"v":[[-4.869,38.24],[-38.24,-4.869],[4.869,-38.24],[38.24,4.869]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[21.12,2.689],[-2.689,21.12],[-21.12,-2.689],[2.689,-21.12]],"o":[[-21.12,-2.689],[2.689,-21.12],[21.12,2.689],[-2.689,21.12]],"v":[[-4.869,38.24],[-38.24,-4.869],[4.869,-38.24],[38.24,4.869]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[21.12,2.689],[-2.689,21.12],[-21.12,-2.689],[2.689,-21.12]],"o":[[-21.12,-2.689],[2.689,-21.12],[21.12,2.689],[-2.689,21.12]],"v":[[-4.869,38.24],[-38.24,-4.869],[4.869,-38.24],[38.24,4.869]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[17.088,-9.328],[13.251,14.849],[-17.088,9.328],[-13.251,-14.849]],"o":[[-17.088,9.328],[-13.251,-14.849],[17.088,-9.328],[13.251,14.849]],"v":[[23.994,35.979],[-30.941,25.983],[-23.994,-17.794],[30.941,-7.798]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[17.088,-9.328],[13.251,14.849],[-17.088,9.328],[-13.251,-14.849]],"o":[[-17.088,9.328],[-13.251,-14.849],[17.088,-9.328],[13.251,14.849]],"v":[[23.994,35.979],[-30.941,25.983],[-23.994,-17.794],[30.941,-7.798]],"c":true}]},{"t":158,"s":[{"i":[[21.12,2.689],[-2.689,21.12],[-21.12,-2.689],[2.689,-21.12]],"o":[[-21.12,-2.689],[2.689,-21.12],[21.12,2.689],[-2.689,21.12]],"v":[[-4.869,38.24],[-38.24,-4.869],[4.869,-38.24],[38.24,4.869]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.003921568859,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":12},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.016,0.706,1,0.5,0.016,0.706,1,1,0.016,0.706,1,0,1,0.5,0.5,1,0]}},"s":{"a":0,"k":[-12.358,-89.703]},"e":{"a":0,"k":[42.73,53.2]},"t":1,"nm":"ggg","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"lupa14","parent":6,"sr":1,"ks":{},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[3.495,-21.533],[21.533,3.495],[-3.495,21.533],[-21.533,-3.495]],"o":[[-3.495,21.533],[-21.533,-3.495],[3.495,-21.533],[21.533,3.495]],"v":[[38.99,6.329],[-6.329,38.99],[-38.99,-6.329],[6.329,-38.99]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[17.088,-9.328],[13.251,14.849],[-17.088,9.328],[-13.251,-14.849]],"o":[[-17.088,9.328],[-13.251,-14.849],[17.088,-9.328],[13.251,14.849]],"v":[[25.553,28.511],[-29.382,18.515],[-22.434,-25.262],[32.501,-15.266]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[17.088,-9.328],[13.251,14.849],[-17.088,9.328],[-13.251,-14.849]],"o":[[-17.088,9.328],[-13.251,-14.849],[17.088,-9.328],[13.251,14.849]],"v":[[25.553,28.511],[-29.382,18.515],[-22.434,-25.262],[32.501,-15.266]],"c":true}]},{"t":158,"s":[{"i":[[3.495,-21.533],[21.533,3.495],[-3.495,21.533],[-21.533,-3.495]],"o":[[-3.495,21.533],[-21.533,-3.495],[3.495,-21.533],[21.533,3.495]],"v":[[38.99,6.329],[-6.329,38.99],[-38.99,-6.329],[6.329,-38.99]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.243137269862,0.243137269862,0.243137269862,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":12},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":100,"op":158,"st":60,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"lupa13","parent":10,"sr":1,"ks":{"r":{"a":0,"k":95.361},"p":{"a":0,"k":[-1.899,8.047,0]},"s":{"a":0,"k":[76.08,45.674,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[8.996,-2.333],[0.06,-2.922],[-4.267,-1.353]],"o":[[-4.333,1.124],[-0.073,3.546],[7.298,2.313]],"v":[[-0.326,-7.284],[-17.761,0.611],[0.413,9.182]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.243137269862,0.243137269862,0.243137269862,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":72,"op":222,"st":60,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"lupa9","parent":10,"sr":1,"ks":{"p":{"a":0,"k":[0,-25.25,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[6.617,0],[0,-6.617],[-6.617,0],[0,6.617]],"o":[[-6.617,0],[0,6.617],[6.617,0],[0,-6.617]],"v":[[0,-9],[-12,0],[0,9],[12,0]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.003921568859,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":72,"op":222,"st":60,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"lupa8","parent":34,"sr":1,"ks":{"r":{"a":0,"k":-361.786},"s":{"a":0,"k":[102.993,97.094,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.537,0],[0,-2.268],[-7.11,0],[0,7.111]],"o":[[-2.537,0],[0,7.111],[7.11,0],[0,-2.268]],"v":[[0,-26],[-12.894,13.105],[0,26],[12.894,13.105]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.003921568859,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":72,"op":222,"st":60,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"mouth","parent":13,"sr":1,"ks":{"p":{"a":0,"k":[99.957,82.118,0]},"a":{"a":0,"k":[64.819,32.647,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[-62.293,2.556]],"o":[[70.185,-13.586],[0,0]],"v":[[-85.813,27.732],[89.216,12.649]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[-62.293,2.556]],"o":[[70.185,-13.586],[0,0]],"v":[[-81.17,27.485],[93.859,12.402]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[0,0],[-62.293,2.556]],"o":[[70.185,-13.586],[0,0]],"v":[[-81.17,27.485],[93.859,12.402]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":114,"s":[{"i":[[0,0],[-62.293,2.556]],"o":[[70.185,-13.586],[0,0]],"v":[[-93.836,29.31],[81.193,14.227]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[-62.293,2.556]],"o":[[70.185,-13.586],[0,0]],"v":[[-93.836,29.31],[81.193,14.227]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":158,"s":[{"i":[[0,0],[-58.08,-8.087]],"o":[[68.302,-23.251],[0,0]],"v":[[-85.747,29.073],[89.282,13.99]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":210,"s":[{"i":[[0,0],[-58.08,-8.087]],"o":[[68.302,-23.251],[0,0]],"v":[[-85.747,29.073],[89.282,13.99]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[-62.293,2.556]],"o":[[70.185,-13.586],[0,0]],"v":[[-85.813,27.732],[89.216,12.649]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[31]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":158,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":210,"s":[0]},{"t":230,"s":[31]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[69]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":158,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":210,"s":[100]},{"t":230,"s":[69]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.490196078431,0.035294117647,0.035294117647,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[64.819,32.647]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"beak_bl","parent":13,"sr":1,"ks":{"r":{"a":0,"k":7.036},"p":{"a":0,"k":[50.927,24.827,0]},"a":{"a":0,"k":[33.59,24.06,0]},"s":{"a":0,"k":[100.251,100.251,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[5.079,42.636]],"o":[[9.196,-5.161],[0,0]],"v":[[23.139,64.05],[42.349,1.419]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":158,"s":[{"i":[[0,0],[5.079,42.636]],"o":[[18.356,-10.157],[0,0]],"v":[[-20.7,75.582],[36.489,4.447]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":210,"s":[{"i":[[0,0],[5.079,42.636]],"o":[[18.356,-10.157],[0,0]],"v":[[-20.7,75.582],[36.489,4.447]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[5.079,42.636]],"o":[[9.196,-5.161],[0,0]],"v":[[23.139,64.05],[42.349,1.419]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.705882352941,0.517647058824,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[33.59,24.06]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[10]},{"t":240,"s":[20]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[70]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[70]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[70]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[80]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"beak","parent":22,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":68,"s":[1.238]},{"t":80,"s":[5.238],"h":1},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[5.238]},{"t":114,"s":[10.952],"h":1},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[10.952]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":158,"s":[-3.259]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":182,"s":[-3.259]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":210,"s":[-3.259]},{"t":230,"s":[1.238]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[201.589,193.463,0],"to":[0,0,0],"ti":[0,0,0]},{"t":80,"s":[241.082,205.309,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[241.082,205.309,0],"to":[0,0,0],"ti":[0,0,0]},{"t":114,"s":[151.828,190.018,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[151.828,190.018,0],"to":[0,0,0],"ti":[-1.876,2.272,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":158,"s":[197.065,177.122,0],"to":[1.875,-2.272,0],"ti":[-1.876,2.272,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":182,"s":[197.065,177.122,0],"to":[1.875,-2.272,0],"ti":[-1.876,2.272,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":210,"s":[197.065,177.122,0],"to":[1.875,-2.272,0],"ti":[-1.501,1.818,0]},{"t":230,"s":[201.589,193.463,0]}]},"a":{"a":0,"k":[99.727,19.536,0]},"s":{"a":0,"k":[106.05,93.1,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[12.994,-1.415],[13.99,-1.67],[9.862,-2.259],[-13.677,9.061],[-23.063,2.556],[-13.236,-7.846]],"o":[[-12.043,1.311],[-15.088,1.802],[-20.392,4.67],[22.83,-15.125],[27.153,-3.011],[24.51,14.529]],"v":[[41.697,36.974],[5.343,38.403],[-33.369,43.704],[-36.617,12.009],[-3.942,-51.521],[30.62,1.1]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[12.994,-1.415],[13.99,-1.67],[9.862,-2.259],[-13.677,9.061],[-23.063,2.556],[-13.236,-7.846]],"o":[[-12.043,1.311],[-15.088,1.802],[-20.392,4.67],[22.83,-15.125],[27.153,-3.011],[24.51,14.529]],"v":[[41.697,36.974],[5.343,38.403],[-33.369,43.704],[-36.617,12.009],[-3.942,-51.521],[30.62,1.1]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":158,"s":[{"i":[[11.821,-13.944],[45.043,-5.668],[9.862,-2.259],[-15.493,5.395],[-30.474,5.332],[-74.903,-9.906]],"o":[[-8.631,10.181],[-47.964,6.035],[-20.392,4.67],[81.514,-28.384],[32.665,-5.715],[30.442,4.026]],"v":[[101.22,37.491],[-1.379,36.141],[-81.959,54.325],[-85.206,22.629],[-3.942,-51.521],[77.592,5.643]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":210,"s":[{"i":[[11.821,-13.944],[45.043,-5.668],[9.862,-2.259],[-15.493,5.395],[-30.474,5.332],[-74.903,-9.906]],"o":[[-8.631,10.181],[-47.964,6.035],[-20.392,4.67],[81.514,-28.384],[32.665,-5.715],[30.442,4.026]],"v":[[101.22,37.491],[-1.379,36.141],[-81.959,54.325],[-85.206,22.629],[-3.942,-51.521],[77.592,5.643]],"c":true}]},{"t":230,"s":[{"i":[[12.994,-1.415],[13.99,-1.67],[9.862,-2.259],[-13.677,9.061],[-23.063,2.556],[-13.236,-7.846]],"o":[[-12.043,1.311],[-15.088,1.802],[-20.392,4.67],[22.83,-15.125],[27.153,-3.011],[24.51,14.529]],"v":[[41.697,36.974],[5.343,38.403],[-33.369,43.704],[-36.617,12.009],[-3.942,-51.521],[30.62,1.1]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.811999990426,0.20800000359,0.008000000785,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":6.667},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.361000001197,0.118000000598,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[97.207,71.199]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"eye_r 2","parent":15,"sr":1,"ks":{"o":{"a":1,"k":[{"t":110,"s":[100],"h":1},{"t":112,"s":[0],"h":1},{"t":116,"s":[0],"h":1},{"t":119,"s":[100],"h":1},{"t":122,"s":[100],"h":1},{"t":123,"s":[0],"h":1},{"t":132,"s":[100],"h":1},{"t":180,"s":[100],"h":1},{"t":182,"s":[0],"h":1},{"t":192,"s":[100],"h":1}]},"p":{"a":0,"k":[27.147,31.05,0]},"a":{"a":0,"k":[27.147,31.05,0]},"s":{"a":0,"k":[18.547,18.547,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.661,-16.693],[14.49,-0.574],[0.661,16.693],[-14.49,0.574]],"o":[[0.661,16.693],[-14.49,0.574],[-0.662,-16.693],[14.49,-0.574]],"v":[[26.237,-1.04],[1.198,30.225],[-26.236,1.039],[-1.198,-30.225]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-23.787,-45.981]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":268,"st":60,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"eye_r","parent":13,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[190.812,28.758,0],"to":[-1.728,-0.049,0],"ti":[1.728,0.049,0]},{"t":80,"s":[180.443,28.465,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[180.443,28.465,0],"to":[1.728,0.049,0],"ti":[-1.728,-0.049,0]},{"t":114,"s":[190.812,28.758,0],"h":1},{"t":140,"s":[190.812,28.758,0],"h":1}]},"a":{"a":0,"k":[27.148,31.05,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":68,"s":[100,100,100]},{"t":80,"s":[80,100,100],"h":1},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":100,"s":[80,100,100]},{"t":114,"s":[100,100,100],"h":1},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":140,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":158,"s":[60,60,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":210,"s":[60,60,100]},{"t":230,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[-0.661,-16.693],[14.49,-0.574],[0.661,16.693],[-14.49,0.574]],"o":[[0.661,16.693],[-14.49,0.574],[-0.662,-16.693],[14.49,-0.574]],"v":[[26.237,-1.04],[1.198,30.225],[-26.236,1.039],[-1.198,-30.225]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[-2.853,-1.819],[17.436,-0.513],[-2.3,2.121],[-24.836,1.391]],"o":[[4.6,2.933],[-26.239,0.772],[3.242,-2.989],[21.835,-1.223]],"v":[[26.237,5.857],[1.819,15.499],[-26.236,7.936],[0.922,8.214]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":122,"s":[{"i":[[-0.661,-16.693],[14.49,-0.574],[0.661,16.693],[-14.49,0.574]],"o":[[0.661,16.693],[-14.49,0.574],[-0.662,-16.693],[14.49,-0.574]],"v":[[26.237,-1.04],[1.198,30.225],[-26.236,1.039],[-1.198,-30.225]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":128,"s":[{"i":[[-2.853,-1.819],[17.436,-0.513],[-2.3,2.121],[-24.836,1.391]],"o":[[4.6,2.933],[-26.239,0.772],[3.242,-2.989],[21.835,-1.223]],"v":[[26.237,5.857],[1.819,15.499],[-26.236,7.936],[0.922,8.214]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":140,"s":[{"i":[[-0.661,-16.693],[14.49,-0.574],[0.661,16.693],[-14.49,0.574]],"o":[[0.661,16.693],[-14.49,0.574],[-0.662,-16.693],[14.49,-0.574]],"v":[[26.237,-1.04],[1.198,30.225],[-26.236,1.039],[-1.198,-30.225]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":180,"s":[{"i":[[-0.661,-16.693],[14.49,-0.574],[0.661,16.693],[-14.49,0.574]],"o":[[0.661,16.693],[-14.49,0.574],[-0.662,-16.693],[14.49,-0.574]],"v":[[26.237,-1.04],[1.198,30.225],[-26.236,1.039],[-1.198,-30.225]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":188,"s":[{"i":[[-2.853,-1.819],[17.436,-0.513],[-2.3,2.121],[-24.836,1.391]],"o":[[4.6,2.933],[-26.239,0.772],[3.242,-2.989],[21.835,-1.223]],"v":[[26.237,5.857],[1.819,15.499],[-26.236,7.936],[0.922,8.214]],"c":true}]},{"t":198,"s":[{"i":[[-0.661,-16.693],[14.49,-0.574],[0.661,16.693],[-14.49,0.574]],"o":[[0.661,16.693],[-14.49,0.574],[-0.662,-16.693],[14.49,-0.574]],"v":[[26.237,-1.04],[1.198,30.225],[-26.236,1.039],[-1.198,-30.225]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[27.147,31.05]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":116,"s":[10]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":128,"s":[10]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":188,"s":[10]},{"t":200,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"eye_l 2","parent":17,"sr":1,"ks":{"o":{"a":1,"k":[{"t":110,"s":[100],"h":1},{"t":112,"s":[0],"h":1},{"t":116,"s":[0],"h":1},{"t":119,"s":[100],"h":1},{"t":122,"s":[100],"h":1},{"t":123,"s":[0],"h":1},{"t":132,"s":[100],"h":1},{"t":182,"s":[100],"h":1},{"t":184,"s":[0],"h":1},{"t":194,"s":[100],"h":1}]},"p":{"a":0,"k":[30.388,33.639,0]},"a":{"a":0,"k":[30.388,33.639,0]},"s":{"a":0,"k":[27.37,27.37,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[4.689,-16.192],[14.055,4.071],[-4.689,16.192],[-14.055,-4.07]],"o":[[-4.689,16.192],[-14.055,-4.07],[4.69,-16.192],[14.055,4.071]],"v":[[25.449,7.37],[-8.491,29.318],[-25.449,-7.37],[8.491,-29.319]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[15.77,-20.802]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[75.153,75.153]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":268,"st":60,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"eye_l","parent":13,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[0]},{"t":114,"s":[-12],"h":1},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-12]},{"t":158,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[1.347,31.614,0],"to":[0.338,0.724,0],"ti":[-0.338,-0.724,0]},{"t":80,"s":[3.374,35.957,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[3.374,35.957,0],"to":[2.97,0.579,0],"ti":[-2.97,-0.579,0]},{"t":114,"s":[21.192,39.433,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[21.192,39.433,0],"to":[-3.307,-1.303,0],"ti":[3.307,1.303,0]},{"t":158,"s":[1.347,31.614,0]}]},"a":{"a":0,"k":[30.368,34.202,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":68,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":76,"s":[100,100,100]},{"t":80,"s":[137,137,100],"h":1},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":100,"s":[137,137,100]},{"t":114,"s":[109.6,137,100],"h":1},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":140,"s":[109.6,137,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":158,"s":[60,60,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":210,"s":[60,60,100]},{"t":230,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[4.689,-16.192],[14.055,4.071],[-4.689,16.192],[-14.055,-4.07]],"o":[[-4.689,16.192],[-14.055,-4.07],[4.69,-16.192],[14.055,4.071]],"v":[[25.449,7.37],[-8.491,29.318],[-25.449,-7.37],[8.491,-29.319]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[-3.12,-2.95],[16.641,0.607],[-1.973,3.962],[-14.632,-0.137]],"o":[[4.034,3.815],[-14.623,-0.533],[2.838,-5.699],[16.326,0.153]],"v":[[26.195,4.34],[0.215,15.429],[-25.2,3.236],[0.282,8.812]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0},"t":122,"s":[{"i":[[4.689,-16.192],[14.055,4.071],[-4.689,16.192],[-14.055,-4.07]],"o":[[-4.689,16.192],[-14.055,-4.07],[4.69,-16.192],[14.055,4.071]],"v":[[25.449,7.37],[-8.491,29.318],[-25.449,-7.37],[8.491,-29.319]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":128,"s":[{"i":[[-3.12,-2.95],[16.641,0.607],[-1.973,3.962],[-14.632,-0.137]],"o":[[4.034,3.815],[-14.623,-0.533],[2.838,-5.699],[16.326,0.153]],"v":[[26.195,4.34],[0.215,15.429],[-25.2,3.236],[0.282,8.812]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":140,"s":[{"i":[[4.689,-16.192],[14.055,4.071],[-4.689,16.192],[-14.055,-4.07]],"o":[[-4.689,16.192],[-14.055,-4.07],[4.69,-16.192],[14.055,4.071]],"v":[[25.449,7.37],[-8.491,29.318],[-25.449,-7.37],[8.491,-29.319]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[{"i":[[5.093,-17.588],[15.267,4.421],[-5.094,17.588],[-15.267,-4.422]],"o":[[-5.093,17.588],[-15.267,-4.421],[5.094,-17.588],[15.267,4.422]],"v":[[25.045,5.127],[-11.822,28.967],[-30.242,-10.884],[6.625,-34.726]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":148,"s":[{"i":[[4.689,-16.192],[14.055,4.071],[-4.689,16.192],[-14.055,-4.07]],"o":[[-4.689,16.192],[-14.055,-4.07],[4.69,-16.192],[14.055,4.071]],"v":[[25.449,7.37],[-8.491,29.318],[-25.449,-7.37],[8.491,-29.319]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":182,"s":[{"i":[[4.689,-16.192],[14.055,4.071],[-4.689,16.192],[-14.055,-4.07]],"o":[[-4.689,16.192],[-14.055,-4.07],[4.69,-16.192],[14.055,4.071]],"v":[[25.449,7.37],[-8.491,29.318],[-25.449,-7.37],[8.491,-29.319]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":190,"s":[{"i":[[-3.12,-2.95],[16.641,0.607],[-1.973,3.962],[-14.632,-0.137]],"o":[[4.034,3.815],[-14.623,-0.533],[2.838,-5.699],[16.326,0.153]],"v":[[26.195,4.34],[0.215,15.429],[-25.2,3.236],[0.282,8.812]],"c":true}]},{"t":202,"s":[{"i":[[4.689,-16.192],[14.055,4.071],[-4.689,16.192],[-14.055,-4.07]],"o":[[-4.689,16.192],[-14.055,-4.07],[4.69,-16.192],[14.055,4.071]],"v":[[25.449,7.37],[-8.491,29.318],[-25.449,-7.37],[8.491,-29.319]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[30.388,33.639]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":116,"s":[10]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":128,"s":[10]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":182,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":190,"s":[10]},{"t":202,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"head_bl1","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[320.498,178.454,0]},"a":{"a":0,"k":[48.324,110.462,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-36.326],[19.366,-18.785]],"o":[[28.684,25.988],[0,29.13],[0,0]],"v":[[-23.323,-85.462],[23.323,12.88],[-7.594,85.462]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.987999949736,0.933000033509,0.128999986836,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[48.324,110.462]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[0]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[95]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"head_bl0","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[126.397,134.159,0]},"a":{"a":0,"k":[97.475,104.838,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-27.206,16.408],[-27.285,0]],"o":[[11.749,-27.609],[21.795,-13.143],[0,0]],"v":[[-67.477,44.82],[-7.128,-23.78],[67.476,-44.82]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[0]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[95]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"tr","p":{"a":0,"k":[102.473,69.82]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"wing_l_bl 2","parent":21,"sr":1,"ks":{"p":{"a":0,"k":[58.491,81.784,0]},"a":{"a":0,"k":[39.576,60.461,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-9.814,-27.276],[0,0]],"v":[[-10.663,38.916],[22.1,-45.125]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[0,0],[0.288,21.282]],"o":[[7.541,-12.171],[0,0]],"v":[[1.131,59.403],[18.308,5.123]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[0.288,21.282]],"o":[[7.541,-12.171],[0,0]],"v":[[1.131,59.403],[18.308,5.123]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-25.166,-21.41],[0,0]],"v":[[-34.572,58.153],[4.831,-32.951]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.89,"y":0},"t":166,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-35.696,-14.893],[0,0]],"v":[[-1.779,54.024],[4.831,-32.951]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-35.696,-14.893],[0,0]],"v":[[-1.779,54.024],[4.831,-32.951]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-9.814,-27.276],[0,0]],"v":[[-10.663,38.916],[22.1,-45.125]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[39.576,60.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[0]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[95]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":76,"op":106,"st":60,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"wing_l 2","parent":25,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":68,"s":[1.958]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[94.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[94.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[94.423]},{"i":{"x":[0.413],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[94.423]},{"i":{"x":[0.119],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":210,"s":[94.423]},{"t":230,"s":[1.958]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[-32.888,40.154,0],"to":[-2.5,1.667,0],"ti":[2.5,-1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":80,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":86,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":100,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":114,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.413,"y":0.413},"o":{"x":0.333,"y":0.333},"t":140,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[-47.888,50.154,0],"to":[2.5,-1.667,0],"ti":[-2.5,1.667,0]},{"t":230,"s":[-32.888,40.154,0]}]},"a":{"a":0,"k":[90.955,25,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[12.341,9.191],[-50.426,37.782]],"o":[[-13.53,28.324],[-12.073,-8.99],[0,0]],"v":[[32.978,13.596],[-18.413,47.618],[17.449,-56.809]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[0,0],[20.797,22.973],[44.174,49.309]],"o":[[13.233,49.298],[-22.304,-24.639],[0,0]],"v":[[60.258,-13.585],[-12.376,81.758],[-10.493,-22.552]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[20.797,22.973],[44.174,49.309]],"o":[[13.233,49.298],[-22.304,-24.639],[0,0]],"v":[[60.258,-13.585],[-12.376,81.758],[-10.493,-22.552]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[30.304,-6.475],[-81.365,55.161]],"o":[[-41.881,17.073],[-30.841,6.59],[0,0]],"v":[[60.718,-14.122],[-31.926,68.57],[4.261,-45.76]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.89,"y":0},"t":166,"s":[{"i":[[0,0],[30.304,-6.475],[-75.507,58.066]],"o":[[-56.305,20.682],[-30.841,6.59],[0,0]],"v":[[69.291,-20.91],[1.423,65.646],[8.247,-52.587]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.89,"y":0},"t":210,"s":[{"i":[[0,0],[30.304,-6.475],[-75.507,58.066]],"o":[[-56.305,20.682],[-30.841,6.59],[0,0]],"v":[[69.291,-20.91],[1.423,65.646],[8.247,-52.587]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.167,"y":0.167},"t":218,"s":[{"i":[[0,0],[27.689,-4.195],[-60.791,48.688]],"o":[[-50.078,21.795],[-28.109,4.322],[0,0]],"v":[[64.005,-15.887],[-1.465,63.022],[0.003,-49.405]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[12.341,9.191],[-50.426,37.782]],"o":[[-13.53,28.324],[-12.073,-8.99],[0,0]],"v":[[32.978,13.596],[-18.413,47.618],[17.449,-56.809]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980000035903,0.564000028722,0.088000002094,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834999952129,0.152999997606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[57.978,81.809]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":76,"op":106,"st":60,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"head","parent":23,"sr":1,"ks":{"p":{"a":0,"k":[-0.844,-185.896,0]},"a":{"a":0,"k":[198.872,158.783,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,35.849],[-96.027,0],[0,-85.843],[23.231,-23.356]],"o":[[-34.972,-19.697],[0,-85.843],[96.027,0],[0,36.217],[0,0]],"v":[[-127.667,133.783],[-173.872,36.566],[-0.001,-133.783],[173.872,36.566],[136.785,126.808]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980000035903,0.564000028722,0.088000002094,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834999952129,0.152999997606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[198.872,158.783]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":23,"ty":3,"nm":"Null 33","parent":37,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":86,"s":[-5.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[-5.339]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[-5.339]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[6.755]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":210,"s":[6.755]},{"t":230,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[207.875,145.921,0],"to":[0,1.667,0],"ti":[0,-1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":86,"s":[207.875,155.921,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":120,"s":[207.875,155.921,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":140,"s":[207.875,155.921,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":166,"s":[208.216,165.915,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":210,"s":[208.216,165.915,0],"to":[0,0,0],"ti":[0.057,3.332,0]},{"t":230,"s":[207.875,145.921,0]}]}},"ao":0,"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"wing_r_bl","parent":26,"sr":1,"ks":{"p":{"a":0,"k":[65.551,87.158,0]},"a":{"a":0,"k":[37.183,57.851,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[24.367,41.336]],"o":[[3.481,-7.832],[0,0]],"v":[[2.176,32.851],[-12.184,-32.851]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[31.964,38.799]],"o":[[9.766,-23.584],[0,0]],"v":[[31.148,51.044],[-12.184,-32.851]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":166,"s":[{"i":[[0,0],[31.964,38.799]],"o":[[13.856,-26.472],[0,0]],"v":[[8.778,53.065],[-12.184,-32.851]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.333,"y":0},"t":210,"s":[{"i":[[0,0],[31.964,38.799]],"o":[[13.856,-26.472],[0,0]],"v":[[8.778,53.065],[-12.184,-32.851]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[24.367,41.336]],"o":[[3.481,-7.832],[0,0]],"v":[[2.176,32.851],[-12.184,-32.851]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.987999949736,0.933000033509,0.128999986836,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[37.184,57.851]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[0]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[95]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":25,"ty":3,"nm":"null_wings","parent":37,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-1.958]},{"i":{"x":[0.413],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[7.192]},{"i":{"x":[0.119],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":210,"s":[7.192]},{"t":230,"s":[-1.958]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[208.446,133.084,0],"to":[0.057,1.666,0],"ti":[-0.057,-1.666,0]},{"i":{"x":0.413,"y":0.413},"o":{"x":0.167,"y":0.167},"t":166,"s":[208.788,143.078,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[208.788,143.078,0],"to":[-0.057,-1.666,0],"ti":[0.057,1.666,0]},{"t":230,"s":[208.446,133.084,0]}]},"a":{"a":0,"k":[60,60,0]}},"ao":0,"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"wing_r","parent":25,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[1.958]},{"i":{"x":[0.413],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":152,"s":[-103.977]},{"i":{"x":[0.119],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":210,"s":[-103.977]},{"t":230,"s":[1.958]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[159.865,40.232,0],"to":[0.829,0.066,0],"ti":[0,0,0]},{"i":{"x":0.119,"y":1},"o":{"x":0.333,"y":0},"t":210,"s":[164.842,40.63,0],"to":[0,0,0],"ti":[0.829,0.066,0]},{"t":230,"s":[159.865,40.232,0]}]},"a":{"a":0,"k":[25,25,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[-11.722,9.442],[27.198,35.429]],"o":[[13.53,28.324],[9.545,-7.688],[-5.936,-7.733]],"v":[[-32.977,12.523],[19.756,48.44],[4.887,-35.924]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[-24.232,0.409],[53.13,42.939]],"o":[[56.598,16.369],[31.859,-0.538],[-11.713,-9.466]],"v":[[-62.834,-6.376],[34.531,69.592],[4.139,-34.258]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":166,"s":[{"i":[[0,0],[-24.232,0.409],[34.216,43.899]],"o":[[50.996,17.007],[31.859,-0.538],[-8.583,-11.013]],"v":[[-50.947,-4.449],[8.329,73.408],[17.272,-30.07]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.333,"y":0},"t":210,"s":[{"i":[[0,0],[-24.232,0.409],[34.216,43.899]],"o":[[50.996,17.007],[31.859,-0.538],[-8.583,-11.013]],"v":[[-50.947,-4.449],[8.329,73.408],[17.272,-30.07]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[-11.722,9.442],[27.198,35.429]],"o":[[13.53,28.324],[9.545,-7.688],[-5.936,-7.733]],"v":[[-32.977,12.523],[19.756,48.44],[4.887,-35.924]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980000035903,0.564000028722,0.088000002094,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834999952129,0.152999997606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[57.977,82.882]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"wing_l_bl 3","parent":29,"sr":1,"ks":{"p":{"a":0,"k":[58.491,81.784,0]},"a":{"a":0,"k":[39.576,60.461,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-9.814,-27.276],[0,0]],"v":[[-10.663,38.916],[22.1,-45.125]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[0,0],[0.421,13.794]],"o":[[7.541,-12.171],[0,0]],"v":[[20.954,56.899],[38.506,20.467]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[0.421,13.794]],"o":[[7.541,-12.171],[0,0]],"v":[[20.954,56.899],[38.506,20.467]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.89,"y":0},"t":160,"s":[{"i":[[0,0],[-10.239,8.215]],"o":[[8.338,-10.66],[0,0]],"v":[[-0.226,15.956],[34.249,-17.178]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.89,"y":0},"t":166,"s":[{"i":[[0,0],[-10.239,8.215]],"o":[[-2.145,-9.119],[0,0]],"v":[[14.778,19.114],[34.249,-17.178]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[{"i":[[0,0],[-10.239,8.215]],"o":[[-2.145,-9.119],[0,0]],"v":[[14.778,19.114],[34.249,-17.178]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-9.814,-27.276],[0,0]],"v":[[-10.663,38.916],[22.1,-45.125]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[39.576,60.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[0]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[95]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":106,"op":240,"st":60,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"wing_l_bl","parent":30,"sr":1,"ks":{"p":{"a":0,"k":[58.491,81.784,0]},"a":{"a":0,"k":[39.576,60.461,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-9.814,-27.276],[0,0]],"v":[[-10.663,38.916],[22.1,-45.125]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[0,0],[-23.011,17.647]],"o":[[10.155,7.72],[0,0]],"v":[[-37.288,9.306],[22.514,-5.109]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[0,0],[0.288,21.282]],"o":[[7.541,-12.171],[0,0]],"v":[[1.131,59.403],[18.308,5.123]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[0.288,21.282]],"o":[[7.541,-12.171],[0,0]],"v":[[1.131,59.403],[18.308,5.123]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-25.166,-21.41],[0,0]],"v":[[-34.572,58.153],[4.831,-32.951]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.89,"y":0},"t":166,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-35.696,-14.893],[0,0]],"v":[[-1.779,54.024],[4.831,-32.951]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-35.696,-14.893],[0,0]],"v":[[-1.779,54.024],[4.831,-32.951]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[-27.412,26.106]],"o":[[-9.814,-27.276],[0,0]],"v":[[-10.663,38.916],[22.1,-45.125]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[39.576,60.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[0]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[95]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":76,"st":60,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"wing_l 3","parent":25,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":68,"s":[1.958]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[94.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[94.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[94.423]},{"i":{"x":[0.413],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[94.423]},{"i":{"x":[0.119],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":210,"s":[94.423]},{"t":230,"s":[1.958]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[-32.888,40.154,0],"to":[-2.5,1.667,0],"ti":[2.5,-1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":80,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":86,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":100,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":114,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.413,"y":0.413},"o":{"x":0.333,"y":0.333},"t":140,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[-47.888,50.154,0],"to":[2.5,-1.667,0],"ti":[-2.5,1.667,0]},{"t":230,"s":[-32.888,40.154,0]}]},"a":{"a":0,"k":[90.955,25,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[12.341,9.191],[-50.426,37.782]],"o":[[-13.53,28.324],[-12.073,-8.99],[0,0]],"v":[[32.978,13.596],[-18.413,47.618],[17.449,-56.809]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[0,0],[20.797,22.973],[44.174,49.309]],"o":[[13.233,49.298],[-22.304,-24.639],[0,0]],"v":[[60.258,-13.585],[-12.376,81.758],[-10.493,-22.552]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[20.797,22.973],[44.174,49.309]],"o":[[13.233,49.298],[-22.304,-24.639],[0,0]],"v":[[60.258,-13.585],[-12.376,81.758],[-10.493,-22.552]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[30.304,-6.475],[-81.365,55.161]],"o":[[-41.881,17.073],[-30.841,6.59],[0,0]],"v":[[60.718,-14.122],[-31.926,68.57],[4.261,-45.76]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.89,"y":0},"t":166,"s":[{"i":[[0,0],[30.304,-6.475],[-75.507,58.066]],"o":[[-56.305,20.682],[-30.841,6.59],[0,0]],"v":[[69.291,-20.91],[1.423,65.646],[8.247,-52.587]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.89,"y":0},"t":210,"s":[{"i":[[0,0],[30.304,-6.475],[-75.507,58.066]],"o":[[-56.305,20.682],[-30.841,6.59],[0,0]],"v":[[69.291,-20.91],[1.423,65.646],[8.247,-52.587]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.167,"y":0.167},"t":218,"s":[{"i":[[0,0],[27.689,-4.195],[-60.791,48.688]],"o":[[-50.078,21.795],[-28.109,4.322],[0,0]],"v":[[64.005,-15.887],[-1.465,63.022],[0.003,-49.405]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[12.341,9.191],[-50.426,37.782]],"o":[[-13.53,28.324],[-12.073,-8.99],[0,0]],"v":[[32.978,13.596],[-18.413,47.618],[17.449,-56.809]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980000035903,0.564000028722,0.088000002094,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834999952129,0.152999997606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[57.978,81.809]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":106,"op":240,"st":60,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"wing_l","parent":25,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":68,"s":[1.958]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[94.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[94.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[94.423]},{"i":{"x":[0.413],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[94.423]},{"i":{"x":[0.119],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":210,"s":[94.423]},{"t":230,"s":[1.958]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[-32.888,40.154,0],"to":[-2.5,1.667,0],"ti":[2.5,-1.667,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":80,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":86,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":100,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":114,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.413,"y":0.413},"o":{"x":0.333,"y":0.333},"t":140,"s":[-47.888,50.154,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[-47.888,50.154,0],"to":[2.5,-1.667,0],"ti":[-2.5,1.667,0]},{"t":230,"s":[-32.888,40.154,0]}]},"a":{"a":0,"k":[90.955,25,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[12.341,9.191],[-50.426,37.782]],"o":[[-13.53,28.324],[-12.073,-8.99],[0,0]],"v":[[32.978,13.596],[-18.413,47.618],[17.449,-56.809]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[0,0],[14.592,41.565],[-21.293,32.809]],"o":[[-21.941,28.95],[-9.471,-26.978],[0,0]],"v":[[60.718,-14.122],[-54.96,10.674],[26.303,-65.518]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":114,"s":[{"i":[[0,0],[20.797,22.973],[44.174,49.309]],"o":[[13.233,49.298],[-22.304,-24.639],[0,0]],"v":[[60.258,-13.585],[-12.376,81.758],[-10.493,-22.552]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[20.797,22.973],[44.174,49.309]],"o":[[13.233,49.298],[-22.304,-24.639],[0,0]],"v":[[60.258,-13.585],[-12.376,81.758],[-10.493,-22.552]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[30.304,-6.475],[-81.365,55.161]],"o":[[-41.881,17.073],[-30.841,6.59],[0,0]],"v":[[60.718,-14.122],[-31.926,68.57],[4.261,-45.76]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.89,"y":0},"t":166,"s":[{"i":[[0,0],[30.304,-6.475],[-75.507,58.066]],"o":[[-56.305,20.682],[-30.841,6.59],[0,0]],"v":[[69.291,-20.91],[1.423,65.646],[8.247,-52.587]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.89,"y":0},"t":210,"s":[{"i":[[0,0],[30.304,-6.475],[-75.507,58.066]],"o":[[-56.305,20.682],[-30.841,6.59],[0,0]],"v":[[69.291,-20.91],[1.423,65.646],[8.247,-52.587]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.167,"y":0.167},"t":218,"s":[{"i":[[0,0],[27.689,-4.195],[-60.791,48.688]],"o":[[-50.078,21.795],[-28.109,4.322],[0,0]],"v":[[64.005,-15.887],[-1.465,63.022],[0.003,-49.405]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[12.341,9.191],[-50.426,37.782]],"o":[[-13.53,28.324],[-12.073,-8.99],[0,0]],"v":[[32.978,13.596],[-18.413,47.618],[17.449,-56.809]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980000035903,0.564000028722,0.088000002094,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834999952129,0.152999997606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[57.978,81.809]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":76,"st":60,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"lupa7","parent":34,"sr":1,"ks":{"p":{"a":0,"k":[0,-25.25,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[6.617,0],[0,-6.617],[-6.617,0],[0,6.617]],"o":[[-6.617,0],[0,6.617],[6.617,0],[0,-6.617]],"v":[[0,-9],[-12,0],[0,9],[12,0]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.003921568859,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":222,"op":240,"st":60,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"lupa6","parent":34,"sr":1,"ks":{"r":{"a":0,"k":-360}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.537,0],[0,-2.268],[-7.11,0],[0,7.111]],"o":[[-2.537,0],[0,7.111],[7.11,0],[0,-2.268]],"v":[[0,-26],[-12.894,13.105],[0,26],[12.894,13.105]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.003921568859,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":222,"op":240,"st":60,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"lupa2","parent":34,"sr":1,"ks":{"p":{"a":0,"k":[0,-25.25,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[6.617,0],[0,-6.617],[-6.617,0],[0,6.617]],"o":[[-6.617,0],[0,6.617],[6.617,0],[0,-6.617]],"v":[[0,-9],[-12,0],[0,9],[12,0]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.003921568859,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":72,"st":60,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"lupa3","parent":38,"sr":1,"ks":{"o":{"a":1,"k":[{"t":70,"s":[100],"h":1},{"t":72,"s":[0],"h":1}]},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":68,"s":[-272.549]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[-381.347]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[-381.347]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":114,"s":[-398.276]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-398.276]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":160,"s":[-466.421]},{"i":{"x":[0.413],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":166,"s":[-454.411]},{"i":{"x":[0.119],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":210,"s":[-454.411]},{"t":230,"s":[-272.549]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[60,60,0],"to":[45.801,-17.236,0],"ti":[0,0,0]},{"t":80,"s":[38.1,-4.168,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[38.1,-4.168,0],"to":[19.129,25.333,0],"ti":[6.412,-7.381,0]},{"t":114,"s":[51.532,75.327,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[51.532,75.327,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[30.69,56.206,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.413,"y":0.413},"o":{"x":0.333,"y":0.333},"t":166,"s":[61.4,55.087,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[61.4,55.087,0],"to":[0,0,0],"ti":[0,0,0]},{"t":230,"s":[60,60,0]}]},"s":{"a":0,"k":[133,133,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.537,0],[0,-2.268],[-7.11,0],[0,7.111]],"o":[[-2.537,0],[0,7.111],[7.11,0],[0,-2.268]],"v":[[0,-26],[-12.894,13.105],[0,26],[12.894,13.105]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.003921568859,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":244,"st":60,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"body_bl","parent":37,"sr":1,"ks":{"p":{"a":0,"k":[216.973,130.423,0]},"a":{"a":0,"k":[188.59,59.694,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":68,"s":[{"i":[[0,0],[-2.325,-17.569]],"o":[[-14.639,20.82],[0,0]],"v":[[12.672,-9.853],[-2.23,40.631]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.167,"y":0},"t":80,"s":[{"i":[[0,0],[-18.618,-14.885]],"o":[[-2.767,11.612],[0,0]],"v":[[0.832,53.589],[17.809,99.981]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[{"i":[[0,0],[-18.618,-14.885]],"o":[[-2.767,11.612],[0,0]],"v":[[0.832,53.589],[17.809,99.981]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[-2.325,-17.569]],"o":[[-14.639,20.82],[0,0]],"v":[[12.672,-9.853],[-2.23,40.631]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[33.014,46.386]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[6.613,-16.453]],"o":[[21.341,44.399],[0,0]],"v":[[-17.046,-28.517],[-10.527,55.629]],"c":false}]},{"i":{"x":0.413,"y":1},"o":{"x":0.167,"y":0},"t":164,"s":[{"i":[[0,0],[55.662,-15.805]],"o":[[2.306,27.196],[0,0]],"v":[[-8.103,28.21],[-60.165,96.348]],"c":false}]},{"i":{"x":0.119,"y":1},"o":{"x":0.89,"y":0},"t":210,"s":[{"i":[[0,0],[55.662,-15.805]],"o":[[2.306,27.196],[0,0]],"v":[[-8.103,28.21],[-60.165,96.348]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[6.613,-16.453]],"o":[[21.341,44.399],[0,0]],"v":[[-17.046,-28.517],[-10.527,55.629]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.987999949736,0.933000033509,0.128999986836,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[342.558,59.694]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":48,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[0]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[95]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":36,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[265.814,470.678,0]},"a":{"a":0,"k":[60,60,0]}},"ao":0,"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"body","parent":36,"sr":1,"ks":{"r":{"a":0,"k":1.958},"p":{"a":0,"k":[60,60,0]},"a":{"a":0,"k":[212.688,255.599,0]},"s":{"a":1,"k":[{"i":{"x":[0.595,0.595,0.595],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":68,"s":[100,100,100]},{"i":{"x":[0.661,0.661,0.661],"y":[0.954,0.942,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":76,"s":[102,95.355,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.329,0.329,0.329],"y":[-0.09,0.26,0]},"t":88,"s":[100,100,100]},{"i":{"x":[0.595,0.595,0.595],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":100,"s":[100,100,100]},{"i":{"x":[0.661,0.661,0.661],"y":[0.954,0.942,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":108,"s":[102,95.355,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.338,0.338,0.338],"y":[-0.154,0.445,0]},"t":120,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":140,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":148,"s":[102,95.355,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":160,"s":[98,103,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":168,"s":[102,95.355,100]},{"t":174,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[45.447,50.71],[1.09,20.241],[-97.035,0],[6.248,-112.406],[47.513,-16.732]],"o":[[-13.79,-15.386],[-4.738,-88.003],[104.214,0],[-1.823,32.8],[-50.195,17.677]],"v":[[-148.484,73.286],[-169.43,22.956],[0.832,-111.8],[169.924,20.909],[110.907,88.614]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":164,"s":[{"i":[[45.447,50.71],[-2.213,20.149],[-97.035,0],[0,-103.78],[47.513,-16.732]],"o":[[-13.79,-15.386],[10.63,-96.813],[104.214,0],[0,32.851],[-50.195,17.677]],"v":[[-148.484,73.286],[-164.635,19.916],[-0.019,-123.996],[166.848,17.107],[110.908,88.614]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":210,"s":[{"i":[[45.447,50.71],[-2.213,20.149],[-97.035,0],[0,-103.78],[47.513,-16.732]],"o":[[-13.79,-15.386],[10.63,-96.813],[104.214,0],[0,32.851],[-50.195,17.677]],"v":[[-148.484,73.286],[-164.635,19.916],[-0.019,-123.996],[166.848,17.107],[110.908,88.614]],"c":true}]},{"t":230,"s":[{"i":[[45.447,50.71],[1.09,20.241],[-97.035,0],[6.248,-112.406],[47.513,-16.732]],"o":[[-13.79,-15.386],[-4.738,-88.003],[104.214,0],[-1.823,32.8],[-50.195,17.677]],"v":[[-148.484,73.286],[-169.43,22.956],[0.832,-111.8],[169.924,20.909],[110.907,88.614]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980000035903,0.564000028722,0.088000002094,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834999952129,0.152999997606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[211.848,148.996]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":38,"ty":3,"nm":"NULL CONTROL","parent":30,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":-1.958},"p":{"a":0,"k":[59.974,130.074,0]},"a":{"a":0,"k":[60,60,0]},"s":{"a":1,"k":[{"i":{"x":[0.595,0.595,0.595],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":68,"s":[100,100,100]},{"i":{"x":[0.661,0.661,0.661],"y":[0.954,0.942,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":76,"s":[102,95.355,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.329,0.329,0.329],"y":[-0.09,0.26,0]},"t":88,"s":[100,100,100]},{"i":{"x":[0.595,0.595,0.595],"y":[1,1,1]},"o":{"x":[0.254,0.254,0.254],"y":[0,0,0]},"t":100,"s":[100,100,100]},{"i":{"x":[0.661,0.661,0.661],"y":[0.954,0.942,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":108,"s":[102,95.355,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.338,0.338,0.338],"y":[-0.154,0.445,0]},"t":120,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":140,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":148,"s":[102,95.355,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":160,"s":[98,103,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":168,"s":[102,95.355,100]},{"t":174,"s":[100,100,100]}]}},"ao":0,"ip":60,"op":242,"st":60,"bm":0},{"ddd":0,"ind":39,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[256,256,0]},"a":{"a":0,"k":[60,60,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"ip":60,"op":240,"st":60,"bm":0},{"ddd":0,"ind":40,"ty":0,"nm":"water1 Comp 1","refId":"comp_1","sr":1,"ks":{"p":{"a":0,"k":[268,265,0]},"a":{"a":0,"k":[256,256,0]}},"ao":0,"w":512,"h":512,"ip":146,"op":266,"st":146,"bm":0},{"ddd":0,"ind":41,"ty":0,"nm":"water1 Comp 1","refId":"comp_1","sr":1,"ks":{"p":{"a":0,"k":[268,265,0]},"a":{"a":0,"k":[256,256,0]}},"ao":0,"w":512,"h":512,"ip":70,"op":190,"st":70,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"water1","sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[257.634,431.728,0],"to":[0,0.5,0],"ti":[0,-0.5,0]},{"t":70,"s":[257.634,434.728,0]}]},"a":{"a":0,"k":[176.495,64.82,0]},"s":{"a":1,"k":[{"i":{"x":[0.649,0.649,0.649],"y":[0.878,0.878,-3.532]},"o":{"x":[0.312,0.312,0.312],"y":[0,0,0]},"t":0,"s":[66,66,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,-6.857]},"o":{"x":[0.38,0.38,0.38],"y":[0.149,0.149,7.017]},"t":28.822,"s":[103.083,103.083,100]},{"t":70,"s":[150.226,150.226,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.992],[83.668,0],[0,21.992],[-83.668,0]],"o":[[0,21.992],[-83.668,0],[0,-21.992],[83.668,0]],"v":[[151.495,0],[0.001,39.82],[-151.494,0],[0.001,-39.82]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.014981626997,0.706667133406,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.649],"y":[1.119]},"o":{"x":[0.302],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.407],"y":[0.645]},"t":12.352,"s":[8.324]},{"t":70,"s":[0]}]},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[176.495,64.82]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":110,"st":-5,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"_016_SRCH","refId":"comp_0","sr":1,"ks":{"p":{"a":0,"k":[256,256,0]},"a":{"a":0,"k":[256,256,0]}},"ao":0,"w":512,"h":512,"ip":62,"op":242,"st":2,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"_016_SRCH","refId":"comp_0","sr":1,"ks":{"p":{"a":0,"k":[256,256,0]},"a":{"a":0,"k":[256,256,0]}},"ao":0,"w":512,"h":512,"ip":-118,"op":62,"st":-178,"bm":0}]} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/Application.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/Application.kt new file mode 100644 index 0000000..b89cb26 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/Application.kt @@ -0,0 +1,15 @@ +package com.aiwazian.messenger + +import android.app.Application +import com.google.firebase.FirebaseApp +import dagger.hilt.android.HiltAndroidApp +import java.util.Locale + +@HiltAndroidApp +class Application : Application() { + override fun onCreate() { + super.onCreate() + Locale.setDefault(Locale.forLanguageTag("ru")) + FirebaseApp.initializeApp(this) + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/LoginActivity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/LoginActivity.kt new file mode 100644 index 0000000..7f888b4 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/LoginActivity.kt @@ -0,0 +1,25 @@ +package com.aiwazian.messenger + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import com.aiwazian.messenger.ui.login.AuthScreen +import com.aiwazian.messenger.ui.theme.ApplicationTheme +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class LoginActivity : ComponentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + enableEdgeToEdge() + + setContent { + ApplicationTheme(dynamicColor = true) { + AuthScreen() + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/MainActivity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/MainActivity.kt new file mode 100644 index 0000000..5cbbce1 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/MainActivity.kt @@ -0,0 +1,190 @@ +package com.aiwazian.messenger + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.database.repository.UserRepository +import com.aiwazian.messenger.services.AppLockService +import com.aiwazian.messenger.services.DataStoreManager +import com.aiwazian.messenger.services.NotificationService +import com.aiwazian.messenger.services.ThemeService +import com.aiwazian.messenger.services.TokenManager +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.ui.ChatScreen +import com.aiwazian.messenger.ui.LockScreen +import com.aiwazian.messenger.ui.MainScreen +import com.aiwazian.messenger.ui.element.NavigationController +import com.aiwazian.messenger.ui.theme.ApplicationTheme +import com.aiwazian.messenger.utils.ChatState +import com.aiwazian.messenger.utils.WebSocketManager +import com.aiwazian.messenger.viewModels.NavigationViewModel +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import javax.inject.Inject + +@AndroidEntryPoint +class MainActivity : ComponentActivity() { + + @Inject + lateinit var appLockService: AppLockService + + @Inject + lateinit var themeService: ThemeService + + @Inject + lateinit var userRepository: UserRepository + + lateinit var navViewModel: NavigationViewModel + + override fun attachBaseContext(newBase: Context) { + DataStoreManager.initialize(newBase) + runBlocking { TokenManager.init() } + super.attachBaseContext(newBase) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + if (TokenManager.getToken().isBlank()) { + startActivity( + Intent( + this, + LoginActivity::class.java + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + ) + finish() + return + } + + enableEdgeToEdge() + + TokenManager.setUnauthorizedCallback { + val intent = Intent( + this, + LoginActivity::class.java + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + this@MainActivity.startActivity(intent) + this@MainActivity.finish() + } + + setContent { + val isLockApp by appLockService.isLockApp.collectAsState() + val selectedTheme by themeService.currentTheme.collectAsState() + val selectedColor by themeService.primaryColor.collectAsState() + val isDynamicColorEnable by themeService.dynamicColor.collectAsState() + + LaunchedEffect(Unit) { + try { + WebSocketManager.onConnect = { + lifecycleScope.launch { + UserManager.loadUserData(userRepository) + } + } + + WebSocketManager.onClose = { code -> + if (code == 1008) { + TokenManager.getUnauthorizedCallback()?.invoke() + } else { + lifecycleScope.launch { + delay(1000) + WebSocketManager.connect() + } + } + } + + WebSocketManager.onFailure = { + lifecycleScope.launch { + delay(1000) + WebSocketManager.connect() + } + } + + WebSocketManager.connect() + + UserManager.loadUserData(userRepository) + } catch (e: Exception) { + Log.e( + "MainActivity", + "Ошибка подключения вебсокета", + e + ) + } + + try { + val notificationService = NotificationService() + val token = notificationService.getFirebaseToken() + notificationService.sendTokenToServer(token) + } catch (e: Exception) { + Log.e( + "MainActivity", + "Ошибка при отправке токена для уведомлений на сервер", + e + ) + } + } + + ApplicationTheme( + theme = selectedTheme, + dynamicColor = isDynamicColorEnable, + primaryColor = selectedColor.color + ) { + navViewModel = viewModel() + + NavigationController { + MainScreen() + } + + AnimatedVisibility( + visible = isLockApp, + enter = fadeIn(tween(100)), + exit = fadeOut(tween(100)) + ) { + LockScreen() + } + + LaunchedEffect(Unit) { + val chatId = intent.getStringExtra("chatId")?.toLongOrNull() + + if (chatId != null && !ChatState.isChatOpen(chatId)) { + navViewModel.addScreenInStack { + ChatScreen(chatId) + } + } + } + } + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + + val chatId = intent.getStringExtra("chatId")?.toLongOrNull() + + if (chatId != null) { + if (!ChatState.isChatOpen(chatId)) { + navViewModel.addScreenInStack { + ChatScreen(chatId) + } + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/api/AuthInterceptor.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/api/AuthInterceptor.kt new file mode 100644 index 0000000..65c080d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/api/AuthInterceptor.kt @@ -0,0 +1,42 @@ +package com.aiwazian.messenger.api + +import com.aiwazian.messenger.services.TokenManager +import okhttp3.Interceptor +import okhttp3.Response + +class AuthInterceptor( + private val getToken: () -> String?, + private val shouldSkipAuth: (String) -> Boolean, + private val onUnauthorized: (() -> Unit)? +) : Interceptor { + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val path = request.url.encodedPath + + if (shouldSkipAuth(path)) { + return chain.proceed(request) + } + + val token = getToken() + val authRequest = if (!token.isNullOrEmpty()) { + request.newBuilder() + .addHeader( + "Authorization", + "Bearer $token" + ) + .build() + } else { + request + } + + val response = chain.proceed(authRequest) + + if (response.code == 401 && TokenManager.isAuthorized()) { + TokenManager.setAuthorized(false) + onUnauthorized?.invoke() + } + + return response + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/api/ProgressInterceptor.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/api/ProgressInterceptor.kt new file mode 100644 index 0000000..59dcef3 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/api/ProgressInterceptor.kt @@ -0,0 +1,25 @@ +package com.aiwazian.messenger.api + +import com.aiwazian.messenger.utils.ProgressResponseBody +import okhttp3.Interceptor +import okhttp3.Response + +class ProgressInterceptor( + private val onProgress: (url: String, progress: Int) -> Unit +) : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val response = chain.proceed(request) + val url = request.url.toString() + val body = response.body + return response.newBuilder() + .body( + ProgressResponseBody( + url, + body, + onProgress + ) + ) + .build() + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/api/RetrofitInstance.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/api/RetrofitInstance.kt new file mode 100644 index 0000000..b61ec15 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/api/RetrofitInstance.kt @@ -0,0 +1,85 @@ +package com.aiwazian.messenger.api + +import com.aiwazian.messenger.interfaces.ApiService +import com.aiwazian.messenger.services.TokenManager +import com.aiwazian.messenger.utils.Constants +import com.aiwazian.messenger.utils.DownloadManager +import com.aiwazian.messenger.utils.Route +import com.google.gson.GsonBuilder +import com.google.gson.JsonDeserializationContext +import com.google.gson.JsonDeserializer +import com.google.gson.JsonElement +import com.google.gson.JsonPrimitive +import com.google.gson.JsonSerializationContext +import com.google.gson.JsonSerializer +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.lang.reflect.Type +import java.util.concurrent.TimeUnit + +private object LongTypeAdapter : JsonDeserializer, JsonSerializer { + override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Long { + return when { + json.isJsonPrimitive && json.asJsonPrimitive.isNumber -> json.asLong + json.isJsonPrimitive -> json.asString.toLongOrNull() ?: 0L + else -> 0L + } + } + override fun serialize(src: Long, typeOfSrc: Type, context: JsonSerializationContext): JsonElement { + return JsonPrimitive(src) + } +} + +object RetrofitInstance { + + private val gson = GsonBuilder() + .registerTypeAdapter(Long::class.java, LongTypeAdapter) + .registerTypeAdapter(Long::class.javaObjectType, LongTypeAdapter) + .create() + + private val BASE_URL = Constants.SERVER_URL + + private val skipAuthPaths = listOf( + Route.LOGIN, + Route.REGISTER, + Route.FIND_USER_BY_LOGIN + ) + + private val okHttpClient = OkHttpClient.Builder().connectTimeout( + 1, + TimeUnit.MINUTES + ).readTimeout( + 1, + TimeUnit.MINUTES + ).writeTimeout( + 1, + TimeUnit.MINUTES + ).addInterceptor( + AuthInterceptor( + getToken = { + TokenManager.getToken() + }, + shouldSkipAuth = { path -> + skipAuthPaths.contains(path) + }, + onUnauthorized = { + TokenManager.getUnauthorizedCallback()?.invoke() + }) + ).addNetworkInterceptor( + ProgressInterceptor { url, progress -> + DownloadManager.updateProgress( + url, + progress + ) + }).build() + + val api: ApiService by lazy { + Retrofit.Builder() + .baseUrl(BASE_URL) + .client(okHttpClient) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build() + .create(ApiService::class.java) + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ApiResponse.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ApiResponse.kt new file mode 100644 index 0000000..8d78312 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ApiResponse.kt @@ -0,0 +1,14 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep + +@Keep +data class ApiResponse( + @Keep val ok: Boolean, + @Keep val message: String +) + +@Keep +data class UsernameAvailability( + @Keep val available: Boolean = false +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Attachment.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Attachment.kt new file mode 100644 index 0000000..dd33420 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Attachment.kt @@ -0,0 +1,34 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import kotlinx.serialization.Serializable +import com.google.gson.annotations.SerializedName + +@Keep +@Serializable +data class Attachment( + @Keep val id: String, + @Keep val messageId: Int = 0, + @Keep val chatId: Long = 0, + @Keep val name: String, + @Keep val url: String = "", + @Keep val size: Long, + @Keep val mimeType: String? = null +) + +@Keep +data class FileDownloadUrlResponse( + val downloadUrl: String, + val name: String, + val size: String, + val mimeType: String +) + +@Keep +data class FileUploadInitRequest(val name: String, val size: Long, val mimeType: String) + +@Keep +data class FileUploadInitResponse(val signedUrl: String, val fileId: String) + +@Keep +data class FileUploadConfirmRequest(val fileId: String, val text: String? = null) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/AuthRequest.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/AuthRequest.kt new file mode 100644 index 0000000..b069cff --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/AuthRequest.kt @@ -0,0 +1,12 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep + +@Keep +data class AuthRequest( + @Keep val login: String, + @Keep val password: String, + @Keep val deviceModel: String, + @Keep val osVersion: String, + @Keep val osName: String +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/AuthResponse.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/AuthResponse.kt new file mode 100644 index 0000000..6d9c3cb --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/AuthResponse.kt @@ -0,0 +1,9 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep + +@Keep +data class AuthResponse( + @Keep val token: String, + @Keep val userId: String +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChangeCloudPasswordRequest.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChangeCloudPasswordRequest.kt new file mode 100644 index 0000000..d240ab7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChangeCloudPasswordRequest.kt @@ -0,0 +1,5 @@ +package com.aiwazian.messenger.data + +data class ChangeCloudPasswordRequest( + val password: String +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChannelInfo.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChannelInfo.kt new file mode 100644 index 0000000..0e3e476 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChannelInfo.kt @@ -0,0 +1,30 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import com.aiwazian.messenger.enums.ChannelType +import com.aiwazian.messenger.interfaces.Profile +import com.google.gson.annotations.SerializedName + +@Keep +data class ChannelInfo( + @Keep override val id: Long = 0, + @Keep val ownerId: Long = 0, + @Keep val name: String = "", + @Keep val bio: String = "", + @Keep val subscribers: Int = 0, + @Keep val removedUser: Int = 0, + @Keep var channelType: Int = ChannelType.PRIVATE.ordinal, + @Keep var publicLink: String? = null, + @Keep val isSubscribed: Boolean = false +) : Profile + +@Keep +data class CreateChannelRequest( + @SerializedName("name") val name: String, + @SerializedName("bio") val bio: String? = null, + @SerializedName("channelType") val channelType: String, + @SerializedName("username") val username: String? = null +) + +@Keep +data class CreatedEntityResponse(@SerializedName("id") val id: Long) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChatInfo.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChatInfo.kt new file mode 100644 index 0000000..465187e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ChatInfo.kt @@ -0,0 +1,16 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import com.google.gson.annotations.SerializedName +import com.aiwazian.messenger.enums.ChatType +import kotlinx.serialization.Serializable +import kotlinx.serialization.Serializer + +@Keep +@Serializable +data class ChatInfo( + @Keep var id: Long = 0, + @Keep @SerializedName("name") var chatName: String = "", + @Keep var isPinned: Boolean = false, + @Keep var lastMessage: Message? = null +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/CustomColors.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/CustomColors.kt new file mode 100644 index 0000000..cfa7029 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/CustomColors.kt @@ -0,0 +1,16 @@ +package com.aiwazian.messenger.data + +import androidx.compose.ui.graphics.Color + +data class CustomColors( + val secondary: Color, + val background: Color, + var primary: Color, + val text: Color, + val textHint: Color, + val topAppBarBackground: Color, + val sendMessageTimeBackground: Color, + val danger: Color, + val dangerBackground: Color, + val horizontalDivider: Color +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DeleteChatPayload.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DeleteChatPayload.kt new file mode 100644 index 0000000..8e4d704 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DeleteChatPayload.kt @@ -0,0 +1,8 @@ +package com.aiwazian.messenger.data + +import kotlinx.serialization.Serializable + +@Serializable +data class DeleteChatPayload ( + val chatId: Long +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DeleteMessagePayload.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DeleteMessagePayload.kt new file mode 100644 index 0000000..7a02fd8 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DeleteMessagePayload.kt @@ -0,0 +1,9 @@ +package com.aiwazian.messenger.data + +import kotlinx.serialization.Serializable + +@Serializable +data class DeleteMessagePayload( + val chatId: Long, + val messageId: Int +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DownloadItem.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DownloadItem.kt new file mode 100644 index 0000000..abff0ed --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DownloadItem.kt @@ -0,0 +1,15 @@ +package com.aiwazian.messenger.data + +import com.aiwazian.messenger.enums.DownloadStatus +import okhttp3.ResponseBody +import retrofit2.Call + +data class DownloadItem( + val fileId: String = "", + val url: String, + val fileName: String, + var progress: Int = 0, + var status: DownloadStatus = DownloadStatus.PENDING, + var call: Call? = null, + var onComplete: (() -> Unit)? = null +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DropdownMenuAction.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DropdownMenuAction.kt new file mode 100644 index 0000000..da6536b --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/DropdownMenuAction.kt @@ -0,0 +1,9 @@ +package com.aiwazian.messenger.data + +import androidx.compose.ui.graphics.vector.ImageVector + +data class DropdownMenuAction( + val icon: ImageVector, + val text: String, + val onClick: () -> Unit +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/FolderInfo.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/FolderInfo.kt new file mode 100644 index 0000000..5df340a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/FolderInfo.kt @@ -0,0 +1,10 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep + +@Keep +data class FolderInfo( + @Keep var id: Int = 0, + @Keep var name: String = "", + @Keep var chats: List = emptyList() +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/GroupInfo.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/GroupInfo.kt new file mode 100644 index 0000000..f159fb7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/GroupInfo.kt @@ -0,0 +1,20 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import com.aiwazian.messenger.interfaces.Profile +import com.google.gson.annotations.SerializedName + +@Keep +data class GroupInfo( + @Keep override val id: Long = 0, + @Keep val ownerId: Long = 0, + @Keep val name: String = "", + @Keep val bio: String = "", + @Keep val members: Int = 0 +) : Profile + +@Keep +data class CreateGroupRequest( + @SerializedName("name") val name: String, + @SerializedName("bio") val bio: String? = null +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/HistoryClearPayload.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/HistoryClearPayload.kt new file mode 100644 index 0000000..bb27242 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/HistoryClearPayload.kt @@ -0,0 +1,8 @@ +package com.aiwazian.messenger.data + +import kotlinx.serialization.Serializable + +@Serializable +data class HistoryClearPayload( + val chatId: String +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Kanban.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Kanban.kt new file mode 100644 index 0000000..f905ecc --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Kanban.kt @@ -0,0 +1,60 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import com.google.gson.annotations.SerializedName +import kotlinx.serialization.Serializable + +@Keep +@Serializable +data class KanbanBoard( + val id: Int = 0, + val title: String = "", + val columns: List = emptyList(), + val updatedAt: Long = 0 +) + +@Keep +@Serializable +data class KanbanColumn( + val id: Int = 0, + val boardId: Int = 0, + val title: String = "", + val position: Int = 0, + val tasks: List = emptyList() +) + +@Keep +@Serializable +data class KanbanTask( + val id: Int = 0, + val columnId: Int = 0, + val title: String = "", + val description: String? = null, + val position: Int = 0, + val column: KanbanTaskColumn? = null +) + +@Keep +@Serializable +data class KanbanTaskColumn( + val board: KanbanBoard = KanbanBoard() +) + +@Keep +data class KanbanTitleRequest(@SerializedName("title") val title: String) + +@Keep +data class KanbanTaskRequest( + @SerializedName("title") val title: String, + @SerializedName("description") val description: String? = null +) + +@Keep +data class KanbanMoveTaskRequest(@SerializedName("columnId") val columnId: Int) + +@Keep +data class SendMessageRequest( + @SerializedName("text") val text: String, + @SerializedName("kanbanBoardId") val kanbanBoardId: Int? = null, + @SerializedName("kanbanTaskId") val kanbanTaskId: Int? = null +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/LocalAccount.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/LocalAccount.kt new file mode 100644 index 0000000..cf85421 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/LocalAccount.kt @@ -0,0 +1,3 @@ +package com.aiwazian.messenger.data + +data class LocalAccount(val id: Long, val isCurrent: Boolean) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/LoginAvailability.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/LoginAvailability.kt new file mode 100644 index 0000000..66bbb4f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/LoginAvailability.kt @@ -0,0 +1,8 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep + +@Keep +data class LoginAvailability( + @Keep val available: Boolean +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Message.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Message.kt new file mode 100644 index 0000000..46a7f85 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Message.kt @@ -0,0 +1,58 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import kotlinx.serialization.Serializable +import com.google.gson.annotations.SerializedName + +@Keep +@Serializable +data class Message( + @Keep var id: Int = 0, + @Keep val senderId: Long = 0, + @Keep val chatId: Long = 0, + @Keep val text: String? = null, + @Keep val sendTime: Long = 0, + @Keep var isRead: Boolean = false, + @Keep @SerializedName(value = "files", alternate = ["attachments"]) + val attachments: Array = emptyArray(), + @Keep val kanbanBoardId: Int? = null, + @Keep val kanbanTaskId: Int? = null, + @Keep val kanbanBoard: KanbanBoard? = null, + @Keep val kanbanTask: KanbanTask? = null +) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Message + + if (id != other.id) return false + if (senderId != other.senderId) return false + if (chatId != other.chatId) return false + if (sendTime != other.sendTime) return false + if (isRead != other.isRead) return false + if (text != other.text) return false + if (!attachments.contentEquals(other.attachments)) return false + if (kanbanBoardId != other.kanbanBoardId) return false + if (kanbanTaskId != other.kanbanTaskId) return false + if (kanbanBoard != other.kanbanBoard) return false + if (kanbanTask != other.kanbanTask) return false + + return true + } + + override fun hashCode(): Int { + var result = id + result = 31 * result + senderId.hashCode() + result = 31 * result + chatId.hashCode() + result = 31 * result + sendTime.hashCode() + result = 31 * result + isRead.hashCode() + result = 31 * result + (text?.hashCode() ?: 0) + result = 31 * result + attachments.contentHashCode() + result = 31 * result + (kanbanBoardId ?: 0) + result = 31 * result + (kanbanTaskId ?: 0) + result = 31 * result + (kanbanBoard?.hashCode() ?: 0) + result = 31 * result + (kanbanTask?.hashCode() ?: 0) + return result + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NavigationIcon.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NavigationIcon.kt new file mode 100644 index 0000000..54ac88d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NavigationIcon.kt @@ -0,0 +1,8 @@ +package com.aiwazian.messenger.data + +import androidx.compose.ui.graphics.vector.ImageVector + +data class NavigationIcon( + val icon: ImageVector, + val onClick: () -> Unit +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Notification.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Notification.kt new file mode 100644 index 0000000..3d3e23f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/Notification.kt @@ -0,0 +1,7 @@ +package com.aiwazian.messenger.data + +data class Notification( + val chatId: Long, + val title: String, + val message: String +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NotificationChannelInfo.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NotificationChannelInfo.kt new file mode 100644 index 0000000..5e2216e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NotificationChannelInfo.kt @@ -0,0 +1,7 @@ +package com.aiwazian.messenger.data + +data class NotificationChannelInfo( + val id: String, + val name: String, + val description: String +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NotificationTokenRequest.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NotificationTokenRequest.kt new file mode 100644 index 0000000..23d913c --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/NotificationTokenRequest.kt @@ -0,0 +1,8 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep + +@Keep +data class NotificationTokenRequest ( + @Keep val token: String +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/PrivacySettings.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/PrivacySettings.kt new file mode 100644 index 0000000..a45b6b7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/PrivacySettings.kt @@ -0,0 +1,13 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import com.aiwazian.messenger.enums.PrivacyLevel + +@Keep +data class PrivacySettings( + @Keep val bio: Int = PrivacyLevel.Everybody.ordinal, + @Keep val dateOfBirth: Int = PrivacyLevel.Everybody.ordinal, + @Keep val lastSeen: Int = PrivacyLevel.Everybody.ordinal, + @Keep val messages: Int = PrivacyLevel.Everybody.ordinal, + @Keep val invites: Int = PrivacyLevel.Everybody.ordinal +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ReadMessagePayload.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ReadMessagePayload.kt new file mode 100644 index 0000000..cc8eac5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ReadMessagePayload.kt @@ -0,0 +1,9 @@ +package com.aiwazian.messenger.data + +import kotlinx.serialization.Serializable + +@Serializable +data class ReadMessagePayload( + val chatId: Long, + val messageId: Int +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/RegisterRequest.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/RegisterRequest.kt new file mode 100644 index 0000000..39ee911 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/RegisterRequest.kt @@ -0,0 +1,11 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep + +@Keep +data class RegisterRequest ( + @Keep val login: String, + @Keep val password: String, + @Keep val firstName: String, + @Keep val lastName: String? = null, +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ScreenEntry.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ScreenEntry.kt new file mode 100644 index 0000000..ae495dd --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/ScreenEntry.kt @@ -0,0 +1,8 @@ +package com.aiwazian.messenger.data + +import androidx.compose.runtime.Composable + +data class ScreenEntry( + val content: @Composable () -> Unit, + val canGoBackBySwipe: Boolean = true +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/SearchInfo.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/SearchInfo.kt new file mode 100644 index 0000000..4f78fa9 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/SearchInfo.kt @@ -0,0 +1,10 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep + +@Keep +data class SearchInfo( + @Keep val chatId: Long, + @Keep val name: String, + @Keep val publicLink: String +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/SessionInfo.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/SessionInfo.kt new file mode 100644 index 0000000..7149b49 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/SessionInfo.kt @@ -0,0 +1,12 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import kotlinx.serialization.Serializable + +@Keep +@Serializable +data class SessionInfo( + @Keep val id: Int = 0, + @Keep var deviceName: String = "", + @Keep val createdAt: String = "", +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/TopBarAction.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/TopBarAction.kt new file mode 100644 index 0000000..666187c --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/TopBarAction.kt @@ -0,0 +1,9 @@ +package com.aiwazian.messenger.data + +import androidx.compose.ui.graphics.vector.ImageVector + +data class TopBarAction( + val icon: ImageVector, + val onClick: (() -> Unit)? = null, + val dropdownActions: List = emptyList() +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/UserInfo.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/UserInfo.kt new file mode 100644 index 0000000..e48894e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/UserInfo.kt @@ -0,0 +1,29 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import com.google.gson.annotations.SerializedName +import com.aiwazian.messenger.interfaces.Profile + +@Keep +data class UserInfo( + @Keep override var id: Long = 0, + @Keep var firstName: String = "", + @Keep var lastName: String = "", + @Keep var username: String? = null, + @Keep var bio: String = "", + @Keep var dateOfBirth: Long? = null, +): Profile + +@Keep +data class UpdateProfileRequest( + @SerializedName("firstName") val firstName: String, + @SerializedName("lastName") val lastName: String? = null, + @SerializedName("username") val username: String? = null, + @SerializedName("bio") val bio: String? = null, + @SerializedName("dateOfBirth") val dateOfBirth: Long? = null +) + +@Keep +data class UpdateUsernameRequest( + @SerializedName("username") val username: String? +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/data/WebSocketMessage.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/WebSocketMessage.kt new file mode 100644 index 0000000..5bec5ba --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/data/WebSocketMessage.kt @@ -0,0 +1,13 @@ +package com.aiwazian.messenger.data + +import androidx.annotation.Keep +import com.aiwazian.messenger.enums.WebSocketAction +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +@Keep +@Serializable +data class WebSocketMessage( + @Keep val action: WebSocketAction, + @Keep val data: JsonObject +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/AppDatabase.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/AppDatabase.kt new file mode 100644 index 0000000..ac9b0c6 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/AppDatabase.kt @@ -0,0 +1,40 @@ +package com.aiwazian.messenger.database + +import androidx.room.Database +import androidx.room.RoomDatabase +import com.aiwazian.messenger.database.dao.AccountDao +import com.aiwazian.messenger.database.dao.ChannelDao +import com.aiwazian.messenger.database.dao.ChatDao +import com.aiwazian.messenger.database.dao.FolderChatDao +import com.aiwazian.messenger.database.dao.FolderDao +import com.aiwazian.messenger.database.dao.GroupDao +import com.aiwazian.messenger.database.dao.UserDao +import com.aiwazian.messenger.database.entity.AccountEntity +import com.aiwazian.messenger.database.entity.AttachmentEntity +import com.aiwazian.messenger.database.entity.ChannelEntity +import com.aiwazian.messenger.database.entity.FolderChatEntity +import com.aiwazian.messenger.database.entity.FolderEntity +import com.aiwazian.messenger.database.entity.GroupEntity +import com.aiwazian.messenger.database.entity.MessageEntity +import com.aiwazian.messenger.database.entity.UserEntity + +@Database( + entities = [FolderEntity::class, FolderChatEntity::class, UserEntity::class, MessageEntity::class, ChannelEntity::class, AccountEntity::class, GroupEntity::class, AttachmentEntity::class], + version = 7 +) +abstract class AppDatabase : RoomDatabase() { + + abstract fun folderDao(): FolderDao + + abstract fun folderChatDao(): FolderChatDao + + abstract fun userDao(): UserDao + + abstract fun channelDao(): ChannelDao + + abstract fun accountDao(): AccountDao + + abstract fun groupDao(): GroupDao + + abstract fun chatDao(): ChatDao +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/DatabaseModule.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/DatabaseModule.kt new file mode 100644 index 0000000..4ccd593 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/DatabaseModule.kt @@ -0,0 +1,67 @@ +package com.aiwazian.messenger.database + +import android.content.Context +import androidx.room.Room +import com.aiwazian.messenger.database.dao.AccountDao +import com.aiwazian.messenger.database.dao.ChannelDao +import com.aiwazian.messenger.database.dao.ChatDao +import com.aiwazian.messenger.database.dao.FolderChatDao +import com.aiwazian.messenger.database.dao.FolderDao +import com.aiwazian.messenger.database.dao.GroupDao +import com.aiwazian.messenger.database.dao.UserDao +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object DatabaseModule { + + @Provides + @Singleton + fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase { + return Room.databaseBuilder( + context, + AppDatabase::class.java, + "app_database" + ).fallbackToDestructiveMigration(true).build() + } + + @Provides + fun provideFolderDao(database: AppDatabase): FolderDao { + return database.folderDao() + } + + @Provides + fun provideFolderChatDao(database: AppDatabase): FolderChatDao { + return database.folderChatDao() + } + + @Provides + fun provideUserDao(database: AppDatabase): UserDao { + return database.userDao() + } + + @Provides + fun provideChannelDao(database: AppDatabase): ChannelDao { + return database.channelDao() + } + + @Provides + fun provideAccount(database: AppDatabase): AccountDao { + return database.accountDao() + } + + @Provides + fun provideGroup(database: AppDatabase): GroupDao { + return database.groupDao() + } + + @Provides + fun provideChat(database: AppDatabase): ChatDao { + return database.chatDao() + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/AccountDao.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/AccountDao.kt new file mode 100644 index 0000000..1f7aef4 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/AccountDao.kt @@ -0,0 +1,23 @@ +package com.aiwazian.messenger.database.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.aiwazian.messenger.database.entity.AccountEntity + +@Dao +interface AccountDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun add(account: AccountEntity) + + @Query("SELECT * FROM account WHERE id = :id") + suspend fun get(id: Int): AccountEntity? + + @Query("SELECT * FROM account WHERE isCurrent = 1") + suspend fun getMe(): AccountEntity? + + @Delete + suspend fun delete(account: AccountEntity) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/ChannelDao.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/ChannelDao.kt new file mode 100644 index 0000000..9e8d97e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/ChannelDao.kt @@ -0,0 +1,28 @@ +package com.aiwazian.messenger.database.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Update +import com.aiwazian.messenger.database.entity.ChannelEntity +import com.aiwazian.messenger.types.EntityId + +@Dao +interface ChannelDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insert(channelEntity: ChannelEntity) + + @Query("SELECT * FROM channel") + suspend fun getAll(): List + + @Query("SELECT * FROM channel WHERE id = :id") + suspend fun get(id: Long): ChannelEntity? + + @Update + suspend fun update(channelEntity: ChannelEntity) + + @Query("DELETE FROM 'channel' WHERE id = :id") + suspend fun delete(id: Long) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/ChatDao.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/ChatDao.kt new file mode 100644 index 0000000..6b23367 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/ChatDao.kt @@ -0,0 +1,18 @@ +package com.aiwazian.messenger.database.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.aiwazian.messenger.database.entity.AttachmentEntity + +@Dao +interface ChatDao { + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun save(attachment: AttachmentEntity) + + @Query("SELECT * FROM attachment WHERE id = :id") + suspend fun get(id: String): AttachmentEntity + +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/FolderChatDao.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/FolderChatDao.kt new file mode 100644 index 0000000..0a3e439 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/FolderChatDao.kt @@ -0,0 +1,33 @@ +package com.aiwazian.messenger.database.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.aiwazian.messenger.database.entity.FolderChatEntity +import com.aiwazian.messenger.database.entity.MessageEntity + +@Dao +interface FolderChatDao { + @Query("SELECT * FROM folderChat WHERE folderId = :id") + suspend fun getAll(id: Int): List + + @Query("SELECT * FROM folderChat WHERE id = :id") + suspend fun get(id: Long): FolderChatEntity? + + @Query("SELECT * FROM message WHERE chatId = :id") + suspend fun getMessages(id: Long): List + + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) + suspend fun insertAll(chatEntities: List) + + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) + suspend fun insert(chatEntity: FolderChatEntity) + + @Delete + suspend fun delete(folderChatEntity: FolderChatEntity) + + @Query("DELETE FROM folderChat WHERE id = :id") + suspend fun deleteById(id: Long) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/FolderDao.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/FolderDao.kt new file mode 100644 index 0000000..0b8e2de --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/FolderDao.kt @@ -0,0 +1,23 @@ +package com.aiwazian.messenger.database.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.aiwazian.messenger.database.entity.FolderEntity + +@Dao +interface FolderDao { + @Query("SELECT * FROM folder") + suspend fun getAll(): List + + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) + suspend fun insertAll(folderEntities: List) + + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) + suspend fun insert(folderEntities: FolderEntity) + + @Delete + suspend fun delete(folderEntity: FolderEntity) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/GroupDao.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/GroupDao.kt new file mode 100644 index 0000000..fd7250d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/GroupDao.kt @@ -0,0 +1,27 @@ +package com.aiwazian.messenger.database.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Update +import com.aiwazian.messenger.database.entity.GroupEntity + +@Dao +interface GroupDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insert(groupEntity: GroupEntity) + + @Query("SELECT * FROM 'group' WHERE id = :id") + suspend fun get(id: Long): GroupEntity? + + @Update + suspend fun update(groupEntity: GroupEntity) + + @Delete + suspend fun remove(groupEntity: GroupEntity) + + @Query("DELETE FROM 'group' WHERE id = :id") + suspend fun delete(id: Long) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/UserDao.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/UserDao.kt new file mode 100644 index 0000000..de40370 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/dao/UserDao.kt @@ -0,0 +1,20 @@ +package com.aiwazian.messenger.database.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.aiwazian.messenger.database.entity.UserEntity + +@Dao +interface UserDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insert(userEntity: UserEntity) + + @Query("SELECT * FROM user WHERE id = :id") + suspend fun get(id: Long): UserEntity? + + @Delete + suspend fun delete(userEntity: UserEntity) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/AccountEntity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/AccountEntity.kt new file mode 100644 index 0000000..e8982ed --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/AccountEntity.kt @@ -0,0 +1,7 @@ +package com.aiwazian.messenger.database.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity("account") +data class AccountEntity(@PrimaryKey val id: Long, val isCurrent: Boolean) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/AttachmentEntity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/AttachmentEntity.kt new file mode 100644 index 0000000..4bf58b7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/AttachmentEntity.kt @@ -0,0 +1,13 @@ +package com.aiwazian.messenger.database.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity("attachment") +data class AttachmentEntity( + @PrimaryKey val id: String, + val messageId: Int, + val name: String, + val url: String, + val size: Long +) diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/ChannelEntity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/ChannelEntity.kt new file mode 100644 index 0000000..1019c86 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/ChannelEntity.kt @@ -0,0 +1,17 @@ +package com.aiwazian.messenger.database.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity("channel") +data class ChannelEntity( + @PrimaryKey val id: Long, + var name: String, + var bio: String = "", + val ownerId: Long, + val subscribers: Int, + val removedUser: Int, + val channelType: Int, + val publicLink: String?, + val isSubscribed: Boolean = false +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/FolderChatEntity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/FolderChatEntity.kt new file mode 100644 index 0000000..0c29311 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/FolderChatEntity.kt @@ -0,0 +1,13 @@ +package com.aiwazian.messenger.database.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity("folderChat") +data class FolderChatEntity( + @PrimaryKey var id: Long, + val folderId: Int = 0, + var chatName: String = "", + var isPinned: Boolean = false, + var lastMessageId: Int? = null +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/FolderEntity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/FolderEntity.kt new file mode 100644 index 0000000..2634763 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/FolderEntity.kt @@ -0,0 +1,10 @@ +package com.aiwazian.messenger.database.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "folder") +data class FolderEntity( + @PrimaryKey val id: Int, + val folderName: String = "" +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/GroupEntity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/GroupEntity.kt new file mode 100644 index 0000000..772c37d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/GroupEntity.kt @@ -0,0 +1,13 @@ +package com.aiwazian.messenger.database.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity("group") +data class GroupEntity( + @PrimaryKey val id: Long, + val ownerId: Long, + var name: String, + var bio: String, + val members: Int +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/MessageEntity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/MessageEntity.kt new file mode 100644 index 0000000..88e8370 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/MessageEntity.kt @@ -0,0 +1,14 @@ +package com.aiwazian.messenger.database.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity("message") +data class MessageEntity( + @PrimaryKey var id: Int, + val senderId: Long, + val chatId: Long, + val text: String? = null, + val sendTime: Long = 0, + var isRead: Boolean = false +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/UserEntity.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/UserEntity.kt new file mode 100644 index 0000000..0305238 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/entity/UserEntity.kt @@ -0,0 +1,14 @@ +package com.aiwazian.messenger.database.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity("user") +data class UserEntity( + @PrimaryKey var id: Long, + var firstName: String = "", + var lastName: String = "", + var username: String? = null, + var bio: String = "", + var dateOfBirth: Long? = null +) \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/AccountMappers.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/AccountMappers.kt new file mode 100644 index 0000000..69914d7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/AccountMappers.kt @@ -0,0 +1,18 @@ +package com.aiwazian.messenger.database.mappers + +import com.aiwazian.messenger.data.LocalAccount +import com.aiwazian.messenger.database.entity.AccountEntity + +fun LocalAccount.toEntity(): AccountEntity { + return AccountEntity( + id = this.id, + isCurrent = this.isCurrent + ) +} + +fun AccountEntity.toLocal(): LocalAccount { + return LocalAccount( + id = this.id, + isCurrent = this.isCurrent + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/AttachmentMappers.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/AttachmentMappers.kt new file mode 100644 index 0000000..623308e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/AttachmentMappers.kt @@ -0,0 +1,24 @@ +package com.aiwazian.messenger.database.mappers + +import com.aiwazian.messenger.data.Attachment +import com.aiwazian.messenger.database.entity.AttachmentEntity + +fun Attachment.toEntity(): AttachmentEntity { + return AttachmentEntity( + id = this.id, + messageId = this.messageId, + name = this.name, + url = this.url, + size = this.size + ) +} + +fun AttachmentEntity.toModel(): Attachment { + return Attachment( + id = this.id, + messageId = this.messageId, + name = this.name, + url = this.url, + size = this.size + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/ChannelMappers.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/ChannelMappers.kt new file mode 100644 index 0000000..a04cbf6 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/ChannelMappers.kt @@ -0,0 +1,32 @@ +package com.aiwazian.messenger.database.mappers + +import com.aiwazian.messenger.data.ChannelInfo +import com.aiwazian.messenger.database.entity.ChannelEntity + +fun ChannelInfo.toEntity(): ChannelEntity { + return ChannelEntity( + id = this.id, + name = this.name, + bio = this.bio, + ownerId = this.ownerId, + subscribers = this.subscribers, + removedUser = this.removedUser, + channelType = this.channelType, + publicLink = this.publicLink, + isSubscribed = this.isSubscribed + ) +} + +fun ChannelEntity.toChannel(): ChannelInfo { + return ChannelInfo( + id = this.id, + name = this.name, + bio = this.bio, + ownerId = this.ownerId, + subscribers = this.subscribers, + removedUser = this.removedUser, + channelType = this.channelType, + publicLink = this.publicLink, + isSubscribed = this.isSubscribed + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/FolderChatMappers.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/FolderChatMappers.kt new file mode 100644 index 0000000..a0255c5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/FolderChatMappers.kt @@ -0,0 +1,26 @@ +package com.aiwazian.messenger.database.mappers + +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.database.entity.FolderChatEntity +import com.aiwazian.messenger.enums.ChatType + +fun ChatInfo.toEntity( + folderId: Int, + lastMessageId: Int? = null +): FolderChatEntity { + return FolderChatEntity( + id = this.id, + chatName = this.chatName, + isPinned = this.isPinned, + folderId = folderId, + lastMessageId = lastMessageId + ) +} + +fun FolderChatEntity.toChat(): ChatInfo { + return ChatInfo( + id = this.id, + chatName = this.chatName, + isPinned = this.isPinned + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/FolderMappers.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/FolderMappers.kt new file mode 100644 index 0000000..a98f270 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/FolderMappers.kt @@ -0,0 +1,17 @@ +package com.aiwazian.messenger.database.mappers +import com.aiwazian.messenger.data.FolderInfo +import com.aiwazian.messenger.database.entity.FolderEntity + +fun FolderInfo.toEntity(): FolderEntity { + return FolderEntity( + id = this.id, + folderName = this.name + ) +} + +fun FolderEntity.toFolder(): FolderInfo { + return FolderInfo( + id = this.id, + name = this.folderName + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/GroupMappers.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/GroupMappers.kt new file mode 100644 index 0000000..79d7037 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/GroupMappers.kt @@ -0,0 +1,24 @@ +package com.aiwazian.messenger.database.mappers + +import com.aiwazian.messenger.data.GroupInfo +import com.aiwazian.messenger.database.entity.GroupEntity + +fun GroupInfo.toEntity(): GroupEntity { + return GroupEntity( + id = this.id, + name = this.name, + bio = this.bio, + ownerId = this.ownerId, + members = this.members + ) +} + +fun GroupEntity.toGroup(): GroupInfo { + return GroupInfo( + id = this.id, + name = this.name, + bio = this.bio, + ownerId = this.ownerId, + members = this.members + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/MessageMappers.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/MessageMappers.kt new file mode 100644 index 0000000..495231e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/MessageMappers.kt @@ -0,0 +1,26 @@ +package com.aiwazian.messenger.database.mappers + +import com.aiwazian.messenger.data.Message +import com.aiwazian.messenger.database.entity.MessageEntity + +fun Message.toEntity(): MessageEntity { + return MessageEntity( + id = this.id, + senderId = this.senderId, + chatId = this.chatId, + text = this.text, + sendTime = this.sendTime, + isRead = this.isRead + ) +} + +fun MessageEntity.toMessage(): Message { + return Message( + id = this.id, + senderId = this.senderId, + chatId = this.chatId, + text = this.text, + sendTime = this.sendTime, + isRead = this.isRead + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/UserMappers.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/UserMappers.kt new file mode 100644 index 0000000..c8501c2 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/mappers/UserMappers.kt @@ -0,0 +1,26 @@ +package com.aiwazian.messenger.database.mappers + +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.database.entity.UserEntity + +fun UserInfo.toEntity(): UserEntity { + return UserEntity( + id = this.id, + firstName = this.firstName, + lastName = this.lastName, + username = this.username, + bio = this.bio, + dateOfBirth = this.dateOfBirth + ) +} + +fun UserEntity.toUser(): UserInfo { + return UserInfo( + id = this.id, + firstName = this.firstName, + lastName = this.lastName, + username = this.username, + bio = this.bio, + dateOfBirth = this.dateOfBirth + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/AccountRepository.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/AccountRepository.kt new file mode 100644 index 0000000..5f11ee5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/AccountRepository.kt @@ -0,0 +1,12 @@ +package com.aiwazian.messenger.database.repository + +import com.aiwazian.messenger.data.LocalAccount +import com.aiwazian.messenger.database.dao.AccountDao +import com.aiwazian.messenger.database.mappers.toLocal +import javax.inject.Inject + +class AccountRepository @Inject constructor(private val accountDao: AccountDao) { + suspend fun getCurrent(): LocalAccount? { + return accountDao.getMe()?.toLocal() + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/ChannelRepository.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/ChannelRepository.kt new file mode 100644 index 0000000..8e23bfe --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/ChannelRepository.kt @@ -0,0 +1,179 @@ +package com.aiwazian.messenger.database.repository + +import android.util.Log +import com.aiwazian.messenger.data.ChannelInfo +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.database.dao.ChannelDao +import com.aiwazian.messenger.database.mappers.toChannel +import com.aiwazian.messenger.database.mappers.toEntity +import com.aiwazian.messenger.services.ChannelService +import com.aiwazian.messenger.types.EntityId +import javax.inject.Inject + +class ChannelRepository @Inject constructor( + private val channelService: ChannelService, + private val channelDao: ChannelDao +) { + + suspend fun get(id: Long): ChannelInfo? { + try { + val channel = channelService.get(id) + + if (channel != null) { + channelDao.insert(channel.toEntity()) + return channel + } + + return channelDao.get(id)?.toChannel() + } catch (e: Exception) { + Log.e( + "ChannelRepository", + "Ошибка при получении канала", + e + ) + } + + val localChannel = channelDao.get(id) + + return localChannel?.toChannel() + } + + suspend fun create(channelInfo: ChannelInfo): Long? { + try { + val createdId = channelService.create(channelInfo) + + if (createdId == null) { + return null + } + + channelDao.insert(channelInfo.toEntity()) + + return createdId + } catch (e: Exception) { + Log.e( + "ChannelRepository", + "Ошибка при создании канала", + e + ) + + return null + } + } + + suspend fun save(channelInfo: ChannelInfo): Long? { + try { + val savedId = channelService.save(channelInfo) + + if (savedId == null) { + return null + } + + channelDao.insert(channelInfo.toEntity()) + + return savedId + } catch (e: Exception) { + Log.e( + "ChannelRepository", + "Ошибка при сохранении канала", + e + ) + + return null + } + } + + suspend fun delete(id: Long): Boolean { + try { + val isDeleted = channelService.delete(id) + + if (isDeleted) { + channelDao.delete(id) + } + + return isDeleted + } catch (e: Exception) { + Log.e( + "ChannelRepository", + "Ошибка при удалении канала", + e + ) + + return false + } + } + + suspend fun getSubscribers(id: Long): List { + try { + val subscribers = channelService.getSubscribers(id) + + return subscribers ?: emptyList() + } catch (e: Exception) { + Log.e( + "ChannelRepository", + "Ошибка при получении подписчиков канала", + e + ) + + return emptyList() + } + } + + suspend fun join(id: Long): Boolean { + try { + channelService.join(id) + + val channel = channelDao.get(id) + + if (channel != null) { + channelDao.update(channel.copy(isSubscribed = true)) + } + + return true + } catch (e: Exception) { + Log.e( + "ChannelRepository", + "Ошибка при подписке на канал", + e + ) + + return false + } + } + + suspend fun checkIsBusyPublicLink(link: String): Boolean? { + return try { + channelService.isBusyPublicLick(link) + } catch (e: Exception) { + Log.e( + "ChannelRepository", + "Ошибка при проверке публичной ссылки канала", + e + ) + + null + } + } + + suspend fun leave(id: Long): Boolean { + try { + val channel = channelDao.get(id) + + if (channel != null) { + channelDao.update(channel.copy(isSubscribed = false)) + } + + channelService.leave(id) + + return true + } catch (e: Exception) { + Log.e( + "ChannelRepository", + "Ошибка при отписке от канала", + e + ) + + return false + } + } + +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/ChatRepository.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/ChatRepository.kt new file mode 100644 index 0000000..21e3f2f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/ChatRepository.kt @@ -0,0 +1,166 @@ +package com.aiwazian.messenger.database.repository + +import android.util.Log +import com.aiwazian.messenger.data.Attachment +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.Message +import com.aiwazian.messenger.database.dao.ChatDao +import com.aiwazian.messenger.database.dao.FolderChatDao +import com.aiwazian.messenger.database.mappers.toChat +import com.aiwazian.messenger.database.mappers.toEntity +import com.aiwazian.messenger.database.mappers.toMessage +import com.aiwazian.messenger.database.mappers.toModel +import com.aiwazian.messenger.services.ChatService +import javax.inject.Inject + +class ChatRepository @Inject constructor( + private val chatService: ChatService, + private val folderChatDao: FolderChatDao, + private val chatDao: ChatDao +) { + + suspend fun get(id: Long): ChatInfo? { + try { + val chat = chatService.getChatInfo(id) + + if (chat != null) { + return chat + } + } catch (e: Exception) { + Log.e( + "ChatRepository", + "Ошибка при получении информации о чате", + e + ) + } + + val localChat = folderChatDao.get(id) + + return localChat?.toChat() + } + + suspend fun getMessages(id: Long): List { + try { + val messages = chatService.getChatMessages(id) + + if (messages != null) { + return messages + } + } catch (e: Exception) { + Log.e( + "ChatRepository", + "Ошибка при получении сообщений", + e + ) + } + + val localMessages = folderChatDao.getMessages(id) + + if (localMessages.isEmpty()) { + return emptyList() + } + + return localMessages.map { it.toMessage() } + } + + suspend fun getLastMessage(id: Long): Message? { + return chatService.getChatLastMessage(id) + } + + suspend fun sendMessage(chatId: Long, message: Message): Message? { + return chatService.sendMessage(chatId, message) + } + + suspend fun saveAttachment(attachment: Attachment) { + chatDao.save(attachment.toEntity()) + } + + suspend fun getAttachment(id: String): Attachment { + return chatDao.get(id).toModel() + } + + suspend fun makeAsRead( + chatId: Long, + messageId: Int + ): Boolean { + return chatService.makeAsReadMessage( + chatId, + messageId + ) + } + + suspend fun deleteMessage( + chatId: Long, + messageId: Int, + deleteForAll: Boolean + ): Boolean { + try { + return chatService.deleteMessage( + chatId, + messageId, + deleteForAll + ) + } catch (e: Exception) { + Log.e( + "ChatRepository", + "Ошибка при удалени сообщения", + e + ) + + return false + } + } + + suspend fun deleteChat( + chatId: Long + ) { + try { + folderChatDao.deleteById(chatId) + + } catch (e: Exception) { + Log.e( + "ChatRepository", + "Ошибка при удалении чата", + e + ) + } + } + + suspend fun deleteChatMessages( + chatId: Long, + deleteForReceiver: Boolean + ): Boolean { + return chatService.deleteChatMessages( + chatId, + deleteForReceiver + ) + } + + suspend fun pin( + chatId: Long, + folderId: Int + ): Boolean { + return chatService.pin( + chatId, + folderId + ) + } + + suspend fun unpin( + chatId: Long, + folderId: Int + ): Boolean { + return chatService.unpin( + chatId, + folderId + ) + } + + suspend fun archive(id: Long): Boolean { + return chatService.archiveChat(id) + } + + suspend fun unarchive(id: Long): Boolean { + return chatService.unarchiveChat(id) + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/FolderRepository.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/FolderRepository.kt new file mode 100644 index 0000000..520062e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/FolderRepository.kt @@ -0,0 +1,110 @@ +package com.aiwazian.messenger.database.repository + +import android.util.Log +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.FolderInfo +import com.aiwazian.messenger.database.dao.FolderChatDao +import com.aiwazian.messenger.database.dao.FolderDao +import com.aiwazian.messenger.database.mappers.toEntity +import com.aiwazian.messenger.database.mappers.toChat +import com.aiwazian.messenger.database.mappers.toFolder +import com.aiwazian.messenger.services.FolderService +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class FolderRepository @Inject constructor( + private val folderService: FolderService, + private val folderDao: FolderDao, + private val folderChatDao: FolderChatDao +) { + + private val _folders = MutableStateFlow>(emptyList()) + val folders = _folders.asStateFlow() + + suspend fun loadFolders() { + val localFolderEntities = folderDao.getAll() + + val localFolders = localFolderEntities.map { it.toFolder() } + + _folders.update { + localFolders.map { folder -> + folder.chats = folderChatDao.getAll(folder.id).map { it.toChat() } + folder + } + } + + try { + val folders = folderService.getAll().orEmpty() + val chatsResponse = RetrofitInstance.api.getUnarchivedChats() + if (!chatsResponse.isSuccessful) return + val response = chatsResponse.body().orEmpty() + + val chatFolderInfos = listOf( + FolderInfo( + id = 0, + name = "Все чаты", + chats = response + ) + ) + folders + + _folders.update { chatFolderInfos } + + val folderEntities = _folders.value.map { it.toEntity() } + folderDao.insertAll(folderEntities) + + _folders.value.forEach { folder -> + val chatEntities = folder.chats.map { it.toEntity(folder.id) } + folderChatDao.insertAll(chatEntities) + } + } catch (e: Exception) { + Log.e( + "FolderRepository", + "Ошибка при получении папок с чатами", + e + ) + } + } + + fun getFolderChats(folderId: Int): List { + return _folders.value.find { it.id == folderId }?.chats ?: emptyList() + } + + suspend fun saveFolder(folderInfo: FolderInfo) { + if (folderInfo.id == 0) { + folderInfo.id = (_folders.value.maxOfOrNull { it.id } ?: 0) + 1 + } + + _folders.update { currentFolders -> + val existingIndex = currentFolders.indexOfFirst { it.id == folderInfo.id } + + if (existingIndex != -1) { + currentFolders.toMutableList().apply { + this[existingIndex] = folderInfo + } + } else { + currentFolders + folderInfo + } + } + folderDao.insertAll(listOf(folderInfo.toEntity())) + folderChatDao.insertAll(folderInfo.chats.map { it.toEntity(folderInfo.id) }) + } + + suspend fun remove(folderId: Int): Boolean { + val folder = _folders.value.find { it.id == folderId }?.toEntity() + + if (folder == null) { + return false + } + + _folders.update { it.filter { it -> it.id != folderId } } + + folderDao.delete(folder) + + return true + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/GroupRepository.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/GroupRepository.kt new file mode 100644 index 0000000..c5472df --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/GroupRepository.kt @@ -0,0 +1,78 @@ +package com.aiwazian.messenger.database.repository + +import android.util.Log +import com.aiwazian.messenger.data.GroupInfo +import com.aiwazian.messenger.database.dao.GroupDao +import com.aiwazian.messenger.database.mappers.toEntity +import com.aiwazian.messenger.database.mappers.toGroup +import com.aiwazian.messenger.services.GroupService +import javax.inject.Inject + +class GroupRepository @Inject constructor( + private val groupService: GroupService, + private val groupDao: GroupDao +) { + + suspend fun create(groupInfo: GroupInfo): Long? { + try { + val createdId = groupService.create(groupInfo) + + if (createdId == null) { + return null + } + + groupDao.insert(groupInfo.toEntity()) + + return createdId + } catch (e: Exception) { + Log.e( + "GroupRepository", + "Ошибка при создании канала", + e + ) + + return null + } + } + + suspend fun get(id: Long): GroupInfo? { + try { + val group = groupService.get(id) + + if (group != null) { + groupDao.insert(group.toEntity()) + return group + } + + return groupDao.get(id)?.toGroup() + } catch (e: Exception) { + Log.e( + "GroupRepository", + "Ошибка при получении группы", + e + ) + + return null + } + } + + suspend fun delete(id: Long): Boolean { + try { + val isDeleted = groupService.delete(id) + + if (isDeleted) { + groupDao.delete(id) + } + + return isDeleted + } catch (e: Exception) { + Log.e( + "GroupRepository", + "Ошибка при получении участников группы", + e + ) + + return false + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/UserRepository.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/UserRepository.kt new file mode 100644 index 0000000..d1ed159 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/database/repository/UserRepository.kt @@ -0,0 +1,88 @@ +package com.aiwazian.messenger.database.repository + +import android.util.Log +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.database.dao.AccountDao +import com.aiwazian.messenger.database.dao.UserDao +import com.aiwazian.messenger.database.entity.AccountEntity +import com.aiwazian.messenger.database.mappers.toEntity +import com.aiwazian.messenger.database.mappers.toUser +import com.aiwazian.messenger.services.UserService +import javax.inject.Inject + +class UserRepository @Inject constructor( + private val userService: UserService, + private val userDao: UserDao, + private val accountDao: AccountDao +) { + + suspend fun getMe(): UserInfo? { + try { + val response = RetrofitInstance.api.getMe() + + val user = response.body() + + if (user != null) { + val userEntity = user.toEntity() + userDao.insert(userEntity) + + val accountEntity = AccountEntity(id = userEntity.id, isCurrent = true) + accountDao.add(accountEntity) + + return user + } + } catch (e: Exception) { + Log.e( + "UserRepository", + "Ошибка при запросе Get Me", + e + ) + } + + val accountEntity = accountDao.getMe() + + if (accountEntity == null) { + return null + } + + val user = userDao.get(accountEntity.id) + + return user?.toUser() + } + + suspend fun getById(id: Long): UserInfo? { + try { + val user = userService.getById(id) + + if (user != null) { + userDao.insert(user.toEntity()) + return user + } + } catch (e: Exception) { + Log.e( + "UserRepository", + "Ошибка при получении профиля", + e + ) + } + + val localUser = userDao.get(id) + + return localUser?.toUser() + } + + suspend fun updateProfile(user: UserInfo): Boolean { + try { + userDao.insert(user.toEntity()) + return userService.updateProfile(user) + } catch (e: Exception) { + Log.e( + "UserRepository", + "Ошибка при обновлении профиля", + e + ) + return false + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ChannelType.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ChannelType.kt new file mode 100644 index 0000000..248cad0 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ChannelType.kt @@ -0,0 +1,12 @@ +package com.aiwazian.messenger.enums + +enum class ChannelType { + PUBLIC, + PRIVATE; + + companion object { + fun fromInt(value: Int): ChannelType { + return entries.first { it.ordinal == value } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ChatType.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ChatType.kt new file mode 100644 index 0000000..e2e0c5c --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ChatType.kt @@ -0,0 +1,26 @@ +package com.aiwazian.messenger.enums + +enum class ChatType { + PRIVATE, + GROUP, + CHANNEL, + UNKNOWN; + + companion object { + fun fromOrdinal(ordinal: Int): ChatType { + return entries.firstOrNull { it.ordinal == ordinal } ?: UNKNOWN + } + + fun fromId(id: Long): ChatType { + val idString = id.toString() + val firstDigit = idString[0].digitToInt() + + return when (firstDigit) { + 1-> PRIVATE + 2-> CHANNEL + 3-> GROUP + else -> UNKNOWN + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/DownloadStatus.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/DownloadStatus.kt new file mode 100644 index 0000000..4d8162a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/DownloadStatus.kt @@ -0,0 +1,7 @@ +package com.aiwazian.messenger.enums + +enum class DownloadStatus { + PENDING, + DOWNLOADING, + COMPLETED +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/FileType.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/FileType.kt new file mode 100644 index 0000000..6f2b514 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/FileType.kt @@ -0,0 +1,48 @@ +package com.aiwazian.messenger.enums + +enum class FileType { + IMAGE, + VIDEO, + MUSIC, + ZIP, + TEXT, + HTML, + CSS, + JAVASCRIPT, + PHP, + APK, + GIF, + JSON, + OTHER; + + companion object { + private val extensionMap: Map = mapOf( + "jpg" to IMAGE, + "jpeg" to IMAGE, + "png" to IMAGE, + "gif" to IMAGE, + "bmp" to IMAGE, + "mp4" to VIDEO, + "avi" to VIDEO, + "mkv" to VIDEO, + "mov" to VIDEO, + "mp3" to MUSIC, + "wav" to MUSIC, + "aac" to MUSIC, + "flac" to MUSIC, + "zip" to ZIP, + "txt" to TEXT, + "html" to HTML, + "css" to CSS, + "js" to JAVASCRIPT, + "php" to PHP, + "gif" to GIF, + "apk" to APK, + "json" to JSON + ) + + fun fromExtension(extension: String): FileType { + return extensionMap[extension.lowercase()] ?: OTHER + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/PrimaryColorOption.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/PrimaryColorOption.kt new file mode 100644 index 0000000..d6ae0dd --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/PrimaryColorOption.kt @@ -0,0 +1,20 @@ +package com.aiwazian.messenger.enums + +import androidx.compose.ui.graphics.Color + +enum class PrimaryColorOption(val color: Color) { + Blue(Color(0xFF2196F3)), + Green(Color(0xFF4CAF50)), + DarkGreen(Color(0xFF009688)), + Purple(Color(0xFF9C27B0)), + Orange(Color(0xFFFF5722)), + Orange1(Color(0xFFE91E63)), + Pink(Color(0xFFFF00FF)), + Pink1(Color(0xFF673AB7)); + + companion object { + fun fromString(value: String): PrimaryColorOption { + return entries.firstOrNull { it.name.equals(value, ignoreCase = true) } ?: Blue + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/PrivacyLevel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/PrivacyLevel.kt new file mode 100644 index 0000000..f0b9c8c --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/PrivacyLevel.kt @@ -0,0 +1,12 @@ +package com.aiwazian.messenger.enums + +enum class PrivacyLevel(val id: Int) { + Everybody(0), + Nobody(1); + + companion object { + fun fromId(id: Int): PrivacyLevel { + return entries.first { it.id == id } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ThemeOption.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ThemeOption.kt new file mode 100644 index 0000000..38e291f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/ThemeOption.kt @@ -0,0 +1,18 @@ +package com.aiwazian.messenger.enums + +enum class ThemeOption { + LIGHT, + DARK, + SYSTEM; + + companion object { + fun fromString(value: String): ThemeOption { + return entries.firstOrNull { + it.name.equals( + value, + ignoreCase = true + ) + } ?: SYSTEM + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/WebSocketAction.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/WebSocketAction.kt new file mode 100644 index 0000000..39c5597 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/enums/WebSocketAction.kt @@ -0,0 +1,29 @@ +package com.aiwazian.messenger.enums + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +enum class WebSocketAction { + @SerialName("NEW_MESSAGE") + NEW_MESSAGE, + + @SerialName("DELETE_MESSAGE") + DELETE_MESSAGE, + + @SerialName("DELETE_CHAT") + DELETE_CHAT, + + @SerialName("READ_MESSAGE") + READ_MESSAGE, + + @SerialName("NEW_CHAT") + NEW_CHAT, + + @SerialName("HISTORY_CLEAR") + HISTORY_CLEAR, + + KANBAN_UPDATE, + + UNKNOWN +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/ApiService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/ApiService.kt new file mode 100644 index 0000000..4776d2f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/ApiService.kt @@ -0,0 +1,311 @@ +package com.aiwazian.messenger.interfaces + +import androidx.annotation.Keep +import com.aiwazian.messenger.data.ApiResponse +import com.aiwazian.messenger.data.AuthRequest +import com.aiwazian.messenger.data.FileDownloadUrlResponse +import com.aiwazian.messenger.data.AuthResponse +import com.aiwazian.messenger.data.ChangeCloudPasswordRequest +import com.aiwazian.messenger.data.ChannelInfo +import com.aiwazian.messenger.data.CreateChannelRequest +import com.aiwazian.messenger.data.CreateGroupRequest +import com.aiwazian.messenger.data.CreatedEntityResponse +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.FolderInfo +import com.aiwazian.messenger.data.FileUploadConfirmRequest +import com.aiwazian.messenger.data.FileUploadInitRequest +import com.aiwazian.messenger.data.FileUploadInitResponse +import com.aiwazian.messenger.data.GroupInfo +import com.aiwazian.messenger.data.LoginAvailability +import com.aiwazian.messenger.data.KanbanBoard +import com.aiwazian.messenger.data.KanbanMoveTaskRequest +import com.aiwazian.messenger.data.KanbanTaskRequest +import com.aiwazian.messenger.data.KanbanTitleRequest +import com.aiwazian.messenger.data.Message +import com.aiwazian.messenger.data.NotificationTokenRequest +import com.aiwazian.messenger.data.PrivacySettings +import com.aiwazian.messenger.data.RegisterRequest +import com.aiwazian.messenger.data.SearchInfo +import com.aiwazian.messenger.data.SessionInfo +import com.aiwazian.messenger.data.SendMessageRequest +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.data.UsernameAvailability +import com.aiwazian.messenger.data.UpdateProfileRequest +import com.aiwazian.messenger.data.UpdateUsernameRequest +import com.aiwazian.messenger.utils.Route +import okhttp3.MultipartBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.GET +import retrofit2.http.Multipart +import retrofit2.http.PATCH +import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Part +import retrofit2.http.Path +import retrofit2.http.Query +import retrofit2.http.Streaming +import retrofit2.http.Url + +@Keep +interface ApiService { + @GET("api/kanban") + suspend fun getKanbanBoards(): Response> + + @POST("api/kanban") + suspend fun createKanbanBoard(@Body request: KanbanTitleRequest): Response + + @PATCH("api/kanban/{boardId}") + suspend fun renameKanbanBoard( + @Path("boardId") boardId: Int, + @Body request: KanbanTitleRequest + ): Response + + @DELETE("api/kanban/{boardId}") + suspend fun deleteKanbanBoard(@Path("boardId") boardId: Int): Response + + @POST("api/kanban/{boardId}/columns") + suspend fun createKanbanColumn(@Path("boardId") boardId: Int, @Body request: KanbanTitleRequest): Response + + @POST("api/kanban/columns/{columnId}/tasks") + suspend fun createKanbanTask(@Path("columnId") columnId: Int, @Body request: KanbanTaskRequest): Response + + @PATCH("api/kanban/tasks/{taskId}") + suspend fun moveKanbanTask(@Path("taskId") taskId: Int, @Body request: KanbanMoveTaskRequest): Response + + @DELETE("api/kanban/tasks/{taskId}") + suspend fun deleteKanbanTask(@Path("taskId") taskId: Int): Response + + @GET(Route.FIND_USER_BY_LOGIN) + suspend fun findUserByLogin(@Path("login") login: String): Response + + @POST(Route.LOGIN) + suspend fun login(@Body request: AuthRequest): Response + + @POST(Route.REGISTER) + suspend fun register(@Body request: RegisterRequest): Response + + @POST(Route.LOGOUT) + suspend fun logout(): Response + + @GET(Route.ME) + suspend fun getMe(): Response + + @GET(Route.UNARCHIVED_CHATS) + suspend fun getUnarchivedChats(): Response> + + @GET(Route.ARCHIVED_CHATS) + suspend fun getArchivedChats(): Response> + + @GET(Route.GET_SESSIONS) + suspend fun getSessions(): Response> + + @POST(Route.UPDATE_FCM_TOKEN) + suspend fun updateFcmToken(@Body newToken: NotificationTokenRequest): Response + + @DELETE(Route.TERMINATE_ALL_SESSIONS) + suspend fun terminateAllSessions(): Response + + @DELETE(Route.TERMINATE_SESSION) + suspend fun terminateSession(@Path("id") id: Int): Response + + @GET(Route.GET_DEVICE_COUNT) + suspend fun getDeviceCount(): Response + + @DELETE(Route.DELETE_CHAT) + suspend fun deleteChat( + @Path("id") chatId: Long, + @Query("deleteForReceiver") deleteForReceiver: Boolean + ): Response + + @DELETE(Route.DELETE_CHAT_MESSAGES) + suspend fun deleteChatMessages( + @Path("id") id: Long, + @Query("deleteForReceiver") deleteForReceiver: Boolean + ): Response + + @PATCH(Route.CHANGE_CLOUD_PASSWORD) + suspend fun changeCloudPassword(@Body body: ChangeCloudPasswordRequest): Response + + @PATCH(Route.CHANGE_BIO_PRIVACY) + suspend fun changeBioPrivacy(@Path("value") body: Int): Response + + @PATCH(Route.CHANGE_DATE_OF_BIRTH_PRIVACY) + suspend fun changeDateOfBirthPrivacy(@Path("value") body: Int): Response + + @GET(Route.CHAT_MESSAGES) + suspend fun getMessagesBetweenUsers(@Path("id") chatId: Long): Response> + + @GET(Route.GET_CHAT_LAST_MESSAGE) + suspend fun getChatLastMessage(@Path("chatId") chatId: Long): Response + + @GET(Route.GET_CHAT_INFO) + suspend fun getChatInfo(@Path("id") id: Long): Response + + @PATCH("api/users/me") + suspend fun updateProfile(@Body profile: UpdateProfileRequest): Response + + @GET("api/search") + suspend fun searchUser(@Query("q") query: String): Response> + + @GET(Route.GE_USER_BY_ID) + suspend fun getUserById(@Path("id") id: Long): Response + + @POST(Route.ADD_CHAT_TO_ARCHIVE) + suspend fun archiveChat(@Path("id") chatId: Long): Response + + @DELETE(Route.DELETE_CHAT_FROM_ARCHIVE) + suspend fun unarchiveChat(@Path("id") chatId: Long): Response + + @POST(Route.SEND_MESSAGE) + suspend fun sendMessage( + @Path("chatId") chatId: Long, + @Body requestBody: SendMessageRequest + ): Response + + @Multipart + @POST(Route.SEND_DOCUMENT) + suspend fun sendDocument( + @Part file: MultipartBody.Part, + @Path("chatId") chatId: Long + ): Response + + @POST("api/chats/{chatId}/messages/files/init") + suspend fun initFileUpload( + @Path("chatId") chatId: Long, + @Body request: FileUploadInitRequest + ): Response + + @POST("api/chats/{chatId}/messages/files/confirm") + suspend fun confirmFileUpload( + @Path("chatId") chatId: Long, + @Body request: FileUploadConfirmRequest + ): Response + + @GET("api/chats/{chatId}/messages/{messageId}/files/{fileId}/download") + suspend fun getFileDownloadUrl( + @Path("chatId") chatId: Long, + @Path("messageId") messageId: Int, + @Path("fileId") fileId: String + ): Response + + @DELETE(Route.DELETE_MESSAGE) + suspend fun deleteMessage( + @Path("chatId") chatId: Long, + @Path("messageId") messageId: Int, + @Query("forEveryone") forEveryone: Boolean + ): Response + + @POST(Route.MAKE_AS_READ_MESSAGE) + suspend fun makeAsReadMessage( + @Path("chatId") chatId: Long, + @Path("messageId") messageId: Int + ): Response + + @POST(Route.FOLDER) + suspend fun saveFolder(@Body requestBody: FolderInfo): Response + + @DELETE(Route.DELETE_FOLDER) + suspend fun deleteFolder(@Path("id") id: Int): Response + + @GET(Route.FOLDERS) + suspend fun getFolders(): Response> + + @GET(Route.CHATS) + suspend fun getAllChats(): Response> + + @GET(Route.CHATS) + suspend fun getAllChatsWithOtherUser(): Response> + + @POST(Route.PIN_CHAT) + suspend fun pinChat( + @Path("id") chatId: Long + ): Response + + @DELETE(Route.UNPIN_CHAT) + suspend fun unpinChat( + @Path("id") chatId: Long + ): Response + + @POST(Route.PIN_CHAT_IN_FOLDER) + suspend fun pinChatInFolder( + @Path("folderId") folderId: Int, + @Path("chatId") chatId: Long + ): Response + + @DELETE(Route.UNPIN_CHAT_IN_FOLDER) + suspend fun unpinChatInFolder( + @Path("folderId") folderId: Int, + @Path("chatId") chatId: Long + ): Response + + @GET(Route.GET_MY_PRIVACY) + suspend fun getMyPrivacy(): Response + + @PATCH("api/users/me/privacy") + suspend fun updatePrivacy(@Body settings: PrivacySettings): Response + + @GET("api/search/check/{username}") + suspend fun checkUsername(@Path("username") username: String): Response + + @PATCH("api/users/me/username") + suspend fun saveUsername(@Body request: UpdateUsernameRequest): Response + + @POST(Route.CREATE_CHANNEL) + suspend fun createChannel(@Body channelInfo: CreateChannelRequest): Response + + @POST(Route.SAVE_CHANNEL) + suspend fun saveChannel( + @Path("id") id: Long, + @Body channelInfo: ChannelInfo + ): Response + + @DELETE(Route.DELETE_CHANNEL) + suspend fun deleteChannel(@Path("id") id: Long): Response + + @GET(Route.GET_CHANNEL) + suspend fun getChannel(@Path("id") id: Long): Response + + @POST(Route.JOIN_CHANNEL) + suspend fun joinChannel(@Path("id") id: Long): Response + + @DELETE(Route.LEAVE_CHANNEL) + suspend fun leaveChannel(@Path("id") id: Long): Response + + @GET(Route.GET_CHANNEL_SUBSCRIBERS) + suspend fun getChannelSubscribers(@Path("id") id: Long): Response> + + @GET(Route.CHECK_CHANNEL_PUBLIC_LINK) + suspend fun checkChannelPublicLink(@Path("link") link: String): Response + + @POST(Route.CREATE_GROUP) + suspend fun createGroup(@Body groupInfo: CreateGroupRequest): Response + + @GET(Route.GET_GROUP) + suspend fun getGroup(@Path("id") id: Long): Response + + @DELETE(Route.DELETE_GROUP) + suspend fun deleteGroup(@Path("id") id: Long): Response + + @GET(Route.GET_GROUP_MEMBERS) + suspend fun getGroupMembers(@Path("id") id: Long): Response> + + @POST(Route.INVITE_USER_TO_GROUP) + suspend fun inviteUserToGroup( + @Path("groupId") groupId: Long, + @Path("userId") userId: Long + ): Response + + @DELETE(Route.REMOVE_USER_FROM_GROUP) + suspend fun removeUserFromGroup( + @Path("groupId") groupId: Long, + @Path("userId") userId: Long + ): Response + + @Streaming + @GET + fun downloadFile(@Url fileUrl: String): Call +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/NotificationService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/NotificationService.kt new file mode 100644 index 0000000..8b5f259 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/NotificationService.kt @@ -0,0 +1,10 @@ +package com.aiwazian.messenger.interfaces + +import com.aiwazian.messenger.data.Notification + +interface NotificationService { + fun showNotification( + notification: Notification, + messages: List + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/Profile.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/Profile.kt new file mode 100644 index 0000000..29cc589 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/Profile.kt @@ -0,0 +1,8 @@ +package com.aiwazian.messenger.interfaces + +import com.google.errorprone.annotations.Keep + +@Keep +interface Profile { + val id: Long +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/QrCodeService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/QrCodeService.kt new file mode 100644 index 0000000..06ab95e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/interfaces/QrCodeService.kt @@ -0,0 +1,5 @@ +package com.aiwazian.messenger.interfaces + +interface QrCodeService { + //fun createQrCode() +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/AppLockService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/AppLockService.kt new file mode 100644 index 0000000..7e55bb9 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/AppLockService.kt @@ -0,0 +1,64 @@ +package com.aiwazian.messenger.services + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AppLockService @Inject constructor() { + + private val _isLockApp = MutableStateFlow(false) + val isLockApp = _isLockApp.asStateFlow() + + private val _passcode = MutableStateFlow("") + + private val _hasPasscode = MutableStateFlow(false) + val hasPasscode = _hasPasscode.asStateFlow() + + private val coroutineScope = CoroutineScope(Dispatchers.IO) + + private val dataStoreManager = DataStoreManager.getInstance() + + init { + coroutineScope.launch { + val passcode = dataStoreManager.getPasscode().first() + _passcode.update { passcode } + + _hasPasscode.update { _passcode.value.isNotBlank() } + + val isLock = dataStoreManager.getIsLockApp().first() + _isLockApp.update { isLock } + } + } + + suspend fun lock() { + _isLockApp.update { true } + dataStoreManager.saveIsLockApp(true) + } + + suspend fun unlock() { + _isLockApp.update { false } + dataStoreManager.saveIsLockApp(false) + } + + suspend fun disablePasscode() { + _hasPasscode.update { false } + dataStoreManager.savePasscode("") + } + + suspend fun changePasscode(newPasscode: String) { + _passcode.update { newPasscode } + _hasPasscode.update { true } + dataStoreManager.savePasscode(newPasscode) + } + + fun checkPasscode(passcode: String): Boolean { + return passcode == _passcode.value + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/AuthService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/AuthService.kt new file mode 100644 index 0000000..73406d1 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/AuthService.kt @@ -0,0 +1,34 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.AuthRequest +import com.aiwazian.messenger.data.RegisterRequest +import com.aiwazian.messenger.utils.WebSocketManager +import javax.inject.Inject + +class AuthService @Inject constructor() { + + suspend fun logout() { + RetrofitInstance.api.logout() + WebSocketManager.close() + TokenManager.setAuthorized(false) + TokenManager.removeToken() + } + + suspend fun login(authRequest: AuthRequest): String? { + val response = RetrofitInstance.api.login(authRequest) + + return response.body()?.token + } + + suspend fun register(registerRequest: RegisterRequest): Boolean { + val response = RetrofitInstance.api.register(registerRequest) + + return response.isSuccessful + } + + suspend fun findUserByLogin(login: String): Boolean { + val response = RetrofitInstance.api.findUserByLogin(login) + return response.body()?.available == false + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ChannelService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ChannelService.kt new file mode 100644 index 0000000..53d7303 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ChannelService.kt @@ -0,0 +1,60 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.ChannelInfo +import com.aiwazian.messenger.data.CreateChannelRequest +import com.aiwazian.messenger.enums.ChannelType +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.types.EntityId +import javax.inject.Inject + +class ChannelService @Inject constructor() { + + suspend fun create(channel: ChannelInfo): Long? { + val response = RetrofitInstance.api.createChannel( + CreateChannelRequest( + name = channel.name, + bio = channel.bio.ifBlank { null }, + channelType = if (channel.channelType == ChannelType.PUBLIC.ordinal) "PUBLIC" else "PRIVATE", + username = channel.publicLink?.trim()?.trimStart('@')?.ifBlank { null } + ) + ) + return response.body()?.id + } + + suspend fun save(channel: ChannelInfo): Long? { + val response = RetrofitInstance.api.saveChannel(channel.id, channel) + return response.body()?.message?.toLongOrNull() + } + + suspend fun delete(id: Long): Boolean { + val response = RetrofitInstance.api.deleteChannel(id) + return response.isSuccessful + } + + suspend fun get(id: Long): ChannelInfo? { + val response = RetrofitInstance.api.getChannel(id) + return response.body() + } + + suspend fun join(id: Long): Boolean { + val response = RetrofitInstance.api.joinChannel(id) + return response.isSuccessful + } + + suspend fun leave(id: Long): Boolean { + val response = RetrofitInstance.api.leaveChannel(id) + return response.isSuccessful + } + + suspend fun isBusyPublicLick(link:String): Boolean { + val response = RetrofitInstance.api.checkChannelPublicLink(link) + return !response.isSuccessful + } + + suspend fun getSubscribers(id:Long): List? { + val response = RetrofitInstance.api.getChannelSubscribers(id) + return response.body() + } + +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ChatService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ChatService.kt new file mode 100644 index 0000000..b9eaee4 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ChatService.kt @@ -0,0 +1,135 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.Message +import com.aiwazian.messenger.data.SendMessageRequest +import okhttp3.MultipartBody +import javax.inject.Inject + +class ChatService @Inject constructor() { + + suspend fun sendMessage(chatId: Long, message: Message): Message? { + val response = RetrofitInstance.api.sendMessage( + chatId, + SendMessageRequest(message.text.orEmpty(), message.kanbanBoardId, message.kanbanTaskId) + ) + return if (response.isSuccessful) response.body() else null + } + + suspend fun sendDocument(fileUri: MultipartBody.Part, chatId: Long): Message? { + val response = RetrofitInstance.api.sendDocument(fileUri, chatId) + return if (response.isSuccessful) response.body() else null + } + + suspend fun getChatInfo(chatId: Long): ChatInfo? { + val response = RetrofitInstance.api.getChatInfo(chatId) + return response.body() + } + + suspend fun getAllChatsWithOtherUser(): List? { + val response = RetrofitInstance.api.getAllChatsWithOtherUser() + return response.body() + } + + suspend fun makeAsReadMessage( + chatId: Long, + messageId: Int + ): Boolean { + val response = RetrofitInstance.api.makeAsReadMessage( + chatId, + messageId + ) + + return response.isSuccessful + } + + suspend fun getChatLastMessage(chatId: Long): Message? { + return getChatMessages(chatId)?.lastOrNull() + } + + suspend fun getChatMessages(chatId: Long): List? { + val response = RetrofitInstance.api.getMessagesBetweenUsers(chatId) + return response.body() + } + + suspend fun archiveChat(chatId: Long): Boolean { + val response = RetrofitInstance.api.archiveChat(chatId) + return response.isSuccessful + } + + suspend fun unarchiveChat(chatId: Long): Boolean { + val response = RetrofitInstance.api.unarchiveChat(chatId) + return response.isSuccessful + } + + suspend fun pin( + chatId: Long, + folderId: Int + ): Boolean { + val response = if (folderId == 0) { + RetrofitInstance.api.pinChat(chatId) + } else { + RetrofitInstance.api.pinChatInFolder( + folderId, + chatId + ) + } + + return response.isSuccessful + } + + suspend fun unpin( + chatId: Long, + folderId: Int + ): Boolean { + val response = if (folderId == 0) { + RetrofitInstance.api.unpinChat(chatId) + } else { + RetrofitInstance.api.unpinChatInFolder( + folderId, + chatId + ) + } + + return response.isSuccessful + } + + suspend fun deleteMessage( + chatId: Long, + messageId: Int, + deleteForAll: Boolean + ): Boolean { + val response = RetrofitInstance.api.deleteMessage( + chatId, + messageId, + deleteForAll + ) + + return response.isSuccessful + } + + suspend fun deleteChat( + chatId: Long, + deleteForReceiver: Boolean + ): Boolean { + val response = RetrofitInstance.api.deleteChat( + chatId, + deleteForReceiver + ) + + return response.isSuccessful + } + + suspend fun deleteChatMessages( + chatId: Long, + deleteForReceiver: Boolean + ): Boolean { + val response = RetrofitInstance.api.deleteChatMessages( + chatId, + deleteForReceiver + ) + + return response.isSuccessful + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ClipboardHelper.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ClipboardHelper.kt new file mode 100644 index 0000000..16261e8 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ClipboardHelper.kt @@ -0,0 +1,16 @@ +package com.aiwazian.messenger.services + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context + +class ClipboardHelper(private val context: Context) { + fun copy(text: String) { + val clipboardManager = + context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + + val clipData = ClipData.newPlainText("label", text) + + clipboardManager.setPrimaryClip(clipData) + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DataStoreManager.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DataStoreManager.kt new file mode 100644 index 0000000..c35f392 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DataStoreManager.kt @@ -0,0 +1,126 @@ +package com.aiwazian.messenger.services + +import android.annotation.SuppressLint +import android.content.Context +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import com.aiwazian.messenger.enums.PrimaryColorOption +import com.aiwazian.messenger.enums.ThemeOption +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +private const val USER_PREFERENCES_NAME = "data_store" + +private val Context.dataStore by preferencesDataStore(USER_PREFERENCES_NAME) + +private object Keys { + val THEME = stringPreferencesKey("app_theme") + val TOKEN = stringPreferencesKey("token") + val PRIMARY_COLOR = stringPreferencesKey("primary_color") + val PASSCODE = stringPreferencesKey("passcode") + val IS_LOCK_APP = booleanPreferencesKey("is_lock_app") + val DYNAMIC_COLOR = booleanPreferencesKey("dynamic_color") +} + +class DataStoreManager private constructor(private val context: Context) { + companion object { + @SuppressLint("StaticFieldLeak") + @Volatile + private var INSTANCE: DataStoreManager? = null + + fun initialize(context: Context) { + if (INSTANCE == null) { + synchronized(this) { + if (INSTANCE == null) { + INSTANCE = DataStoreManager(context.applicationContext) + } + } + } + } + + fun getInstance(): DataStoreManager { + return INSTANCE ?: throw IllegalStateException("DataStoreManager is not initialized") + } + } + + private suspend fun setValue( + key: Preferences.Key, + value: T + ) { + context.dataStore.edit { settings -> + settings[key] = value + } + } + + private fun getValue( + key: Preferences.Key, + defaultValue: T + ): Flow { + return context.dataStore.data.map { pref -> + pref[key] ?: defaultValue + } + } + + suspend fun saveToken(token: String) = setValue( + Keys.TOKEN, + token + ) + + suspend fun savePasscode(passcode: String) = setValue( + Keys.PASSCODE, + passcode + ) + + suspend fun saveIsLockApp(isLock: Boolean) = setValue( + Keys.IS_LOCK_APP, + isLock + ) + + suspend fun savePrimaryColor(colorName: String) = setValue( + Keys.PRIMARY_COLOR, + colorName + ) + + suspend fun saveTheme(theme: ThemeOption) = setValue( + Keys.THEME, + theme.toString() + ) + + suspend fun saveDynamicColor(dynamicColor: Boolean) = setValue( + Keys.DYNAMIC_COLOR, + dynamicColor + ) + + fun getToken() = getValue( + Keys.TOKEN, + "" + ) + + fun getPasscode() = getValue( + Keys.PASSCODE, + "" + ) + + fun getIsLockApp() = getValue( + Keys.IS_LOCK_APP, + false + ) + + fun getPrimaryColor() = getValue( + Keys.PRIMARY_COLOR, + PrimaryColorOption.Blue.name + ) + + fun getTheme() = getValue( + Keys.THEME, + ThemeOption.SYSTEM.name + ) + + fun getDynamicColor() = getValue( + Keys.DYNAMIC_COLOR, + false + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DeviceHelper.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DeviceHelper.kt new file mode 100644 index 0000000..b0de824 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DeviceHelper.kt @@ -0,0 +1,22 @@ +package com.aiwazian.messenger.services + +import android.os.Build +import javax.inject.Inject + +class DeviceHelper @Inject constructor() { + + fun getDeviceName(): String { + val manufacturer = Build.MANUFACTURER + val model = Build.MODEL + + return if (model.startsWith(manufacturer, ignoreCase = true)) { + model + } else { + "$manufacturer $model" + } + } + + fun getOsVersion(): String = Build.VERSION.RELEASE + + fun getOsName(): String = "Android" +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DialogController.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DialogController.kt new file mode 100644 index 0000000..08c177e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/DialogController.kt @@ -0,0 +1,19 @@ +package com.aiwazian.messenger.services + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue + +class DialogController { + + var isVisible by mutableStateOf(false) + private set + + fun show() { + isVisible = true + } + + fun hide() { + isVisible = false + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/FolderService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/FolderService.kt new file mode 100644 index 0000000..d0f0cee --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/FolderService.kt @@ -0,0 +1,26 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.FolderInfo +import javax.inject.Inject + +class FolderService @Inject constructor() { + + suspend fun getAll(): List? { + return emptyList() + } + + suspend fun save(folderInfo: FolderInfo): Int? { + val request = RetrofitInstance.api.saveFolder(folderInfo) + + val savedFolderId = request.body()?.message?.toInt() + + return savedFolderId + } + + suspend fun remove(folderId: Int): Boolean { + val request = RetrofitInstance.api.deleteFolder(folderId) + + return request.isSuccessful + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/GroupService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/GroupService.kt new file mode 100644 index 0000000..d53cc72 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/GroupService.kt @@ -0,0 +1,56 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.GroupInfo +import com.aiwazian.messenger.data.CreateGroupRequest +import com.aiwazian.messenger.data.UserInfo +import javax.inject.Inject + +class GroupService @Inject constructor() { + + suspend fun create(groupInfo: GroupInfo): Long? { + val response = RetrofitInstance.api.createGroup( + CreateGroupRequest(groupInfo.name, groupInfo.bio.ifBlank { null }) + ) + return response.body()?.id + } + + suspend fun get(id: Long): GroupInfo? { + val response = RetrofitInstance.api.getGroup(id) + return response.body() + } + + suspend fun delete(id: Long): Boolean { + val response = RetrofitInstance.api.deleteGroup(id) + return response.isSuccessful + } + + suspend fun getMembers(id: Long): List? { + val response = RetrofitInstance.api.getGroupMembers(id) + return response.body() + } + + suspend fun inviteUserToGroup( + groupId: Long, + userId: Long + ): Boolean { + return try { + val response = RetrofitInstance.api.inviteUserToGroup(groupId, userId) + response.isSuccessful + } catch (e: Exception) { + false + } + } + + suspend fun removeUserFromGroup( + groupId: Long, + userId: Long + ): Boolean { + return try { + val response = RetrofitInstance.api.removeUserFromGroup(groupId, userId) + response.isSuccessful + } catch (e: Exception) { + false + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/NotificationService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/NotificationService.kt new file mode 100644 index 0000000..cc7d89f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/NotificationService.kt @@ -0,0 +1,201 @@ +package com.aiwazian.messenger.services + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Intent +import android.util.Log +import androidx.core.app.NotificationCompat +import com.aiwazian.messenger.MainActivity +import com.aiwazian.messenger.R +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.Notification +import com.aiwazian.messenger.data.NotificationTokenRequest +import com.aiwazian.messenger.interfaces.NotificationService +import com.aiwazian.messenger.utils.ChatState +import com.aiwazian.messenger.utils.NotificationChannelConstants +import com.aiwazian.messenger.utils.VibrationPattern +import com.google.firebase.messaging.FirebaseMessaging +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine + +private data class ChatNotificationData( + val chatId: Long, + val title: String, + val messages: MutableList +) + +private val chatNotifications = mutableMapOf() + +class NotificationService : FirebaseMessagingService(), NotificationService { + + override fun onCreate() { + super.onCreate() + createNotificationChannel() + } + + private fun createNotificationChannel() { + val personalMessages = NotificationChannelConstants.PERSONAL_MESSAGES + + val importance = NotificationManager.IMPORTANCE_HIGH + + val channel = NotificationChannel( + personalMessages.id, + personalMessages.name, + importance + ).apply { + description = personalMessages.description + enableVibration(true) + vibrationPattern = VibrationPattern.Notification + } + + val notificationManager: NotificationManager = + getSystemService(NOTIFICATION_SERVICE) as NotificationManager + + notificationManager.createNotificationChannel(channel) + } + + override fun onNewToken(token: String) { + super.onNewToken(token) + + CoroutineScope(Dispatchers.IO).launch { + sendTokenToServer(token) + } + } + + suspend fun getFirebaseToken(): String { + return suspendCoroutine { continuation -> + FirebaseMessaging.getInstance().token.addOnCompleteListener { task -> + if (task.isSuccessful) { + val token = task.result + if (token != null) { + continuation.resume(token) + } else { + continuation.resumeWithException(IllegalStateException("Token is null")) + } + } else { + continuation.resumeWithException( + task.exception ?: IllegalStateException("Unknown error") + ) + } + } + } + } + + suspend fun sendTokenToServer(token: String) { + try { + val request = NotificationTokenRequest(token) + val response = RetrofitInstance.api.updateFcmToken(request) + + if (response.isSuccessful) { + Log.d( + "NotificationService", + "Токен обновлен" + ) + } else { + Log.e( + "NotificationService", + "Ошибка при обновлении токена: ${response.code()}" + ) + } + } catch (e: Exception) { + Log.e( + "NotificationService", + "Ошибка при получении токена", + e + ) + } + } + + override fun onMessageReceived(remoteMessage: RemoteMessage) { + val chatId = remoteMessage.data["chatId"]?.toLongOrNull() ?: return + val title = remoteMessage.data["title"] ?: "Messenger" + val body = remoteMessage.data["body"] ?: "" + + if (!ChatState.isChatOpen(chatId)) { + val chatData = chatNotifications.getOrPut(chatId) { + ChatNotificationData( + chatId = chatId, + title = title, + messages = mutableListOf() + ) + } + + if (chatData.messages.size >= 5) { + chatData.messages.removeAt(0) + } + + chatData.messages.add(body) + + val notification = Notification( + chatId, + title, + body + ) + + showNotification( + notification = notification, + messages = chatData.messages + ) + } + } + + override fun showNotification( + notification: Notification, + messages: List + ) { + val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager + val channelId = NotificationChannelConstants.PERSONAL_MESSAGES.id + val groupKey = "CHAT_GROUP_${notification.chatId}" + + val notificationText = messages.joinToString(separator = "\n") + + val bigTextStyle = NotificationCompat.BigTextStyle() + .bigText(notificationText) + .setSummaryText(notification.title) + + val intent = Intent( + this, + MainActivity::class.java + ).apply { + putExtra( + "chatId", + notification.chatId + ) + flags = Intent.FLAG_ACTIVITY_SINGLE_TOP + } + + val pendingIntent = PendingIntent.getActivity( + this, + notification.chatId.toInt(), + intent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + + val summaryNotification = NotificationCompat.Builder( + this, + channelId + ) + .setContentTitle(notification.title) + .setContentText(notificationText) + .setStyle(bigTextStyle) + .setSmallIcon(R.mipmap.new_app_icon_round) + .setGroup(groupKey) + .setGroupSummary(true) + .setContentIntent(pendingIntent) + .setVibrate(VibrationPattern.Notification) + .setAutoCancel(true) + .build() + + notificationManager.notify( + notification.chatId.toInt(), + summaryNotification + ) + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/PrivacyService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/PrivacyService.kt new file mode 100644 index 0000000..289b107 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/PrivacyService.kt @@ -0,0 +1,13 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.PrivacySettings +import javax.inject.Inject + +class PrivacyService @Inject constructor() { + + suspend fun getMyPrivacy(): PrivacySettings? { + val response = RetrofitInstance.api.getMyPrivacy() + return response.body() + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/QrCodeService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/QrCodeService.kt new file mode 100644 index 0000000..ca2b27e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/QrCodeService.kt @@ -0,0 +1,43 @@ +package com.aiwazian.messenger.services + +import android.graphics.Bitmap +import android.graphics.Color +import com.google.zxing.BarcodeFormat +import com.google.zxing.EncodeHintType +import com.google.zxing.qrcode.QRCodeWriter +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel +import java.util.EnumMap +import androidx.core.graphics.createBitmap +import androidx.core.graphics.set +import com.aiwazian.messenger.interfaces.QrCodeService + +class QrCodeService : QrCodeService { + fun createQrCode(content: String, size: Int): Bitmap? { + try { + val hints = EnumMap(EncodeHintType::class.java) + hints[EncodeHintType.CHARACTER_SET] = "UTF-8" + hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.H + + val writer = QRCodeWriter() + val bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, size, size, hints) + + val width = bitMatrix.width + val height = bitMatrix.height + val bitmap = createBitmap(width, height, Bitmap.Config.RGB_565) + + for (x in 0 until width) { + for (y in 0 until height) { + bitmap[x, y] = if (bitMatrix.get(x, y)) Color.BLACK else Color.WHITE + } + } + return bitmap + } catch (e: Exception) { + e.printStackTrace() + return null + } + } + + fun scan() { + + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/SearchService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/SearchService.kt new file mode 100644 index 0000000..2d357ff --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/SearchService.kt @@ -0,0 +1,13 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.SearchInfo +import javax.inject.Inject + +class SearchService @Inject constructor() { + + suspend fun searchUserByUsername(query: String): List? { + val response = RetrofitInstance.api.searchUser(query) + return response.body() + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/SessionService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/SessionService.kt new file mode 100644 index 0000000..bb35b2e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/SessionService.kt @@ -0,0 +1,28 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.SessionInfo +import javax.inject.Inject + +class SessionService @Inject constructor() { + + suspend fun terminateSession(sessionId: Int): Boolean { + val response = RetrofitInstance.api.terminateSession(sessionId) + return response.isSuccessful + } + + suspend fun terminateAllSessions(): Boolean { + val response = RetrofitInstance.api.terminateAllSessions() + return response.isSuccessful + } + + suspend fun getSessions(): List? { + val response = RetrofitInstance.api.getSessions() + + if (response.isSuccessful) { + return response.body() ?: emptyList() + } + + return null + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ThemeService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ThemeService.kt new file mode 100644 index 0000000..7c6a5f8 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/ThemeService.kt @@ -0,0 +1,62 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.enums.PrimaryColorOption +import com.aiwazian.messenger.enums.ThemeOption +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ThemeService @Inject constructor() { + + private val _currentTheme = MutableStateFlow(ThemeOption.SYSTEM) + val currentTheme = _currentTheme.asStateFlow() + + private val _primaryColor = MutableStateFlow(PrimaryColorOption.Blue) + val primaryColor = _primaryColor.asStateFlow() + + private val _dynamicColor = MutableStateFlow(false) + val dynamicColor = _dynamicColor.asStateFlow() + + private val dataStorage = DataStoreManager.Companion.getInstance() + + init { + val coroutineScope = CoroutineScope(Dispatchers.IO) + + coroutineScope.launch { + val theme = dataStorage.getTheme().first() + _currentTheme.update { ThemeOption.fromString(theme) } + } + + coroutineScope.launch { + val primaryColor = dataStorage.getPrimaryColor().first() + _primaryColor.update { PrimaryColorOption.fromString(primaryColor) } + } + + coroutineScope.launch { + val dynamicColor = dataStorage.getDynamicColor().first() + _dynamicColor.update { dynamicColor } + } + } + + suspend fun setDynamicColor(dynamicColor: Boolean) { + _dynamicColor.update { dynamicColor } + dataStorage.saveDynamicColor(dynamicColor) + } + + suspend fun setTheme(theme: ThemeOption) { + _currentTheme.update { theme } + dataStorage.saveTheme(theme) + } + + suspend fun setPrimaryColor(color: PrimaryColorOption) { + _primaryColor.update { color } + dataStorage.savePrimaryColor(color.name) + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/TokenManager.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/TokenManager.kt new file mode 100644 index 0000000..468d94a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/TokenManager.kt @@ -0,0 +1,46 @@ +package com.aiwazian.messenger.services + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.update + +object TokenManager { + + private val _token = MutableStateFlow("") + + private var _isAuthorized = false + + private var unauthorizedCallback: (() -> Unit)? = null + + fun getToken() = _token.value + + fun setAuthorized(value: Boolean) { + _isAuthorized = value + } + + fun isAuthorized() = _isAuthorized + + suspend fun init() { + val dataStore = DataStoreManager.getInstance() + _token.update { dataStore.getToken().first() } + _isAuthorized = _token.value.isNotBlank() + } + + suspend fun saveToken(token: String) { + _token.update { token } + val dataStore = DataStoreManager.getInstance() + dataStore.saveToken(token) + } + + suspend fun removeToken() { + _token.update { "" } + val dataStore = DataStoreManager.getInstance() + dataStore.saveToken("") + } + + fun setUnauthorizedCallback(callback: () -> Unit) { + unauthorizedCallback = callback + } + + fun getUnauthorizedCallback() = unauthorizedCallback +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/UserManager.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/UserManager.kt new file mode 100644 index 0000000..68422ef --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/UserManager.kt @@ -0,0 +1,32 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.database.repository.UserRepository +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update + +object UserManager { + + private val _userInfo = MutableStateFlow(UserInfo()) + val user = _userInfo.asStateFlow() + + fun updateUserInfo(updatedUserInfo: UserInfo) { + val newUserInfo = _userInfo.value.copy( + firstName = updatedUserInfo.firstName, + lastName = updatedUserInfo.lastName, + bio = updatedUserInfo.bio, + username = updatedUserInfo.username, + dateOfBirth = updatedUserInfo.dateOfBirth, + ) + _userInfo.update { newUserInfo } + } + + suspend fun loadUserData(userRepository: UserRepository) { + val user = userRepository.getMe() + + if (user != null) { + _userInfo.update { user } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/UserService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/UserService.kt new file mode 100644 index 0000000..d9b6380 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/UserService.kt @@ -0,0 +1,40 @@ +package com.aiwazian.messenger.services + +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.data.UpdateProfileRequest +import com.aiwazian.messenger.data.UpdateUsernameRequest +import javax.inject.Inject + +class UserService @Inject constructor() { + + suspend fun updateProfile(userInfo: UserInfo): Boolean { + val response = RetrofitInstance.api.updateProfile(userInfo.toUpdateRequest()) + return response.isSuccessful + } + + suspend fun getById(userId: Long): UserInfo? { + val response = RetrofitInstance.api.getUserById(userId) + return response.body() + } + + suspend fun checkUsername(username: String): Boolean { + val response = RetrofitInstance.api.checkUsername(username) + return response.isSuccessful && response.body()?.available == true + } + + suspend fun saveUsername(username: String): Boolean { + val response = RetrofitInstance.api.saveUsername( + UpdateUsernameRequest(username.ifBlank { null }) + ) + return response.isSuccessful + } + + private fun UserInfo.toUpdateRequest() = UpdateProfileRequest( + firstName = firstName, + lastName = lastName.ifBlank { null }, + username = username, + bio = bio.ifBlank { null }, + dateOfBirth = dateOfBirth + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/services/VibrateService.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/VibrateService.kt new file mode 100644 index 0000000..a21c9b1 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/services/VibrateService.kt @@ -0,0 +1,23 @@ +package com.aiwazian.messenger.services + +import android.content.Context +import android.os.Build +import android.os.VibrationEffect +import android.os.Vibrator +import android.os.VibratorManager +import com.aiwazian.messenger.utils.VibrationPattern + +class VibrateService(private val context: Context) { + + fun vibrate(pattern: LongArray) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + val vibratorManager = + context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager + val vibrator = vibratorManager.defaultVibrator + vibrator.vibrate(VibrationEffect.createWaveform(pattern, -1)) + } else { + val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + vibrator.vibrate(VibrationEffect.createWaveform(pattern, -1)) + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/types/EntityId.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/types/EntityId.kt new file mode 100644 index 0000000..966b831 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/types/EntityId.kt @@ -0,0 +1,3 @@ +package com.aiwazian.messenger.types + +typealias EntityId = Int \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ArchiveScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ArchiveScreen.kt new file mode 100644 index 0000000..fe311c7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ArchiveScreen.kt @@ -0,0 +1,185 @@ +package com.aiwazian.messenger.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +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.outlined.ArrowBack +import androidx.compose.material.icons.filled.Archive +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material.icons.outlined.QuestionMark +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material.icons.outlined.Unarchive +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.DropdownMenuAction +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SwipeableChatCard +import com.aiwazian.messenger.viewModels.ArchiveViewModel +import com.aiwazian.messenger.viewModels.MainViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun ArchiveScreen(mainViewModel: MainViewModel) { + Content(mainViewModel) +} + +@Composable +private fun Content(mainViewModel: MainViewModel) { + val navViewModel = viewModel() + val archiveViewModel = viewModel() + + val archiveInfoDialog = archiveViewModel.archiveInfoBottomDialog + + val chatList by mainViewModel.archivedChats.collectAsState() + + val action = listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.Outlined.Settings, + text = stringResource(R.string.archive_settings), + onClick = { + navViewModel.addScreenInStack { + + } + }), + DropdownMenuAction( + icon = Icons.Outlined.QuestionMark, + text = stringResource(R.string.how_does_it_work), + onClick = archiveInfoDialog::show + ) + ) + ) + ) + + Scaffold( + topBar = { + PageTopBar( + title = { + Text(text = stringResource(R.string.archive)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = action + ) + }, + ) { innerPadding -> + Column( + modifier = Modifier.padding(innerPadding) + ) { + val user by UserManager.user.collectAsState() + + LazyColumn { + items( + chatList, + key = { it.id }) { chat -> + + var chatInfo = chat + + if (chatInfo.id == user.id) { + chatInfo = chat.copy(chatName = stringResource(R.string.saved_messages)) + } + + SwipeableChatCard( + chatInfo = chatInfo, + onClick = { + navViewModel.addScreenInStack { + ChatScreen(chatInfo.id) + } + }, + backgroundIcon = Icons.Outlined.Unarchive, + onDismiss = { + mainViewModel.unarchiveChat(chatInfo.id) + }) + } + } + } + + if (archiveInfoDialog.isVisible) { + BottomModal( + onDismissRequest = archiveInfoDialog::hide, + onConfirmRequest = archiveInfoDialog::hide + ) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun BottomModal( + onDismissRequest: () -> Unit, + onConfirmRequest: () -> Unit +) { + ModalBottomSheet( + onDismissRequest = onDismissRequest, + dragHandle = null + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(top = 20.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Box( + modifier = Modifier + .clip(CircleShape) + .background(MaterialTheme.colorScheme.primary) + ) { + Icon( + imageVector = Icons.Filled.Archive, + modifier = Modifier + .padding(14.dp) + .size(40.dp), + contentDescription = null, + tint = MaterialTheme.colorScheme.onPrimary, + ) + } + + Button( + onClick = onConfirmRequest, + modifier = Modifier + .fillMaxWidth() + .padding(15.dp), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary + ), + shape = RoundedCornerShape(10.dp) + ) { + Text( + text = stringResource(R.string.ok).uppercase(), + modifier = Modifier.padding(8.dp) + ) + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ChatScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ChatScreen.kt new file mode 100644 index 0000000..7ac4bfa --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ChatScreen.kt @@ -0,0 +1,1396 @@ +package com.aiwazian.messenger.ui + +import android.net.Uri +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.scaleIn +import androidx.compose.animation.scaleOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.rememberOverscrollEffect +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.Logout +import androidx.compose.material.icons.automirrored.outlined.Send +import androidx.compose.material.icons.filled.Download +import androidx.compose.material.icons.outlined.AccountCircle +import androidx.compose.material.icons.outlined.Attachment +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material.icons.outlined.ContentCopy +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.DeleteOutline +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material.icons.outlined.Storage +import androidx.compose.material.icons.outlined.ViewKanban +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Checkbox +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +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.draw.rotate +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.layout.positionInParent +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.PopupProperties +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.ChannelInfo +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.DropdownMenuAction +import com.aiwazian.messenger.data.GroupInfo +import com.aiwazian.messenger.data.Message +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.enums.ChatType +import com.aiwazian.messenger.enums.DownloadStatus +import com.aiwazian.messenger.enums.FileType +import com.aiwazian.messenger.services.ClipboardHelper +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.MessageFile +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.utils.Shape +import com.aiwazian.messenger.utils.WebSocketManager +import com.aiwazian.messenger.utils.formatFileSize +import com.aiwazian.messenger.utils.getFileExtension +import com.aiwazian.messenger.utils.isFileExists +import com.aiwazian.messenger.viewModels.ChannelViewModel +import com.aiwazian.messenger.viewModels.ChatViewModel +import com.aiwazian.messenger.viewModels.MainViewModel +import com.aiwazian.messenger.viewModels.KanbanViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch +import java.text.SimpleDateFormat +import java.time.Instant +import java.time.ZoneId +import java.util.Locale +import java.time.format.TextStyle as MonthTextStyle + +@Composable +fun ChatScreen(chatId: Long) { + Content(chatId) +} + +@Composable +private fun Content(chatId: Long) { + val navViewModel = viewModel() + + val mainViewModel = hiltViewModel() + + val chatViewModel = hiltViewModel() + + val chatInfo by chatViewModel.chatInfo.collectAsState() + + val selectedMessages by chatViewModel.selectedMessages.collectAsState() + + val scope = rememberCoroutineScope() + + LaunchedEffect(Unit) { + chatViewModel.open(chatId) + chatViewModel.onChatDeleted = { + navViewModel.goToMain() + } + } + + DisposableEffect(Unit) { + onDispose { + chatViewModel.close() + } + } + + val profile by chatViewModel.profile.collectAsState() + + val deleteChatDialog = chatViewModel.deleteChatDialog + val clearHistoryChatDialog = chatViewModel.clearHistoryDialog + val deleteMessageDialog = chatViewModel.deleteMessageDialog + + val messageText by chatViewModel.messageText.collectAsState() + + val messages by chatViewModel.messages.collectAsState() + + var subTitle by remember { mutableStateOf("") } + + val listState = rememberLazyListState() + + var isVisibleLeaveDialog by remember { mutableStateOf(false) } + + var actions = listOf() + + when (ChatType.fromId(chatId)) { + ChatType.PRIVATE -> { + subTitle = "" + + actions = listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.Outlined.DeleteOutline, + text = stringResource(R.string.delete_chat), + onClick = deleteChatDialog::show + ) + ) + ) + ) + } + + ChatType.CHANNEL -> { + if (profile is ChannelInfo) { + subTitle = + "${(profile as ChannelInfo).subscribers} ${stringResource(R.string.subscriberCount).lowercase()}" + } + + if (profile is ChannelInfo && (profile as ChannelInfo).ownerId != chatViewModel.myId) { + actions = listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.AutoMirrored.Outlined.Logout, + text = stringResource(R.string.leave_channel), + onClick = { + isVisibleLeaveDialog = true + }) + ) + ) + ) + } + } + + ChatType.GROUP -> { + if (profile is GroupInfo) { + val group = profile as GroupInfo + subTitle = "${group.members} ${stringResource(R.string.members)}" + + if (group.ownerId != chatViewModel.myId) { + actions = listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.AutoMirrored.Outlined.Logout, + text = stringResource(R.string.leave_group), + onClick = { + isVisibleLeaveDialog = true + }) + ) + ) + ) + } + } + } + + else -> {} + } + + LaunchedEffect(messages.size) { + if (messages.isNotEmpty()) { + listState.animateScrollToItem(index = messages.lastIndex) + } + } + + Scaffold( + topBar = { + TopBar( + chatInfo, + subTitle, + actions + ) + }) { innerPadding -> + Column( + modifier = Modifier.padding(innerPadding) + ) { + if (messages.isEmpty()) { + Box( + modifier = Modifier + .weight(1f) + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + EmptyChatPlaceholder() + } + } else { + LazyColumn( + state = listState, + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.Bottom, + overscrollEffect = rememberOverscrollEffect() + ) { + itemsIndexed(items = messages) { index, message -> + val currentMessageSendDate = + Instant.ofEpochMilli(message.sendTime) + .atZone(ZoneId.systemDefault()) + .toLocalDate() + + val monthName = currentMessageSendDate.month.getDisplayName( + MonthTextStyle.FULL, + Locale.getDefault() + ) + + val capitalizedMonthName = monthName.replaceFirstChar { + if (it.isLowerCase()) { + it.titlecase(Locale.getDefault()) + } else { + it.toString() + } + } + + val showDateSeparator = if (index > 0) { + val previousMessageSendDate = + Instant.ofEpochMilli(messages[index - 1].sendTime) + .atZone(ZoneId.systemDefault()) + .toLocalDate() + !currentMessageSendDate.isEqual(previousMessageSendDate) + } else { + true + } + + if (showDateSeparator) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp), + horizontalArrangement = Arrangement.Center + ) { + Box( + modifier = Modifier.clip(CircleShape) + ) { + Text( + text = "${currentMessageSendDate.dayOfMonth} $capitalizedMonthName", + textAlign = TextAlign.Center + ) + } + } + } + + MessageBubble( + message = message, + chatId = chatId, + onSeen = { + if (!message.isRead) { + scope.launch { + chatViewModel.markAsReadMessage(message) + } + } + }) + } + } + } + + if (ChatType.fromId(chatId) == ChatType.CHANNEL && profile is ChannelInfo) { + if ((profile as ChannelInfo).ownerId == chatViewModel.myId) { + InputMessage( + value = messageText, + onValueChange = chatViewModel::changeText, + onSendMessage = { + scope.launch { + val sentMessage = chatViewModel.sendMessage() + + if (sentMessage != null) { + mainViewModel.onSendMessage(sentMessage) + } + } + }) + } else { + val channelViewModel = hiltViewModel() + + var isJoined by remember { mutableStateOf((profile as ChannelInfo).isSubscribed) } + + if (isJoined) { + var isMuted by remember { mutableStateOf(false) } + + TextButton( + shape = RectangleShape, + modifier = Modifier.fillMaxWidth(), + onClick = { + isMuted = !isMuted + }) { + AnimatedContent( + targetState = isMuted, + transitionSpec = { + slideInVertically(tween(200)) { height -> height } + fadeIn( + tween(200) + ) + scaleIn( + tween(200) + ) togetherWith slideOutVertically(tween(200)) { height -> -height } + fadeOut( + tween(200) + ) + scaleOut(tween(200)) + }) { isMute -> + Text( + text = if (isMute) { + stringResource(R.string.mute).uppercase() + } else { + stringResource(R.string.unmute).uppercase() + }, + modifier = Modifier + .padding(vertical = 8.dp) + .fillMaxWidth(), + fontSize = 18.sp, + textAlign = TextAlign.Center + ) + } + } + } else { + TextButton( + shape = RectangleShape, + modifier = Modifier.fillMaxWidth(), + onClick = { + scope.launch { + val isJoin = channelViewModel.tryJoin(chatInfo.id) + + isJoined = isJoin + + if (isJoin) { + mainViewModel.showNewChat( + chatInfo, + messages.lastOrNull() + ) + } + } + }) { + Text( + text = stringResource(R.string.join).uppercase(), + modifier = Modifier.padding(vertical = 8.dp), + fontSize = 18.sp, + color = MaterialTheme.colorScheme.primary + ) + } + } + } + } else { + InputMessage( + value = messageText, + onValueChange = chatViewModel::changeText, + onSendMessage = { + scope.launch { + val sentMessage = chatViewModel.sendMessage() + + if (sentMessage != null) { + mainViewModel.onSendMessage(sentMessage) + } + } + }) + } + } + + if (deleteChatDialog.isVisible) { + DeleteChatDialog( + onDismissRequest = deleteChatDialog::hide, + onConfirm = { deleteForReceiver -> + scope.launch { + val isDeleted = chatViewModel.tryDeleteChat(deleteForReceiver) + + if (isDeleted) { + deleteChatDialog.hide() + mainViewModel.deleteChat(chatInfo.id) + navViewModel.goToMain() + } + } + }, + chatInfo = chatInfo + ) + } + + if (clearHistoryChatDialog.isVisible) { + DeleteChatDialog( + onDismissRequest = clearHistoryChatDialog::hide, + onConfirm = { deleteForReceiver -> + scope.launch { + val isDeleted = chatViewModel.tryDeleteChatMessages(deleteForReceiver) + + if (isDeleted) { + clearHistoryChatDialog.hide() + } + } + }, + chatInfo = chatInfo + ) + } + + if (deleteMessageDialog.isVisible) { + DeleteMessageDialog( + onDismissRequest = deleteMessageDialog::hide, + onConfirm = { deleteForAll -> + scope.launch { + selectedMessages.forEach { message -> + val isDeleted = chatViewModel.tryDeleteMessage( + message.id, + deleteForAll + ) + + if (isDeleted) { + chatViewModel.unselectMessage(message) + deleteMessageDialog.hide() + } + } + } + }, + chatInfo = chatInfo + ) + } + + val channelViewModel = hiltViewModel() + + if (isVisibleLeaveDialog) { + LeaveChannelDialog( + onConfirm = { + scope.launch { + val isLeaved = channelViewModel.tryLeave(chatInfo.id) + + isVisibleLeaveDialog = false + + if (isLeaved) { + mainViewModel.deleteChat(chatInfo.id) + navViewModel.goToMain() + } + } + }, + onDismiss = { + isVisibleLeaveDialog = false + }, + channelName = chatInfo.chatName + ) + } + } +} + +@Composable +private fun EmptyChatPlaceholder() { + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Card( + modifier = Modifier.widthIn(max = 280.dp), + shape = RoundedCornerShape(16.dp), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surface + ), + elevation = CardDefaults.cardElevation(4.dp) + ) { + Column(modifier = Modifier.padding(14.dp)) { + Text( + text = "Напишите сообщение или отправьте стикер", + textAlign = TextAlign.Center + ) + } + } + } +} + +@Composable +private fun TopBar( + chat: ChatInfo, + subTitle: String, + dropdownActions: List +) { + val navViewModel = viewModel() + + val me by UserManager.user.collectAsState() + + val isConnected by WebSocketManager.isConnectedState.collectAsState() + + val interactionSource = remember { MutableInteractionSource() } + + val isPressed by interactionSource.collectIsPressedAsState() + + val scale by animateFloatAsState( + targetValue = if (isPressed) 0.95f else 1f, + label = "card_scale_animation" + ) + + PageTopBar( + title = { + Card( + shape = RectangleShape, + modifier = Modifier + .fillMaxWidth() + .graphicsLayer( + scaleX = scale, + scaleY = scale + ) + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = { + navViewModel.addScreenInStack { + ProfileScreen(chat.id) + } + }), + colors = CardDefaults.cardColors( + containerColor = Color.Transparent + ) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Icon( + imageVector = Icons.Outlined.AccountCircle, + contentDescription = null + ) + + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.Center + ) { + val chatName = if (chat.id == me.id) { + stringResource(R.string.saved_messages) + } else { + chat.chatName + } + + Text( + text = chatName, + maxLines = 1, + fontSize = 18.sp, + lineHeight = 16.sp, + overflow = TextOverflow.Ellipsis, + ) + + AnimatedContent( + targetState = isConnected, + transitionSpec = { slideInVertically(tween(200)) togetherWith slideOutVertically(tween(200)) }) { isConnected -> + if (!isConnected) { + Text( + text = "${stringResource(R.string.connecting)}...", + fontSize = 12.sp, + lineHeight = 12.sp, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.fillMaxWidth() + ) + } else { + Text( + text = subTitle, + fontSize = 12.sp, + lineHeight = 12.sp, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.fillMaxWidth() + ) + } + } + } + } + } + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = dropdownActions + ) +} + +@Composable +private fun DeleteChatDialog( + onDismissRequest: () -> Unit, + onConfirm: (Boolean) -> Unit, + chatInfo: ChatInfo +) { + var deleteForReceiver by remember { mutableStateOf(false) } + + CustomDialog( + title = stringResource(R.string.delete_chat), + onDismissRequest = onDismissRequest, + content = { + val me by UserManager.user.collectAsState() + + val chatName = if (chatInfo.id != me.id) " c " + chatInfo.chatName.trimEnd() else "" + + Text( + text = "Удалить чат$chatName без возможности восстановления?", + lineHeight = 16.sp + ) + + if (chatInfo.id != me.id) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .clip(RoundedCornerShape(10.dp)) + .clickable { + deleteForReceiver = !deleteForReceiver + }) { + Row(modifier = Modifier.padding(10.dp)) { + Checkbox( + modifier = Modifier.padding(end = 10.dp), + checked = deleteForReceiver, + onCheckedChange = null + ) + Text( + text = "Также удалить для ${chatInfo.chatName}", + fontSize = 14.sp, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + } else { + deleteForReceiver = true + } + }, + buttons = { + TextButton(onClick = onDismissRequest) { + Text(stringResource(R.string.cancel)) + } + + TextButton( + onClick = { + onConfirm(deleteForReceiver) + }, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error + ) + ) { + Text(stringResource(R.string.delete_chat)) + } + }) +} + +@Composable +private fun DeleteMessageDialog( + onDismissRequest: () -> Unit, + onConfirm: (Boolean) -> Unit, + chatInfo: ChatInfo +) { + var deleteForReceiver by remember { mutableStateOf(false) } + + CustomDialog( + title = stringResource(R.string.delete_message), + onDismissRequest = onDismissRequest, + content = { + val me by UserManager.user.collectAsState() + + Text( + text = stringResource(R.string.delete_message_description), + lineHeight = 16.sp + ) + + if (chatInfo.id != me.id) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp) + .clip(RoundedCornerShape(10.dp)) + .clickable { + deleteForReceiver = !deleteForReceiver + }) { + Row(modifier = Modifier.padding(10.dp)) { + Checkbox( + modifier = Modifier.padding(end = 10.dp), + checked = deleteForReceiver, + onCheckedChange = null + ) + Text( + text = "${stringResource(R.string.also_delete_for)} ${chatInfo.chatName}", + fontSize = 14.sp, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + } else { + deleteForReceiver = true + } + }, + buttons = { + TextButton(onClick = onDismissRequest) { + Text(stringResource(R.string.cancel)) + } + + TextButton( + onClick = { + onConfirm(deleteForReceiver) + }, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error + ) + ) { + Text(stringResource(R.string.delete)) + } + }) +} + +@Composable +private fun LeaveChannelDialog( + onDismiss: () -> Unit, + onConfirm: () -> Unit, + channelName: String +) { + CustomDialog( + title = stringResource(R.string.leave_channel), + onDismissRequest = onDismiss, + buttons = { + TextButton(onClick = onDismiss) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = onConfirm, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error) + ) { + Text(stringResource(R.string.leave_channel)) + } + }) { + Text(text = buildAnnotatedString { + append(stringResource(R.string.leave_channel_confirm)) + + withStyle(style = SpanStyle(fontWeight = FontWeight.W500)) { + append( + " $channelName" + ) + } + + append("?") + }) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun InputMessage( + value: String, + onValueChange: (String) -> Unit, + onSendMessage: () -> Unit, + attachFile: () -> Unit = { }, +) { + var attachmentModal by remember { mutableStateOf(false) } + + TextField( + shape = RectangleShape, + value = value, + onValueChange = onValueChange, + maxLines = 5, + modifier = Modifier.fillMaxWidth(), + placeholder = { + Text(stringResource(R.string.message)) + }, + colors = TextFieldDefaults.colors( + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + ), + trailingIcon = { + Row { + IconButton(onClick = { attachmentModal = true }) { + Icon( + imageVector = Icons.Outlined.Attachment, + contentDescription = null, + modifier = Modifier.rotate(135f) + ) + } + IconButton(onClick = onSendMessage) { + Icon( + imageVector = Icons.AutoMirrored.Outlined.Send, + contentDescription = null, + ) + } + } + }) + + val viewModel = hiltViewModel() + val kanbanViewModel = androidx.lifecycle.viewmodel.compose.viewModel() + val boards by kanbanViewModel.boards.collectAsState() + val kanbanScope = rememberCoroutineScope() + + val context = LocalContext.current + + val filePickerLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.OpenMultipleDocuments(), + onResult = { uris: List -> + if (uris.isNotEmpty()) { + viewModel.sendDocument( + context, + uris + ) + + attachmentModal = false + } + }) + + if (attachmentModal) { + ModalBottomSheet(onDismissRequest = { attachmentModal = false }) { + Column { + Card( + onClick = { + filePickerLauncher.launch(arrayOf("*/*")) + }, + modifier = Modifier.fillMaxWidth(), + shape = RectangleShape, + colors = CardDefaults.cardColors(containerColor = Color.Transparent) + ) { + Row( + modifier = Modifier.padding(10.dp), + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .clip(CircleShape) + .background(MaterialTheme.colorScheme.primaryContainer) + ) { + Icon( + modifier = Modifier.padding(10.dp), + imageVector = Icons.Outlined.Storage, + contentDescription = null + ) + } + + Column { + Text( + text = "Внутреннее хранилище", + color = MaterialTheme.colorScheme.onSurface, + ) + Text( + text = "Поиск в файловой системе", + color = MaterialTheme.colorScheme.onSurfaceVariant, + fontSize = 12.sp, + lineHeight = 12.sp + ) + } + } + } + + boards.forEach { board -> + Card( + onClick = { + kanbanScope.launch { + viewModel.sendKanban(board = board) + attachmentModal = false + } + }, + modifier = Modifier.fillMaxWidth(), + shape = RectangleShape, + colors = CardDefaults.cardColors(containerColor = Color.Transparent) + ) { + Row( + Modifier.padding(10.dp), + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon(Icons.Outlined.ViewKanban, null) + Column { + Text("Доска: ${board.title}") + Text("${board.columns.sumOf { it.tasks.size }} задач", fontSize = 12.sp) + } + } + } + board.columns.flatMap { it.tasks }.forEach { task -> + TextButton(onClick = { + kanbanScope.launch { + viewModel.sendKanban(task = task) + attachmentModal = false + } + }) { Text("Задача: ${task.title}") } + } + } + } + } + } +} + +@Composable +private fun MessageBubble( + message: Message, + chatId: Long, + onSeen: (Int) -> Unit +) { + val me by UserManager.user.collectAsState() + + val formatter = SimpleDateFormat( + "HH:mm", + Locale.getDefault() + ) + val sendMessageTime = formatter.format(message.sendTime) + + var expanded by remember { mutableStateOf(false) } + + val alignment = if (message.senderId == me.id) { + Alignment.CenterEnd + } else { + Alignment.CenterStart + } + + var isVisible by remember { mutableStateOf(false) } + + LaunchedEffect(isVisible) { + if (isVisible) { + onSeen(message.id) + } + } + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxWidth() + .onGloballyPositioned { coordinates -> + val position = coordinates.positionInParent() + + val isElementVisible = + position.y >= 0 && position.y < coordinates.parentLayoutCoordinates!!.size.height + if (isElementVisible) { + isVisible = true + } + }) { + + val dropdownActions = remember { mutableStateListOf() } + + MessageText( + message = message, + chatId = chatId, + time = sendMessageTime, + isRead = if (me.id != message.senderId) null else message.isRead, + alignment = alignment, + onClick = { + dropdownActions.clear() + dropdownActions.addAll(it) + expanded = true + }) + + DropdownMenu( + shape = Shape.DropdownMenu, + expanded = expanded, + onDismissRequest = { expanded = false }, + offset = DpOffset( + LocalConfiguration.current.screenWidthDp.dp / 2, + 0.dp + ), + properties = PopupProperties(focusable = true), + ) { + dropdownActions.forEach { action -> + DropdownMenuItem( + leadingIcon = { + Row(horizontalArrangement = Arrangement.Center) { + Icon( + imageVector = action.icon, + contentDescription = null, + modifier = Modifier.size(20.dp) + ) + } + }, + text = { + Text(action.text) + }, + onClick = { + expanded = false + action.onClick.invoke() + }) + } + } + } +} + +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +private fun MessageText( + message: Message, + chatId: Long, + time: String, + isRead: Boolean?, + alignment: Alignment, + onClick: (List) -> Unit +) { + val chatViewModel = hiltViewModel() + val me by UserManager.user.collectAsState() + val text = message.text + val context = LocalContext.current + + val actions = remember { mutableStateListOf() } + + Box( + modifier = Modifier + .fillMaxWidth() + .padding( + horizontal = 8.dp, + vertical = 1.dp + ) + .combinedClickable( + onClick = { onClick.invoke(actions) }, + onLongClick = { }, + indication = null, + interactionSource = remember { MutableInteractionSource() }), + contentAlignment = alignment + ) { + if (!text.isNullOrBlank() && isSingleEmoji(text)) { + actions.clear() + actions.add( + DropdownMenuAction( + icon = Icons.Outlined.ContentCopy, + text = stringResource(R.string.copy), + onClick = { ClipboardHelper(context).copy(text) }) + ) + actions.add( + DropdownMenuAction( + icon = Icons.Outlined.Delete, + text = stringResource(R.string.delete), + onClick = { + chatViewModel.deleteMessageDialog.show() + chatViewModel.selectMessage(message) + }) + ) + + Box( + modifier = Modifier.widthIn(max = 280.dp), + ) { + Text( + text = text, + fontSize = 64.sp, + lineHeight = 72.sp, + modifier = Modifier.padding(bottom = 20.dp) + ) + Box( + contentAlignment = Alignment.BottomEnd, + modifier = Modifier + .background( + color = Color(0x66646464), + shape = RoundedCornerShape(16.dp) + ) + .align(Alignment.BottomEnd) + ) { + Text( + text = time, + style = TextStyle( + textAlign = TextAlign.Center + ), + fontSize = 10.sp, + color = Color.White, + modifier = Modifier + .padding( + vertical = 4.dp, + horizontal = 6.dp + ) + .align(Alignment.BottomEnd) + ) + } + } + } else if (message.kanbanBoard != null || message.kanbanTask != null) { + val board = message.kanbanBoard ?: message.kanbanTask?.column?.board + val navigation = viewModel() + Card( + onClick = { navigation.addScreenInStack { KanbanScreen() } }, + modifier = Modifier.widthIn(max = 280.dp) + ) { + Column(Modifier.padding(12.dp), verticalArrangement = Arrangement.spacedBy(4.dp)) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) { + Icon(Icons.Outlined.ViewKanban, null) + Text(if (message.kanbanTask != null) "Задача" else "Канбан-доска", fontWeight = FontWeight.Bold) + } + Text(message.kanbanTask?.title ?: board?.title.orEmpty()) + message.kanbanTask?.description?.takeIf { it.isNotBlank() }?.let { Text(it, fontSize = 12.sp) } + if (message.kanbanBoard != null) { + Text("${message.kanbanBoard.columns.sumOf { it.tasks.size }} задач", fontSize = 12.sp) + } + } + } + } else if (message.attachments.isNotEmpty()) { + val scope = rememberCoroutineScope() + val context = LocalContext.current + + Box( + modifier = Modifier + .background( + color = if (alignment == Alignment.CenterEnd) { + MaterialTheme.colorScheme.primaryContainer + } else Color( + 0x66646464 + ), + shape = RoundedCornerShape(16.dp) + ) + .clip(RoundedCornerShape(16.dp)) + .widthIn(max = 280.dp) + ) { + Column { + val downloads by chatViewModel.downloads.collectAsState() + + message.attachments.forEach { attachment -> + actions.clear() + actions.add( + DropdownMenuAction( + icon = Icons.Outlined.Delete, + text = stringResource(R.string.delete_message), + onClick = { + chatViewModel.deleteMessageDialog.show() + chatViewModel.selectMessage(message) + }) + ) + + val item = downloads.find { it.fileId == attachment.id } + + val fileSize = formatFileSize(attachment.size) + val fileExtension = getFileExtension(attachment.name) + val filePath = attachment.id.toString() + '.' + fileExtension + val isExists = isFileExists( + context, + filePath + ) + + if (isExists) { + actions.add( + 0, + DropdownMenuAction( + icon = Icons.Filled.Download, + text = stringResource(R.string.save_to_downloads), + onClick = { + scope.launch { + chatViewModel.saveFile( + context, + attachment + ) + } + }) + ) + } + + MessageFile( + fileName = attachment.name, + fileInfo = "$fileSize ${fileExtension.uppercase()}", + onClick = { + if (isExists) { + chatViewModel.openFile( + context, + filePath + ) + } else { + scope.launch { + if (item == null) { + chatViewModel.addDownload( + context, + attachment, + chatId + ) + } else if (item.status == DownloadStatus.DOWNLOADING) { + chatViewModel.cancelDownload(item) + } else if (item.status == DownloadStatus.COMPLETED) { + chatViewModel.openFile( + context, + filePath + ) + } + } + } + }, + fileType = FileType.fromExtension(fileExtension), + downloadStatus = if (isExists) { + DownloadStatus.COMPLETED + } else { + item?.status ?: DownloadStatus.PENDING + }, + progress = item?.progress ?: 0 + ) + } + } + } + } else if (!text.isNullOrBlank()) { + actions.clear() + actions.add( + DropdownMenuAction( + icon = Icons.Outlined.ContentCopy, + text = stringResource(R.string.copy), + onClick = { ClipboardHelper(context).copy(text) }) + ) + actions.add( + DropdownMenuAction( + icon = Icons.Outlined.Delete, + text = stringResource(R.string.delete_message), + onClick = { + chatViewModel.deleteMessageDialog.show() + chatViewModel.selectMessage(message) + }) + ) + + Box( + modifier = Modifier + .background( + color = if (alignment == Alignment.CenterEnd) { + MaterialTheme.colorScheme.primaryContainer + } else Color( + 0x66646464 + ), + shape = RoundedCornerShape(16.dp) + ) + .widthIn(max = 280.dp) + .padding( + top = 6.dp + ) + ) { + Column { + if (ChatType.fromId(message.chatId) == ChatType.GROUP && message.senderId != me.id) { + val chatViewModel = hiltViewModel() + + LaunchedEffect(Unit) { + chatViewModel.loadUserName(message.senderId) + } + + val userNamesCache by chatViewModel.userNamesCache.collectAsState() + + val senderName = userNamesCache[message.senderId] + + senderName?.let { + Text( + text = it, + color = MaterialTheme.colorScheme.primary, + fontSize = 14.sp, + overflow = TextOverflow.Ellipsis, + fontWeight = FontWeight.W500, + lineHeight = 10.sp, + modifier = Modifier.padding( + start = 8.dp, + end = 8.dp + ) + ) + } + } + + val annotatedString = buildAnnotatedString { + val parts = text.split(" ") + + for (part in parts) { + if (part.startsWith("@")) { + pushStringAnnotation( + tag = "user", + annotation = part + ) + + withStyle( + style = SpanStyle( + color = MaterialTheme.colorScheme.primary + ) + ) { + append(part) + } + + pop() + } else { + append(part) + } + + append(" ") + } + } + + Text( + text = annotatedString, + modifier = Modifier + .padding( + start = 8.dp, + end = 40.dp, + bottom = 6.dp + ) + .clip(shape = RoundedCornerShape(4.dp)), + lineHeight = 18.sp + ) + } + + Row( + modifier = Modifier.align(Alignment.BottomEnd), + verticalAlignment = Alignment.Bottom + ) { + Text( + text = time, + style = TextStyle( + textAlign = TextAlign.Center + ), + fontSize = 9.sp, + color = Color.White, + modifier = Modifier.padding( + end = if (isRead == null) 8.dp else 0.dp + ) + ) + + if (isRead != null) { + Box( + contentAlignment = Alignment.CenterEnd + ) { + Icon( + Icons.Outlined.Check, + null, + Modifier.size(16.dp) + ) + + if (isRead) { + Icon( + Icons.Outlined.Check, + null, + Modifier + .padding(end = 6.dp) + .size(16.dp) + ) + } + } + } + } + } + } + } +} + +private fun isSingleEmoji(text: String): Boolean { + val emojiRegex = + Regex("^[\\p{So}\\p{Cntrl}\\p{InEmoticons}\\p{InMiscellaneousSymbolsAndPictographs}\\p{InSupplementalSymbolsAndPictographs}\\uD83C\\uDFF0-\\uD83D\\uDFFF]+$") + + return emojiRegex.matches(text.trim()) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/KanbanScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/KanbanScreen.kt new file mode 100644 index 0000000..b6ce336 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/KanbanScreen.kt @@ -0,0 +1,188 @@ +package com.aiwazian.messenger.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Add +import androidx.compose.material.icons.outlined.ArrowForward +import androidx.compose.material.icons.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +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.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.data.KanbanColumn +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.viewModels.KanbanViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun KanbanScreen() { + val navigation = viewModel() + val kanban = viewModel() + val boards by kanban.boards.collectAsState() + var newBoard by remember { mutableStateOf(false) } + var newColumnBoardId by remember { mutableStateOf(null) } + var renameBoardId by remember { mutableStateOf(null) } + + Scaffold( + topBar = { + PageTopBar( + title = { Text("Канбан-доски") }, + navigationIcon = NavigationIcon(Icons.AutoMirrored.Outlined.ArrowBack) { navigation.removeLastScreenInStack() } + ) + }, + floatingActionButton = { + FloatingActionButton(onClick = { newBoard = true }) { Icon(Icons.Outlined.Add, null) } + } + ) { padding -> + Column( + Modifier.fillMaxSize().padding(padding).verticalScroll(rememberScrollState()).padding(12.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + if (boards.isEmpty()) Text("Создайте первую доску") + boards.forEach { board -> + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Row(verticalAlignment = androidx.compose.ui.Alignment.CenterVertically) { + Text(board.title, style = MaterialTheme.typography.titleLarge, modifier = Modifier.weight(1f)) + var menu by remember { mutableStateOf(false) } + IconButton(onClick = { menu = true }) { Icon(Icons.Outlined.MoreVert, "Управление") } + DropdownMenu(expanded = menu, onDismissRequest = { menu = false }) { + DropdownMenuItem( + text = { Text("Переименовать") }, + onClick = { menu = false; renameBoardId = board.id } + ) + DropdownMenuItem( + text = { Text("Удалить") }, + onClick = { menu = false; kanban.deleteBoard(board.id) } + ) + } + } + Row( + Modifier.fillMaxWidth().horizontalScroll(rememberScrollState()), + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + board.columns.forEachIndexed { index, column -> + KanbanColumnCard( + column = column, + previousColumnId = board.columns.getOrNull(index - 1)?.id, + nextColumnId = board.columns.getOrNull(index + 1)?.id, + kanban = kanban + ) + } + Button(onClick = { newColumnBoardId = board.id }) { + Text("Добавить колонку") + } + } + } + } + } + } + + if (newBoard) NameDialog("Новая доска", { newBoard = false }) { + kanban.createBoard(it) + newBoard = false + } + newColumnBoardId?.let { boardId -> + NameDialog("Новая колонка", { newColumnBoardId = null }) { + kanban.createColumn(boardId, it) + newColumnBoardId = null + } + } + renameBoardId?.let { boardId -> + NameDialog("Название доски", { renameBoardId = null }) { + kanban.renameBoard(boardId, it) + renameBoardId = null + } + } +} + +@Composable +private fun KanbanColumnCard( + column: KanbanColumn, + previousColumnId: Int?, + nextColumnId: Int?, + kanban: KanbanViewModel +) { + var addTask by remember { mutableStateOf(false) } + Card(Modifier.width(270.dp)) { + Column( + Modifier.padding(12.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text(column.title, style = MaterialTheme.typography.titleMedium) + column.tasks.forEach { task -> + Card(Modifier.fillMaxWidth()) { + Column(Modifier.padding(10.dp)) { + Text(task.title) + if (!task.description.isNullOrBlank()) Text(task.description, style = MaterialTheme.typography.bodySmall) + Row { + if (previousColumnId != null) { + IconButton(onClick = { kanban.moveTask(task.id, previousColumnId) }) { + Icon(Icons.Outlined.ArrowBack, "Переместить назад") + } + } + if (nextColumnId != null) { + IconButton(onClick = { kanban.moveTask(task.id, nextColumnId) }) { + Icon(Icons.Outlined.ArrowForward, "Переместить") + } + } + IconButton(onClick = { kanban.deleteTask(task.id) }) { + Icon(Icons.Outlined.Delete, "Удалить") + } + } + } + } + } + Button(onClick = { addTask = true }, modifier = Modifier.fillMaxWidth()) { + Text("Добавить задачу") + } + } + } + if (addTask) NameDialog("Новая задача", { addTask = false }) { + kanban.createTask(column.id, it) + addTask = false + } +} + +@Composable +private fun NameDialog(title: String, dismiss: () -> Unit, submit: (String) -> Unit) { + var value by remember { mutableStateOf("") } + AlertDialog( + onDismissRequest = dismiss, + title = { Text(title) }, + text = { OutlinedTextField(value, { value = it }, label = { Text("Название") }) }, + confirmButton = { TextButton(onClick = { if (value.isNotBlank()) submit(value.trim()) }) { Text("Создать") } }, + dismissButton = { TextButton(onClick = dismiss) { Text("Отмена") } } + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/LockScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/LockScreen.kt new file mode 100644 index 0000000..d3889fd --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/LockScreen.kt @@ -0,0 +1,97 @@ +package com.aiwazian.messenger.ui + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Backspace +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.CodeBlocks +import com.aiwazian.messenger.ui.element.CustomNumberBoard +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.LockScreenViewModel +import com.aiwazian.messenger.viewModels.PasscodeLockViewModel + +@Composable +fun LockScreen() { + Content() +} + +@Composable +private fun Content() { + val context = LocalContext.current + + val lockScreenViewModel = hiltViewModel() + + lockScreenViewModel.onWrongPasscode = { + val vibrateService = VibrateService(context) + vibrateService.vibrate(VibrationPattern.Error) + } + + Scaffold { innerPadding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(80.dp), + ) { + Icon( + imageVector = Icons.Filled.Lock, + contentDescription = "Lock", + modifier = Modifier.size(40.dp), + ) + + CodeBlocks( + count = PasscodeLockViewModel.MAX_LENGTH_PASSCODE, + showInput = false, + code = lockScreenViewModel.passcode + ) + + val boardButtons = listOf( + listOf( + "1", + "2", + "3" + ), + listOf( + "4", + "5", + "6" + ), + listOf( + "7", + "8", + "9" + ), + listOf( + null, + "0", + Icons.AutoMirrored.Outlined.Backspace + ), + ) + + CustomNumberBoard( + value = lockScreenViewModel.passcode, + buttons = boardButtons, + onChange = lockScreenViewModel::onPasscodeChanged + ) + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/LogoutScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/LogoutScreen.kt new file mode 100644 index 0000000..a94e03a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/LogoutScreen.kt @@ -0,0 +1,154 @@ +package com.aiwazian.messenger.ui + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.Key +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.services.AppLockService +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.ui.settings.SettingsDataAndStorageScreen +import com.aiwazian.messenger.ui.settings.security.SettingsPasscodeScreen +import com.aiwazian.messenger.viewModels.LogoutViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun LogoutScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + val logoutViewModel = hiltViewModel() + + val scrollState = rememberScrollState() + + val logoutDialog = logoutViewModel.logoutDialog + + Scaffold( + topBar = { TopBar() }, + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(it) + .verticalScroll(scrollState) + ) { + SectionHeader(title = stringResource(R.string.alternative_options)) + + SectionContainer { + // SectionItem( + // icon = Icons.Outlined.PersonAdd, + // text = "Добавить аккаунт", + // description = "Подключите несколько аккаунтов и легко переключайтесь между ними." + // ) + // + SectionItem( + icon = Icons.Outlined.Delete, + text = stringResource(R.string.clear_cache), + description = "Освободите память устройства, файлы останутся в облаке.", + onClick = { + navViewModel.addScreenInStack { + SettingsDataAndStorageScreen() + } + }) + + val hasPasscode by AppLockService().hasPasscode.collectAsState() + + if (!hasPasscode) { + SectionItem( + icon = Icons.Outlined.Key, + text = "Установить код пароль", + description = "Включите код-пароль для разблокировки приложения на Вашем устройстве.", + onClick = { + navViewModel.addScreenInStack { + SettingsPasscodeScreen() + } + }) + } + } + + SectionContainer { + SectionItem( + text = stringResource(R.string.log_out), + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error), + onClick = logoutDialog::show + ) + } + + if (logoutDialog.isVisible) { + val context = LocalContext.current + val scope = rememberCoroutineScope() + + LogoutModal( + onConfirm = { + scope.launch { + logoutViewModel.logout(context) + } + }, + onDismiss = logoutDialog::hide + ) + } + } + } +} + +@Composable +private fun LogoutModal( + onConfirm: () -> Unit, + onDismiss: () -> Unit +) { + CustomDialog( + title = stringResource(R.string.log_out), + onDismissRequest = onDismiss, + content = { + Text(text = "Вы точно хотите выйти?") + }, + buttons = { + TextButton(onClick = onDismiss) { + Text(stringResource(R.string.cancel)) + } + TextButton(onClick = onConfirm) { + Text(stringResource(R.string.log_out)) + } + }) +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(stringResource(R.string.log_out)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/MainScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/MainScreen.kt new file mode 100644 index 0000000..afd7a9b --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/MainScreen.kt @@ -0,0 +1,875 @@ +package com.aiwazian.messenger.ui + +import android.Manifest.permission.POST_NOTIFICATIONS +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import android.provider.Settings +import androidx.activity.compose.BackHandler +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +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.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Reply +import androidx.compose.material.icons.filled.Create +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material.icons.filled.Notifications +import androidx.compose.material.icons.outlined.AccountCircle +import androidx.compose.material.icons.outlined.Archive +import androidx.compose.material.icons.outlined.BookmarkBorder +import androidx.compose.material.icons.outlined.ViewKanban +import androidx.compose.material.icons.outlined.Close +import androidx.compose.material.icons.outlined.LockOpen +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material.icons.outlined.PushPin +import androidx.compose.material.icons.outlined.Search +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DrawerState +import androidx.compose.material3.DrawerValue +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.ModalDrawerSheet +import androidx.compose.material3.ModalNavigationDrawer +import androidx.compose.material3.NavigationDrawerItem +import androidx.compose.material3.PrimaryScrollableTabRow +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.material3.SwipeToDismissBox +import androidx.compose.material3.Tab +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.rememberDrawerState +import androidx.compose.material3.rememberSwipeToDismissBoxState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +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.RectangleShape +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.core.content.ContextCompat +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.airbnb.lottie.compose.LottieAnimation +import com.airbnb.lottie.compose.LottieCompositionSpec +import com.airbnb.lottie.compose.LottieConstants +import com.airbnb.lottie.compose.rememberLottieComposition +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.DropdownMenuAction +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.ui.element.ChatCard +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SwipeableChatCard +import com.aiwazian.messenger.ui.settings.SettingsScreen +import com.aiwazian.messenger.utils.LottieAnimation +import com.aiwazian.messenger.utils.Shape +import com.aiwazian.messenger.utils.WebSocketManager +import com.aiwazian.messenger.viewModels.MainViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun MainScreen() { + MainScreenContent() +} + +@Composable +private fun MainScreenContent() { + val context = LocalContext.current + + var showPermissionRationale by remember { mutableStateOf(false) } + + val requestPermissionLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestPermission() + ) { isGranted: Boolean -> + if (!isGranted) { + showPermissionRationale = true + } + } + + if (showPermissionRationale) { + NotificationBottomModal( + enable = { + showPermissionRationale = false + + val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { + putExtra( + Settings.EXTRA_APP_PACKAGE, + context.packageName + ) + } + + context.startActivity(intent) + }, + disable = { + showPermissionRationale = false + }) + } + + LaunchedEffect(Unit) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission( + context, + POST_NOTIFICATIONS + ) != PackageManager.PERMISSION_GRANTED + ) { + requestPermissionLauncher.launch(POST_NOTIFICATIONS) + } + } + } + + val scope = rememberCoroutineScope() + + val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) + + BackHandler(drawerState.currentValue == DrawerValue.Open) { + scope.launch { + drawerState.close() + } + } + + ModalNavigationDrawer( + drawerState = drawerState, + drawerContent = { + DrawerContent(drawerState) + }, + ) { + Content(drawerState) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun NotificationBottomModal( + enable: () -> Unit, + disable: () -> Unit +) { + ModalBottomSheet( + onDismissRequest = disable, + dragHandle = null, + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + Box( + modifier = Modifier + .size(70.dp) + .clip(CircleShape) + .background(MaterialTheme.colorScheme.primary) + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + Icon( + imageVector = Icons.Default.Notifications, + contentDescription = null, + modifier = Modifier + .fillMaxSize() + .padding(10.dp), + tint = MaterialTheme.colorScheme.onPrimary + ) + } + + Column { + Text( + text = "Включите уведомления", + fontSize = 18.sp, + textAlign = TextAlign.Center, + fontWeight = FontWeight.W500, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 10.dp) + ) + + Text( + text = "Разрешите приложению отправлять Вам уведомления, чтобы не пропустить сообщения от друзей и родных.", + textAlign = TextAlign.Center, + fontSize = 14.sp, + lineHeight = 14.sp, + modifier = Modifier.fillMaxWidth() + ) + } + } + + Button( + onClick = enable, + modifier = Modifier + .padding(15.dp) + .fillMaxWidth(), + shape = RoundedCornerShape(10.dp), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary + ) + ) { + Text( + text = "Открыть настройки", + modifier = Modifier.padding(8.dp) + ) + } + } +} + +@Composable +private fun Content(drawerState: DrawerState) { + val navViewModel = viewModel() + + val mainViewModel = hiltViewModel() + + val folders by mainViewModel.chatFolders.collectAsState() + val archiveChats by mainViewModel.archivedChats.collectAsState() + val selectedChats by mainViewModel.selectedChats.collectAsState() + val allSelectedChatsArePinned by mainViewModel.allSelectedArePinned.collectAsState() + + val hasPasscode by mainViewModel.hasPasscode.collectAsState() + + val snackbarHostState = remember { SnackbarHostState() } + + val scope = rememberCoroutineScope() + + var selectedTabIndex by remember { mutableIntStateOf(0) } + + val pagerState = rememberPagerState { folders.size } + + LaunchedEffect(selectedTabIndex) { + pagerState.animateScrollToPage(selectedTabIndex) + } + + LaunchedEffect(pagerState.currentPage) { + selectedTabIndex = pagerState.currentPage + } + + BackHandler(selectedTabIndex != 0) { + selectedTabIndex = 0 + } + + BackHandler(selectedChats.isNotEmpty()) { + mainViewModel.unselectAllChats() + } + + Scaffold( + modifier = Modifier.fillMaxSize(), + topBar = { + DefaultTopBar( + drawerState = drawerState, + isLockApp = hasPasscode, + onLockClick = { + scope.launch { + mainViewModel.lockApp() + } + }) + + val selectedChatCount = selectedChats.values.sumOf { it.size } + + AnimatedVisibility( + visible = selectedChats.isNotEmpty(), + enter = fadeIn(tween(200)), + exit = fadeOut(tween(200)) + ) { + SelectedChatTopBar( + onBack = mainViewModel::unselectAllChats, + selectedCount = selectedChatCount, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.Outlined.PushPin, + text = if (allSelectedChatsArePinned) { + stringResource(R.string.unpin) + } else { + stringResource(R.string.pin) + }, + onClick = { + scope.launch { + if (allSelectedChatsArePinned) { + selectedChats.forEach { folder -> + folder.value.forEach { chatId -> + mainViewModel.unpinChat( + chatId = chatId, + folderId = folder.key + ) + } + } + } else { + selectedChats.forEach { folder -> + folder.value.forEach { chatId -> + mainViewModel.pinChat( + chatId = chatId, + folderId = folder.key + ) + } + } + } + } + mainViewModel.unselectAllChats() + }) + ) + ) + } + }, + snackbarHost = { + SwipeDismissSnackbarHost(snackbarHostState) + }, + floatingActionButton = { + FloatingButton(onClick = { + navViewModel.addScreenInStack { + NewMessageScreen() + } + }) + }) { innerPadding -> + Column( + modifier = Modifier.padding(innerPadding), + ) { + AnimatedVisibility( + visible = folders.size > 1, + enter = slideInVertically(tween(100)), + exit = slideOutVertically(tween(100)) + ) { + PrimaryScrollableTabRow( + selectedTabIndex = selectedTabIndex, + modifier = Modifier.fillMaxWidth(), + edgePadding = 8.dp, + divider = { }) { + folders.forEachIndexed { index, folder -> + Tab( + selected = index == selectedTabIndex, + onClick = { + selectedTabIndex = index + }, + modifier = Modifier.clip(shape = Shape.PrimaryTab), + text = { + Text(text = folder.name) + }, + unselectedContentColor = MaterialTheme.colorScheme.onSurfaceVariant + ) + + } + } + } + + HorizontalPager( + state = pagerState, + userScrollEnabled = folders.size > 1 && selectedChats.isEmpty(), + overscrollEffect = null, + modifier = Modifier.fillMaxSize() + ) { index -> + val chatFolders = folders.toMutableList() + + val folder = chatFolders[index] + + Column(modifier = Modifier.fillMaxSize()) { + if (folder.id == 0) { + if (folder.chats.isEmpty() && archiveChats.isEmpty()) { + EmptyChatPlaceholder(text = "Чтобы начать общение нажмите на значок поиска в правом верхнем углу и найдите пользователя по его @username") + return@Column + } + + if (archiveChats.isNotEmpty()) { + ChatCard( + chatInfo = ChatInfo(chatName = stringResource(R.string.archive)), + onClickChat = { + if (selectedChats.isEmpty()) { + navViewModel.addScreenInStack { + ArchiveScreen(mainViewModel) + } + } + }) + } + } + + if (folder.id != 0 && folder.chats.isEmpty()) { + EmptyChatPlaceholder( + text = "Добавьте чаты в папку", + animation = LottieAnimation.FOLDER_CLOSED + ) + return@Column + } + + val selectedChatsInFolder = selectedChats[folder.id] ?: emptyList() + + val snackBarActionLabel = stringResource(R.string.cancel).uppercase() + + val snackBarMessage = stringResource(R.string.chat_archived) + + ChatListSection( + chatList = folder.chats, + selectedChats = selectedChatsInFolder, + enableSwipeable = folder.id == 0, + onChatClick = { chat -> + if (selectedChats.isEmpty()) { + navViewModel.addScreenInStack { + ChatScreen(chat.id) + } + } else { + mainViewModel.selectChat( + chat.id, + folder.id + ) + } + }, + onChatLongClick = { chat -> + mainViewModel.selectChat( + chat.id, + folder.id + ) + }, + onChatSwipe = { chat -> + mainViewModel.archiveChat(chat.id) + + scope.launch { + val result = snackbarHostState.showSnackbar( + message = snackBarMessage, + actionLabel = snackBarActionLabel, + duration = SnackbarDuration.Short + ) + + if (result == SnackbarResult.ActionPerformed) { + mainViewModel.unarchiveChat(chat.id) + } + } + }) + } + } + } + } +} + +@Composable +private fun ChatListSection( + chatList: List, + selectedChats: List, + enableSwipeable: Boolean, + onChatClick: (ChatInfo) -> Unit, + onChatLongClick: (ChatInfo) -> Unit, + onChatSwipe: (ChatInfo) -> Unit +) { + val user by UserManager.user.collectAsState() + + LazyColumn { + items( + chatList, + { it.lastMessage?.sendTime ?: it.id }) { chat -> + var chatInfo = chat + + if (chatInfo.id == user.id) { + chatInfo = chat.copy(chatName = stringResource(R.string.saved_messages)) + } + + if (enableSwipeable) { + SwipeableChatCard( + chatInfo = chatInfo, + selected = chatInfo.id in selectedChats, + pinned = chatInfo.isPinned, + enableSwipeable = selectedChats.isEmpty(), + onClick = { onChatClick(chatInfo) }, + onLongClick = { onChatLongClick(chatInfo) }, + backgroundIcon = Icons.Outlined.Archive, + onDismiss = { onChatSwipe(chatInfo) }) + } else { + ChatCard( + chatInfo = chatInfo, + selected = chatInfo.id in selectedChats, + pinned = chatInfo.isPinned, + onClickChat = { onChatClick(chatInfo) }, + onLongClickChat = { onChatLongClick(chatInfo) }, + ) + } + } + } +} + +@Composable +private fun EmptyChatPlaceholder( + text: String, + animation: String? = null +) { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (animation != null) { + val composition by rememberLottieComposition( + spec = LottieCompositionSpec.Asset(animation) + ) + + LottieAnimation( + composition = composition, + modifier = Modifier + .size(100.dp) + .padding(bottom = 10.dp), + iterations = LottieConstants.IterateForever, + isPlaying = true + ) + } + + Text( + text = text, + textAlign = TextAlign.Center, + ) + } +} + +@Composable +private fun FloatingButton(onClick: () -> Unit) { + FloatingActionButton( + shape = CircleShape, + onClick = onClick, + containerColor = MaterialTheme.colorScheme.primary + ) { + Icon( + imageVector = Icons.Default.Create, + contentDescription = null + ) + } +} + +@Composable +private fun SwipeDismissSnackbarHost(snackbarHostState: SnackbarHostState) { + SnackbarHost( + hostState = snackbarHostState, + modifier = Modifier.fillMaxWidth() + ) { data -> + var dismissed by remember { mutableStateOf(false) } + + if (!dismissed) { + val swipeToDismissBoxState = rememberSwipeToDismissBoxState() + + SwipeToDismissBox( + state = swipeToDismissBoxState, + backgroundContent = { }, + modifier = Modifier.fillMaxWidth(), + ) { + Row( + modifier = Modifier + .padding(12.dp) + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surface), + verticalAlignment = Alignment.CenterVertically + ) { + Row( + modifier = Modifier + .padding(horizontal = 4.dp) + .fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Row( + modifier = Modifier.padding(start = 8.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Icon( + imageVector = Icons.Outlined.Archive, + contentDescription = null, + ) + + Text( + text = data.visuals.message + ) + } + + TextButton( + onClick = { data.performAction() }, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.primary, + ), + shape = RoundedCornerShape(10.dp) + ) { + Icon( + imageVector = Icons.AutoMirrored.Outlined.Reply, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary + ) + + data.visuals.actionLabel?.let { + Text( + text = it, + color = MaterialTheme.colorScheme.primary + ) + } + } + } + } + } + } else { + data.dismiss() + } + } +} + +@Composable +private fun SelectedChatTopBar( + onBack: () -> Unit, + selectedCount: Int, + dropdownActions: List +) { + val actions = listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = dropdownActions + ) + ) + + PageTopBar( + title = { + AnimatedContent( + targetState = selectedCount, + transitionSpec = { + if (targetState > initialState) { + slideInVertically(tween(200)) { height -> height } + fadeIn( + tween(200) + ) togetherWith slideOutVertically(tween(200)) { height -> -height } + fadeOut( + tween(200) + ) + } else { + slideInVertically(animationSpec = tween(200)) { height -> -height } + fadeIn( + tween(200) + ) togetherWith slideOutVertically(tween(200)) { height -> height } + fadeOut( + tween(200) + ) + } + }) { count -> + Text(text = count.toString()) + } + }, + navigationIcon = NavigationIcon( + icon = Icons.Outlined.Close, + onClick = onBack::invoke + ), + actions = actions + ) +} + +@Composable +private fun DefaultTopBar( + drawerState: DrawerState, + isLockApp: Boolean, + onLockClick: () -> Unit +) { + val isConnected by WebSocketManager.isConnectedState.collectAsState() + + val navViewModel = viewModel() + + val scope = rememberCoroutineScope() + + val actions = if (isLockApp) { + listOf( + TopBarAction( + icon = Icons.Outlined.LockOpen, + onClick = onLockClick + ), + TopBarAction( + icon = Icons.Outlined.Search, + onClick = { + navViewModel.addScreenInStack { + SearchScreen() + } + }) + ) + } else { + listOf( + TopBarAction( + icon = Icons.Outlined.Search, + onClick = { + navViewModel.addScreenInStack { + SearchScreen() + } + }) + ) + } + + PageTopBar( + title = { + AnimatedContent( + targetState = isConnected, + transitionSpec = { + if (isConnected) { + slideInVertically(tween(200)) { height -> height } + fadeIn( + tween(200) + ) togetherWith slideOutVertically(tween(200)) { height -> -height } + fadeOut( + tween(200) + ) + } else { + slideInVertically(tween(200)) { height -> -height } + fadeIn( + tween(200) + ) togetherWith slideOutVertically(tween(200)) { height -> height } + fadeOut( + tween(200) + ) + } + }) { connected -> + Text( + text = if (connected) { + stringResource(R.string.app_name) + } else { + stringResource(R.string.connecting) + "..." + } + ) + } + }, + navigationIcon = NavigationIcon( + icon = Icons.Default.Menu, + onClick = { + scope.launch { + drawerState.open() + } + }), + actions = actions + ) +} + +@Composable +private fun DrawerContent(drawerState: DrawerState) { + val context = LocalContext.current + + val navViewModel = viewModel() + + val user by UserManager.user.collectAsState() + val scope = rememberCoroutineScope() + + ModalDrawerSheet( + modifier = Modifier + .width(300.dp) + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + ) { + Column( + modifier = Modifier.padding( + top = 80.dp, + bottom = 40.dp + ) + ) { + Text( + text = "${user.firstName} ${user.lastName}", + modifier = Modifier.padding( + start = 20.dp, + end = 20.dp, + bottom = 40.dp + ), + fontSize = 24.sp, + maxLines = 1, + softWrap = false, + overflow = TextOverflow.Ellipsis + ) + + DrawerItem( + label = stringResource(R.string.profile), + icon = Icons.Outlined.AccountCircle + ) { + scope.launch { + drawerState.close() + } + navViewModel.addScreenInStack { + ProfileScreen(user.id) + } + } + + DrawerItem( + label = stringResource(R.string.saved_messages), + icon = Icons.Outlined.BookmarkBorder + ) { + scope.launch { + drawerState.close() + } + navViewModel.addScreenInStack { + ChatScreen(user.id) + } + } + + DrawerItem( + label = "Канбан-доски", + icon = Icons.Outlined.ViewKanban + ) { + scope.launch { drawerState.close() } + navViewModel.addScreenInStack { KanbanScreen() } + } + + DrawerItem( + label = stringResource(R.string.settings), + icon = Icons.Outlined.Settings + ) { + scope.launch { + drawerState.close() + } + navViewModel.addScreenInStack { + SettingsScreen() + } + } + } + + Box(Modifier.weight(1f)) + } +} + +@Composable +private fun DrawerItem( + label: String, + icon: ImageVector, + onClick: () -> Unit +) { + NavigationDrawerItem( + shape = RectangleShape, + label = { + Text(text = label) + }, + icon = { + Icon( + imageVector = icon, + contentDescription = null + ) + }, + selected = false, + onClick = onClick + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/NewMessageScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/NewMessageScreen.kt new file mode 100644 index 0000000..eb7f941 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/NewMessageScreen.kt @@ -0,0 +1,76 @@ +package com.aiwazian.messenger.ui + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Group +import androidx.compose.material.icons.outlined.Groups +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.channel.CreateChannelScreen +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.ui.group.CreateGroupScreen +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun NewMessageScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + + val scrollState = rememberScrollState() + + Scaffold( + topBar = { TopBar() }, + ) { + Column( + modifier = Modifier + .padding(it) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + SectionContainer { + SectionItem( + icon = Icons.Outlined.Group, + text = stringResource(R.string.create_channel), + onClick = { + navViewModel.addScreenInStack { CreateChannelScreen() } + }) + SectionItem( + icon = Icons.Outlined.Groups, + text = stringResource(R.string.create_group), + onClick = { + navViewModel.addScreenInStack { CreateGroupScreen() } + }) + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(stringResource(R.string.new_message)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ProfileScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ProfileScreen.kt new file mode 100644 index 0000000..f931dc2 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/ProfileScreen.kt @@ -0,0 +1,526 @@ +package com.aiwazian.messenger.ui + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.Logout +import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.outlined.AddHome +import androidx.compose.material.icons.outlined.AlternateEmail +import androidx.compose.material.icons.outlined.Edit +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.LoadingIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +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.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.sp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.ChannelInfo +import com.aiwazian.messenger.data.DropdownMenuAction +import com.aiwazian.messenger.data.GroupInfo +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.interfaces.Profile +import com.aiwazian.messenger.services.ClipboardHelper +import com.aiwazian.messenger.services.DialogController +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.ui.channel.ChannelSettingsScreen +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.ui.group.GroupSettingsScreen +import com.aiwazian.messenger.ui.settings.profile.SettingsProfileScreen +import com.aiwazian.messenger.ui.settings.profile.SettingsUsernameScreen +import com.aiwazian.messenger.utils.ShortcutHelper +import com.aiwazian.messenger.viewModels.ChannelViewModel +import com.aiwazian.messenger.viewModels.GroupViewModel +import com.aiwazian.messenger.viewModels.MainViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.ProfileViewModel +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch +import java.text.SimpleDateFormat +import java.util.Locale + +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +fun ProfileScreen(profileId: Long) { + val navViewModel = viewModel() + + val profileViewModel = viewModel() + + var profileInfo by remember { mutableStateOf(null) } + + LaunchedEffect(Unit) { + profileViewModel.open(profileId) + profileInfo = profileViewModel.profile.first() + } + + when (profileInfo) { + is UserInfo -> { + UserProfile(profileInfo as UserInfo) + } + + is ChannelInfo -> { + val channelViewModel = hiltViewModel() + channelViewModel.open(profileInfo as ChannelInfo) + ChannelProfile(profileInfo as ChannelInfo) + } + + is GroupInfo -> { + val groupViewModel = hiltViewModel() + groupViewModel.open(profileInfo as GroupInfo) + GroupProfile(profileInfo as GroupInfo) + } + + null -> { + Scaffold(topBar = { + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + }) { + Column( + Modifier + .padding(it) + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + LoadingIndicator() + } + } + } + } +} + +@Composable +private fun GroupProfile(group: GroupInfo) { + val context = LocalContext.current + val navViewModel = viewModel() + + var myId by remember { mutableLongStateOf(0) } + LaunchedEffect(Unit) { + myId = UserManager.user.value.id + } + + var actions by remember { mutableStateOf>(emptyList()) } + + LaunchedEffect( + group.ownerId, + myId + ) { + actions = if (group.ownerId == myId) { + listOf( + TopBarAction( + icon = Icons.Filled.Edit, + onClick = { + navViewModel.addScreenInStack { GroupSettingsScreen() } + } + ), + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.Outlined.AddHome, + text = context.getString(R.string.add_to_home_screen), + onClick = { + ShortcutHelper.createChatShortcut( + context, + group.id, + group.name + ) + }) + ) + ) + ) + } else { + listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.Outlined.AddHome, + text = context.getString(R.string.add_to_home_screen), + onClick = { + ShortcutHelper.createChatShortcut( + context, + group.id, + group.name + ) + }) + ) + ) + ) + } + } + + Scaffold(topBar = { + TopBar( + title = group.name, + actions = actions + ) + }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + if (group.bio.isNotBlank()) { + SectionItem(text = group.bio) + } + } + } + } +} + +@Composable +private fun ChannelProfile(channel: ChannelInfo) { + val context = LocalContext.current + val mainViewModel = hiltViewModel() + val navViewModel = viewModel() + val channelViewModel = hiltViewModel() + val channelInfo by channelViewModel.channelInfo.collectAsState() + + val scope = rememberCoroutineScope() + val leaveChannelDialog = DialogController() + + var myId by remember { mutableLongStateOf(0) } + LaunchedEffect(Unit) { + myId = UserManager.user.value.id + } + + var actions by remember { mutableStateOf>(emptyList()) } + + LaunchedEffect( + channelInfo, + myId + ) { + val dropdown = mutableListOf() + + dropdown += DropdownMenuAction( + icon = Icons.Outlined.AddHome, + text = context.getString(R.string.add_to_home_screen), + onClick = { + ShortcutHelper.createChatShortcut( + context, + channelInfo.id, + channelInfo.name + ) + } + ) + + if (channelInfo.isSubscribed && channelInfo.ownerId != myId) { + dropdown += DropdownMenuAction( + icon = Icons.AutoMirrored.Outlined.Logout, + text = context.getString(R.string.leave_channel), + onClick = leaveChannelDialog::show + ) + } + + actions = if (channel.ownerId == myId) { + listOf( + TopBarAction( + icon = Icons.Filled.Edit, + onClick = { + navViewModel.addScreenInStack { ChannelSettingsScreen() } + } + ), + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = dropdown + ) + ) + } else { + listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = dropdown + ) + ) + } + } + + Scaffold(topBar = { + TopBar( + title = channelInfo.name, + actions = actions + ) + }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + if (channelInfo.bio.isNotEmpty()) { + SectionItem( + text = channelInfo.bio, + description = stringResource(R.string.description) + ) + } + + if (channelInfo.publicLink?.isNotEmpty() == true) { + SectionItem( + text = channelInfo.publicLink!!, + description = stringResource(R.string.invite_link) + ) + } + } + } + + if (leaveChannelDialog.isVisible) { + CustomDialog( + title = stringResource(R.string.leave_channel), + onDismissRequest = leaveChannelDialog::hide, + buttons = { + TextButton(onClick = leaveChannelDialog::hide) { + Text(text = stringResource(R.string.cancel)) + } + TextButton( + onClick = { + scope.launch { + val isLeaved = channelViewModel.tryLeave(channel.id) + + if (isLeaved) { + mainViewModel.deleteChat(channel.id) + navViewModel.removeLastScreenInStack() + } + } + }, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error) + ) { + Text(text = stringResource(R.string.leave_channel)) + } + }) { + Text(text = buildAnnotatedString { + append(stringResource(R.string.leave_channel_confirm)) + withStyle(SpanStyle(fontWeight = FontWeight.W500)) { + append(" ${channelInfo.name}") + } + append("?") + }) + } + } + } +} + +@Composable +private fun UserProfile(user: UserInfo) { + val navViewModel = viewModel() + val profileViewModel = viewModel() + val context = LocalContext.current + val clipboardHelper = ClipboardHelper(context = context) + + var myId by remember { mutableLongStateOf(0) } + LaunchedEffect(Unit) { + myId = UserManager.user.value.id + } + + val scrollState = rememberScrollState() + + var actions by remember { mutableStateOf>(emptyList()) } + + LaunchedEffect(user.id) { + actions = if (myId == user.id) { + listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.Outlined.Edit, + text = context.getString(R.string.edit_info), + onClick = { + navViewModel.addScreenInStack { SettingsProfileScreen() } + } + ), + DropdownMenuAction( + icon = Icons.Outlined.AlternateEmail, + text = context.getString(R.string.change_username), + onClick = { + navViewModel.addScreenInStack { SettingsUsernameScreen() } + } + ) + ) + ) + ) + } else { + listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.Outlined.AddHome, + text = context.getString(R.string.add_to_home_screen), + onClick = { + val chatName = "${user.firstName} ${user.lastName}" + ShortcutHelper.createChatShortcut( + context, + user.id, + chatName + ) + } + ) + ) + ) + ) + } + } + + Scaffold( + topBar = { + TopBar( + title = "${user.firstName} ${user.lastName}", + actions = actions + ) + }, + ) { + Column( + Modifier + .padding(it) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + SectionContainer { + val userBio = user.bio + + if (userBio.isNotEmpty()) { + SectionItem( + text = userBio, + description = stringResource(R.string.bio), + onLongClick = { + clipboardHelper.copy(userBio) + }) + } + + val username = user.username + + if (!username.isNullOrBlank()) { + SectionItem( + text = ("@$username"), + description = stringResource(R.string.username), + onLongClick = { + clipboardHelper.copy(username) + }, // primaryIcon = Icons.Outlined.QrCode, + primaryIconClick = { + navViewModel.addScreenInStack { + QRCodeScreen() + } + }) + } + + val dateOfBirth = user.dateOfBirth + + if (dateOfBirth != null) { + val date = SimpleDateFormat( + "d MMM yyyy", + Locale.getDefault() + ).format(dateOfBirth) + + SectionItem( + text = date, + description = stringResource(R.string.date_of_birth) + ) + } + } + } + + if (profileViewModel.blockUserDialog.isVisible) { + CustomDialog( + title = stringResource(R.string.block_user), + onDismissRequest = profileViewModel.blockUserDialog::hide, + content = { + Text( + text = "${stringResource(R.string.block_user_confirm)} ${user.firstName}?", + lineHeight = 18.sp + ) + }, + buttons = { + TextButton( + onClick = profileViewModel.blockUserDialog::hide + ) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = profileViewModel.blockUserDialog::hide, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error) + ) { + Text(stringResource(R.string.block_user)) + } + }) + } + + if (profileViewModel.startSecretChatDialog.isVisible) { + CustomDialog( + title = stringResource(R.string.secret_chat), + onDismissRequest = profileViewModel.startSecretChatDialog::hide, + content = { + Text( + text = stringResource(R.string.secret_chat_confirm), + lineHeight = 18.sp + ) + }, + buttons = { + TextButton( + onClick = profileViewModel.startSecretChatDialog::hide + ) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = profileViewModel.startSecretChatDialog::hide + ) { + Text(stringResource(R.string.start)) + } + }) + } + } +} + +@Composable +private fun TopBar( + title: String, + actions: List +) { + val navViewModel = viewModel() + + PageTopBar( + title = { + Text( + text = title, + maxLines = 1, + softWrap = false, + overflow = TextOverflow.Ellipsis + ) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = actions + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/QRCodeScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/QRCodeScreen.kt new file mode 100644 index 0000000..654dd57 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/QRCodeScreen.kt @@ -0,0 +1,116 @@ +package com.aiwazian.messenger.ui + +import android.graphics.Bitmap +import android.util.Log +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +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.asImageBitmap +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.services.QrCodeService +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.utils.Constants +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun QRCodeScreen() { + Content() +} + +@Composable +private fun Content() { + Scaffold( + topBar = { + TopBar() + }, + + ) { innerPadding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding), + verticalArrangement = Arrangement.SpaceBetween, + horizontalAlignment = Alignment.CenterHorizontally + ) { + + val url = "${Constants.DOMAIN_NAME}//TODO username" + + val qrCodeService = QrCodeService() + + val qrBitmap: Bitmap? = remember(url) { + qrCodeService.createQrCode( + url, + 500 + ) + } + + Box {} + + qrBitmap?.let { + Image( + bitmap = it.asImageBitmap(), + contentDescription = "QR Code for $url", + modifier = Modifier + .size(250.dp) + .clip(RoundedCornerShape(20.dp)), + ) + } ?: run { + Log.e( + "QRCodeScreen", + "QR code generation failed" + ) + } + + Button( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + onClick = {}, + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary + ), + shape = RoundedCornerShape(10.dp) + ) { + Text( + text = stringResource(R.string.share), + modifier = Modifier.padding(vertical = 8.dp), + color = MaterialTheme.colorScheme.onPrimary + ) + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/QrCodeScaner.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/QrCodeScaner.kt new file mode 100644 index 0000000..4d780b2 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/QrCodeScaner.kt @@ -0,0 +1,8 @@ +package com.aiwazian.messenger.ui + +import androidx.compose.runtime.Composable + +@Composable +fun QRCodeScanner() { + +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/SearchScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/SearchScreen.kt new file mode 100644 index 0000000..0306fa5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/SearchScreen.kt @@ -0,0 +1,232 @@ +package com.aiwazian.messenger.ui + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.scaleIn +import androidx.compose.animation.scaleOut +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SearchViewModel + +@Composable +fun SearchScreen() { + val navViewModel = viewModel() + val searchViewModel = viewModel() + + val searchResults by searchViewModel.searchResults.collectAsState() + val query by searchViewModel.query.collectAsState() + val isSearching by searchViewModel.isSearching.collectAsState() + + Scaffold( + topBar = { + TopBar( + query, + searchViewModel::onQueryChange + ) + }, + ) { innerPadding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding) + ) { + if (searchResults.isEmpty()) { + if (query.isBlank()) { + return@Column + } + + Column( + modifier = Modifier + .imePadding() + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = if (isSearching) "Поиск…" else "Нет результатов", + textAlign = TextAlign.Center, + ) + } + + return@Column + } + + LazyColumn { + items(searchResults) { search -> + Card( + modifier = Modifier.fillMaxWidth(), + shape = RectangleShape, + onClick = { + navViewModel.addScreenInStack { + ChatScreen(search.chatId) + } + }, + colors = CardDefaults.cardColors( + containerColor = Color.Transparent + ) + ) { + Column(modifier = Modifier.padding(8.dp)) { + Text( + text = search.name, + modifier = Modifier.padding(bottom = 4.dp), + ) + + val username = search.publicLink + + val normalizedQuery = query.trim().trimStart('@') + val startIndex = username.indexOf(normalizedQuery, ignoreCase = true) + val endIndex = startIndex + normalizedQuery.length + + Text( + text = buildAnnotatedString { + if (startIndex in username.indices) { + withStyle(SpanStyle(color = MaterialTheme.colorScheme.primary)) { + append("@") + } + + append( + username.substring( + 0, + startIndex + ) + ) + + withStyle(SpanStyle(color = MaterialTheme.colorScheme.primary)) { + append( + username.substring( + startIndex, + endIndex + ) + ) + } + + append(username.substring(endIndex)) + } else { + append("@$username") + } + }, + fontSize = 12.sp + ) + } + } + } + } + } + } +} + +@Composable +private fun TopBar( + value: String, + onValueChange: (String) -> Unit +) { + val navViewModel = viewModel() + + PageTopBar( + title = { + SearchTextField( + value, + onValueChange, + ) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} + +@Composable +private fun SearchTextField( + value: String, + onValueChange: (String) -> Unit +) { + val keyboardController = LocalSoftwareKeyboardController.current + + val focusRequester = remember { FocusRequester() } + + LaunchedEffect(Unit) { + focusRequester.requestFocus() + keyboardController?.show() + } + + OutlinedTextField( + modifier = Modifier + .fillMaxWidth() + .focusRequester(focusRequester), + singleLine = true, + value = value, + onValueChange = onValueChange, + placeholder = { + Text( + text = stringResource(R.string.search), + ) + }, + colors = TextFieldDefaults.colors( + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent + ), + trailingIcon = { + AnimatedVisibility( + visible = value.isNotBlank(), + enter = scaleIn(tween(100)) + fadeIn(tween(100)), + exit = scaleOut(tween(100)) + fadeOut(tween(100)) + ) { + IconButton( + onClick = { + onValueChange("") + }) { + Icon( + Icons.Default.Close, + null, + ) + } + } + }) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelBlackListScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelBlackListScreen.kt new file mode 100644 index 0000000..59facd5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelBlackListScreen.kt @@ -0,0 +1,40 @@ +package com.aiwazian.messenger.ui.channel + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun ChannelBlackListScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + + Scaffold(topBar = { + PageTopBar( + title = { Text(text = stringResource(R.string.removed_user)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelInviteLinksScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelInviteLinksScreen.kt new file mode 100644 index 0000000..cf25f1c --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelInviteLinksScreen.kt @@ -0,0 +1,53 @@ +package com.aiwazian.messenger.ui.channel + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.AddLink +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun ChannelInviteLinksScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + + Scaffold(topBar = { + PageTopBar( + title = { + Text(stringResource(R.string.invite_links)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + SectionItem( + text = "Создать ссылку-приглашение", + icon = Icons.Outlined.AddLink, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.primary) + ) + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelSettingsScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelSettingsScreen.kt new file mode 100644 index 0000000..316194b --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelSettingsScreen.kt @@ -0,0 +1,187 @@ +package com.aiwazian.messenger.ui.channel + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material.icons.outlined.PeopleAlt +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.enums.ChannelType +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.InputField +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.ChannelViewModel +import com.aiwazian.messenger.viewModels.MainViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun ChannelSettingsScreen() { + Content() +} + +@Composable +private fun Content() { + val context = LocalContext.current + + val navViewModel = viewModel() + + val channelViewModel = hiltViewModel() + + val channelInfo by channelViewModel.channelInfo.collectAsState() + + val scrollState = rememberScrollState() + + val scope = rememberCoroutineScope() + + val vibrateService = VibrateService(context) + + Scaffold( + topBar = { + TopBar( + listOf( + TopBarAction( + icon = Icons.Outlined.Check, + onClick = { + scope.launch { + val savedId = channelViewModel.trySaveOrCreate() + + if (savedId == null) { + vibrateService.vibrate(VibrationPattern.Error) + } else { + navViewModel.removeLastScreenInStack() + } + } + }) + ) + ) + }, + modifier = Modifier.imePadding() + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .verticalScroll(scrollState) + ) { + SectionContainer { + InputField( + placeholder = stringResource(R.string.channel_name), + value = channelInfo.name, + onValueChange = channelViewModel::changeName + ) + InputField( + placeholder = stringResource(R.string.description), + value = channelInfo.bio, + onValueChange = channelViewModel::changeBio + ) + } + + SectionContainer { + SectionItem( + icon = Icons.Outlined.PeopleAlt, + text = stringResource(R.string.channel_type), + primaryText = if (channelInfo.channelType == ChannelType.PUBLIC.ordinal) { + stringResource(R.string.public_channel) + } else { + stringResource(R.string.private_channel) + }, + onClick = { + navViewModel.addScreenInStack { + ChannelTypeSettingsScreen() + } + }) + } + + SectionContainer { + SectionItem( + icon = Icons.Outlined.PeopleAlt, + text = stringResource(R.string.subscribers), + primaryText = channelInfo.subscribers.toString(), + onClick = { + navViewModel.addScreenInStack { + ChannelSubscribersScreen(channelInfo.id) + } + }) + } + + SectionContainer { + SectionItem( + text = stringResource(R.string.delete_channel), + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error), + onClick = channelViewModel.deleteDialog::show + ) + } + + val mainViewModel = hiltViewModel() + + if (channelViewModel.deleteDialog.isVisible) { + CustomDialog( + title = stringResource(R.string.delete_channel), + onDismissRequest = channelViewModel.deleteDialog::hide, + buttons = { + TextButton(onClick = channelViewModel.deleteDialog::hide) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = { + scope.launch { + val isDeleted = channelViewModel.tryDelete() + + if (isDeleted) { + mainViewModel.deleteChat(channelInfo.id) + channelViewModel.deleteDialog.hide() + navViewModel.goToMain() + } else { + vibrateService.vibrate(VibrationPattern.Error) + } + } + }, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error) + ) { + Text(stringResource(R.string.delete_channel)) + } + }, + content = { + Text("Вы точно хотите удалить канал?") + }) + } + } + } +} + +@Composable +private fun TopBar(actions: List) { + val navViewModel = viewModel() + + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = actions + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelSubscribersScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelSubscribersScreen.kt new file mode 100644 index 0000000..495b024 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelSubscribersScreen.kt @@ -0,0 +1,79 @@ +package com.aiwazian.messenger.ui.channel + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.ui.ProfileScreen +import com.aiwazian.messenger.ui.element.MinimizeChatCard +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.viewModels.ChannelViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun ChannelSubscribersScreen(id: Long) { + Content(id) +} + +@Composable +private fun Content(id: Long) { + val navViewModel = viewModel() + val channelViewModel = hiltViewModel() + + var subscribers by remember { mutableStateOf>(emptyList()) } + + LaunchedEffect(Unit) { + subscribers = channelViewModel.getSubscribers(id) + } + + Scaffold(topBar = { TopBar() }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + LazyColumn { + items( + items = subscribers, + key = { it.id }) { user -> + MinimizeChatCard( + chatName = "${user.firstName} ${user.lastName}", + onClick = { + navViewModel.addScreenInStack { + ProfileScreen(user.id) + } + }) + } + } + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(stringResource(R.string.subscribers)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelTypeSettingsScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelTypeSettingsScreen.kt new file mode 100644 index 0000000..4623754 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/ChannelTypeSettingsScreen.kt @@ -0,0 +1,336 @@ +package com.aiwazian.messenger.ui.channel + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.scaleIn +import androidx.compose.animation.scaleOut +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material.icons.outlined.ContentCopy +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material.icons.outlined.QrCode +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.enums.ChannelType +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.InputField +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionDescription +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionRadioItem +import com.aiwazian.messenger.utils.Shape +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.ChannelViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +private data class LinkMessage( + var text: String, + var color: Color +) + +@Composable +fun ChannelTypeSettingsScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + val channelViewModel = hiltViewModel() + + var channelType by remember { mutableStateOf(ChannelType.PRIVATE) } + var publicLink by remember { mutableStateOf(null) } + + val vibrateService = VibrateService(LocalContext.current) + + LaunchedEffect(Unit) { + channelType = ChannelType.fromInt(channelViewModel.channelInfo.value.channelType) + publicLink = channelViewModel.channelInfo.value.publicLink.orEmpty() + } + + val scrollState = rememberScrollState() + + val scope = rememberCoroutineScope() + + var canSave by remember { mutableStateOf(true) } + + val action = if (canSave) { + listOf( + TopBarAction( + icon = Icons.Outlined.Check, + onClick = { + scope.launch { + if (channelType == ChannelType.PRIVATE) { + publicLink = null + } + + channelViewModel.changePublicLink(publicLink) + + val isChanged = channelViewModel.changeChannelType(channelType) + + if (!isChanged) { + vibrateService.vibrate(VibrationPattern.Error) + return@launch + } + + val savedId = channelViewModel.trySaveOrCreate() + + if (savedId == null) { + vibrateService.vibrate(VibrationPattern.Error) + return@launch + } + + navViewModel.removeLastScreenInStack() + } + }) + ) + } else { + emptyList() + } + + Scaffold( + topBar = { + TopBar(actions = action) + }, + modifier = Modifier.imePadding() + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .verticalScroll(scrollState) + ) { + SectionHeader(title = stringResource(R.string.channel_type)) + SectionContainer { + SectionRadioItem( + text = stringResource(R.string.private_channel), + selected = channelType == ChannelType.PRIVATE, + description = "На частные каналы можно подписаться только по ссылке-приглашению.", + onClick = { + canSave = true + channelType = ChannelType.PRIVATE + }) + SectionRadioItem( + text = stringResource(R.string.public_channel), + selected = channelType == ChannelType.PUBLIC, + description = "Публичные каналы можно найти через поиск, подписаться на них может любой пользователь.", + onClick = { + channelType = ChannelType.PUBLIC + }) + } + + AnimatedContent( + targetState = channelType, + transitionSpec = { + scaleIn(tween(200)) + fadeIn(tween(200)) togetherWith scaleOut(tween(200)) + fadeOut(tween(200)) + }) { type -> + if (type == ChannelType.PUBLIC) { + Column { + var linkError by remember { mutableStateOf(null) } + + SectionHeader(title = stringResource(R.string.public_link)) + + val errorColor = MaterialTheme.colorScheme.error + val successColor = MaterialTheme.colorScheme.primary + + SectionContainer { + InputField( + placeholder = "Ссылка", + value = publicLink.orEmpty(), + onValueChange = { newLink -> + scope.launch { + publicLink = newLink + + if (newLink.isBlank()) { + canSave = false + linkError = null + return@launch + } + + if (newLink == channelViewModel.channelInfo.value.publicLink) { + canSave = true + linkError = null + return@launch + } + + val isBusy = channelViewModel.checkIsBusyPublicLink(newLink) + + canSave = isBusy == false + + if (isBusy == null) { + linkError = LinkMessage( + text = "Не удалось проверить.", + color = errorColor + ) + } else if (isBusy) { + linkError = LinkMessage( + text = "Ссылка занята.", + color = errorColor + ) + } else { + linkError = LinkMessage( + text = "$publicLink доступен.", + color = successColor + ) + } + } + }) + } + + AnimatedContent(targetState = linkError) { text -> + if (text != null) { + Text( + text = text.text, + modifier = Modifier.padding( + start = 16.dp, + end = 16.dp, + bottom = 8.dp + ), + fontSize = 12.sp, + color = text.color + ) + } + } + + SectionDescription(text = "Если у канала будет постоянная публичная ссылка, другие пользователи смогут найти его и подписаться.") + } + } else if (false) { + Column { + SectionHeader(title = stringResource(R.string.invite_link)) + SectionContainer { + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(8.dp) + .fillMaxWidth() + .clip(RoundedCornerShape(10.dp)) + .background(MaterialTheme.colorScheme.background) + .combinedClickable(onClick = { }) + ) { + var expand by remember { mutableStateOf(false) } + + Text( + text = "me/ggkodps", + fontSize = 16.sp, + modifier = Modifier + .weight(1f) + .padding(horizontal = 16.dp) + ) + + IconButton(onClick = { expand = true }) { + Icon( + imageVector = Icons.Outlined.MoreVert, + contentDescription = null + ) + + DropdownMenu( + expanded = expand, + onDismissRequest = { expand = false }, + shape = Shape.DropdownMenu + ) { + DropdownMenuItem( + text = { Text("Получить QR-код") }, + onClick = { }, + leadingIcon = { + Icon( + imageVector = Icons.Outlined.QrCode, + contentDescription = null + ) + }) + } + } + } + + OutlinedButton( + onClick = { }, + modifier = Modifier + .fillMaxWidth() + .padding( + start = 8.dp, + end = 8.dp, + bottom = 8.dp + ), + shape = RoundedCornerShape(10.dp) + ) { + Row( + modifier = Modifier.padding(vertical = 4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Outlined.ContentCopy, + contentDescription = null, + modifier = Modifier.padding(end = 4.dp) + ) + Text( + text = "Скопировать", + fontSize = 16.sp + ) + } + } + } + SectionDescription(text = "По этой ссылке можно подписаться на канал. Вы можете сбросить её в любой момент.") + } + } + } + } + } +} + +@Composable +private fun TopBar(actions: List) { + val navViewModel = viewModel() + + PageTopBar( + title = { + Text(stringResource(R.string.channel_type)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = actions + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/CreateChannelScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/CreateChannelScreen.kt new file mode 100644 index 0000000..aec457f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/channel/CreateChannelScreen.kt @@ -0,0 +1,195 @@ +package com.aiwazian.messenger.ui.channel + +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.ArrowForward +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +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.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.enums.ChatType +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.ChatScreen +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionDescription +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.ChannelViewModel +import com.aiwazian.messenger.viewModels.MainViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun CreateChannelScreen() { + Content() +} + +@Composable +private fun Content() { + val context = LocalContext.current + + val navViewModel = viewModel() + val mainViewModel = hiltViewModel() + val viewModel = hiltViewModel() + + LaunchedEffect(Unit) { + viewModel.cleanData() + } + + DisposableEffect(Unit) { + onDispose { + viewModel.cleanData() + } + } + + val channel by viewModel.channelInfo.collectAsState() + + val vibrateService = VibrateService(context) + + val scrollState = rememberScrollState() + val scope = rememberCoroutineScope() + + var isLoading by remember { mutableStateOf(false) } + + Scaffold( + topBar = { + TopBar() + }, + floatingActionButton = { + FloatingActionButton( + modifier = Modifier.imePadding(), + onClick = { + scope.launch { + isLoading = true + val createdId = viewModel.trySaveOrCreate() + + if (createdId == null) { + vibrateService.vibrate(VibrationPattern.Error) + isLoading = false + return@launch + } + + val chatInfo = ChatInfo( + id = createdId, + chatName = channel.name + ) + + mainViewModel.showNewChat(chatInfo) + + navViewModel.goToMain() + + navViewModel.addScreenInStack { + ChatScreen(chatInfo.id) + } + } + }, + containerColor = MaterialTheme.colorScheme.primary, + shape = CircleShape + ) { + AnimatedContent(targetState = isLoading) { isLoading -> + if (isLoading) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onPrimary, + strokeWidth = 2.dp, + modifier = Modifier.size(20.dp) + ) + } else { + Icon( + Icons.AutoMirrored.Outlined.ArrowForward, + null + ) + } + } + } + }) { it -> + Column( + Modifier + .padding(it) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + SectionContainer { + OutlinedTextField( + modifier = Modifier.fillMaxWidth(), + singleLine = true, + value = channel.name, + onValueChange = viewModel::changeName, + placeholder = { + Text(text = stringResource(R.string.channel_name)) + }, + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + ) + ) + + OutlinedTextField( + modifier = Modifier.fillMaxWidth(), + singleLine = true, + value = channel.bio, + onValueChange = viewModel::changeBio, + placeholder = { + Text(text = stringResource(R.string.description)) + }, + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + ) + ) + } + + SectionDescription("Можете указать дополнительное описание канала.") + + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(text = stringResource(R.string.create_channel)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/AnimatedIntroSection.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/AnimatedIntroSection.kt new file mode 100644 index 0000000..e5c2ec8 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/AnimatedIntroSection.kt @@ -0,0 +1,82 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.airbnb.lottie.compose.LottieAnimation +import com.airbnb.lottie.compose.LottieCompositionSpec +import com.airbnb.lottie.compose.LottieConstants +import com.airbnb.lottie.compose.rememberLottieComposition + +@Composable +fun AnimatedIntroScreen( + animation: String, + title: String, + description: String, + buttonText: String, + buttonClick: () -> Unit +) { + Column( + modifier = Modifier + .padding(20.dp) + .fillMaxSize() + ) { + Column( + modifier = Modifier + .weight(1f), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + val composition by rememberLottieComposition( + spec = LottieCompositionSpec.Asset(animation) + ) + + LottieAnimation( + composition = composition, + modifier = Modifier.size(100.dp), + iterations = LottieConstants.IterateForever, + isPlaying = true + ) + + Text( + text = title, + fontSize = 24.sp, + modifier = Modifier.padding(top = 16.dp, bottom = 8.dp) + ) + + Text( + text = description, + textAlign = TextAlign.Center, + fontSize = 14.sp, + lineHeight = 16.sp, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + + Button( + onClick = buttonClick, + modifier = Modifier + .fillMaxWidth(), + shape = RoundedCornerShape(10.dp) + ) { + Text( + text = buttonText, + modifier = Modifier.padding(8.dp), + ) + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/ChatCard.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/ChatCard.kt new file mode 100644 index 0000000..0b83a94 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/ChatCard.kt @@ -0,0 +1,211 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.background +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.AccountCircle +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material.icons.outlined.PushPin +import androidx.compose.material3.Badge +import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.Message +import java.time.Instant +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +@Composable +fun ChatCard( + chatInfo: ChatInfo, + selected: Boolean = false, + pinned: Boolean = false, + unreadMessageCount: Int = 0, + onClickChat: () -> Unit = {}, + onLongClickChat: () -> Unit = {}, + onLongClickChatLogo: () -> Unit = {} +) { + ListItem( + modifier = Modifier.combinedClickable( + onClick = { + onClickChat() + }, + onLongClick = { + onLongClickChat() + }), + headlineContent = { + Text( + text = chatInfo.chatName, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + }, + supportingContent = { + if (chatInfo.lastMessage != null && !chatInfo.lastMessage?.text.isNullOrBlank()) { + Text( + text = chatInfo.lastMessage?.text ?: chatInfo.lastMessage?.attachments[0]?.name + ?: "", + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + }, + leadingContent = { + Leading(selected) + }, + trailingContent = { + Column { + if (chatInfo.lastMessage != null) { + LastMessageSendTime(chatInfo.lastMessage!!) + } + + Box(modifier = Modifier.size(40.dp)) { + if (unreadMessageCount > 0) { + UnreadMessageCount(unreadMessageCount) + } else if (pinned) { + PinIcon() + } + } + } + }) +} + +@Composable +private fun LastMessageSendTime(lastMessage: Message) { + val isRead = lastMessage.isRead + + val sendTime = lastMessage.sendTime + val sendMessageTime = formatTimestamp(sendTime) + + Row(verticalAlignment = Alignment.CenterVertically) { + Box(contentAlignment = Alignment.CenterEnd) { + Icon( + imageVector = Icons.Outlined.Check, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.size(16.dp) + ) + + if (isRead) { + Icon( + imageVector = Icons.Outlined.Check, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier + .padding(end = 6.dp) + .size(16.dp) + ) + } + } + + Text(sendMessageTime) + } +} + +@Composable +private fun PinIcon() { + Badge( + containerColor = Color.Transparent, + contentColor = MaterialTheme.colorScheme.onSurface + ) { + Icon( + imageVector = Icons.Outlined.PushPin, + contentDescription = null, + modifier = Modifier.rotate(45f), + ) + } +} + +@Composable +private fun UnreadMessageCount(count: Int) { + Badge( + containerColor = MaterialTheme.colorScheme.primary, + contentColor = Color.White + ) { + Text( + text = count.toString(), + fontSize = 14.sp, + modifier = Modifier.padding(2.dp), + textAlign = TextAlign.End + ) + } +} + +@Composable +private fun Leading(visible: Boolean) { + Box(modifier = Modifier.size(40.dp)) { + Icon( + imageVector = Icons.Outlined.AccountCircle, + contentDescription = null, + modifier = Modifier.fillMaxSize() + ) + + Box( + modifier = Modifier + .clip(CircleShape) + .size(16.dp) + .align(Alignment.BottomEnd) + ) { + AnimatedContent(targetState = visible) { isVisible -> + if (isVisible) { + Box( + modifier = Modifier + .clip(CircleShape) + .size(16.dp) + .background(Color.Green), + ) { + Icon( + imageVector = Icons.Outlined.Check, + contentDescription = null, + tint = Color.White, + modifier = Modifier.size(16.dp) + ) + } + } + } + } + } +} + +private fun formatTimestamp(timestamp: Long): String { + val currentDateTime = LocalDateTime.now() + val providedDateTime = + Instant.ofEpochMilli(timestamp).atZone(ZoneId.systemDefault()).toLocalDateTime() + + if (providedDateTime.toLocalDate().isEqual(currentDateTime.toLocalDate())) { + return providedDateTime.format(DateTimeFormatter.ofPattern("HH:mm")) + } + + val startOfWeek = + currentDateTime.toLocalDate().minusDays(currentDateTime.dayOfWeek.ordinal.toLong()) + if (providedDateTime.toLocalDate().isAfter(startOfWeek) && providedDateTime.toLocalDate() + .isBefore(currentDateTime.toLocalDate()) + ) { + val dayOfWeekFormatter = DateTimeFormatter.ofPattern("E") + return providedDateTime.format(dayOfWeekFormatter) + } + + val dateFormatter = DateTimeFormatter.ofPattern("d MMM") + return providedDateTime.format(dateFormatter) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CodeBlocks.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CodeBlocks.kt new file mode 100644 index 0000000..608f2cc --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CodeBlocks.kt @@ -0,0 +1,125 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.SizeTransform +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Circle +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun CodeBlocks( + count: Int, + showInput: Boolean = true, + code: String +) { + val durationMills = 150 + + val fadeInSpec = fadeIn(tween(durationMills)) + + val fadeOutSpec = fadeOut(tween(durationMills)) + + val inputAnimation = slideInVertically( + tween(durationMills) + ) { it } + fadeInSpec togetherWith slideOutVertically( + tween(durationMills) + ) { -it } + fadeOutSpec + + val outputAnimation = slideInVertically( + tween(durationMills) + ) { -it } + fadeInSpec togetherWith slideOutVertically( + tween(durationMills) + ) { it } + fadeOutSpec + + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + repeat(times = count) { index -> + val char = code.getOrNull(index)?.toString() ?: "" + + val isCurrent = index == code.length && char.isEmpty() + + val cellBorderColor by animateColorAsState( + targetValue = if (isCurrent) { + MaterialTheme.colorScheme.primary + } else { + MaterialTheme.colorScheme.outline + }, + animationSpec = tween( + durationMillis = 200, + easing = FastOutSlowInEasing + ) + ) + + Column( + modifier = Modifier + .width(44.dp) + .height(48.dp) + .border( + width = 2.dp, + color = cellBorderColor, + shape = RoundedCornerShape(8.dp) + ), + verticalArrangement = Arrangement.Center + ) { + AnimatedContent( + targetState = char, + transitionSpec = { + if (targetState > initialState) { + inputAnimation + } else { + outputAnimation + }.using(SizeTransform(clip = true)) + }) { + if (showInput) { + Text( + text = it, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center, + lineHeight = 40.sp, + fontSize = 20.sp + ) + } else if (it.isNotBlank()) { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon( + imageVector = Icons.Filled.Circle, + contentDescription = null, + modifier = Modifier.size(10.dp), + ) + } + } + } + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomDialog.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomDialog.kt new file mode 100644 index 0000000..5eb9ab5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomDialog.kt @@ -0,0 +1,76 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Card +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import com.aiwazian.messenger.utils.Shape + +@Composable +fun CustomDialog( + title: String, + onDismissRequest: () -> Unit, + buttons: @Composable () -> Unit, + content: @Composable () -> Unit +) { + Dialog( + onDismissRequest = onDismissRequest, + properties = DialogProperties( + dismissOnBackPress = true, + dismissOnClickOutside = true + ) + ) { + Card( + modifier = Modifier.fillMaxWidth(), + shape = Shape.Dialog + ) { + Column { + Text( + text = title, + modifier = Modifier.padding( + start = 16.dp, + top = 16.dp, + end = 16.dp, + bottom = 8.dp + ), + fontSize = 20.sp, + fontWeight = FontWeight.W500 + ) + + Column( + modifier = Modifier.padding( + start = 16.dp, + end = 16.dp, + bottom = 16.dp + ) + ) { + content() + } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding( + bottom = 4.dp, + end = 8.dp + ), + horizontalArrangement = Arrangement.End, + ) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + buttons() + } + } + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomNumberBoard.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomNumberBoard.kt new file mode 100644 index 0000000..b9846c4 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomNumberBoard.kt @@ -0,0 +1,106 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Backspace +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.utils.VibrationPattern + +@Composable +fun CustomNumberBoard( + value: String = "", + buttons: List>, + onChange: (String) -> Unit +) { + val context = LocalContext.current + + val vibrateService = VibrateService(context) + + Column( + modifier = Modifier + .padding(10.dp), + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + buttons.forEach { row -> + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + row.forEach { key -> + + if (key == null) { + Box(modifier = Modifier.weight(1f)) + return@forEach + } + + NumberButton( + onClick = { + if (key is ImageVector) { + onChange(value.dropLast(1)) + } else { + onChange(value + key) + } + + vibrateService.vibrate( + pattern = VibrationPattern.TactileResponse + ) + }, + modifier = Modifier + .weight(1f) + .padding(vertical = 2.dp) + ) { + if (key is ImageVector) { + Text( + text = "", + lineHeight = 30.sp + ) + + Icon( + imageVector = Icons.AutoMirrored.Outlined.Backspace, + contentDescription = null, + ) + } else if (key is String) { + Text( + text = key, + fontSize = 18.sp, + lineHeight = 30.sp + ) + } + } + } + } + } + } +} + +@Composable +private fun NumberButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + content: @Composable () -> Unit, +) { + TextButton( + onClick = onClick, + modifier = modifier, + shape = RoundedCornerShape(10.dp), + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.onSurface, + containerColor = MaterialTheme.colorScheme.surface, + ) + ) { + content() + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomSwitch.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomSwitch.kt new file mode 100644 index 0000000..bc0d499 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/CustomSwitch.kt @@ -0,0 +1,18 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults +import androidx.compose.runtime.Composable + +@Composable +fun CustomSwitch(checked: Boolean, onCheckedChange: ((Boolean) -> Unit)?) { + Switch( + checked = checked, + onCheckedChange = onCheckedChange, + colors = SwitchDefaults.colors( + checkedTrackColor = MaterialTheme.colorScheme.primary, + uncheckedTrackColor = MaterialTheme.colorScheme.surface + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/InputField.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/InputField.kt new file mode 100644 index 0000000..412c154 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/InputField.kt @@ -0,0 +1,35 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.selection.TextSelectionColors +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color + +@Composable +fun InputField(placeholder: String, value: String, onValueChange: (String) -> Unit) { + val selectionColor = TextSelectionColors( + handleColor = MaterialTheme.colorScheme.primary, + backgroundColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.4f) + ) + + TextField( + modifier = Modifier.fillMaxWidth(), + value = value, + singleLine = true, + placeholder = { Text(placeholder) }, + onValueChange = onValueChange, + colors = TextFieldDefaults.colors( + selectionColors = selectionColor, + cursorColor = MaterialTheme.colorScheme.primary, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/MessageFile.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/MessageFile.kt new file mode 100644 index 0000000..1070610 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/MessageFile.kt @@ -0,0 +1,144 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.background +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.Row +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.layout.widthIn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.InsertDriveFile +import androidx.compose.material.icons.automirrored.rounded.TextSnippet +import androidx.compose.material.icons.filled.Download +import androidx.compose.material.icons.rounded.Android +import androidx.compose.material.icons.rounded.Close +import androidx.compose.material.icons.rounded.Css +import androidx.compose.material.icons.rounded.DataObject +import androidx.compose.material.icons.rounded.FolderZip +import androidx.compose.material.icons.rounded.Gif +import androidx.compose.material.icons.rounded.Html +import androidx.compose.material.icons.rounded.Image +import androidx.compose.material.icons.rounded.Javascript +import androidx.compose.material.icons.rounded.MusicNote +import androidx.compose.material.icons.rounded.Php +import androidx.compose.material.icons.rounded.VideoCameraBack +import androidx.compose.material3.CircularWavyProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.aiwazian.messenger.enums.DownloadStatus +import com.aiwazian.messenger.enums.FileType + +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +fun MessageFile( + fileName: String, + fileInfo: String, + onClick: () -> Unit, + fileType: FileType, + downloadStatus: DownloadStatus, + progress: Int = 0 +) { + Row( + modifier = Modifier + .clickable { + onClick.invoke() + } + .padding(8.dp) + .widthIn(min = 220.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Box( + modifier = Modifier + .clip(CircleShape) + .background(MaterialTheme.colorScheme.onPrimary) + .padding(4.dp) + .width(50.dp) + .height(50.dp), + contentAlignment = Alignment.Center + ) { + when (downloadStatus) { + DownloadStatus.PENDING -> { + Icon( + imageVector = Icons.Filled.Download, + contentDescription = null, + modifier = Modifier.size(30.dp), + tint = MaterialTheme.colorScheme.primary + ) + } + + DownloadStatus.DOWNLOADING -> { + CircularWavyProgressIndicator( + progress = { + progress / 100f + }, + modifier = Modifier + .width(46.dp) + .height(46.dp) + ) + + Icon( + imageVector = Icons.Rounded.Close, + contentDescription = null, + modifier = Modifier.size(30.dp), + tint = MaterialTheme.colorScheme.primary + ) + } + + DownloadStatus.COMPLETED -> { + val icon = when (fileType) { + FileType.IMAGE -> Icons.Rounded.Image + FileType.VIDEO -> Icons.Rounded.VideoCameraBack + FileType.MUSIC -> Icons.Rounded.MusicNote + FileType.ZIP -> Icons.Rounded.FolderZip + FileType.APK -> Icons.Rounded.Android + FileType.CSS -> Icons.Rounded.Css + FileType.HTML -> Icons.Rounded.Html + FileType.JAVASCRIPT -> Icons.Rounded.Javascript + FileType.PHP -> Icons.Rounded.Php + FileType.GIF -> Icons.Rounded.Gif + FileType.TEXT -> Icons.AutoMirrored.Rounded.TextSnippet + FileType.JSON -> Icons.Rounded.DataObject + FileType.OTHER -> Icons.AutoMirrored.Rounded.InsertDriveFile + } + + Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier.size(30.dp), + tint = MaterialTheme.colorScheme.primary + ) + } + } + } + + Column { + Text( + text = fileName, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + fontSize = 16.sp, + lineHeight = 16.sp + ) + Text( + text = fileInfo, + fontSize = 12.sp, + lineHeight = 12.sp + ) + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/MinimizeChatCard.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/MinimizeChatCard.kt new file mode 100644 index 0000000..3500501 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/MinimizeChatCard.kt @@ -0,0 +1,77 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.AccountCircle +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.Icon +import androidx.compose.material3.ListItem +import androidx.compose.material3.ListItemDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +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.unit.dp + +@Composable +fun MinimizeChatCard( + chatName: String, + selected: Boolean = false, + trailingContent: @Composable (() -> Unit)? = null, + onClick: () -> Unit = { } +) { + ListItem( + modifier = Modifier.clickable { + onClick() + }, + leadingContent = { + Box(modifier = Modifier.size(40.dp)) { + Icon( + imageVector = Icons.Outlined.AccountCircle, + contentDescription = null, + modifier = Modifier.fillMaxSize() + ) + + Box( + modifier = Modifier + .clip(CircleShape) + .size(16.dp) + .align(Alignment.BottomEnd) + ) { + AnimatedContent(targetState = selected) { isVisible -> + if (isVisible) { + Box( + modifier = Modifier + .clip(CircleShape) + .size(16.dp) + .background(Color.Green), + ) { + Icon( + imageVector = Icons.Outlined.Check, + contentDescription = null, + tint = Color.White, + modifier = Modifier.size(16.dp) + ) + } + } + } + } + } + }, + trailingContent = trailingContent, + headlineContent = { + Text(chatName) + }, + colors = ListItemDefaults.colors( + containerColor = Color.Transparent + ) + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/NavigationController.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/NavigationController.kt new file mode 100644 index 0000000..20377d5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/NavigationController.kt @@ -0,0 +1,148 @@ +package com.aiwazian.messenger.ui.element + +import androidx.activity.compose.BackHandler +import androidx.compose.animation.core.animateDpAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.draggable +import androidx.compose.foundation.gestures.rememberDraggableState +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch +import kotlin.math.roundToInt + +@Composable +fun NavigationController(startScreen: @Composable () -> Unit) { + val navViewModel = viewModel() + + val screenStack by navViewModel.screenStack.collectAsState() + val offsetStack by navViewModel.offsetStack.collectAsState() + + val tweenDurationMillis = navViewModel.tweenDurationMillis + + val screenWidthPx = with(LocalDensity.current) { + LocalConfiguration.current.screenWidthDp.dp.toPx() + } + + navViewModel.screenWidth = screenWidthPx + + val scope = rememberCoroutineScope() + + navViewModel.scope = scope + + val keyboardController = LocalSoftwareKeyboardController.current + + Box(modifier = Modifier.fillMaxSize()) { + startScreen() + + screenStack.forEachIndexed { index, screenEntry -> + val offsetX = offsetStack[index] + val isTop = index == screenStack.lastIndex + + val canGoBackBySwipe = screenEntry.canGoBackBySwipe + + BackHandler(enabled = screenStack.isNotEmpty() && canGoBackBySwipe) { + navViewModel.removeLastScreenInStack() + } + + LaunchedEffect(key1 = screenEntry.content) { + keyboardController?.hide() + offsetX.animateTo( + 0f, + tween(tweenDurationMillis) + ) + } + + val backgroundAlpha = ((1f - (offsetX.value / screenWidthPx)).coerceIn( + 0f, + 1f + )) * 0.5f + + BoxShadow( + index, + backgroundAlpha + ) + + val draggableState = rememberDraggableState { delta -> + keyboardController?.hide() + scope.launch { + offsetX.snapTo((offsetX.value + delta).coerceAtLeast(0f)) + } + } + + Box( + modifier = Modifier + .fillMaxSize() + .offset { + IntOffset( + offsetX.value.roundToInt(), + 0 + ) + } + .zIndex(index + 0.2f) + .then( + if (isTop && canGoBackBySwipe) { + Modifier.draggable( + orientation = Orientation.Horizontal, + state = draggableState, + onDragStopped = { + scope.launch { + if (offsetX.value > screenWidthPx / 4) { + navViewModel.removeLastScreenInStack() + } else { + offsetX.animateTo( + 0f, + tween(tweenDurationMillis) + ) + } + } + }) + } else Modifier + ) + ) { + screenEntry.content() + } + } + } +} + +@Composable +private fun BoxShadow( + index: Int, + backgroundAlpha: Float +) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(alpha = backgroundAlpha)) + .zIndex(zIndex = index + 0.1f) + .clickable( + indication = null, + interactionSource = remember { + MutableInteractionSource() + }) { }) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/PageTopBar.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/PageTopBar.kt new file mode 100644 index 0000000..566c3c7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/PageTopBar.kt @@ -0,0 +1,74 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.utils.Shape + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PageTopBar( + title: @Composable () -> Unit = { }, + navigationIcon: NavigationIcon, + actions: List = emptyList() +) { + TopAppBar( + title = title, + navigationIcon = { + IconButton(onClick = { navigationIcon.onClick() }) { + Icon( + imageVector = navigationIcon.icon, + contentDescription = null + ) + } + }, + actions = { + actions.forEach { action -> + var expand by remember { mutableStateOf(false) } + + IconButton(onClick = { + action.onClick?.invoke() + + if (action.dropdownActions.isNotEmpty()) { + expand = true + } + }) { + Icon( + imageVector = action.icon, + contentDescription = null + ) + } + + DropdownMenu( + shape = Shape.DropdownMenu, + expanded = expand, + onDismissRequest = { expand = false }) { + action.dropdownActions.forEach { item -> + DropdownMenuItem( + text = { Text(item.text) }, + onClick = { + expand = false + item.onClick() + }, + leadingIcon = { + Icon( + imageVector = item.icon, + contentDescription = null + ) + }) + } + } + } + }) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionCkeckBoxItem.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionCkeckBoxItem.kt new file mode 100644 index 0000000..5407747 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionCkeckBoxItem.kt @@ -0,0 +1,55 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CheckboxDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp + +@Composable +fun SectionCheckBoxItem(text: String, checked: Boolean, onChecked: () -> Unit = {}) { + var isChecked by remember { mutableStateOf(checked) } + + Column { + TextButton( + modifier = Modifier + .fillMaxWidth() + .padding(0.dp), + shape = RectangleShape, + onClick = { + isChecked = !isChecked + onChecked() + } + ) { + Row( + modifier = Modifier.padding(8.dp).fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(10.dp) + ) { + Checkbox( + onCheckedChange = null, + checked = isChecked, + colors = CheckboxDefaults.colors( + checkedColor = MaterialTheme.colorScheme.primary + ) + ) + Text(text = text, fontWeight = FontWeight.W400) + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionContainer.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionContainer.kt new file mode 100644 index 0000000..9fb5926 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionContainer.kt @@ -0,0 +1,24 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import com.aiwazian.messenger.utils.Shape + +@Composable +fun SectionContainer(content: @Composable () -> Unit) { + Card( + modifier = Modifier + .padding(10.dp) + .fillMaxWidth() + .clip(Shape.Section), + elevation = CardDefaults.cardElevation(4.dp) + ) { + content() + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionDescription.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionDescription.kt new file mode 100644 index 0000000..bc7b8b7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionDescription.kt @@ -0,0 +1,20 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun SectionDescription(text: String) { + Text( + text = text, + fontSize = 12.sp, + lineHeight = 14.sp, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 16.dp) + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionHeader.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionHeader.kt new file mode 100644 index 0000000..eb7c56b --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionHeader.kt @@ -0,0 +1,31 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun SectionHeader(title: String, actionButton: @Composable (() -> Unit) = { }) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(start = 18.dp, top = 14.dp, end = 12.dp, bottom = 0.dp) + ) { + Text( + text = title, + modifier = Modifier.weight(1f), + fontSize = 14.sp, + fontWeight = FontWeight.W600, + color = MaterialTheme.colorScheme.primary + ) + + actionButton() + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionItem.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionItem.kt new file mode 100644 index 0000000..0b7f56a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionItem.kt @@ -0,0 +1,96 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun SectionItem( + text: String, + icon: ImageVector? = null, + description: String? = null, + primaryText: String? = null, + primaryIcon: ImageVector? = null, + primaryIconClick: () -> Unit = {}, + colors: ButtonColors? = null, + onClick: () -> Unit = {}, + onLongClick: () -> Unit = {}, +) { + TextButton( + shape = RectangleShape, + modifier = Modifier.fillMaxWidth(), + onClick = onClick, + colors = colors ?: ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.onSurface) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + if (icon != null) { + Icon( + imageVector = icon, + contentDescription = null, + tint = colors?.contentColor ?: MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(end = 16.dp) + ) + } + + Column(modifier = Modifier.weight(1f)) { + Text( + text = text, + color = colors?.contentColor ?: MaterialTheme.colorScheme.onSurface, + fontSize = 16.sp, + fontWeight = FontWeight.Normal + ) + + if (description != null) { + Text( + text = description, + fontSize = 12.sp, + lineHeight = 14.sp, + fontWeight = FontWeight.Normal, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + + if (primaryText != null) { + Text( + text = primaryText, + color = MaterialTheme.colorScheme.primary, + fontSize = 16.sp, + fontWeight = FontWeight.Normal + ) + } else if (primaryIcon != null) { + IconButton(onClick = primaryIconClick) { + Icon( + imageVector = primaryIcon, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary + ) + } + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionRadioItem.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionRadioItem.kt new file mode 100644 index 0000000..c4a3f55 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionRadioItem.kt @@ -0,0 +1,69 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton +import androidx.compose.material3.RadioButtonDefaults +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun SectionRadioItem( + text: String, + selected: Boolean = false, + description: String? = null, + onClick: () -> Unit = {} +) { + TextButton( + shape = RectangleShape, + modifier = Modifier.fillMaxWidth(), + onClick = onClick, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.onSurface) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + RadioButton( + onClick = null, + selected = selected, + modifier = Modifier.padding(end = 16.dp), + colors = RadioButtonDefaults.colors( + selectedColor = MaterialTheme.colorScheme.primary + ) + ) + + Column(modifier = Modifier.weight(1f)) { + Text( + text = text, + color = MaterialTheme.colorScheme.onSurface, + fontSize = 16.sp, + fontWeight = FontWeight.Normal + ) + + if (description != null) { + Text( + text = description, + fontSize = 12.sp, + lineHeight = 14.sp, + fontWeight = FontWeight.Normal, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionToggleItem.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionToggleItem.kt new file mode 100644 index 0000000..1309f49 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SectionToggleItem.kt @@ -0,0 +1,80 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun SectionToggleItem( + icon: ImageVector? = null, + text: String, + description: String? = null, + isChecked: Boolean, + onCheckedChange: () -> Unit, +) { + Card( + shape = RectangleShape, + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = Color.Transparent, + ), + onClick = onCheckedChange + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + ) { + if (icon != null) { + Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier.padding(end = 16.dp) + ) + } + + Column(modifier = Modifier.weight(1f)) { + Text( + text = text, + ) + if (description != null) { + Text( + text = description, + fontSize = 12.sp, + ) + } + } + + Box(Modifier.pointerInput(Unit) { + awaitPointerEventScope { + while (true) { + awaitPointerEvent() + } + } + }) { + CustomSwitch( + checked = isChecked, + onCheckedChange = null + ) + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SwipeableChatCard.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SwipeableChatCard.kt new file mode 100644 index 0000000..39565df --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/element/SwipeableChatCard.kt @@ -0,0 +1,101 @@ +package com.aiwazian.messenger.ui.element + +import androidx.compose.animation.animateColorAsState +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SwipeToDismissBox +import androidx.compose.material3.SwipeToDismissBoxValue +import androidx.compose.material3.rememberSwipeToDismissBoxState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.utils.VibrationPattern + +@Composable +fun SwipeableChatCard( + chatInfo: ChatInfo, + selected: Boolean = false, + pinned: Boolean = false, + enableSwipeable: Boolean = true, + onClick: () -> Unit, + onLongClick: () -> Unit = {}, + onDismiss: () -> Unit, + backgroundIcon: ImageVector? = null +) { + val context = LocalContext.current + + val swipeToDismissBoxState = rememberSwipeToDismissBoxState() + + val backgroundColor by animateColorAsState( + targetValue = if (swipeToDismissBoxState.progress > 0.5f && swipeToDismissBoxState.progress < 1f) { + MaterialTheme.colorScheme.onSurfaceVariant + } else { + MaterialTheme.colorScheme.primary + } + ) + + val vibrateService = VibrateService(context) + + var leftVibration by remember { mutableStateOf(false) } + + if (swipeToDismissBoxState.progress > 0.5f && swipeToDismissBoxState.progress < 0.9f && !leftVibration) { + vibrateService.vibrate(VibrationPattern.TactileResponse) + leftVibration = true + } else if (swipeToDismissBoxState.progress == 1f && leftVibration) { + vibrateService.vibrate(VibrationPattern.TactileResponse) + leftVibration = false + } + + SwipeToDismissBox( + onDismiss = { it -> + if (it == SwipeToDismissBoxValue.EndToStart) { + onDismiss() + } + }, + enableDismissFromStartToEnd = false, + enableDismissFromEndToStart = false, // TODO enableSwipeable + state = swipeToDismissBoxState, + backgroundContent = { + Column( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight() + .background(backgroundColor) + .padding(horizontal = 16.dp), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.End + ) { + if (backgroundIcon != null) { + Icon( + imageVector = backgroundIcon, + contentDescription = null, + tint = Color.White + ) + } + } + }) { + ChatCard( + chatInfo = chatInfo, + selected = selected, + pinned = pinned, + onClickChat = onClick, + onLongClickChat = onLongClick + ) + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/AddMemberScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/AddMemberScreen.kt new file mode 100644 index 0000000..adeb4a8 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/AddMemberScreen.kt @@ -0,0 +1,164 @@ +package com.aiwazian.messenger.ui.group + +import android.util.Log +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.services.ChatService +import com.aiwazian.messenger.services.SearchService +import com.aiwazian.messenger.ui.element.InputField +import com.aiwazian.messenger.ui.element.MinimizeChatCard +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun AddMemberScreen( + membersId: LongArray, + callback: (LongArray) -> Unit +) { + val navViewModel = viewModel() + + var allChats by remember { mutableStateOf>(emptyList()) } + var searchQuery by remember { mutableStateOf("") } + var selectedUsers by remember { mutableStateOf>(emptyList()) } + + var networkSearchResults by remember { mutableStateOf>(emptyList()) } + + val localFilteredChats = allChats.filter { chatInfo -> + chatInfo.chatName.contains( + other = searchQuery.trim(), + ignoreCase = true + ) + } + + val filteredChats = remember( + localFilteredChats, + networkSearchResults, + searchQuery + ) { + if (searchQuery.isBlank()) { + localFilteredChats + } else { + val combined = networkSearchResults.toMutableList() + + localFilteredChats.forEach { localChat -> + if (combined.none { it.id == localChat.id }) { + combined.add(localChat) + } + } + combined.toList() + } + } + + LaunchedEffect(searchQuery) { + if (searchQuery.isBlank()) { + networkSearchResults = emptyList() + return@LaunchedEffect + } + + try { + val result = SearchService().searchUserByUsername(searchQuery) + + val ds = result?.map { + ChatInfo( + id = it.chatId, + chatName = it.name + ) + } ?: emptyList() + + networkSearchResults = ds + + } catch (e: Exception) { + Log.e( + "AddMemberScreen", + "Ошибка при поиске пользователей", + e + ) + } + } + + LaunchedEffect(Unit) { + try { + val chats = ChatService().getAllChatsWithOtherUser() + allChats = chats.orEmpty() + + selectedUsers = allChats.filter { it.id in membersId } + } catch (e: Exception) { + Log.e( + "AddMemberScreen", + "Не удалось получить всех пользователей", + e + ) + } + } + + Scaffold(topBar = { + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = listOf( + TopBarAction( + icon = Icons.Outlined.Check, + onClick = { + callback(selectedUsers.map { it.id }.toLongArray()) + + navViewModel.removeLastScreenInStack() + } + ) + ) + ) + }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + InputField( + placeholder = "Поиск людей...", + value = searchQuery, + onValueChange = { searchQuery = it }) + } + + SectionContainer { + LazyColumn { + items( + filteredChats, + { it.id }) { chat -> + val isPermanentMember = remember { chat.id in membersId } + + val selected = isPermanentMember || selectedUsers.any { it.id == chat.id } + + MinimizeChatCard( + chatName = chat.chatName, + selected = selected, + onClick = { + if (!isPermanentMember) { + selectedUsers = if (selected) { + selectedUsers - chat + } else { + selectedUsers + chat + } + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/CreateGroupScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/CreateGroupScreen.kt new file mode 100644 index 0000000..dbec387 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/CreateGroupScreen.kt @@ -0,0 +1,181 @@ +package com.aiwazian.messenger.ui.group + +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.ArrowForward +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect +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.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.enums.ChatType +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.ChatScreen +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.GroupViewModel +import com.aiwazian.messenger.viewModels.MainViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun CreateGroupScreen() { + Content() +} + +@Composable +private fun Content() { + val context = LocalContext.current + + val mainViewModel = hiltViewModel() + val navViewModel = viewModel() + val groupViewModel = hiltViewModel() + + LaunchedEffect(Unit) { + groupViewModel.cleanData() + } + + DisposableEffect(Unit) { + onDispose { + groupViewModel.cleanData() + } + } + + val groupInfo by groupViewModel.groupInfo.collectAsState() + + val vibrateService = VibrateService(context) + + val scrollState = rememberScrollState() + val scope = rememberCoroutineScope() + + var isLoading by remember { mutableStateOf(false) } + + Scaffold( + topBar = { + TopBar() + }, + floatingActionButton = { + FloatingActionButton( + modifier = Modifier.imePadding(), + onClick = { + scope.launch { + val isValid = groupViewModel.checkValid() + + if (!isValid) { + vibrateService.vibrate(VibrationPattern.Error) + return@launch + } + + isLoading = true + + val createdId = groupViewModel.createGroup() + + if (createdId == null) { + vibrateService.vibrate(VibrationPattern.Error) + isLoading = false + return@launch + } + + val chatInfo = ChatInfo( + id = createdId, + chatName = groupInfo.name + ) + + mainViewModel.showNewChat(chatInfo) + + navViewModel.goToMain() + navViewModel.addScreenInStack { + ChatScreen(createdId) + } + } + }, + containerColor = MaterialTheme.colorScheme.primary, + shape = CircleShape + ) { + AnimatedContent(targetState = isLoading) { isLoading -> + if (isLoading) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onPrimary, + strokeWidth = 2.dp, + modifier = Modifier.size(20.dp) + ) + } else { + Icon( + Icons.AutoMirrored.Outlined.ArrowForward, + null + ) + } + } + } + } + ) { + Column( + Modifier + .padding(it) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + SectionContainer { + OutlinedTextField( + modifier = Modifier.fillMaxWidth(), + singleLine = true, + value = groupInfo.name, + onValueChange = groupViewModel::changeGroupName, + placeholder = { Text("Название группы") }, + colors = TextFieldDefaults.colors( + focusedContainerColor = Color.Transparent, + unfocusedContainerColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + ) + ) + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(text = stringResource(R.string.create_group)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/GroupMembersScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/GroupMembersScreen.kt new file mode 100644 index 0000000..ee0c73a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/GroupMembersScreen.kt @@ -0,0 +1,199 @@ +package com.aiwazian.messenger.ui.group + +import android.util.Log +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material.icons.outlined.PersonAdd +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.Modifier +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.services.GroupService +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.services.UserService +import com.aiwazian.messenger.ui.ProfileScreen +import com.aiwazian.messenger.ui.element.MinimizeChatCard +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.utils.Shape +import com.aiwazian.messenger.viewModels.GroupViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun GroupMembersScreen(groupId: Long) { + val navViewModel = viewModel() + val groupViewModel = hiltViewModel() + val groupService = GroupService() + + var members by remember { mutableStateOf>(emptyList()) } + LaunchedEffect(Unit) { + try { + members = groupService.getMembers(groupId).orEmpty() + } catch (e: Exception) { + Log.e( + "GroupMemberScreen", + "Не удалось получить участников группы", + e + ) + } + } + + val scope = rememberCoroutineScope() + + Scaffold(topBar = { + PageTopBar( + title = { Text(stringResource(R.string.members)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + SectionItem( + icon = Icons.Outlined.PersonAdd, + text = stringResource(R.string.add_member), + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.primary), + onClick = { + navViewModel.addScreenInStack { + AddMemberScreen(members.map { it.id }.toLongArray()) { users -> + val userService = UserService() + + scope.launch { + val successfullyAddedUsers = mutableListOf() + + users.forEach { userId -> + try { + groupService.inviteUserToGroup( + groupId, + userId + ) + } catch (e: Exception) { + Log.e( + "AddMemberScreen", + "Не удалось добавить пользователя в группу", + e + ) + } + + try { + val user = userService.getById(userId) + if (user != null) { + successfullyAddedUsers.add(user) + } + } catch (e: Exception) { + Log.e( + "AddMemberScreen", + "Не удалось получить информацию о добавленном пользователе", + e + ) + } + } + + if (successfullyAddedUsers.isNotEmpty()) { + members = (members + successfullyAddedUsers).distinctBy { + it.id + } + groupViewModel.changeMembers(members.size) + } + } + } + } + } + ) + } + + SectionContainer { + LazyColumn { + items( + items = members, + key = { it.id }) { member -> + MinimizeChatCard( + chatName = "${member.firstName} ${member.lastName}", + trailingContent = { + if (member.id != UserManager.user.collectAsState().value.id) { + var expanded by remember { mutableStateOf(false) } + + IconButton(onClick = { + expanded = true + }) { + Icon( + imageVector = Icons.Outlined.MoreVert, + contentDescription = null + ) + } + + DropdownMenu( + expanded = expanded, + shape = Shape.DropdownMenu, + onDismissRequest = { expanded = false }) { + DropdownMenuItem( + leadingIcon = { + Icon( + imageVector = Icons.Outlined.Delete, + contentDescription = null, + tint = MaterialTheme.colorScheme.error + ) + }, + text = { + Text( + text = "Удалить", + color = MaterialTheme.colorScheme.error + ) + }, + onClick = { + scope.launch { + val isRemoved = + groupService.removeUserFromGroup( + groupId, + member.id + ) + + if (isRemoved) { + members = + members.filter { it.id != member.id } + } + } + }) + } + } + }, + onClick = { + navViewModel.addScreenInStack { + ProfileScreen(member.id) + } + }) + } + } + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/GroupSettingsScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/GroupSettingsScreen.kt new file mode 100644 index 0000000..e77808f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/group/GroupSettingsScreen.kt @@ -0,0 +1,120 @@ +package com.aiwazian.messenger.ui.group + +import android.util.Log +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.PeopleOutline +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.services.DialogController +import com.aiwazian.messenger.services.GroupService +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.InputField +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.viewModels.GroupViewModel +import com.aiwazian.messenger.viewModels.MainViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun GroupSettingsScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + val mainViewModel = hiltViewModel() + val groupViewModel = hiltViewModel() + + val groupInfo by groupViewModel.groupInfo.collectAsState() + + val deleteGroupDialog = DialogController() + + Scaffold(topBar = { + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + SectionItem( + icon = Icons.Outlined.PeopleOutline, + text = stringResource(R.string.members), + primaryText = groupInfo.members.toString(), + onClick = { + navViewModel.addScreenInStack { + GroupMembersScreen(groupInfo.id) + } + } + ) + } + + SectionContainer { + SectionItem( + text = stringResource(R.string.delete_group), + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error), + onClick = deleteGroupDialog::show + ) + } + } + + val scope = rememberCoroutineScope() + + if (deleteGroupDialog.isVisible) { + CustomDialog( + title = stringResource(R.string.delete_group), + onDismissRequest = deleteGroupDialog::hide, + buttons = { + TextButton(onClick = deleteGroupDialog::hide) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = { + scope.launch { + try { + val isDeleted = GroupService().delete(groupInfo.id) + if (isDeleted) { + mainViewModel.deleteChat(groupInfo.id) + navViewModel.goToMain() + } + } catch (e: Exception) { + Log.e( + "GroupSettingsScreen", + "Ошибка при удалении группы", + e + ) + } + } + }, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error) + ) { + Text(stringResource(R.string.delete_group)) + } + } + ) { + Text("Вы точно хотите удалить группу для себя и всех участников?") + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/AuthScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/AuthScreen.kt new file mode 100644 index 0000000..5218898 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/AuthScreen.kt @@ -0,0 +1,72 @@ +package com.aiwazian.messenger.ui.login + +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.compose.runtime.Composable +import androidx.compose.ui.unit.IntOffset +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import com.aiwazian.messenger.viewModels.AuthViewModel + +object Screen { + const val LOGIN = "login" + const val VERIFICATION = "verification" + const val PASSWORD = "password" +} + +@Composable +fun AuthScreen() { + Content() +} + +@Composable +private fun Content() { + val navController = rememberNavController() + + val authViewModel = viewModel() + + val transition = tween( + durationMillis = 500, + easing = FastOutSlowInEasing + ) + + NavHost( + navController = navController, + startDestination = Screen.LOGIN, + enterTransition = { + slideInHorizontally(transition) { it } + }, + exitTransition = { + slideOutHorizontally(animationSpec = transition) { -it } + }, + popEnterTransition = { + slideInHorizontally(animationSpec = transition) { -it } + }, + popExitTransition = { + slideOutHorizontally(animationSpec = transition) { it } + } + ) { + composable(route = Screen.LOGIN) { + LoginScreen( + navController = navController, + authViewModel = authViewModel + ) + } + composable(route = Screen.VERIFICATION) { + VerificationCodeScreen( + navController = navController, + viewModel = authViewModel + ) + } + composable(route = Screen.PASSWORD) { + PasswordScreen( + navController = navController, + authViewModel = authViewModel + ) + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/LoginScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/LoginScreen.kt new file mode 100644 index 0000000..4f3754e --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/LoginScreen.kt @@ -0,0 +1,226 @@ +package com.aiwazian.messenger.ui.login + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowForward +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +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.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavHostController +import com.aiwazian.messenger.R +import com.aiwazian.messenger.services.DialogController +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.AuthViewModel +import kotlinx.coroutines.launch + +@Composable +fun LoginScreen( + authViewModel: AuthViewModel, + navController: NavHostController +) { + val context = LocalContext.current + + val vibrateService = VibrateService(context) + + var isLoaded by remember { mutableStateOf(true) } + + val dialogController = DialogController() + + var isFoundUser by remember { mutableStateOf(null) } + + val loginFieldError by authViewModel.loginFieldError.collectAsState() + + val scope = rememberCoroutineScope() + + Scaffold( + modifier = Modifier.fillMaxSize(), + floatingActionButton = { + FloatingActionButton( + onClick = { + scope.launch { + val isValidLogin = authViewModel.checkValidLogin() + + if (!isValidLogin) { + vibrateService.vibrate(VibrationPattern.Error) + return@launch + } + + isLoaded = false + + isFoundUser = authViewModel.findUserByLogin() + + dialogController.show() + + isLoaded = true + } + }, + modifier = Modifier.imePadding(), + contentColor = MaterialTheme.colorScheme.onPrimary, + containerColor = MaterialTheme.colorScheme.primary, + shape = CircleShape + ) { + if (isLoaded) { + Icon( + imageVector = Icons.AutoMirrored.Outlined.ArrowForward, + contentDescription = null, + tint = MaterialTheme.colorScheme.onPrimary + ) + } else { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onPrimary, + strokeWidth = 2.dp, + modifier = Modifier.size(20.dp) + ) + } + } + }) { + val login by authViewModel.login.collectAsState() + + Column( + modifier = Modifier + .fillMaxSize() + .padding(it), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + text = "Логин пользователя", + modifier = Modifier.padding(vertical = 40.dp), + fontSize = 28.sp + ) + Column(Modifier.width(300.dp)) { + LoginField( + value = login, + onValueChange = authViewModel::onLoginChanged, + label = loginFieldError ?: "Логин", + isError = loginFieldError != null + ) + } + } + + if (dialogController.isVisible) { + when (isFoundUser) { + null -> { + CustomDialog( + title = stringResource(R.string.app_name), + onDismissRequest = dialogController::hide, + content = { + Text( + text = "Не удалось проверить, попробуйте ещё раз.", + lineHeight = 18.sp + ) + }, + buttons = { + TextButton(onClick = dialogController::hide) { + Text("ОК") + } + } + ) + } + + true -> { + CustomDialog( + title = stringResource(R.string.app_name), + onDismissRequest = dialogController::hide, + content = { + Text( + text = "Пользователь найден. Продолжить?", + lineHeight = 18.sp + ) + }, + buttons = { + TextButton(onClick = dialogController::hide) { + Text("Нет") + } + TextButton(onClick = { + dialogController.hide() + navController.navigate(Screen.PASSWORD) + }) { + Text("Да") + } + } + ) + } + + else -> { + CustomDialog( + title = stringResource(R.string.app_name), + onDismissRequest = dialogController::hide, + content = { + Text( + text = "Пользователь не найден. Создать?", + lineHeight = 18.sp + ) + }, + buttons = { + TextButton(onClick = dialogController::hide) { + Text("Нет") + } + TextButton(onClick = { + dialogController.hide() + navController.navigate(Screen.PASSWORD) + }) { + Text("Да") + } + } + ) + } + } + } + + } +} + +@Composable +private fun LoginField( + value: String, + onValueChange: (String) -> Unit, + label: String, + isError: Boolean = false +) { + OutlinedTextField( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(10.dp), + colors = OutlinedTextFieldDefaults.colors( + focusedBorderColor = MaterialTheme.colorScheme.primary, + focusedLabelColor = MaterialTheme.colorScheme.primary, + cursorColor = MaterialTheme.colorScheme.primary, + errorLabelColor = MaterialTheme.colorScheme.error, + errorBorderColor = MaterialTheme.colorScheme.error, + errorTextColor = MaterialTheme.colorScheme.error + ), + value = value, + onValueChange = onValueChange, + label = { Text(label) }, + singleLine = true, + isError = isError + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/PasswordScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/PasswordScreen.kt new file mode 100644 index 0000000..c4c8a77 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/PasswordScreen.kt @@ -0,0 +1,286 @@ +package com.aiwazian.messenger.ui.login + +import android.app.Activity +import android.content.Context +import android.content.Intent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowForward +import androidx.compose.material.icons.outlined.Visibility +import androidx.compose.material.icons.outlined.VisibilityOff +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +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.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavHostController +import com.aiwazian.messenger.MainActivity +import com.aiwazian.messenger.R +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.AuthViewModel +import kotlinx.coroutines.launch + +@Composable +fun PasswordScreen( + navController: NavHostController, + authViewModel: AuthViewModel +) { + val context = LocalContext.current + + val vibrateService = VibrateService(context) + + var isLoad by remember { mutableStateOf(true) } + + val scope = rememberCoroutineScope() + + var showFailureLogin by remember { mutableStateOf(false) } + var showFailureRegister by remember { mutableStateOf(false) } + val passwordFieldError by authViewModel.passwordFieldError.collectAsState() + val isUserFound by authViewModel.isUserFound.collectAsState() + + val onClick = { + val isValidPassword = authViewModel.checkValidPassword() + + scope.launch { + if (!isValidPassword) { + vibrateService.vibrate(VibrationPattern.Error) + return@launch + } + + if (isUserFound) { + isLoad = false + + val isLogin = authViewModel.onLoginClicked() + + isLoad = true + + if (!isLogin) { + showFailureLogin = true + return@launch + } + + startMainActivity(context) + } else { + if (!authViewModel.checkValidRegistrationName()) { + vibrateService.vibrate(VibrationPattern.Error) + return@launch + } + isLoad = false + + val isRegister = authViewModel.onRegisterClicked() + + isLoad = true + + if (!isRegister) { + showFailureRegister = true + isLoad = true + return@launch + } + + val isLogin = authViewModel.onLoginClicked() + + if (!isLogin) { + showFailureRegister = true + return@launch + } + + startMainActivity(context) + } + } + } + + DisposableEffect(Unit) { + onDispose { + authViewModel.onPasswordChanged("") + } + } + + Scaffold( + modifier = Modifier.fillMaxSize(), + floatingActionButton = { + FloatingActionButton( + onClick = { + onClick() + }, + modifier = Modifier.imePadding(), + contentColor = MaterialTheme.colorScheme.onPrimary, + containerColor = MaterialTheme.colorScheme.primary, + shape = CircleShape + ) { + if (isLoad) { + Icon( + imageVector = Icons.AutoMirrored.Outlined.ArrowForward, + contentDescription = null, + tint = MaterialTheme.colorScheme.onPrimary + ) + } else { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onPrimary, + strokeWidth = 2.dp, + modifier = Modifier.size(20.dp) + ) + } + } + }) { + val password by authViewModel.password.collectAsState() + val firstName by authViewModel.firstName.collectAsState() + val lastName by authViewModel.lastName.collectAsState() + + Column( + modifier = Modifier + .fillMaxSize() + .padding(it), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + text = "Пароль аккаунта", + modifier = Modifier.padding(vertical = 40.dp), + fontSize = 28.sp + ) + Column(Modifier.width(300.dp)) { + if (!isUserFound) { + OutlinedTextField( + value = firstName, + onValueChange = authViewModel::onFirstNameChanged, + label = { Text("Имя") }, + singleLine = true, + modifier = Modifier.fillMaxWidth() + ) + OutlinedTextField( + value = lastName, + onValueChange = authViewModel::onLastNameChanged, + label = { Text("Фамилия") }, + singleLine = true, + modifier = Modifier.fillMaxWidth().padding(top = 8.dp) + ) + } + PasswordField( + value = password, + onValueChange = authViewModel::onPasswordChanged, + label = passwordFieldError ?: "Пароль", + isError = passwordFieldError != null + ) + } + } + + if (showFailureLogin) { + CustomDialog( + title = stringResource(R.string.app_name), + onDismissRequest = { showFailureLogin = false }, + content = { + Text( + text = "Не удалось войти в аккаунт. Попробуйте ещё раз.", + lineHeight = 18.sp + ) + }, + buttons = { + TextButton(onClick = { + showFailureLogin = false + }) { + Text("Ок") + } + }) + } + + if (showFailureRegister) { + CustomDialog( + title = stringResource(R.string.app_name), + onDismissRequest = { showFailureRegister = false }, + content = { + Text( + text = "Не удалось создать пользователя. Попробуйте ещё раз.", + lineHeight = 18.sp + ) + }, + buttons = { + TextButton(onClick = { + showFailureRegister = false + }) { + Text("Ок") + } + }) + } + } +} + +@Composable +private fun PasswordField( + value: String, + onValueChange: (String) -> Unit, + label: String, + isError: Boolean, +) { + var passwordVisible by remember { mutableStateOf(false) } + + OutlinedTextField( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(10.dp), + colors = OutlinedTextFieldDefaults.colors( + focusedBorderColor = MaterialTheme.colorScheme.primary, + focusedLabelColor = MaterialTheme.colorScheme.primary, + cursorColor = MaterialTheme.colorScheme.primary, + errorLabelColor = MaterialTheme.colorScheme.error, + errorBorderColor = MaterialTheme.colorScheme.error, + errorTextColor = MaterialTheme.colorScheme.error + ), + value = value, + onValueChange = onValueChange, + label = { Text(label) }, + singleLine = true, + isError = isError, + visualTransformation = if (!passwordVisible) PasswordVisualTransformation() else VisualTransformation.None, + trailingIcon = { + IconButton(onClick = { + passwordVisible = !passwordVisible + }) { + Icon( + imageVector = if (passwordVisible) Icons.Outlined.Visibility else Icons.Outlined.VisibilityOff, + contentDescription = null, + tint = if (isError) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.onSurfaceVariant + ) + } + }) +} + +private fun startMainActivity(context: Context) { + val intent = Intent( + context, + MainActivity::class.java + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + + context.startActivity(intent) + (context as Activity).finish() +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/VerificationCodeScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/VerificationCodeScreen.kt new file mode 100644 index 0000000..0ed4687 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/login/VerificationCodeScreen.kt @@ -0,0 +1,63 @@ +package com.aiwazian.messenger.ui.login + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowForward +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import com.aiwazian.messenger.viewModels.AuthViewModel + +@Composable +fun VerificationCodeScreen(navController: NavHostController, viewModel: AuthViewModel) { + Content(navController, viewModel) +} + +@Composable +private fun Content(navController: NavHostController, viewModel: AuthViewModel) { + var keyboardHeight by remember { mutableStateOf(0.dp) } + + Scaffold( + modifier = Modifier.fillMaxSize(), + + floatingActionButton = { + FloatingActionButton( + onClick = { }, + modifier = Modifier.padding(bottom = keyboardHeight + 16.dp), + containerColor = MaterialTheme.colorScheme.primary, + shape = CircleShape + ) { + Icon( + Icons.AutoMirrored.Outlined.ArrowForward, + contentDescription = null, + tint = Color.White + ) + } + } + ) { + Column( + modifier = Modifier + .padding(it) + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceBetween, + ) { + + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsDataAndStorageScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsDataAndStorageScreen.kt new file mode 100644 index 0000000..5051fea --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsDataAndStorageScreen.kt @@ -0,0 +1,170 @@ +package com.aiwazian.messenger.ui.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.viewModels.DataUsageViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch +import java.math.BigDecimal +import java.math.RoundingMode + +@Composable +fun SettingsDataAndStorageScreen() { + Content() +} + +@Composable +private fun Content() { + val dataUsageViewModel = viewModel() + + val context = LocalContext.current + + LaunchedEffect(Unit) { + dataUsageViewModel.reload(context) + } + + val clearCacheDialog = dataUsageViewModel.clearCacheDialog + + val cacheSize = dataUsageViewModel.cacheSize + val cacheMb = cacheSize / (1024.0 * 1024.0) + val cacheMbRounded = BigDecimal(cacheMb).setScale( + 2, + RoundingMode.HALF_UP + ).toDouble() + + val sizeBytes = dataUsageViewModel.appSize + val sizeMb = sizeBytes / (1024.0 * 1024.0) + val sizeMbRounded = BigDecimal(sizeMb).setScale( + 2, + RoundingMode.HALF_UP + ).toDouble() + + Scaffold( + topBar = { TopBar() }) { + Column( + modifier = Modifier + .padding(it) + .fillMaxSize() + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 50.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = "Использование памяти", + fontSize = 20.sp, + fontWeight = FontWeight.W500 + ) + Text(text = "$sizeMbRounded MB") + } + + SectionContainer { + Column(Modifier.padding(10.dp)) { + Button( + onClick = clearCacheDialog::show, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(10.dp), + colors = ButtonDefaults.buttonColors( + contentColor = Color.White, + containerColor = MaterialTheme.colorScheme.primary + ) + ) { + Text( + text = stringResource(R.string.clear_cache) + " $cacheMbRounded MB", + modifier = Modifier.padding(8.dp), + fontSize = 16.sp, + lineHeight = 18.sp + ) + } + } + } + } + val scope = rememberCoroutineScope() + + if (clearCacheDialog.isVisible) { + ClearCacheDialog( + onConfirm = { + scope.launch { + dataUsageViewModel.clearAppData(context) + dataUsageViewModel.reload(context) + clearCacheDialog.hide() + } + }, + onDismissRequest = clearCacheDialog::hide + ) + } + } +} + +@Composable +private fun ClearCacheDialog( + onConfirm: () -> Unit, + onDismissRequest: () -> Unit +) { + CustomDialog( + title = stringResource(R.string.clear_cache), + onDismissRequest = onDismissRequest, + content = { + Text( + text = "Все медиа останутся в облаке, при необходимости Вы сможете заново загрузить их снова.", + lineHeight = 18.sp + ) + }, + buttons = { + TextButton( + onClick = onDismissRequest + ) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = onConfirm, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error + ) + ) { + Text(stringResource(R.string.clear_cache)) + } + }) +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsNotificationsScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsNotificationsScreen.kt new file mode 100644 index 0000000..abd1cd0 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsNotificationsScreen.kt @@ -0,0 +1,77 @@ +package com.aiwazian.messenger.ui.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionToggleItem +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun SettingsNotificationsScreen() { + Content() +} + +@Composable +private fun Content() { + val scrollState = rememberScrollState() + + Scaffold( + topBar = { TopBar() }, + ) { + Column( + modifier = Modifier + .padding(it) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + SectionHeader("Уведомления из чатов") + + SectionContainer { + SectionToggleItem( + text = "Личные чаты", + isChecked = false, + onCheckedChange = {}) + + SectionToggleItem( + text = "Группы", + isChecked = false, + onCheckedChange = {}) + + SectionToggleItem( + text = "Каналы", + isChecked = false, + onCheckedChange = {}) + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { + Text(stringResource(R.string.notifications)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsScreen.kt new file mode 100644 index 0000000..fe07d4b --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/SettingsScreen.kt @@ -0,0 +1,156 @@ +package com.aiwazian.messenger.ui.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.Logout +import androidx.compose.material.icons.outlined.ChatBubbleOutline +import androidx.compose.material.icons.outlined.DataUsage +import androidx.compose.material.icons.outlined.Folder +import androidx.compose.material.icons.outlined.Lock +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.DropdownMenuAction +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.ui.LogoutScreen +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionDescription +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.ui.settings.chat.SettingsChatScreen +import com.aiwazian.messenger.ui.settings.chatFolder.SettingsChatFoldersScreen +import com.aiwazian.messenger.ui.settings.privacy.SettingsPrivacyScreen +import com.aiwazian.messenger.ui.settings.profile.SettingsProfileScreen +import com.aiwazian.messenger.ui.settings.security.SettingsSecurityScreen +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun SettingsScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + + val scrollState = rememberScrollState() + + Scaffold( + topBar = { + TopBar() + }, + ) { innerPadding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding) + .verticalScroll(scrollState) + ) { + SectionHeader(stringResource(R.string.account)) + + SectionContainer { + SectionItem( + text = stringResource(R.string.profile), + description = stringResource(R.string.write_about_me), + onClick = { + navViewModel.addScreenInStack { SettingsProfileScreen() } + }) + + SectionItem( + text = stringResource(R.string.security), + description = stringResource(R.string.protect_your_account), + onClick = { + navViewModel.addScreenInStack { SettingsSecurityScreen() } + }) + } + + SectionHeader(stringResource(R.string.settings)) + + SectionContainer { + SectionItem( + icon = Icons.Outlined.ChatBubbleOutline, + text = stringResource(R.string.appearance), + onClick = { + navViewModel.addScreenInStack { SettingsChatScreen() } + }) + + SectionItem( + icon = Icons.Outlined.Lock, + text = stringResource(R.string.confidentiality), + onClick = { + navViewModel.addScreenInStack { SettingsPrivacyScreen() } + }) + + SectionItem( + icon = Icons.Outlined.DataUsage, + text = stringResource(R.string.data_and_storage), + onClick = { + navViewModel.addScreenInStack { SettingsDataAndStorageScreen() } + }) + + SectionItem( + icon = Icons.Outlined.Folder, + text = stringResource(R.string.chat_folders), + onClick = { + navViewModel.addScreenInStack { SettingsChatFoldersScreen() } + }) + } + + val context = LocalContext.current + + val packageInfo = remember { + context.packageManager.getPackageInfo( + context.packageName, + 0 + ) + } + + val versionName = packageInfo.versionName + val versionCode = packageInfo.longVersionCode + + SectionDescription(text = "${stringResource(R.string.app_name)} v${versionName} (${versionCode})") + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + val actions = listOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + dropdownActions = listOf( + DropdownMenuAction( + icon = Icons.AutoMirrored.Outlined.Logout, + text = stringResource(R.string.log_out), + onClick = { + navViewModel.addScreenInStack { + LogoutScreen() + } + }) + ) + ) + ) + + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = actions + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chat/SettingsChatScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chat/SettingsChatScreen.kt new file mode 100644 index 0000000..3f2dd5b --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chat/SettingsChatScreen.kt @@ -0,0 +1,296 @@ +package com.aiwazian.messenger.ui.settings.chat + +import android.os.Build +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.clickable +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton +import androidx.compose.material3.RadioButtonDefaults +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.scale +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.enums.PrimaryColorOption +import com.aiwazian.messenger.enums.ThemeOption +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.ui.element.SectionToggleItem +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SettingsDesignViewModel +import kotlinx.coroutines.launch + +@Composable +fun SettingsChatScreen() { + Content() +} + +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +private fun Content() { + val navViewModel = viewModel() + + val viewModel = hiltViewModel() + + val primaryColor by viewModel.primaryColor.collectAsState() + val isDynamicColorEnable by viewModel.dynamicColor.collectAsState() + + val coroutineScope = rememberCoroutineScope() + val scrollState = rememberScrollState() + + Scaffold( + topBar = { + TopBar() + }, + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + val theme = when (viewModel.currentTheme.collectAsState().value) { + ThemeOption.DARK -> "Включена" + ThemeOption.LIGHT -> "Отключена" + else -> "Как в системе" + } + + SectionHeader(title = stringResource(R.string.color_theme)) + + SectionContainer { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + SectionToggleItem( + text = stringResource(R.string.dynamic_color), + isChecked = isDynamicColorEnable, + onCheckedChange = { + coroutineScope.launch { + viewModel.setDynamicColor(!isDynamicColorEnable) + } + }) + } + + AnimatedContent(targetState = isDynamicColorEnable) { enableDynamicColor -> + if (!enableDynamicColor) { + Row( + modifier = Modifier + .horizontalScroll(rememberScrollState()) + .padding(8.dp) + ) { + PrimaryColorOption.entries.forEach { option -> + RadioButton( + enabled = !isDynamicColorEnable, + modifier = Modifier.scale(1.5f), + selected = primaryColor == option, + onClick = { + coroutineScope.launch { + viewModel.setPrimaryColor(option) + } + }, + colors = RadioButtonDefaults.colors( + selectedColor = option.color, + unselectedColor = option.color, + ) + ) + } + } + } + } + } + + SectionContainer { + SectionItem( + text = stringResource(R.string.dark_theme), + primaryText = theme, + onClick = { + navViewModel.addScreenInStack { + SettingsDarkThemeScreen() + } + }) + } + +// var vds by remember { mutableStateOf("") } +// +// var selected by remember { mutableIntStateOf(0) } +// +// SectionHeader(title = "Смахивание влево в списке чатов $vds") +// +// SectionContainer { +// Row( +// modifier = Modifier +// .padding(5.dp) +// .horizontalScroll(rememberScrollState()) +// ) { +// Boxic( +// selected = selected == 1, +// icon = Icons.Outlined.Archive, +// onClick = { +// vds = "Архивировать" +// selected = 1 +// }) +// +// Boxic( +// selected = selected == 2, +// icon = Icons.Outlined.PushPin, +// onClick = { +// vds = "Закрепить" +// selected = 2 +// }) +// +// Boxic( +// selected = selected == 5, +// icon = Icons.Outlined.ChatBubble, +// onClick = { +// vds = "Прочитать" +// selected = 5 +// }) +// +// Boxic( +// selected = selected == 6, +// icon = Icons.AutoMirrored.Outlined.VolumeOff, +// onClick = { +// vds = "Выкл. звук" +// selected = 6 +// }) +// +// Boxic( +// selected = selected == 3, +// icon = Icons.Outlined.Block, +// onClick = { +// vds = "Сменить папку" +// selected = 3 +// }) +// +// Boxic( +// selected = selected == 4, +// icon = Icons.Outlined.Delete, +// onClick = { +// vds = "Удалить" +// selected = 4 +// }) +// } +// } +// +// SectionDescription(text = "Выбор действия, которое будет выполняться при смахивании влево в списке чатов.") +// +// SectionHeader("Shape") +// +// val shapes = listOf( +// MaterialShapes.Square.toShape(), +// MaterialShapes.Circle.toShape(), +// MaterialShapes.Pentagon.toShape(), +// MaterialShapes.Cookie4Sided.toShape(), +// MaterialShapes.Cookie6Sided.toShape(), +// MaterialShapes.Cookie7Sided.toShape(), +// MaterialShapes.Cookie9Sided.toShape(), +// MaterialShapes.Cookie12Sided.toShape(), +// MaterialShapes.Clover4Leaf.toShape(), +// MaterialShapes.Clover8Leaf.toShape(), +// MaterialShapes.Flower.toShape(), +// MaterialShapes.SoftBurst.toShape(), +// MaterialShapes.Sunny.toShape(), +// MaterialShapes.VerySunny.toShape() +// ) +// +// var selectedShapeIndex by remember { mutableIntStateOf(0) } +// +// SectionContainer { +// Row( +// modifier = Modifier +// .horizontalScroll(rememberScrollState()) +// .padding(10.dp), +// horizontalArrangement = Arrangement.spacedBy(10.dp) +// ) { +// shapes.forEachIndexed { index, shape -> +// FilledIconButton( +// onClick = { selectedShapeIndex = index }, +// modifier = Modifier.size(50.dp), +// shape = shape +// ) { +// AnimatedVisibility( +// visible = selectedShapeIndex == index, +// enter = scaleIn(tween(200)), +// exit = scaleOut(tween(200)) +// ) { +// Icon( +// Icons.Outlined.Check, +// null +// ) +// } +// } +// } +// } +// } + } + } +} + +@Composable +private fun Boxic( + selected: Boolean, + icon: ImageVector, + onClick: () -> Unit, +) { + Box( + modifier = Modifier + .padding(4.dp) + .clip(RoundedCornerShape(12.dp)) + .clickable { + onClick() + }) { + Box { + Box( + modifier = Modifier + .padding(4.dp) + .clip(RoundedCornerShape(8.dp)) + ) { + Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier.padding(10.dp), + tint = if (selected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { + Text(stringResource(R.string.appearance)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chat/SettingsDarkThemeScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chat/SettingsDarkThemeScreen.kt new file mode 100644 index 0000000..8f576b8 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chat/SettingsDarkThemeScreen.kt @@ -0,0 +1,103 @@ +package com.aiwazian.messenger.ui.settings.chat + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.enums.ThemeOption +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionRadioItem +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SettingsDesignViewModel +import kotlinx.coroutines.launch + +private data class ThemeItem( + val name: String, + val theme: ThemeOption +) + +@Composable +fun SettingsDarkThemeScreen() { + Content() +} + +@Composable +private fun Content() { + val viewModel = hiltViewModel() + + val coroutine = rememberCoroutineScope() + + val scrollState = rememberScrollState() + + Scaffold( + topBar = { + TopBar() + }, + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(it) + .verticalScroll(scrollState) + ) { + val selectedOption by viewModel.currentTheme.collectAsState() + + val themes = listOf( + ThemeItem( + "Как в системе", + ThemeOption.SYSTEM + ), + ThemeItem( + "Включена", + ThemeOption.DARK + ), + ThemeItem( + "Отключена", + ThemeOption.LIGHT + ) + ) + + SectionContainer { + themes.forEach { (name, theme) -> + SectionRadioItem( + text = name, + selectedOption == theme + ) { + coroutine.launch { + viewModel.setTheme(theme) + } + } + } + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(stringResource(R.string.dark_theme)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsChatFoldersScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsChatFoldersScreen.kt new file mode 100644 index 0000000..ca1100d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsChatFoldersScreen.kt @@ -0,0 +1,142 @@ +package com.aiwazian.messenger.ui.settings.chatFolder + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.rememberScrollState +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.filled.CreateNewFolder +import androidx.compose.material.icons.outlined.Menu +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.airbnb.lottie.compose.LottieAnimation +import com.airbnb.lottie.compose.LottieCompositionSpec +import com.airbnb.lottie.compose.LottieConstants +import com.airbnb.lottie.compose.rememberLottieComposition +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.utils.LottieAnimation +import com.aiwazian.messenger.viewModels.FolderViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun SettingsChatFoldersScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + val folderViewModel = viewModel() + + val folders by folderViewModel.folders.collectAsState() + + val scrollState = rememberScrollState() + + Scaffold( + topBar = { + TopBar() + }, + modifier = Modifier.imePadding() + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 10.dp), + verticalArrangement = Arrangement.spacedBy(10.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + val composition by rememberLottieComposition( + spec = LottieCompositionSpec.Asset(LottieAnimation.FOLDERS) + ) + + LottieAnimation( + composition = composition, + modifier = Modifier.size(100.dp), + iterations = LottieConstants.IterateForever, + isPlaying = true + ) + + Text( + text = stringResource(R.string.chat_folders_description), + fontSize = 14.sp, + lineHeight = 14.sp, + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + + SectionHeader(title = stringResource(R.string.chat_folders)) + + SectionContainer { + LazyColumn { + items( + folders, + { it.id }) { folder -> + SectionItem( + text = folder.name, + icon = Icons.Outlined.Menu, + onClick = { + if (folder.id != 0) { + navViewModel.addScreenInStack { + SettingsFolderScreen(folder.id) + } + } + } + ) + } + } + + SectionItem( + text = stringResource(R.string.create_new_folder), + icon = Icons.Filled.CreateNewFolder, + onClick = { + navViewModel.addScreenInStack { + SettingsFolderScreen() + } + }, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.primary) + ) + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(stringResource(R.string.chat_folders)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsChatInFolderScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsChatInFolderScreen.kt new file mode 100644 index 0000000..7621468 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsChatInFolderScreen.kt @@ -0,0 +1,147 @@ +package com.aiwazian.messenger.ui.settings.chatFolder + +import android.util.Log +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.sp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.ui.element.InputField +import com.aiwazian.messenger.ui.element.MinimizeChatCard +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.viewModels.FolderViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun SettingsChatInFolderScreen(onConfirmSelect: (List) -> Unit) { + Content(onConfirmSelect) +} + +@Composable +private fun Content(onConfirmSelect: (List) -> Unit) { + val navViewModel = viewModel() + val folderViewModel = hiltViewModel() + + val openFolder by folderViewModel.openFolder.collectAsState() + + var allChats by remember { mutableStateOf>(emptyList()) } + var searchQuery by remember { mutableStateOf("") } + var currentSelectedChats by remember { mutableStateOf(openFolder.chats) } + + val filteredChats = allChats.filter { chatInfo -> + chatInfo.chatName.contains( + other = searchQuery.trim(), + ignoreCase = true + ) + } + + val action = listOf( + TopBarAction( + icon = Icons.Outlined.Check, + onClick = { + onConfirmSelect(currentSelectedChats) + navViewModel.removeLastScreenInStack() + }) + ) + + LaunchedEffect(Unit) { + try { + val request = RetrofitInstance.api.getAllChats() + if (request.isSuccessful) { + allChats = request.body() ?: emptyList() + } + } catch (e: Exception) { + Log.e( + "SettingsChatInFolderScreen", + "Ошибка при получении всех чатов", + e + ) + } + } + + Scaffold( + topBar = { + PageTopBar( + title = { + Column { + Text(text = "Чаты в папке") + Text( + text = "Количество чатов не ограничено", + fontSize = 12.sp, + lineHeight = 12.sp, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = action + ) + }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + InputField( + placeholder = stringResource(R.string.search), + value = searchQuery, + onValueChange = { newValue -> + searchQuery = newValue + }) + } + + SectionContainer { + val user by UserManager.user.collectAsState() + + LazyColumn { + items( + filteredChats, + { it.id }) { chat -> + val chatName = if (chat.id == user.id) { + stringResource(R.string.saved_messages) + } else { + chat.chatName + } + + val selected = currentSelectedChats.any { it.id == chat.id } + + MinimizeChatCard( + chatName = chatName, + selected = selected, + onClick = { + currentSelectedChats = if (selected) { + currentSelectedChats - chat + } else { + currentSelectedChats + chat + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsFolderScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsFolderScreen.kt new file mode 100644 index 0000000..c7fbdee --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/chatFolder/SettingsFolderScreen.kt @@ -0,0 +1,181 @@ +package com.aiwazian.messenger.ui.settings.chatFolder + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.AddCircle +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.InputField +import com.aiwazian.messenger.ui.element.MinimizeChatCard +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionDescription +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.viewModels.FolderViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun SettingsFolderScreen(folderId: Int = 0) { + Content(folderId) +} + +@Composable +private fun Content(folderId: Int) { + val navViewModel = viewModel() + val folderViewModel = hiltViewModel() + + val openFolder by folderViewModel.openFolder.collectAsState() + val canSave by folderViewModel.canSave.collectAsState() + + val scope = rememberCoroutineScope() + + val action = if (canSave) { + listOf( + TopBarAction( + icon = Icons.Outlined.Check, + onClick = { + scope.launch { + folderViewModel.save() + navViewModel.removeLastScreenInStack() + } + }) + ) + } else { + emptyList() + } + + LaunchedEffect(Unit) { + folderViewModel.open(folderId) + } + + Scaffold( + topBar = { + PageTopBar( + title = { + Text(text = openFolder.name.ifBlank { stringResource(R.string.new_folder) }) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = action + ) + }, + modifier = Modifier.imePadding() + ) { innerPadding -> + Column( + modifier = Modifier.padding(innerPadding) + ) { + SectionHeader(title = stringResource(R.string.folder_name)) + + SectionContainer { + InputField( + placeholder = stringResource(R.string.folder_name), + value = openFolder.name, + onValueChange = folderViewModel::changeFolderName + ) + } + + SectionHeader(title = stringResource(R.string.included_chats)) + + SectionContainer { + SectionItem( + text = stringResource(R.string.add_chats), + icon = Icons.Outlined.AddCircle, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.primary), + onClick = { + navViewModel.addScreenInStack { + SettingsChatInFolderScreen { selectedChats -> + folderViewModel.updateFolderChats(selectedChats) + } + } + }) + + val user by UserManager.user.collectAsState() + + LazyColumn { + items( + openFolder.chats, + { it.id }) { chat -> + val chatName = if (chat.id == user.id) { + stringResource(R.string.saved_messages) + } else { + chat.chatName + } + + MinimizeChatCard(chatName) + } + } + } + + SectionDescription(text = "Выберите чаты, которые нужно показывать в этой папке.") + + val removeFolderDialog = folderViewModel.removeFolderDialog + + if (folderId != 0) { + SectionContainer { + SectionItem( + text = stringResource(R.string.remove_folder), + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error, + ), + onClick = removeFolderDialog::show + ) + } + } + + if (removeFolderDialog.isVisible) { + CustomDialog( + title = stringResource(R.string.remove_folder), + onDismissRequest = removeFolderDialog::hide, + content = { + Text("Это не затронет чаты, находящиеся внутри.") + }, + buttons = { + TextButton(onClick = removeFolderDialog::hide) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = { + scope.launch { + removeFolderDialog.hide() + folderViewModel.remove(folderId) + navViewModel.removeLastScreenInStack() + } + }, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error + ) + ) { + Text(stringResource(R.string.delete)) + } + }) + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsBioScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsBioScreen.kt new file mode 100644 index 0000000..a44363f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsBioScreen.kt @@ -0,0 +1,127 @@ +package com.aiwazian.messenger.ui.settings.privacy + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.enums.PrivacyLevel +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionRadioItem +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SettingsBioViewModel +import kotlinx.coroutines.launch + +@Composable +fun SettingsBioScreen( + initialLevel: PrivacyLevel, + onChange: (PrivacyLevel) -> Unit +) { + Content( + initialLevel, + onChange + ) +} + +@Composable +private fun Content( + initialLevel: PrivacyLevel, + onChange: (PrivacyLevel) -> Unit +) { + val navViewModel = viewModel() + + val settingsPrivacyViewModel = viewModel() + + val currentValue by settingsPrivacyViewModel.currentLevel.collectAsState() + val showSaveButton by settingsPrivacyViewModel.showSaveButton.collectAsState() + + val scope = rememberCoroutineScope() + + val scrollState = rememberScrollState() + + val context = LocalContext.current + + val vibrateService = VibrateService(context) + + val actions = if (showSaveButton) { + listOf( + TopBarAction( + icon = Icons.Outlined.Check, + onClick = { + scope.launch { + val isSaved = settingsPrivacyViewModel.trySave() + + if (isSaved) { + onChange.invoke(currentValue) + navViewModel.removeLastScreenInStack() + } else { + vibrateService.vibrate(VibrationPattern.Error) + } + } + }) + ) + } else { + emptyList() + } + + LaunchedEffect(Unit) { + settingsPrivacyViewModel.init(initialLevel) + } + + Scaffold( + topBar = { + PageTopBar( + title = { + Text(stringResource(R.string.bio)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = actions + ) + }) { + Column( + modifier = Modifier + .padding(it) + .verticalScroll(scrollState) + ) { + SectionHeader("Кто видит мой раздел \"О себе\"?") + + SectionContainer { + SectionRadioItem( + text = stringResource(R.string.everybody), + selected = currentValue == PrivacyLevel.Everybody, + onClick = { + settingsPrivacyViewModel.selectValue(PrivacyLevel.Everybody) + }) + SectionRadioItem( + text = stringResource(R.string.nobody), + selected = currentValue == PrivacyLevel.Nobody, + onClick = { + settingsPrivacyViewModel.selectValue(PrivacyLevel.Nobody) + }) + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsDateOfBirthScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsDateOfBirthScreen.kt new file mode 100644 index 0000000..7bb1df4 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsDateOfBirthScreen.kt @@ -0,0 +1,127 @@ +package com.aiwazian.messenger.ui.settings.privacy + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.enums.PrivacyLevel +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionRadioItem +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SettingsDateOfBirthViewModel +import kotlinx.coroutines.launch + +@Composable +fun SettingsDateOfBirthScreen( + initialLevel: PrivacyLevel, + onChange: (PrivacyLevel) -> Unit +) { + Content( + initialLevel, + onChange + ) +} + +@Composable +private fun Content( + initialLevel: PrivacyLevel, + onChange: (PrivacyLevel) -> Unit +) { + val navViewModel = viewModel() + + val settingsDateOfBirthViewModel = viewModel() + + val currentValue by settingsDateOfBirthViewModel.currentLevel.collectAsState() + val showSaveButton by settingsDateOfBirthViewModel.showSaveButton.collectAsState() + + val scope = rememberCoroutineScope() + + val scrollState = rememberScrollState() + + val context = LocalContext.current + + val vibrateService = VibrateService(context) + + val actions = if (showSaveButton) { + listOf( + TopBarAction( + icon = Icons.Outlined.Check, + onClick = { + scope.launch { + val isSaved = settingsDateOfBirthViewModel.trySave() + + if (isSaved) { + onChange.invoke(currentValue) + navViewModel.removeLastScreenInStack() + } else { + vibrateService.vibrate(VibrationPattern.Error) + } + } + }) + ) + } else { + emptyList() + } + + LaunchedEffect(Unit) { + settingsDateOfBirthViewModel.init(initialLevel) + } + + Scaffold( + topBar = { + PageTopBar( + title = { + Text(stringResource(R.string.date_of_birth)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ), + actions = actions + ) + }) { + Column( + modifier = Modifier + .padding(it) + .verticalScroll(scrollState) + ) { + SectionHeader("Кто видит дату моего рождения?") + + SectionContainer { + SectionRadioItem( + text = stringResource(R.string.everybody), + selected = currentValue == PrivacyLevel.Everybody, + onClick = { + settingsDateOfBirthViewModel.selectValue(PrivacyLevel.Everybody) + }) + SectionRadioItem( + text = stringResource(R.string.nobody), + selected = currentValue == PrivacyLevel.Nobody, + onClick = { + settingsDateOfBirthViewModel.selectValue(PrivacyLevel.Nobody) + }) + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsLastSeenScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsLastSeenScreen.kt new file mode 100644 index 0000000..36219b3 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsLastSeenScreen.kt @@ -0,0 +1,69 @@ +package com.aiwazian.messenger.ui.settings.privacy + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionDescription +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionRadioItem +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun SettingsLastSeenScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + + val scrollState = rememberScrollState() + + Scaffold( + topBar = { + PageTopBar( + title = { + Text(stringResource(R.string.last_seen)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + } + ) { + Column( + modifier = Modifier + .padding(it) + .verticalScroll(scrollState) + ) { + SectionHeader("Кто видит время моего последнего захода?") + + SectionContainer { + SectionRadioItem( + stringResource(R.string.everybody), + selected = true + ) + SectionRadioItem( + stringResource(R.string.nobody), + selected = false + ) + } + + SectionDescription("Вместо точного времени будет видно примерное значение (недавно, на этой неделе, в этом месяце)") + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsPrivacyScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsPrivacyScreen.kt new file mode 100644 index 0000000..44abd5a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/privacy/SettingsPrivacyScreen.kt @@ -0,0 +1,166 @@ +package com.aiwazian.messenger.ui.settings.privacy + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Card +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +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.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.enums.PrivacyLevel +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.ui.element.SectionRadioItem +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SettingsPrivacyViewModel + +@Composable +fun SettingsPrivacyScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + val settingsPrivacyViewModel = hiltViewModel() + + val privacy by settingsPrivacyViewModel.privacySettings.collectAsState() + + val scrollState = rememberScrollState() + + Scaffold( + topBar = { TopBar() }, + ) { + Column( + modifier = Modifier + .padding(it) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + SectionHeader(stringResource(R.string.confidentiality)) + + SectionContainer { + SectionItem( + text = stringResource(R.string.bio), + primaryText = if (privacy.bio == PrivacyLevel.Everybody.ordinal) { + stringResource(R.string.everybody) + } else { + stringResource(R.string.nobody) + }, + onClick = { + navViewModel.addScreenInStack { + SettingsBioScreen( + PrivacyLevel.fromId(privacy.bio), + settingsPrivacyViewModel::updateBioValue + ) + } + }) + + SectionItem( + text = stringResource(R.string.date_of_birth), + primaryText = if (privacy.dateOfBirth == PrivacyLevel.Everybody.ordinal) { + stringResource(R.string.everybody) + } else { + stringResource(R.string.nobody) + }, + onClick = { + navViewModel.addScreenInStack { + SettingsDateOfBirthScreen( + PrivacyLevel.fromId(privacy.dateOfBirth), + settingsPrivacyViewModel::updateDateOfBirthValue + ) + } + }) + } + // + // SectionHeader("Удалить мой аккаунт") + // + // SectionContainer { + // SectionItem( + // text = "Если я не захожу", + // primaryText = "12 месяцев", + // onClick = settingsPrivacyViewModel.deleteAccountDialog::show + // ) + // } + // + // SectionDescription("Если Вы ни разу не загляните в ${stringResource(R.string.app_name)} за это время, аккаунт будет удален.") + // + if (settingsPrivacyViewModel.deleteAccountDialog.isVisible) { + DeleteAccountIfINotLoginDialog( + onDismissRequest = settingsPrivacyViewModel.deleteAccountDialog::hide, + onConfirm = {}) + } + } + } +} + +@Composable +private fun DeleteAccountIfINotLoginDialog( + onDismissRequest: () -> Unit, + onConfirm: () -> Unit +) { + var selectedOption by remember { mutableStateOf("Выберите пункт") } + + val options = listOf( + "1 месяц", + "3 месяца", + "6 месяцев", + "12 месяцев" + ) + + CustomDialog( + title = "Удаление аккаунта при неактивности", + onDismissRequest = onDismissRequest, + content = { + options.forEach { option -> + Card(shape = RoundedCornerShape(10.dp)) { + SectionRadioItem( + text = option, + selected = (selectedOption == option), + onClick = { + selectedOption = option + }) + } + } + }, + buttons = { + TextButton(onClick = onDismissRequest) { + Text(stringResource(R.string.cancel)) + } + }, + ) +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(stringResource(R.string.confidentiality)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsProfileColorScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsProfileColorScreen.kt new file mode 100644 index 0000000..73fea82 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsProfileColorScreen.kt @@ -0,0 +1,39 @@ +package com.aiwazian.messenger.ui.settings.profile + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun SettingsProfileColorScreen() { + Content() +} + +@Composable +private fun Content() { + Scaffold(topBar = { TopBar() }) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsProfileScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsProfileScreen.kt new file mode 100644 index 0000000..6d61037 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsProfileScreen.kt @@ -0,0 +1,245 @@ +package com.aiwazian.messenger.ui.settings.profile + +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DatePicker +import androidx.compose.material3.DatePickerDialog +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.rememberDatePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.ui.element.InputField +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionDescription +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SettingsProfileViewModel +import kotlinx.coroutines.launch +import java.text.SimpleDateFormat +import java.util.Locale + +@Composable +fun SettingsProfileScreen() { + Content() +} + +@Composable +private fun TopBar(onBack: () -> Unit) { + val navViewModel = viewModel() + + val actions = arrayOf( + TopBarAction( + icon = Icons.Outlined.MoreVert, + // dropdownActions = arrayOf( + // DropdownMenuAction( + // icon = Icons.Outlined.ColorLens, + // text = stringResource(R.string.change_profile_color), + // onClick = { navViewModel.addScreenInStack { SettingsProfileColorScreen() } }) + // ) + ) + ) + + PageTopBar( + title = { Text(stringResource(R.string.profile)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = onBack::invoke + ), + // actions = actions + ) +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + + val settingsProfileViewModel = hiltViewModel() + + val isVisibleDatePicker = settingsProfileViewModel.dataOfBirthDialog + + val user by settingsProfileViewModel.user.collectAsState() + + val scope = rememberCoroutineScope() + + val scrollState = rememberScrollState() + + DisposableEffect(Unit) { + onDispose { + scope.launch { + settingsProfileViewModel.save() + } + } + } + + Scaffold( + topBar = { + TopBar( + onBack = { + scope.launch { + settingsProfileViewModel.save() + navViewModel.removeLastScreenInStack() + } + }) + }, + modifier = Modifier.imePadding() + ) { innerPadding -> + Box(Modifier.padding(innerPadding)) { + Column( + Modifier + .fillMaxSize() + .verticalScroll(scrollState) + ) { + + SectionHeader("Ваше имя") + + SectionContainer { + InputField( + placeholder = stringResource(R.string.first_name), + value = user.firstName, + onValueChange = settingsProfileViewModel::onChangeFirstName + ) + + HorizontalDivider( + modifier = Modifier.padding(start = 16.dp), + thickness = 1.dp, + ) + + InputField( + placeholder = stringResource(R.string.last_name), + value = user.lastName, + onValueChange = settingsProfileViewModel::onChangeLastName + ) + } + + SectionHeader(title = stringResource(R.string.bio)) + + SectionContainer { + InputField( + placeholder = "Напишите что-нибудь о себе", + value = user.bio, + onValueChange = settingsProfileViewModel::onChangeBio + ) + } + + SectionDescription("В настройках можно выбрать, кому они будут видны.") + + SectionHeader(title = stringResource(R.string.username)) + + SectionContainer { + SectionItem( + text = if (user.username != null) { + "@${user.username}" + } else { + "Задать имя пользователя" + }, + onClick = { + scope.launch { + navViewModel.addScreenInStack { + SettingsUsernameScreen() + } + settingsProfileViewModel.save() + } + } + ) + } + + SectionDescription("Другие пользователи смогут найти Вас по такому имени и связаться.") + + SectionHeader(title = stringResource(R.string.date_of_birth)) + + SectionContainer { + SectionItem( + text = "Дата Вашего рождения", + primaryText = if (user.dateOfBirth != null) { + SimpleDateFormat( + "d MMM yyyy", + Locale.getDefault() + ).format(user.dateOfBirth) + } else { + "Указать" + }, + onClick = isVisibleDatePicker::show + ) + + AnimatedContent(targetState = user.dateOfBirth) { dateOfBirth -> + if (dateOfBirth != null) { + SectionItem( + text = stringResource(R.string.remove_date_of_birth), + onClick = { + settingsProfileViewModel.onChangeDateOfBirth(null) + }, + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.primary), + ) + } + } + } + + if (isVisibleDatePicker.isVisible) { + val datePickerState = rememberDatePickerState(user.dateOfBirth) + + DatePickerDialog( + onDismissRequest = isVisibleDatePicker::hide, + confirmButton = { + TextButton( + onClick = { + val selected = datePickerState.selectedDateMillis + if (selected != null) { + settingsProfileViewModel.onChangeDateOfBirth(selected) + } + isVisibleDatePicker.hide() + }, + modifier = Modifier.padding(end = 4.dp), + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.primary + ) + ) { + Text(stringResource(R.string.ok)) + } + }, + dismissButton = { + TextButton( + onClick = isVisibleDatePicker::hide, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.primary + ) + ) { + Text(stringResource(R.string.cancel)) + } + }) { + DatePicker( + title = { }, + state = datePickerState + ) + } + } + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsUsernameScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsUsernameScreen.kt new file mode 100644 index 0000000..0a8381f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/profile/SettingsUsernameScreen.kt @@ -0,0 +1,129 @@ +package com.aiwazian.messenger.ui.settings.profile + +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Check +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.TopBarAction +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.InputField +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SettingsUsernameViewModel +import kotlinx.coroutines.launch + +@Composable +fun SettingsUsernameScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + + val viewModel = hiltViewModel() + + val username by viewModel.username.collectAsState() + + val errorText = viewModel.errorText + + LaunchedEffect(Unit) { + viewModel.init() + } + + Scaffold(topBar = { + TopBar( + navViewModel::removeLastScreenInStack, + viewModel + ) + }) { + Column(modifier = Modifier.padding(it)) { + SectionContainer { + InputField( + placeholder = stringResource(R.string.username), + value = username, + onValueChange = viewModel::onChangeUsername + ) + } + + AnimatedContent(targetState = errorText) { text -> + if (text != null) { + Text( + text = text, + modifier = Modifier.padding( + start = 16.dp, + end = 16.dp, + bottom = 8.dp + ), + fontSize = 12.sp + ) + } + } + } + } +} + +@Composable +private fun TopBar( + onBack: () -> Unit, + viewModel: SettingsUsernameViewModel +) { + val navViewModel = viewModel() + + val canSave by viewModel.canSave.collectAsState() + + val context = LocalContext.current + + val vibrationService = VibrateService(context) + + val scope = rememberCoroutineScope() + + val actions = if (canSave) { + listOf( + TopBarAction( + icon = Icons.Outlined.Check, + onClick = { + scope.launch { + val isSaved = viewModel.trySave() + + if (isSaved) { + navViewModel.removeLastScreenInStack() + } else { + vibrationService.vibrate(VibrationPattern.Error) + } + } + }) + ) + } else { + emptyList() + } + + PageTopBar( + title = { Text(stringResource(R.string.username)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = onBack::invoke + ), + actions = actions + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsChangeCloudPasswordScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsChangeCloudPasswordScreen.kt new file mode 100644 index 0000000..92fd0e1 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsChangeCloudPasswordScreen.kt @@ -0,0 +1,135 @@ +package com.aiwazian.messenger.ui.settings.security + +import androidx.compose.animation.AnimatedContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.ArrowForward +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +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.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.services.VibrateService +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.utils.Shape +import com.aiwazian.messenger.utils.VibrationPattern +import com.aiwazian.messenger.viewModels.CloudPasswordViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun SettingsChangeCloudPasswordScreen() { + val navViewModel = viewModel() + val cloudPasswordViewModel = viewModel() + + val newPassword by cloudPasswordViewModel.newPassword.collectAsState() + val errorMessage by cloudPasswordViewModel.errorMessage.collectAsState() + + val vibrateService = VibrateService(LocalContext.current) + + val scope = rememberCoroutineScope() + + var isLoading by remember { mutableStateOf(false) } + + DisposableEffect(Unit) { + onDispose { + cloudPasswordViewModel.cleanData() + } + } + + Scaffold( + topBar = { + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + }, + floatingActionButton = { + FloatingActionButton( + onClick = { + val isValid = cloudPasswordViewModel.checkValidPassword() + + isLoading = true + + scope.launch { + if (!isValid) { + vibrateService.vibrate(VibrationPattern.Error) + isLoading = false + return@launch + } + + val isChanged = cloudPasswordViewModel.changePassword() + isLoading = false + if (isChanged) { + navViewModel.removeLastScreenInStack() + } + } + }, + shape = CircleShape, + modifier = Modifier.imePadding(), + containerColor = MaterialTheme.colorScheme.primary + ) { + AnimatedContent(targetState = isLoading) { isLoading -> + if (isLoading) { + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onPrimary, + strokeWidth = 2.dp, + modifier = Modifier.size(20.dp) + ) + } else { + Icon( + Icons.AutoMirrored.Outlined.ArrowForward, + null + ) + } + } + } + }) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + OutlinedTextField( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 40.dp), + value = newPassword, + onValueChange = cloudPasswordViewModel::onInputNewPassword, + shape = Shape.TextField, + label = { + Text(errorMessage ?: stringResource(R.string.enter_password)) + }, + isError = errorMessage != null + ) + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsCloudPasswordSceen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsCloudPasswordSceen.kt new file mode 100644 index 0000000..ce0cf1b --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsCloudPasswordSceen.kt @@ -0,0 +1,109 @@ +@file:OptIn(ExperimentalMaterial3Api::class) + +package com.aiwazian.messenger.ui.settings.security + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.AnimatedIntroScreen +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.utils.LottieAnimation +import com.aiwazian.messenger.viewModels.NavigationViewModel + +@Composable +fun SettingsCloudPasswordScreen(enabled: Boolean = true) { + Content(enabled) +} + +@Composable +private fun Content(enabled: Boolean) { + val navViewModel = viewModel() + + val navHost = rememberNavController() + + NavHost( + navController = navHost, + startDestination = if (enabled) "SETTINGS" else "MAIN" + ) { + composable("MAIN") { + Main(navViewModel) + } + composable("SETTINGS") { + Settings(navViewModel) + } + } +} + +@Composable +private fun Main(navViewModel: NavigationViewModel) { + Scaffold(topBar = { + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + }) { innerPadding -> + Box(modifier = Modifier.padding(innerPadding)) { + AnimatedIntroScreen( + animation = LottieAnimation.KEY_LOCK, + title = stringResource(R.string.cloud_password), + description = stringResource(R.string.cloud_password_description), + buttonText = "Включить", + buttonClick = { + navViewModel.addScreenInStack { } + } + ) + } + } +} + +@Composable +private fun Settings(navViewModel: NavigationViewModel) { + Scaffold( + topBar = { + TopBar(navViewModel) + }, + ) { innerPadding -> + Column(modifier = Modifier.padding(innerPadding)) { + SectionContainer { + SectionItem( + "Сменить пароль", + onClick = { + navViewModel.addScreenInStack { + SettingsChangeCloudPasswordScreen() + } + }) + } + } + } +} + +@Composable +private fun TopBar(navViewModel: NavigationViewModel) { + PageTopBar( + title = { + Text(stringResource(R.string.cloud_password)) + }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsDevicesScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsDevicesScreen.kt new file mode 100644 index 0000000..a7fc051 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsDevicesScreen.kt @@ -0,0 +1,410 @@ +package com.aiwazian.messenger.ui.settings.security + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Snackbar +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SwipeToDismissBox +import androidx.compose.material3.SwipeToDismissBoxValue +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.rememberSwipeToDismissBoxState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.data.SessionInfo +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionHeader +import com.aiwazian.messenger.ui.element.SectionRadioItem +import com.aiwazian.messenger.viewModels.DevicesViewModel +import com.aiwazian.messenger.viewModels.NavigationViewModel +import kotlinx.coroutines.launch + +@Composable +fun SettingsDevicesScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + val devicesViewModel = hiltViewModel() + + val currentSession by devicesViewModel.currentSession.collectAsState() + + val sessions by devicesViewModel.sessions.collectAsState() + val bottomSheetDialog = devicesViewModel.sessionInfoDialog + val terminateSessionDialog = devicesViewModel.terminateSessionDialog + + LaunchedEffect(Unit) { + devicesViewModel.getSessions() + } + + val snackbarHostState = remember { SnackbarHostState() } + + val scrollState = rememberScrollState() + + val scope = rememberCoroutineScope() + + Scaffold( + topBar = { + PageTopBar( + title = { Text(stringResource(R.string.devices)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) + }, + snackbarHost = { + SwipeDismissSnackbarHost(snackbarHostState) + }) { + Column( + Modifier + .padding(it) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + // Column( + // modifier = Modifier + // .fillMaxWidth() + // .padding(vertical = 10.dp), + // verticalArrangement = Arrangement.spacedBy(10.dp), + // horizontalAlignment = Alignment.CenterHorizontally + // ) { + // val composition by rememberLottieComposition( + // spec = LottieCompositionSpec.Asset(LottieAnimation.APPLE_PHONE) + // ) + // + // LottieAnimation( + // composition = composition, + // modifier = Modifier.size(100.dp), + // iterations = LottieConstants.IterateForever, + // isPlaying = true + // ) + // + // Text( + // text = "Вы можете зайти в приложение с помощью QR-кода.", + // fontSize = 14.sp, + // lineHeight = 14.sp, + // textAlign = TextAlign.Center, + // color = MaterialTheme.colorScheme.onSurfaceVariant + // ) + // + // Button( + // onClick = { }, + // modifier = Modifier + // .fillMaxWidth() + // .padding(10.dp), + // shape = RoundedCornerShape(10.dp), + // ) { + // Icon( + // imageVector = Icons.Outlined.QrCode, + // contentDescription = null, + // ) + // Text( + // text = stringResource(R.string.connect_device), + // modifier = Modifier.padding(8.dp), + // ) + // } + // } + + SectionHeader(stringResource(R.string.this_device)) + + SectionContainer { + DeviceCard( + text = currentSession.deviceName, + onClick = { + devicesViewModel.openSession(currentSession.id) + bottomSheetDialog.show() + }) + + } + // + // if (sessions.isNotEmpty()) { + // SectionContainer { + // SectionItem( + // icon = Icons.Outlined.BackHand, + // iconColor = MaterialTheme.colorScheme.error, + // text = stringResource(R.string.terminate_all_other_sessions), + // textColor = MaterialTheme.colorScheme.error, + // colors = ButtonDefaults.textButtonColors( + // contentColor = MaterialTheme.colorScheme.error + // ), + // onClick = { + // devicesViewModel.setConfirmDialogAction { + // devicesViewModel.terminateAllOtherSessions() + // } + // bottomSheetDialog.show() + // }) + // } + // + // SectionDescription(text = stringResource(R.string.terminate_all_other_sessions_description)) + // } + + if (sessions.isNotEmpty()) { + SectionHeader(title = stringResource(R.string.active_sessions)) + + SectionContainer { + sessions.forEach { session -> + DeviceCard( + text = session.deviceName, + onClick = { + devicesViewModel.openSession(session.id) + bottomSheetDialog.show() + }) + } + } + } + } + + if (terminateSessionDialog.isVisible) { + TerminateSessionDialog( + onDismiss = terminateSessionDialog::hide, + onConfirm = { + devicesViewModel.getConfirmDialogAction()?.let { action -> + scope.launch { + action.invoke() + } + } + terminateSessionDialog.hide() + bottomSheetDialog.hide() + }) + } + + val openSession by devicesViewModel.openedSession.collectAsState() + + if (bottomSheetDialog.isVisible) { + BottomModal( + sessionInfo = openSession, + onDismissRequest = bottomSheetDialog::hide, + onConfirm = { + devicesViewModel.setConfirmDialogAction { + devicesViewModel.terminateSession(openSession.id) + } + terminateSessionDialog.show() + }) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun BottomModal( + sessionInfo: SessionInfo, + onDismissRequest: () -> Unit, + onConfirm: () -> Unit +) { + ModalBottomSheet( + onDismissRequest = onDismissRequest, + dragHandle = null + ) { + Column( + modifier = Modifier + .padding(10.dp) + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + Text( + text = sessionInfo.deviceName, + fontSize = 18.sp + ) + + Text(sessionInfo.createdAt) + + if (sessionInfo.id != 0) { + Button( + onClick = onConfirm, + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp), + colors = ButtonDefaults.buttonColors( + contentColor = MaterialTheme.colorScheme.onErrorContainer, + containerColor = MaterialTheme.colorScheme.errorContainer + ) + ) { + Text( + text = stringResource(R.string.terminate_session), + modifier = Modifier.padding(8.dp), + fontSize = 16.sp + ) + } + } + } + } +} + +@Composable +private fun SwipeDismissSnackbarHost(snackbarHostState: SnackbarHostState) { + SnackbarHost(hostState = snackbarHostState) { data -> + var dismissed by remember { mutableStateOf(false) } + + if (!dismissed) { + val swipeToDismissBoxState = rememberSwipeToDismissBoxState( + confirmValueChange = { + it == SwipeToDismissBoxValue.EndToStart || it == SwipeToDismissBoxValue.StartToEnd + }) + + SwipeToDismissBox( + state = swipeToDismissBoxState, + enableDismissFromEndToStart = true, + enableDismissFromStartToEnd = true, + backgroundContent = { }) { + Snackbar( + modifier = Modifier + .padding(12.dp) + .clip(RoundedCornerShape(16.dp)) + ) { + Text(data.visuals.message) + } + } + } + } +} + +@Composable +private fun DeviceCard( + text: String, + onClick: () -> Unit +) { + Card( + shape = RectangleShape, + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = Color.Transparent + ), + onClick = onClick + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box( + modifier = Modifier + .size(40.dp) + .clip(CircleShape) + ) { + Image( + painter = painterResource(R.drawable.ic_launcher_background), + contentDescription = null, + modifier = Modifier.fillMaxSize() + ) + Image( + painter = painterResource(R.drawable.ic_launcher_foreground), + contentDescription = null, + modifier = Modifier.fillMaxSize() + ) + } + Text( + text = text, + modifier = Modifier.padding(start = 16.dp) + ) + } + } +} + +@Composable +private fun TerminateSessionDialog( + onDismiss: () -> Unit, + onConfirm: () -> Unit +) { + CustomDialog( + title = stringResource(R.string.terminate_session), + onDismissRequest = onDismiss, + content = { + Text("Вы точно хотите завершить сеанс?") + }, + buttons = { + TextButton(onClick = onDismiss) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = onConfirm, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error + ) + ) { + Text(stringResource(R.string.terminate)) + } + }) +} + +@Composable +private fun AutoTerminateSessionDialog( + onDismissRequest: () -> Unit, +) { + var selectedOption by remember { mutableStateOf("Выберите пункт") } + + val options = listOf( + "1 нед.", + "1 мес.", + "1 год", + ) + + CustomDialog( + title = "Автозавершение сессий", + onDismissRequest = onDismissRequest, + content = { + Column { + options.forEach { option -> + Card(shape = RoundedCornerShape(10.dp)) { + SectionRadioItem( + text = option, + selected = option == selectedOption, + onClick = { + selectedOption = option + }) + } + } + } + }, + buttons = { + TextButton(onClick = onDismissRequest) { + Text(stringResource(R.string.cancel)) + } + }) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsPasscodeScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsPasscodeScreen.kt new file mode 100644 index 0000000..0058a39 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsPasscodeScreen.kt @@ -0,0 +1,474 @@ +package com.aiwazian.messenger.ui.settings.security + +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.Backspace +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import com.airbnb.lottie.compose.LottieAnimation +import com.airbnb.lottie.compose.LottieCompositionSpec +import com.airbnb.lottie.compose.LottieConstants +import com.airbnb.lottie.compose.rememberLottieComposition +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.AnimatedIntroScreen +import com.aiwazian.messenger.ui.element.CodeBlocks +import com.aiwazian.messenger.ui.element.CustomDialog +import com.aiwazian.messenger.ui.element.CustomNumberBoard +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.utils.LottieAnimation +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.PasscodeLockViewModel +import kotlinx.coroutines.launch + +private object PasscodeScreens { + const val MAIN = "PasscodeMain" + const val SETTINGS = "PasscodeSettings" + const val CREATE = "CreatePasscode" + const val CHANGE = "ChangePasscode" +} + +@Composable +fun SettingsPasscodeScreen(enablePasscode: Boolean = false) { + val navViewModel = viewModel() + + val navController = rememberNavController() + + val transition = tween( + durationMillis = 500, + easing = FastOutSlowInEasing + ) + + val startDestination = if (enablePasscode) { + PasscodeScreens.SETTINGS + } else { + PasscodeScreens.MAIN + } + + NavHost( + navController = navController, + startDestination = startDestination, + enterTransition = { + slideInHorizontally(animationSpec = transition) { it } + }, + exitTransition = { + slideOutHorizontally(animationSpec = transition) { -it } + }, + popEnterTransition = { + slideInHorizontally(animationSpec = transition) { -it } + }, + popExitTransition = { + slideOutHorizontally(animationSpec = transition) { it } + }) { + composable(route = PasscodeScreens.MAIN) { + PasscodeLockMainScreen( + navController, + navViewModel + ) + } + composable(route = PasscodeScreens.CREATE) { + CreatePasscodeScreen( + navController, + navViewModel + ) + } + composable(route = PasscodeScreens.SETTINGS) { + SettingsPasscodeLockScreen( + navController, + navViewModel + ) + } + composable(route = PasscodeScreens.CHANGE) { + SettingsChangePasscodeLockScreen(navController) + } + } +} + +@Composable +private fun CreatePasscodeScreen( + navController: NavHostController, + navViewModel: NavigationViewModel +) { + val passcodeLockViewModel = hiltViewModel() + + passcodeLockViewModel.onSaveNewPasscode = { + navController.navigate(route = PasscodeScreens.SETTINGS) { + popUpTo(PasscodeScreens.MAIN) { + inclusive = true + } + popUpTo(PasscodeScreens.CREATE) { + inclusive = true + } + } + } + + val passcode by passcodeLockViewModel.passcode.collectAsState() + + Scaffold( + topBar = { + TopBar(navViewModel) + }, + modifier = Modifier.fillMaxSize(), + + ) { + Column( + modifier = Modifier + .padding(it) + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceBetween, + ) { + Column( + modifier = Modifier.padding(top = 40.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(40.dp), + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + + Text( + text = "Создание код-пароля", + fontSize = 24.sp + ) + + Text( + text = "Введите 4 цифры, которые хотите использовать для разблокировки приложения.", + textAlign = TextAlign.Center, + fontSize = 14.sp, + lineHeight = 16.sp + ) + } + + CodeBlocks( + count = PasscodeLockViewModel.MAX_LENGTH_PASSCODE, + showInput = false, + code = passcode + ) + } + + val boardButtons = listOf( + listOf( + "1", + "2", + "3" + ), + listOf( + "4", + "5", + "6" + ), + listOf( + "7", + "8", + "9" + ), + listOf( + null, + "0", + Icons.AutoMirrored.Outlined.Backspace + ), + ) + + CustomNumberBoard( + value = passcode, + buttons = boardButtons, + onChange = passcodeLockViewModel::onPasscodeChanged + ) + } + } +} + +@Composable +private fun SettingsChangePasscodeLockScreen(navController: NavHostController) { + val passcodeLockViewModel = hiltViewModel() + + passcodeLockViewModel.onSaveNewPasscode = { + navController.navigate(route = PasscodeScreens.SETTINGS) { + popUpTo(PasscodeScreens.MAIN) { + inclusive = true + } + popUpTo(PasscodeScreens.CREATE) { + inclusive = true + } + } + } + + val passcode by passcodeLockViewModel.passcode.collectAsState() + + Scaffold( + topBar = { + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navController::popBackStack + ) + ) + }, + modifier = Modifier.fillMaxSize() + ) { + Column( + modifier = Modifier + .padding(it) + .fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.SpaceBetween, + ) { + Column( + modifier = Modifier.padding(top = 40.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(40.dp), + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + + Text( + text = "Введите новый код-пароль", + fontSize = 24.sp + ) + + Text( + text = "Введите 4 цифры, которые хотите использовать для разблокировки приложения.", + textAlign = TextAlign.Center, + fontSize = 14.sp, + lineHeight = 16.sp + ) + } + + CodeBlocks( + count = PasscodeLockViewModel.MAX_LENGTH_PASSCODE, + code = passcode + ) + } + + val boardButtons = listOf( + listOf( + "1", + "2", + "3" + ), + listOf( + "4", + "5", + "6" + ), + listOf( + "7", + "8", + "9" + ), + listOf( + null, + "0", + Icons.AutoMirrored.Outlined.Backspace + ), + ) + + CustomNumberBoard( + value = passcode, + buttons = boardButtons, + onChange = passcodeLockViewModel::onPasscodeChanged + ) + } + } +} + +@Composable +private fun PasscodeLockMainScreen( + navController: NavHostController, + navViewModel: NavigationViewModel +) { + Scaffold( + topBar = { + TopBarMain(navViewModel) + }, + ) { innerPadding -> + Box( + modifier = Modifier.padding(innerPadding) + ) { + AnimatedIntroScreen( + animation = LottieAnimation.KEY_LOCK, + title = stringResource(R.string.passcode_lock), + description = stringResource(R.string.passcode_lock_description), + buttonText = stringResource(R.string.enable_passcode), + buttonClick = { + navController.navigate(route = PasscodeScreens.CREATE) { + popUpTo(PasscodeScreens.MAIN) { + inclusive = true + } + } + }) + } + } +} + +@Composable +private fun TopBar(navViewModel: NavigationViewModel) { + PageTopBar( + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} + +@Composable +private fun SettingsPasscodeLockScreen( + navController: NavHostController, + navViewModel: NavigationViewModel +) { + val passcodeLockViewModel = hiltViewModel() + + val disablePasscodeDialog = passcodeLockViewModel.disablePasscodeDialog + + val scrollState = rememberScrollState() + + Scaffold( + topBar = { + TopBar(navViewModel) + }, + ) { innerPadding -> + Column( + modifier = Modifier + .padding(innerPadding) + .verticalScroll(scrollState) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp), + verticalArrangement = Arrangement.spacedBy(10.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + val composition by rememberLottieComposition( + spec = LottieCompositionSpec.Asset(LottieAnimation.KEY_LOCK) + ) + + LottieAnimation( + composition = composition, + modifier = Modifier.size(100.dp), + iterations = LottieConstants.IterateForever, + isPlaying = true + ) + + Text( + text = "Для блокировки и разблокировки приложения нажмите на значок замка над списком чатов.", + fontSize = 14.sp, + lineHeight = 14.sp, + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + + } + + SectionContainer { + SectionItem( + text = stringResource(R.string.change_passcode), + onClick = { + navController.navigate(PasscodeScreens.CREATE) + }) + } + + SectionContainer { + SectionItem( + text = stringResource(R.string.turn_passcode_off), + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error + ), + onClick = disablePasscodeDialog::show + ) + } + + val scope = rememberCoroutineScope() + + if (disablePasscodeDialog.isVisible) { + DisablePasscodeDialog( + onDismiss = disablePasscodeDialog::hide, + onConfirm = { + scope.launch { + passcodeLockViewModel.disablePasscode() + disablePasscodeDialog.hide() + navViewModel.removeLastScreenInStack() + } + }) + } + } + } +} + +@Composable +private fun DisablePasscodeDialog( + onDismiss: () -> Unit, + onConfirm: () -> Unit +) { + CustomDialog( + title = stringResource(R.string.turn_passcode_off), + onDismissRequest = onDismiss, + content = { + Text( + text = "Вы точно хотите отключить пароль?", + ) + }, + buttons = { + TextButton(onClick = onDismiss) { + Text(stringResource(R.string.cancel)) + } + TextButton( + onClick = onConfirm, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error + ) + ) { + Text(stringResource(R.string.turn_off)) + } + }) +} + +@Composable +private fun TopBarMain(navViewModel: NavigationViewModel) { + PageTopBar( + title = { Text(stringResource(R.string.passcode_lock)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsSecurityScreen.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsSecurityScreen.kt new file mode 100644 index 0000000..04865c5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/settings/security/SettingsSecurityScreen.kt @@ -0,0 +1,123 @@ +package com.aiwazian.messenger.ui.settings.security + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.ArrowBack +import androidx.compose.material.icons.outlined.Devices +import androidx.compose.material.icons.outlined.Key +import androidx.compose.material.icons.outlined.Lock +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import com.aiwazian.messenger.R +import com.aiwazian.messenger.data.NavigationIcon +import com.aiwazian.messenger.ui.element.PageTopBar +import com.aiwazian.messenger.ui.element.SectionContainer +import com.aiwazian.messenger.ui.element.SectionDescription +import com.aiwazian.messenger.ui.element.SectionItem +import com.aiwazian.messenger.viewModels.NavigationViewModel +import com.aiwazian.messenger.viewModels.SettingsSecurityViewModel + +@Composable +fun SettingsSecurityScreen() { + Content() +} + +@Composable +private fun Content() { + val navViewModel = viewModel() + val viewModel = hiltViewModel() + + val deviceCount by viewModel.deviceCount.collectAsState() + val passcodeEnabled by viewModel.isEnablePasscode.collectAsState() + + LaunchedEffect(Unit) { + viewModel.init() + } + + val scrollState = rememberScrollState() + + Scaffold( + topBar = { TopBar() } + ) { + Column( + modifier = Modifier + .padding(it) + .fillMaxSize() + .verticalScroll(scrollState) + ) { + Column { + SectionContainer { + SectionItem( + icon = Icons.Outlined.Key, + text = stringResource(R.string.cloud_password), + primaryText = stringResource(R.string.on), + onClick = { + navViewModel.addScreenInStack { + SettingsCloudPasswordScreen() + } + } + ) + + val passcodeEnabledText = if (passcodeEnabled) { + stringResource(R.string.on) + } else { + stringResource(R.string.off) + } + + SectionItem( + icon = Icons.Outlined.Lock, + text = stringResource(R.string.passcode_lock), + primaryText = passcodeEnabledText, + onClick = { + navViewModel.addScreenInStack { + SettingsPasscodeScreen(passcodeEnabled) + } + } + ) + + SectionItem( + icon = Icons.Outlined.Devices, + text = stringResource(R.string.devices), + primaryText = deviceCount.toString(), + onClick = { + navViewModel.addScreenInStack { + SettingsDevicesScreen() + } + } + ) + } + + SectionDescription( + text = "Просмотреть список устройств, на которых Ваш аккаунт авторизован в ${ + stringResource(R.string.app_name) + }." + ) + } + } + } +} + +@Composable +private fun TopBar() { + val navViewModel = viewModel() + + PageTopBar( + title = { Text(stringResource(R.string.security)) }, + navigationIcon = NavigationIcon( + icon = Icons.AutoMirrored.Outlined.ArrowBack, + onClick = navViewModel::removeLastScreenInStack + ) + ) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/theme/Theme.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/theme/Theme.kt new file mode 100644 index 0000000..b0b221a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/ui/theme/Theme.kt @@ -0,0 +1,93 @@ +package com.aiwazian.messenger.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.MaterialExpressiveTheme +import androidx.compose.material3.MotionScheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat +import com.aiwazian.messenger.enums.PrimaryColorOption +import com.aiwazian.messenger.enums.ThemeOption + +private fun darkColorSchemeMaterial(customPrimaryColor: Color) = darkColorScheme( + primary = customPrimaryColor, + onPrimary = Color.Black, + background = Color.Black, + onBackground = Color.White, + surface = Color.Black, + error = Color(0xFFFF6464), +) + +private fun lightColorSchemeMaterial(customPrimaryColor: Color) = lightColorScheme( + primary = customPrimaryColor, + onPrimary = Color.White, + background = Color.White, + onBackground = Color.Black, + surface = Color.White, + error = Color(0xFFFF6464), +) + +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +fun ApplicationTheme( + theme: ThemeOption = ThemeOption.SYSTEM, + primaryColor: Color = PrimaryColorOption.Blue.color, + dynamicColor: Boolean = true, + content: @Composable () -> Unit, +) { + val isDark = when (theme) { + ThemeOption.DARK -> true + ThemeOption.LIGHT -> false + ThemeOption.SYSTEM -> isSystemInDarkTheme() + } + + val view = LocalView.current + val activity = view.context as Activity + + SideEffect { + val window = activity.window + + WindowCompat.setDecorFitsSystemWindows( + window, + false + ) + + val insetsController = WindowCompat.getInsetsController( + window, + view + ) + + window.statusBarColor = Color.Transparent.toArgb() + window.navigationBarColor = Color.Transparent.toArgb() + + insetsController.isAppearanceLightStatusBars = !isDark + insetsController.isAppearanceLightNavigationBars = !isDark + } + + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (isDark) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + isDark -> darkColorSchemeMaterial(primaryColor) + else -> lightColorSchemeMaterial(primaryColor) + } + + MaterialExpressiveTheme( + motionScheme = MotionScheme.expressive(), + colorScheme = colorScheme, + content = content + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ChatState.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ChatState.kt new file mode 100644 index 0000000..0209344 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ChatState.kt @@ -0,0 +1,18 @@ +package com.aiwazian.messenger.utils + +object ChatState { + + private var openChatId: Long? = null + + fun openChat(chatId: Long) { + openChatId = chatId + } + + fun closeChat() { + openChatId = null + } + + fun isChatOpen(chatId: Long?): Boolean { + return openChatId == chatId + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Constants.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Constants.kt new file mode 100644 index 0000000..b313781 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Constants.kt @@ -0,0 +1,9 @@ +package com.aiwazian.messenger.utils + +import com.aiwazian.messenger.BuildConfig + +object Constants { + val SERVER_URL = BuildConfig.SERVER_URL + val WEB_SOCKET_URL = BuildConfig.WEB_SOCKET_URL + val DOMAIN_NAME = SERVER_URL.trimEnd('/') +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/DownloadManager.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/DownloadManager.kt new file mode 100644 index 0000000..2b1580a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/DownloadManager.kt @@ -0,0 +1,9 @@ +package com.aiwazian.messenger.utils + +object DownloadManager { + var onProgressUpdate: ((url: String, progress: Int) -> Unit)? = null + + fun updateProgress(url: String, progress: Int) { + onProgressUpdate?.invoke(url, progress) + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Downloader.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Downloader.kt new file mode 100644 index 0000000..4b603b4 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Downloader.kt @@ -0,0 +1,136 @@ +package com.aiwazian.messenger.utils + +import android.content.Context +import android.os.Build +import android.os.Environment +import android.util.Log +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.io.IOException +import okhttp3.ResponseBody +import java.io.File +import java.io.FileOutputStream + +suspend fun saveFileToApplicationFolder( + context: Context, + responseBody: ResponseBody, + fileName: String +) { + withContext(Dispatchers.IO) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val appDir = context.getExternalFilesDir(null) ?: return@withContext + + val file = File( + appDir, + fileName + ) + + FileOutputStream(file).use { output -> + responseBody.byteStream().use { input -> + val buffer = ByteArray(8 * 1024) + var bytesRead: Int + while (input.read(buffer).also { bytesRead = it } != -1) { + output.write( + buffer, + 0, + bytesRead + ) + } + output.flush() + } + } + } else { + val appDir = context.getExternalFilesDir(null) ?: return@withContext + if (!appDir.exists()) appDir.mkdirs() + + val file = File( + appDir, + fileName + ) + + FileOutputStream(file).use { output -> + responseBody.byteStream().use { input -> + val buffer = ByteArray(8 * 1024) + var bytesRead: Int + while (input.read(buffer).also { bytesRead = it } != -1) { + output.write( + buffer, + 0, + bytesRead + ) + } + output.flush() + } + } + } + } +} + +fun saveFileToDownloadsFolder( + context: Context, + sourceFileName: String, + destinationFileName: String +): Boolean { + try { + context.filesDir.listFiles()?.forEach { + Log.d( + "Downloader", + "Файл: ${it.absolutePath}" + ) + } + + Log.d( + "Downloader", + sourceFileName + ) + + val sourceFile = File( + context.getExternalFilesDir(null), + sourceFileName + ) + + if (!sourceFile.exists()) { + Log.e( + "Downloader", + "Исходный файл не найден: ${sourceFile.absolutePath}" + ) + // return false + } + + val downloadsDir = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + if (!downloadsDir.exists()) { + downloadsDir.mkdirs() + } + + val destinationFile = File( + downloadsDir, + destinationFileName + ) + + sourceFile.copyTo(destinationFile) + + return true + } catch (e: IOException) { + Log.e( + "Downloader", + "Ошибка при копировании файла", + e + ) + return false + } catch (e: SecurityException) { + Log.e( + "Downloader", + "Нет прав на доступ к файлам", + e + ) + return false + } catch (e: Exception) { + Log.e( + "Downloader", + "Ошибка при копировании файла", + e + ) + return false + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/FileHelper.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/FileHelper.kt new file mode 100644 index 0000000..818cb45 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/FileHelper.kt @@ -0,0 +1,31 @@ +package com.aiwazian.messenger.utils + +import android.annotation.SuppressLint +import android.content.Context +import java.io.File + +fun getFileExtension(fileName: String): String { + return fileName.substringAfterLast('.', "").lowercase() +} + +@SuppressLint("DefaultLocale") +fun formatFileSize(sizeInBytes: Long): String { + if (sizeInBytes <= 0) return "0 B" + + val units = arrayOf("B", "KB", "MB", "GB", "TB") + var size = sizeInBytes.toDouble() + var digitGroups = 0 + + while (size >= 1024.0 && digitGroups < units.size - 1) { + size /= 1024.0 + digitGroups++ + } + + return String.format("%.1f %s", size, units[digitGroups]) +} + +fun isFileExists(context: Context, filePath: String): Boolean { + val appDir = context.getExternalFilesDir(null) ?: return false + val file = File(appDir, filePath) + return file.exists() +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/LottieAnimation.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/LottieAnimation.kt new file mode 100644 index 0000000..3b4c1ec --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/LottieAnimation.kt @@ -0,0 +1,11 @@ +package com.aiwazian.messenger.utils + +object LottieAnimation { + const val APPLE_PHONE = "phone_apple.json" + const val FOLDERS = "folders.json" + const val FOLDER_CLOSED = "folder_closed.json" + const val SEARCH_OUT = "search_out.json" + const val KEY_GOLD = "key_gold.json" + const val KEY_IRON = "key_iron.json" + const val KEY_LOCK = "key_lock.json" +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/NotificationChannelConstants.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/NotificationChannelConstants.kt new file mode 100644 index 0000000..e920419 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/NotificationChannelConstants.kt @@ -0,0 +1,11 @@ +package com.aiwazian.messenger.utils + +import com.aiwazian.messenger.data.NotificationChannelInfo + +object NotificationChannelConstants { + val PERSONAL_MESSAGES = NotificationChannelInfo( + "personal_messages", + "Личные сообщения", + "Уведомления для сообщений в личных чатах" + ) +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ProgressResponseBody.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ProgressResponseBody.kt new file mode 100644 index 0000000..b5b9667 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ProgressResponseBody.kt @@ -0,0 +1,54 @@ +package com.aiwazian.messenger.utils + +import okhttp3.MediaType +import okhttp3.ResponseBody +import okio.Buffer +import okio.BufferedSource +import okio.ForwardingSource +import okio.Source +import okio.buffer +import java.io.IOException + +class ProgressResponseBody( + private val url: String, + private val responseBody: ResponseBody, + private val onProgress: (url: String, progress: Int) -> Unit +) : ResponseBody() { + + private var bufferedSource: BufferedSource? = null + + override fun contentType(): MediaType? = responseBody.contentType() + + override fun contentLength(): Long = responseBody.contentLength() + + override fun source(): BufferedSource { + if (bufferedSource == null) { + bufferedSource = source(responseBody.source()).buffer() + } + return bufferedSource!! + } + + private fun source(source: Source): Source { + return object : ForwardingSource(source) { + var totalBytesRead = 0L + var lastProgress = 0 + + @Throws(IOException::class) + override fun read(sink: Buffer, byteCount: Long): Long { + val bytesRead = super.read(sink, byteCount) + if (bytesRead != -1L) { + totalBytesRead += bytesRead + val fullLength = responseBody.contentLength() + if (fullLength > 0) { + val progress = ((100 * totalBytesRead) / fullLength).toInt() + if (progress != lastProgress) { + lastProgress = progress + onProgress(url, progress) + } + } + } + return bytesRead + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Route.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Route.kt new file mode 100644 index 0000000..2b9c133 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Route.kt @@ -0,0 +1,71 @@ +package com.aiwazian.messenger.utils + +object Route { + + /** Auth **/ + const val LOGIN = "api/auth/signin" + const val REGISTER = "api/auth/signup" + const val FIND_USER_BY_LOGIN = "api/auth/check/{login}" + + /** User **/ + const val ME = "api/users/me" + const val LOGOUT = "api/auth/logout" + const val SEARCH_USER = "api/searchUser" + const val GE_USER_BY_ID = "api/users/{id}" + const val CHECK_USERNAME = "api/checkUsername/{username}" + const val SAVE_USERNAME = "api/me/username/{username}" + const val PROFILE_UPDATE = "api/profileUpdate" + const val ARCHIVED_CHATS = "api/chats" + const val UNARCHIVED_CHATS = "api/chats" + const val GET_SESSIONS = "api/sessions" + const val TERMINATE_SESSION = "api/sessions/{id}" + const val GET_DEVICE_COUNT = "api/sessionCount" + const val UPDATE_FCM_TOKEN = "api/updateFcmToken" + const val TERMINATE_ALL_SESSIONS = "api/sessions" + const val CHANGE_CLOUD_PASSWORD = "api/users/me/password" + + /** Chat **/ + const val CHATS = "api/chats" + const val CHATS_WITH_USERS = "api/chats/users" + const val CHAT_MESSAGES = "api/chats/{id}/messages" + const val GET_CHAT_LAST_MESSAGE = "api/chats/{chatId}/messages" + const val DELETE_CHAT = "api/chats/{id}" + const val DELETE_CHAT_MESSAGES = "api/chats/{id}/messages" + const val GET_CHAT_INFO = "api/chats/{id}" + const val PIN_CHAT = "api/chat/{id}/pin" + const val UNPIN_CHAT = "api/chat/{id}/pin" + const val ADD_CHAT_TO_ARCHIVE = "api/chat/{id}/archive" + const val DELETE_CHAT_FROM_ARCHIVE = "api/chat/{id}/archive" + const val SEND_MESSAGE = "api/chats/{chatId}/messages" + const val SEND_DOCUMENT = "api/v1/upload-file/{chatId}" + const val DELETE_MESSAGE = "api/chats/{chatId}/messages/{messageId}" + const val MAKE_AS_READ_MESSAGE = "api/chats/{chatId}/messages/{messageId}/read" + + /** Folder **/ + const val FOLDER = "api/folder" + const val FOLDERS = "api/folders" + const val DELETE_FOLDER = "api/folder/{id}" + const val PIN_CHAT_IN_FOLDER = "api/folders/{folderId}/chats/{chatId}/pin" + const val UNPIN_CHAT_IN_FOLDER = "api/folders/{folderId}/chats/{chatId}/pin" + const val GET_MY_PRIVACY = "api/users/me/privacy" + const val CHANGE_BIO_PRIVACY = "api/userPrivacy/bio/{value}" + const val CHANGE_DATE_OF_BIRTH_PRIVACY = "api/userPrivacy/dateOfBirth/{value}" + + /** Channel **/ + const val CREATE_CHANNEL = "api/channels" + const val SAVE_CHANNEL = "api/channels/{id}" + const val DELETE_CHANNEL = "api/channels/{id}" + const val GET_CHANNEL = "api/channels/{id}" + const val JOIN_CHANNEL = "api/channels/{id}/join" + const val LEAVE_CHANNEL = "api/channels/{id}/leave" + const val GET_CHANNEL_SUBSCRIBERS = "api/channels/{id}/subscribers" + const val CHECK_CHANNEL_PUBLIC_LINK = "api/channel/q/{link}" + + /** Group **/ + const val CREATE_GROUP = "api/groups" + const val GET_GROUP = "api/groups/{id}" + const val DELETE_GROUP = "api/groups/{id}" + const val GET_GROUP_MEMBERS = "api/groups/{id}/members" + const val INVITE_USER_TO_GROUP = "api/groups/{groupId}/members/{userId}" + const val REMOVE_USER_FROM_GROUP = "api/groups/{groupId}/members/{userId}" +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Shape.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Shape.kt new file mode 100644 index 0000000..21bd299 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/Shape.kt @@ -0,0 +1,15 @@ +package com.aiwazian.messenger.utils + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.ui.unit.dp + +object Shape { + val DropdownMenu = RoundedCornerShape(10.dp) + val Section = RoundedCornerShape(16.dp) + val Dialog = RoundedCornerShape(24.dp) + val PrimaryTab = RoundedCornerShape( + topStart = 10.dp, + topEnd = 10.dp + ) + val TextField = RoundedCornerShape(10.dp) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ShortcutHelper.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ShortcutHelper.kt new file mode 100644 index 0000000..27be8ae --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/ShortcutHelper.kt @@ -0,0 +1,66 @@ +package com.aiwazian.messenger.utils + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.content.pm.ShortcutInfo +import android.content.pm.ShortcutManager +import android.graphics.drawable.Icon +import com.aiwazian.messenger.MainActivity +import com.aiwazian.messenger.R + +object ShortcutHelper { + + fun createChatShortcut( + context: Context, + chatId: Long, + chatName: String + ) { + val shortcutManager = context.getSystemService(ShortcutManager::class.java) + + if (!shortcutManager.isRequestPinShortcutSupported) { + return + } + + val intent = Intent( + context, + MainActivity::class.java + ).apply { + action = Intent.ACTION_VIEW + putExtra( + "chatId", + chatId.toString() + ) + } + + val shortcut = ShortcutInfo.Builder( + context, + chatId.toString() + ) + .setShortLabel(chatName) + .setLongLabel(chatName) + .setIcon( + Icon.createWithResource( + context, + R.mipmap.new_app_icon + ) + ) + .setIntent(intent) + .build() + + val pinnedShortcutCallbackIntent = + shortcutManager.createShortcutResultIntent(shortcut) + + val successCallback = PendingIntent.getBroadcast( + context, + 0, + pinnedShortcutCallbackIntent, + PendingIntent.FLAG_IMMUTABLE + ) + + shortcutManager.requestPinShortcut( + shortcut, + successCallback.intentSender + ) + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/VibrationPattern.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/VibrationPattern.kt new file mode 100644 index 0000000..a9b678f --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/VibrationPattern.kt @@ -0,0 +1,7 @@ +package com.aiwazian.messenger.utils + +object VibrationPattern { + val Notification = longArrayOf(0, 300, 200, 300) + val Error = longArrayOf(0, 100, 50, 100) + val TactileResponse = longArrayOf(0, 50) +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/WebSocketManager.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/WebSocketManager.kt new file mode 100644 index 0000000..149e8a7 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/utils/WebSocketManager.kt @@ -0,0 +1,165 @@ +package com.aiwazian.messenger.utils + +import android.util.Log +import com.aiwazian.messenger.enums.WebSocketAction +import com.aiwazian.messenger.services.TokenManager +import io.socket.client.IO +import io.socket.client.Socket +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.decodeFromJsonElement +import kotlinx.serialization.json.jsonObject +import org.json.JSONObject +import java.net.URI + +object WebSocketManager { + + private var socket: Socket? = null + + private val _isConnectedState = MutableStateFlow(false) + val isConnectedState = _isConnectedState.asStateFlow() + + val json = Json { + ignoreUnknownKeys = true + prettyPrint = true + } + + var onConnect: (() -> Unit)? = null + var onClose: ((Int) -> Unit)? = null + var onFailure: (() -> Unit)? = null + + private val messageHandlers = mutableMapOf Unit>>() + + private val eventActions = mapOf( + "message:new" to WebSocketAction.NEW_MESSAGE, + "message:delete" to WebSocketAction.DELETE_MESSAGE, + "chat:new" to WebSocketAction.NEW_CHAT, + "chat:history_clear" to WebSocketAction.HISTORY_CLEAR, + "kanban:update" to WebSocketAction.KANBAN_UPDATE + ) + + private fun registerMessageHandler( + action: WebSocketAction, + handler: (JsonObject) -> Unit + ) { + val handlersList = messageHandlers.getOrPut(action) { mutableListOf() } + handlersList.add(handler) + } + + private fun unregisterMessageHandler( + action: WebSocketAction, + handler: (JsonObject) -> Unit + ) { + val handlersList = messageHandlers.getOrPut(action) { mutableListOf() } + handlersList.remove(handler) + } + + internal inline fun registerMessageHandler( + action: WebSocketAction, + crossinline handler: (T) -> Unit + ) { + registerMessageHandler(action) { webSocketData -> + try { + handler(json.decodeFromJsonElement(webSocketData)) + } catch (e: Exception) { + Log.e("WebSocketManager", "Ошибка десериализации для действия $action", e) + } + } + } + + internal inline fun unregisterMessageHandler( + action: WebSocketAction, + crossinline handler: (T) -> Unit + ) { + unregisterMessageHandler(action) { webSocketData -> + try { + handler(json.decodeFromJsonElement(webSocketData)) + } catch (e: Exception) { + Log.e("WebSocketManager", "Ошибка десериализации для действия $action", e) + } + } + } + + fun connect() { + if (TokenManager.getToken().isBlank()) { + _isConnectedState.update { false } + return + } + + if (socket?.connected() == true) { + return + } + + socket?.close() + socket = createSocket().also { it.connect() } + } + + private fun createSocket(): Socket { + val options = IO.Options.builder() + .setAuth(mapOf("token" to TokenManager.getToken())) + .setTransports(arrayOf("websocket")) + .setReconnection(false) + .build() + + val socketUrl = Constants.WEB_SOCKET_URL + .replaceFirst("wss://", "https://") + .replaceFirst("ws://", "http://") + + return IO.socket(URI.create(socketUrl), options).apply { + on(Socket.EVENT_CONNECT) { + _isConnectedState.update { true } + onConnect?.invoke() + } + + on(Socket.EVENT_DISCONNECT) { + _isConnectedState.update { false } + onClose?.invoke(1000) + } + + on(Socket.EVENT_CONNECT_ERROR) { args -> + _isConnectedState.update { false } + Log.e("WebSocketManager", "Ошибка подключения Socket.IO: ${args.firstOrNull()}") + onFailure?.invoke() + } + + on("auth:error") { + _isConnectedState.update { false } + onClose?.invoke(1008) + } + + eventActions.forEach { (event, action) -> + on(event) { args -> + dispatch(action, args.firstOrNull()) + } + } + } + } + + private fun dispatch( + action: WebSocketAction, + payload: Any? + ) { + try { + val jsonObject = when (payload) { + is JSONObject -> json.parseToJsonElement(payload.toString()).jsonObject + is String -> json.parseToJsonElement(payload).jsonObject + else -> return + } + + messageHandlers[action]?.forEach { handler -> + handler(jsonObject) + } + } catch (e: Exception) { + Log.e("WebSocketManager", "Ошибка обработки события $action", e) + } + } + + fun close() { + _isConnectedState.update { false } + socket?.close() + socket = null + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ArchiveViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ArchiveViewModel.kt new file mode 100644 index 0000000..85fbd13 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ArchiveViewModel.kt @@ -0,0 +1,9 @@ +package com.aiwazian.messenger.viewModels + +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.services.DialogController + +class ArchiveViewModel : ViewModel() { + + val archiveInfoBottomDialog = DialogController() +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/AuthViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/AuthViewModel.kt new file mode 100644 index 0000000..969c85d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/AuthViewModel.kt @@ -0,0 +1,166 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.data.AuthRequest +import com.aiwazian.messenger.data.RegisterRequest +import com.aiwazian.messenger.services.AuthService +import com.aiwazian.messenger.services.DeviceHelper +import com.aiwazian.messenger.services.TokenManager +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import javax.inject.Inject + +@HiltViewModel +class AuthViewModel @Inject constructor( + private val authService: AuthService, + private val deviceHelper: DeviceHelper +) : ViewModel() { + + private val _login = MutableStateFlow("") + val login = _login.asStateFlow() + + private val _password = MutableStateFlow("") + val password = _password.asStateFlow() + + private val _firstName = MutableStateFlow("") + val firstName = _firstName.asStateFlow() + + private val _lastName = MutableStateFlow("") + val lastName = _lastName.asStateFlow() + + private val _loginFieldError = MutableStateFlow(null) + val loginFieldError = _loginFieldError.asStateFlow() + + private val _passwordFieldError = MutableStateFlow(null) + val passwordFieldError = _passwordFieldError.asStateFlow() + + private val _isUserFound = MutableStateFlow(false) + val isUserFound = _isUserFound.asStateFlow() + + fun onLoginChanged(newLogin: String) { + _login.update { newLogin.trim() } + clearError() + } + + fun onPasswordChanged(newPassword: String) { + _password.update { newPassword.trim() } + clearError() + } + + fun onFirstNameChanged(value: String) { _firstName.value = value } + fun onLastNameChanged(value: String) { _lastName.value = value } + + suspend fun findUserByLogin(): Boolean? { + try { + val isFind = authService.findUserByLogin(login = _login.value) + + _isUserFound.update { isFind } + + return isFind + } catch (e: Exception) { + Log.e( + "AuthViewModel", + "Ошибка при поиске пользователя с логином ${_login.value}", + e + ) + + return null + } + } + + suspend fun onLoginClicked(): Boolean { + try { + val deviceName = deviceHelper.getDeviceName() + + val requestBody = AuthRequest( + _login.value, + _password.value, + deviceName, + deviceHelper.getOsVersion(), + deviceHelper.getOsName() + ) + + val token = authService.login(requestBody) + + if (token == null) { + return false + } + + TokenManager.saveToken(token) + TokenManager.setAuthorized(true) + + return true + } catch (e: Exception) { + Log.e( + "AuthViewModel", + "Ошибка при авторизации", + e + ) + + return false + } + } + + suspend fun onRegisterClicked(): Boolean { + try { + val requestBody = RegisterRequest( + _login.value, + _password.value, + _firstName.value.trim(), + _lastName.value.trim().ifBlank { null } + ) + + return authService.register(requestBody) + } catch (e: Exception) { + Log.e( + "AuthViewModel", + "Ошибка при регистрации", + e + ) + + return false + } + } + + fun checkValidRegistrationName(): Boolean = _firstName.value.trim().isNotEmpty() + + fun checkValidLogin(): Boolean { + if (_login.value.isBlank()) { + _loginFieldError.update { "Введите логин" } + return false + } + + if (_login.value.trim().length < 5) { + _loginFieldError.update { "Минимум 5 символов" } + return false + } + + _loginFieldError.update { null } + + return true + } + + fun checkValidPassword(): Boolean { + if (_password.value.isBlank()) { + _passwordFieldError.update { "Введите пароль" } + return false + } + + if (_password.value.trim().length < 5) { + _passwordFieldError.update { "Минимум 5 символов" } + return false + } + + _passwordFieldError.update { null } + + return true + } + + private fun clearError() { + _loginFieldError.update { null } + _passwordFieldError.update { null } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ChannelViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ChannelViewModel.kt new file mode 100644 index 0000000..986f78b --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ChannelViewModel.kt @@ -0,0 +1,101 @@ +package com.aiwazian.messenger.viewModels + +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.data.ChannelInfo +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.database.repository.ChannelRepository +import com.aiwazian.messenger.enums.ChannelType +import com.aiwazian.messenger.services.DialogController +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import javax.inject.Inject + +@HiltViewModel +class ChannelViewModel @Inject constructor(private val channelRepository: ChannelRepository) : + ViewModel() { + + private val _channelInfo = MutableStateFlow(ChannelInfo()) + val channelInfo = _channelInfo.asStateFlow() + + val deleteDialog = DialogController() + + fun changeName(newName: String) { + _channelInfo.update { it.copy(name = newName) } + } + + fun changeBio(newBio: String) { + _channelInfo.update { it.copy(bio = newBio) } + } + + fun changeChannelType(channelType: ChannelType): Boolean { + if (channelType == ChannelType.PUBLIC && _channelInfo.value.publicLink?.isBlank() == true) { + return false + } + + _channelInfo.update { it.copy(channelType = channelType.ordinal) } + + return true + } + + fun changePublicLink(link: String?) { + _channelInfo.update { it.copy(publicLink = link?.trim()) } + } + + suspend fun checkIsBusyPublicLink(link: String): Boolean? { + return channelRepository.checkIsBusyPublicLink(link) + } + + fun open(channelInfo: ChannelInfo) { + _channelInfo.update { channelInfo } + } + + suspend fun getSubscribers(id: Long): List { + val subscribers = channelRepository.getSubscribers(id) + return subscribers + } + + suspend fun tryJoin(id: Long): Boolean { + val isJoined = channelRepository.join(id) + return isJoined + } + + suspend fun tryLeave(id: Long): Boolean { + val isLeaved = channelRepository.leave(id) + return isLeaved + } + + suspend fun trySaveOrCreate(): Long? { + if (!checkValid()) { + return null + } + + if (_channelInfo.value.id == 0.toLong()) { + return channelRepository.create(_channelInfo.value) + } + + return channelRepository.save(_channelInfo.value) + } + + suspend fun tryDelete(): Boolean { + return channelRepository.delete(channelInfo.value.id) + } + + fun cleanData() { + _channelInfo.update { ChannelInfo() } + } + + private fun checkValid(): Boolean { + if (_channelInfo.value.name.isBlank()) { + return false + } + + if (_channelInfo.value.channelType == ChannelType.PUBLIC.ordinal && _channelInfo.value.publicLink?.isBlank() == true) { + return false + } + + return true + } + +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ChatViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ChatViewModel.kt new file mode 100644 index 0000000..e717a8d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ChatViewModel.kt @@ -0,0 +1,722 @@ +package com.aiwazian.messenger.viewModels + +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.provider.OpenableColumns +import android.util.Log +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.Attachment +import com.aiwazian.messenger.data.KanbanBoard +import com.aiwazian.messenger.data.KanbanTask +import com.aiwazian.messenger.data.FileUploadConfirmRequest +import com.aiwazian.messenger.data.FileUploadInitRequest +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.DeleteChatPayload +import com.aiwazian.messenger.data.DeleteMessagePayload +import com.aiwazian.messenger.data.DownloadItem +import com.aiwazian.messenger.data.HistoryClearPayload +import com.aiwazian.messenger.data.Message +import com.aiwazian.messenger.data.ReadMessagePayload +import com.aiwazian.messenger.database.repository.ChannelRepository +import com.aiwazian.messenger.database.repository.ChatRepository +import com.aiwazian.messenger.database.repository.GroupRepository +import com.aiwazian.messenger.enums.ChatType +import com.aiwazian.messenger.enums.DownloadStatus +import com.aiwazian.messenger.enums.WebSocketAction +import com.aiwazian.messenger.interfaces.Profile +import com.aiwazian.messenger.services.ChatService +import com.aiwazian.messenger.services.DialogController +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.services.UserService +import com.aiwazian.messenger.utils.ChatState +import com.aiwazian.messenger.utils.Constants +import com.aiwazian.messenger.utils.DownloadManager +import com.aiwazian.messenger.utils.WebSocketManager +import com.aiwazian.messenger.utils.getFileExtension +import com.aiwazian.messenger.utils.saveFileToApplicationFolder +import com.aiwazian.messenger.utils.saveFileToDownloadsFolder +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.ResponseBody +import okio.BufferedSink +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import java.io.File +import javax.inject.Inject +import kotlin.random.Random + +@HiltViewModel +class ChatViewModel @Inject constructor( + private val chatRepository: ChatRepository, + private val channelRepository: ChannelRepository, + private val groupRepository: GroupRepository, + private val chatService: ChatService +) : ViewModel() { + + val myId = UserManager.user.value.id + + private val _profile = MutableStateFlow(null) + val profile = _profile.asStateFlow() + + private val _chatInfo = MutableStateFlow(ChatInfo()) + val chatInfo = _chatInfo.asStateFlow() + + private val _messageText = MutableStateFlow("") + val messageText = _messageText.asStateFlow() + + private val _messages = MutableStateFlow>(emptyList()) + val messages = _messages.asStateFlow() + + private val _selectedMessages = MutableStateFlow>(emptySet()) + val selectedMessages = _selectedMessages.asStateFlow() + + private val _userNamesCache = MutableStateFlow(mapOf()) + val userNamesCache = _userNamesCache.asStateFlow() + + private val _downloads = MutableStateFlow>(emptyList()) + val downloads = _downloads.asStateFlow() + + val deleteChatDialog = DialogController() + + val clearHistoryDialog = DialogController() + + val deleteMessageDialog = DialogController() + + var onChatDeleted: (() -> Unit)? = null + + init { + WebSocketManager.registerMessageHandler(WebSocketAction.NEW_MESSAGE) { message -> + if (_chatInfo.value.id == message.senderId && message.senderId != myId) { + _messages.update { it + message } + } + } + + WebSocketManager.registerMessageHandler(WebSocketAction.DELETE_CHAT) { chat -> + if (chat.chatId == _chatInfo.value.id) { + onChatDeleted?.invoke() + } + } + + WebSocketManager.registerMessageHandler(WebSocketAction.DELETE_MESSAGE) { message -> + if (_chatInfo.value.id == message.chatId) { + deleteMessage(message.messageId) + } + } + + WebSocketManager.registerMessageHandler(WebSocketAction.READ_MESSAGE) { message -> + readMessage(message.messageId) + } + + WebSocketManager.registerMessageHandler(WebSocketAction.HISTORY_CLEAR) { payload -> + val payloadChatId = payload.chatId.toLongOrNull() ?: return@registerMessageHandler + if (_chatInfo.value.id == payloadChatId) { + deleteAllMessages() + } + } + + WebSocketManager.registerMessageHandler(WebSocketAction.KANBAN_UPDATE) { board -> + _messages.update { messages -> + messages.map { message -> + when { + message.kanbanBoardId == board.id -> message.copy(kanbanBoard = board) + message.kanbanTaskId != null && board.columns.any { column -> column.tasks.any { it.id == message.kanbanTaskId } } -> { + val task = board.columns.flatMap { it.tasks }.firstOrNull { it.id == message.kanbanTaskId } + message.copy(kanbanTask = task) + } + else -> message + } + } + } + } + + DownloadManager.onProgressUpdate = { url, progress -> + _downloads.update { downloadItems -> + downloadItems.map { + if (it.url == url) it.copy(progress = progress) + else it + } + } + } + } + + fun changeText(newText: String) { + _messageText.update { newText } + } + + fun selectMessage(message: Message) { + _selectedMessages.update { it + message } + } + + fun unselectMessage(message: Message) { + _selectedMessages.update { it - message } + } + + suspend fun open(chatId: Long) { + ChatState.openChat(chatId) + + _profile.update { null } + + _chatInfo.update { + it.copy(id = chatId) + } + + when (ChatType.fromId(chatId)) { + ChatType.CHANNEL -> { + val channel = channelRepository.get(chatId) + + _profile.update { channel } + } + + ChatType.GROUP -> { + val group = groupRepository.get(chatId) + + _profile.update { group } + } + + else -> {} + } + + val chatInfo = chatRepository.get(chatId) + + if (chatInfo == null) { + _messages.update { emptyList() } + return + } + + _chatInfo.update { chatInfo } + + viewModelScope.launch { + val chatMessages = chatRepository.getMessages(chatId) + + _messages.update { chatMessages } + } + } + + fun close() { + _chatInfo.update { ChatInfo() } + _messages.update { emptyList() } + + ChatState.closeChat() + } + + suspend fun sendMessage(): Message? { + if (_messageText.value.isBlank()) { + return null + } + + val validText = _messageText.value.trim() + + val lastMessageId = _messages.value.let { + if (it.isNotEmpty()) { + it.last().id + 1 + } else { + 1 + } + } + + val messageId = Random.nextInt( + lastMessageId + 1, + Int.MAX_VALUE + ) + + val message = Message( + id = messageId, + senderId = myId, + chatId = _chatInfo.value.id, + text = validText, + isRead = myId == _chatInfo.value.id, + sendTime = System.currentTimeMillis() + ) + + changeText("") + + _messages.update { it + message } + + try { + val sentMessage = chatRepository.sendMessage(message.chatId, message) ?: return null + + _messages.update { currentList -> + currentList.map { message -> + if (message.id == messageId) { + message.copy(id = sentMessage.id) + } else { + message + } + } + } + + return sentMessage + } catch (e: Exception) { + Log.e( + "ChatVM", + "Ошибка отпаравки сррбщения", + e + ) + + return null + } + } + + suspend fun sendKanban(board: KanbanBoard? = null, task: KanbanTask? = null): Message? { + if (board == null && task == null) return null + val message = Message( + senderId = myId, + chatId = _chatInfo.value.id, + text = if (task != null) "Задача: ${task.title}" else "Доска: ${board!!.title}", + sendTime = System.currentTimeMillis(), + kanbanBoardId = board?.id, + kanbanTaskId = task?.id + ) + val sent = chatRepository.sendMessage(message.chatId, message) ?: return null + _messages.update { it + sent } + return sent + } + + fun sendDocument( + context: Context, + fileUris: List + ) { + if (fileUris.isEmpty()) { + return + } + + viewModelScope.launch { + fileUris.forEach { fileUri -> + try { + val contentResolver = context.contentResolver + val fileName = getFileName( + contentResolver, + fileUri + ) ?: "upload_file" + val mimeType = contentResolver.getType(fileUri) ?: "*/*" + + val size = contentResolver.query( + fileUri, + arrayOf(OpenableColumns.SIZE), + null, + null, + null + )?.use { cursor -> + if (cursor.moveToFirst()) cursor.getLong(0) else -1L + } ?: contentResolver.openAssetFileDescriptor(fileUri, "r")?.use { it.length } ?: -1 + if (size < 0) return@forEach + val requestBody = object : RequestBody() { + override fun contentType() = + mimeType.toMediaTypeOrNull() + + override fun writeTo(sink: BufferedSink) { + contentResolver.openInputStream(fileUri)?.use { inputStream -> + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + var bytesRead: Int + while (inputStream.read(buffer).also { bytesRead = it } != -1) { + try { + sink.write( + buffer, + 0, + bytesRead + ) + } catch (e: Exception) { + Log.e( + "ChatViewModel", + "Ошибка записи в поток", + e + ) + throw e + } + } + inputStream.close() + } + } + } + + val init = RetrofitInstance.api.initFileUpload( + _chatInfo.value.id, + FileUploadInitRequest(fileName, size, mimeType) + ).body() ?: return@forEach + val uploadResponse = withContext(Dispatchers.IO) { + OkHttpClient().newCall( + Request.Builder().url(init.signedUrl).put(requestBody).build() + ).execute() + } + if (!uploadResponse.isSuccessful) return@forEach + uploadResponse.close() + val response = RetrofitInstance.api.confirmFileUpload( + _chatInfo.value.id, + FileUploadConfirmRequest(init.fileId) + ).body() + + if (response != null) { + _messages.update { it + response } + } + } catch (e: Exception) { + Log.e( + "ChatViewModel", + "Ошибка при отправке файла $fileUri", + e + ) + return@forEach + } + } + } + } + + fun addDownload( + context: Context, + attachment: Attachment, + chatId: Long + ) { + if (_downloads.value.any { it.fileId == attachment.id }) { + return + } + + viewModelScope.launch { + try { + val urlResponse = RetrofitInstance.api.getFileDownloadUrl( + chatId, + attachment.messageId, + attachment.id + ).body() ?: return@launch + + val downloadUrl = urlResponse.downloadUrl + + val item = DownloadItem( + fileId = attachment.id, + url = downloadUrl, + fileName = attachment.name, + onComplete = { + viewModelScope.launch { + chatRepository.saveAttachment(attachment) + } + } + ) + + _downloads.update { it + item } + + startDownload( + item = item, + onDownload = { body -> + if (body == null) return@startDownload + + val fileName = "${attachment.id}.${getFileExtension(attachment.name)}" + + viewModelScope.launch { + saveFileToApplicationFolder(context, body, fileName) + } + + _downloads.update { list -> + list.map { + if (it.fileId == attachment.id) { + it.copy(status = DownloadStatus.COMPLETED, progress = 100).also { updated -> + updated.onComplete?.invoke() + } + } else it + } + } + }, + onError = { + _downloads.update { list -> + list.map { + if (it.fileId == attachment.id) it.copy(status = DownloadStatus.PENDING) + else it + } + } + } + ) + } catch (e: Exception) { + Log.e("ChatViewModel", "Failed to get download URL for ${attachment.id}", e) + } + } + } + + fun openFile( + context: Context, + filePath: String + ) { + val appDir = context.getExternalFilesDir(null) ?: return + val file = File( + appDir, + filePath + ) + + if (!file.exists()) { + return + } + + val uri = FileProvider.getUriForFile( + context, + "com.aiwazian.messenger.fileprovider", + file + ) + + val mimeType = context.contentResolver.getType(uri) + + val intent = Intent(Intent.ACTION_VIEW).setDataAndType( + uri, + mimeType + ).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + + try { + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + Log.e( + "ChatViewModel", + "Не найдено приложение для открытия файла.", + e + ) + } catch (e: Exception) { + Log.e( + "ChatViewModel", + "Ошибка при открытии файла", + e + ) + } + } + + private fun startDownload( + item: DownloadItem, + onDownload: (ResponseBody?) -> Unit, + onError: () -> Unit + ) { + _downloads.update { list -> + list.map { + if (it.fileId == item.fileId) it.copy(status = DownloadStatus.DOWNLOADING) + else it + } + } + + val call = RetrofitInstance.api.downloadFile(item.url) + item.call = call + + call.enqueue(object : Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if (response.isSuccessful) { + onDownload.invoke(response.body()) + } else { + onError.invoke() + } + } + + override fun onFailure( + call: Call, + t: Throwable + ) { + _downloads.update { list -> + list.map { + if (it.fileId == item.fileId) it.copy(status = DownloadStatus.PENDING) + else it + } + } + } + }) + } + + fun cancelDownload(item: DownloadItem) { + item.call?.cancel() + _downloads.update { list -> + list.map { + if (it.fileId == item.fileId) it.copy(status = DownloadStatus.PENDING) + else it + } + } + } + + private fun getFileName( + contentResolver: android.content.ContentResolver, + uri: Uri + ): String? { + var result: String? = null + if (uri.scheme == "content") { + contentResolver.query( + uri, + null, + null, + null, + null + )?.use { cursor -> + if (cursor.moveToFirst()) { + val columnIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) + if (columnIndex != -1) { + result = cursor.getString(columnIndex) + } + } + } + } + return result ?: uri.pathSegments.lastOrNull() + } + + suspend fun saveFile( + context: Context, + attachment: Attachment + ) { + val fileName = chatRepository.getAttachment(attachment.id).name + + saveFileToDownloadsFolder( + context, + attachment.id.toString() + '.' + getFileExtension(attachment.name), + fileName + ) + } + + suspend fun markAsReadMessage(message: Message) { + if (message.senderId == myId) { + return + } + + val isRead = chatRepository.makeAsRead( + _chatInfo.value.id, + message.id + ) + + if (isRead) { + readMessage(message.id) + } + } + + private val pendingRequests = mutableSetOf() + + fun loadUserName(userId: Long) { + if (_userNamesCache.value.containsKey(userId)) { + return + } + + if (pendingRequests.contains(userId)) { + return + } + + pendingRequests.add(userId) + + viewModelScope.launch { + try { + val user = UserService().getById(userId) + + if (user != null) { + val userName = user.let { "${it.firstName} ${it.lastName}" } + + _userNamesCache.update { it + (userId to userName) } + } + + pendingRequests.remove(userId) + } catch (e: Exception) { + Log.e( + "ChatViewModel", + "Не удалось получить имя отправителя", + e + ) + } + } + } + + suspend fun tryDeleteMessage( + messageId: Int, + deleteForAll: Boolean + ): Boolean { + try { + val isDeleted = chatRepository.deleteMessage( + _chatInfo.value.id, + messageId, + deleteForAll + ) + + if (isDeleted) { + deleteMessage(messageId) + } + + return isDeleted + } catch (e: Exception) { + Log.e( + "ChatVM", + "Ошибка удаления сообщения", + e + ) + + return false + } + } + + suspend fun tryDeleteChat(deleteForReceiver: Boolean): Boolean { + try { + val isDeleted = chatService.deleteChat( + _chatInfo.value.id, + deleteForReceiver + ) + + if (isDeleted) { + deleteAllMessages() + } + + return isDeleted + } catch (e: Exception) { + Log.e( + "DeleteChat", + "Ошибка при удалении чата", + e + ) + + return false + } + } + + suspend fun tryDeleteChatMessages(deleteForReceiver: Boolean): Boolean { + try { + val isDeleted = chatRepository.deleteChatMessages( + _chatInfo.value.id, + deleteForReceiver + ) + + if (isDeleted) { + deleteAllMessages() + } + + return isDeleted + } catch (e: Exception) { + Log.e( + "DeleteChat", + "Ошибка при удалении сообщений в чате", + e + ) + + return false + } + } + + private fun readMessage(messageId: Int) { + _messages.update { currentList -> + currentList.map { message -> + if (message.id == messageId) { + val newMessage = message.copy(isRead = true) + newMessage + } else { + message + } + } + } + } + + private fun deleteMessage(messageId: Int) { + val messages = _messages.value.filter { it.id != messageId } + _messages.update { messages } + } + + private fun deleteAllMessages() { + _messages.update { emptyList() } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/CloudPasswordViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/CloudPasswordViewModel.kt new file mode 100644 index 0000000..46cf0f3 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/CloudPasswordViewModel.kt @@ -0,0 +1,63 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.ChangeCloudPasswordRequest +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update + +class CloudPasswordViewModel : ViewModel() { + + private val _newPassword = MutableStateFlow("") + val newPassword = _newPassword.asStateFlow() + + private val _errorMessage = MutableStateFlow(null) + val errorMessage = _errorMessage.asStateFlow() + + fun onInputNewPassword(newPassword: String) { + _newPassword.update { newPassword } + _errorMessage.update { null } + } + + fun checkValidPassword(): Boolean { + if (_newPassword.value.isBlank()) { + _errorMessage.update { "Введите пароль" } + return false + } + + if (_newPassword.value.length < 5) { + _errorMessage.update { "Минимум 5 символов" } + return false + } + + _errorMessage.update { null } + return true + } + + suspend fun changePassword(): Boolean { + try { + val requestBody = ChangeCloudPasswordRequest(_newPassword.value) + val res = RetrofitInstance.api.changeCloudPassword(requestBody) + + if (!res.isSuccessful) { + return false + } + + return res.code() == 200 + } catch (e: Exception) { + Log.e( + "CloudPasswordViewModel", + e.message.toString() + ) + + return false + } + } + + fun cleanData() { + _newPassword.update { "" } + _errorMessage.update { null } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/DataUsageViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/DataUsageViewModel.kt new file mode 100644 index 0000000..77d3487 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/DataUsageViewModel.kt @@ -0,0 +1,82 @@ +package com.aiwazian.messenger.viewModels + +import android.app.usage.StorageStatsManager +import android.content.Context +import android.os.UserHandle +import android.util.Log +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.services.DialogController +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class DataUsageViewModel : ViewModel() { + + val clearCacheDialog = DialogController() + + var cacheSize by mutableLongStateOf(0) + private set + + var appSize by mutableLongStateOf(0) + private set + + fun reload(context: Context) { + getCacheSize(context) + getAppSize(context) + } + + private fun getCacheSize(context: Context) { + val storageStatsManager = + context.getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager + val appInfo = context.applicationInfo + val user = UserHandle.getUserHandleForUid(appInfo.uid) + + try { + val stats = storageStatsManager.queryStatsForPackage( + appInfo.storageUuid, + context.packageName, + user + ) + cacheSize = stats.cacheBytes + } catch (e: Exception) { + cacheSize = 0 + } + } + + private fun getAppSize(context: Context) { + val storageStatsManager = + context.getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager + val appInfo = context.applicationInfo + val user = UserHandle.getUserHandleForUid(appInfo.uid) + + try { + val stats = storageStatsManager.queryStatsForPackage( + appInfo.storageUuid, + context.packageName, + user + ) + appSize = stats.appBytes + stats.dataBytes + stats.cacheBytes + } catch (e: Exception) { + e.printStackTrace() + } + } + + suspend fun clearAppData(context: Context) { + withContext(Dispatchers.IO) { + context.cacheDir?.deleteRecursively() + + val externalDir = context.getExternalFilesDir(null) + if (externalDir != null && externalDir.exists()) { + externalDir.listFiles()?.forEach { file -> + Log.d( + "CLEANUP", + "Удаляю: ${file.absolutePath}" + ) + file.deleteRecursively() + } + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/DevicesViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/DevicesViewModel.kt new file mode 100644 index 0000000..5cfaa78 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/DevicesViewModel.kt @@ -0,0 +1,116 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.data.SessionInfo +import com.aiwazian.messenger.services.DeviceHelper +import com.aiwazian.messenger.services.DialogController +import com.aiwazian.messenger.services.SessionService +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import javax.inject.Inject + +@HiltViewModel +class DevicesViewModel @Inject constructor( + private val deviceHelper: DeviceHelper, + private val sessionService: SessionService +) : ViewModel() { + + private val _currentSessionInfo = MutableStateFlow(SessionInfo()) + val currentSession = _currentSessionInfo.asStateFlow() + + private val _sessions = MutableStateFlow>(emptySet()) + val sessions = _sessions.asStateFlow() + + val terminateSessionDialog = DialogController() + + val sessionInfoDialog = DialogController() + + private var _confirmDialogAction: (suspend () -> Unit)? = null + + private val _openedSessionInfo = MutableStateFlow(SessionInfo()) + + val openedSession = _openedSessionInfo.asStateFlow() + + init { + val deviceName = deviceHelper.getDeviceName() + + _currentSessionInfo.update { session -> + session.deviceName = deviceName + session + } + } + + suspend fun terminateSession(sessionId: Int) { + try { + val isTerminated = sessionService.terminateSession(sessionId) + + if (isTerminated) { + val sessionList = _sessions.value.filter { it.id == sessionId }.toSet() + + _sessions.update { sessionList } + } + } catch (e: Exception) { + Log.e( + "DeviceSettings", + "Ошибка при отключении сессии", + e + ) + } + } + + suspend fun getSessions() { + try { + val sessions = sessionService.getSessions() + + if (sessions?.isNotEmpty() == true) { + _sessions.update { sessions.toSet() } + } + } catch (e: Exception) { + Log.e( + "DeviceSettings", + "Ошибка при получении сессий", + e + ) + } + } + + suspend fun terminateAllOtherSessions() { + try { + val isTerminated = sessionService.terminateAllSessions() + + if (isTerminated) { + _sessions.update { emptySet() } + } + } catch (e: Exception) { + Log.e( + "DeviceSettings", + "${e.message}" + ) + } + } + + fun openSession(sessionId: Int) { + if (sessionId == 0) { + val deviceName = deviceHelper.getDeviceName() + + _openedSessionInfo.update { + SessionInfo( + 0, + deviceName, + "" + ) + } + } else { + _openedSessionInfo.update { _sessions.value.first { it.id == sessionId } } + } + } + + fun setConfirmDialogAction(action: suspend () -> Unit) { + _confirmDialogAction = action + } + + fun getConfirmDialogAction() = _confirmDialogAction +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/FolderViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/FolderViewModel.kt new file mode 100644 index 0000000..78106cb --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/FolderViewModel.kt @@ -0,0 +1,116 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.FolderInfo +import com.aiwazian.messenger.database.repository.FolderRepository +import com.aiwazian.messenger.services.DialogController +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import javax.inject.Inject + +@HiltViewModel +class FolderViewModel @Inject constructor( + private val folderRepository: FolderRepository +) : ViewModel() { + + val folders = folderRepository.folders + + private val _openFolderInfo = MutableStateFlow(FolderInfo()) + val openFolder = _openFolderInfo.asStateFlow() + + private val _canSave = MutableStateFlow(false) + val canSave = _canSave.asStateFlow() + + val removeFolderDialog = DialogController() + + fun open(folderId: Int) { + _openFolderInfo.update { + _openFolderInfo.value.copy( + id = folderId + ) + } + + if (folderId == 0) { + cleanData() + updateCanSaveState() + return + } + + val folderList = folders.value.toMutableList() + val folder = folderList.find { it.id == folderId } + + if (folder == null) { + return + } + + try { + val folderChats = folderRepository.getFolderChats(folderId) + + _openFolderInfo.update { + _openFolderInfo.value.copy( + name = folder.name, + chats = folderChats + ) + } + } catch (e: Exception) { + Log.e( + "FolderViewModel", + "Error loading folder chats", + e + ) + } + } + + fun changeFolderName(newName: String) { + _openFolderInfo.update { _openFolderInfo.value.copy(name = newName) } + updateCanSaveState() + } + + suspend fun remove(folderId: Int) { + try { + val isDeleted = folderRepository.remove(folderId) + + if (isDeleted) { + cleanData() + updateCanSaveState() + } + } catch (e: Exception) { + Log.e( + "FolderViewModel", + "Error removing folder", + e + ) + } + } + + fun updateFolderChats(newChats: List) { + _openFolderInfo.update { _openFolderInfo.value.copy(chats = newChats) } + updateCanSaveState() + } + + suspend fun save() { + try { + val folder = _openFolderInfo.value + + folderRepository.saveFolder(folder) + } catch (e: Exception) { + Log.e( + "FolderViewModel", + "Error creating folder", + e + ) + } + } + + private fun cleanData() { + _openFolderInfo.update { FolderInfo() } + } + + private fun updateCanSaveState() { + _canSave.update { _openFolderInfo.value.name.isNotBlank() } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/GroupViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/GroupViewModel.kt new file mode 100644 index 0000000..2e3e4ef --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/GroupViewModel.kt @@ -0,0 +1,43 @@ +package com.aiwazian.messenger.viewModels + +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.data.GroupInfo +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.database.repository.GroupRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import javax.inject.Inject + +@HiltViewModel +class GroupViewModel @Inject constructor(private val groupRepository: GroupRepository) : + ViewModel() { + + private val _groupInfo = MutableStateFlow(GroupInfo()) + val groupInfo = _groupInfo.asStateFlow() + + fun changeGroupName(newName: String) { + _groupInfo.update { it.copy(name = newName) } + } + + fun changeMembers(count: Int) { + _groupInfo.update { it.copy(members = count) } + } + + fun open(groupInfo: GroupInfo) { + _groupInfo.update { groupInfo } + } + + fun checkValid(): Boolean { + return _groupInfo.value.name.isNotBlank() + } + + fun cleanData() { + _groupInfo.update { GroupInfo() } + } + + suspend fun createGroup(): Long? { + return groupRepository.create(_groupInfo.value) + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/KanbanViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/KanbanViewModel.kt new file mode 100644 index 0000000..81d6c82 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/KanbanViewModel.kt @@ -0,0 +1,47 @@ +package com.aiwazian.messenger.viewModels + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.KanbanBoard +import com.aiwazian.messenger.data.KanbanMoveTaskRequest +import com.aiwazian.messenger.data.KanbanTaskRequest +import com.aiwazian.messenger.data.KanbanTitleRequest +import com.aiwazian.messenger.enums.WebSocketAction +import com.aiwazian.messenger.utils.WebSocketManager +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +class KanbanViewModel : ViewModel() { + private val _boards = MutableStateFlow>(emptyList()) + val boards = _boards.asStateFlow() + + init { + WebSocketManager.registerMessageHandler(WebSocketAction.KANBAN_UPDATE) { update(it) } + refresh() + } + + fun refresh() = viewModelScope.launch { + RetrofitInstance.api.getKanbanBoards().body()?.let { _boards.value = it } + } + + fun createBoard(title: String) = call { RetrofitInstance.api.createKanbanBoard(KanbanTitleRequest(title)).body() } + fun renameBoard(boardId: Int, title: String) = call { + RetrofitInstance.api.renameKanbanBoard(boardId, KanbanTitleRequest(title)).body() + } + fun deleteBoard(boardId: Int) = viewModelScope.launch { + if (RetrofitInstance.api.deleteKanbanBoard(boardId).isSuccessful) { + _boards.value = _boards.value.filterNot { it.id == boardId } + } + } + fun createColumn(boardId: Int, title: String) = call { RetrofitInstance.api.createKanbanColumn(boardId, KanbanTitleRequest(title)).body() } + fun createTask(columnId: Int, title: String) = call { RetrofitInstance.api.createKanbanTask(columnId, KanbanTaskRequest(title)).body() } + fun moveTask(taskId: Int, columnId: Int) = call { RetrofitInstance.api.moveKanbanTask(taskId, KanbanMoveTaskRequest(columnId)).body() } + fun deleteTask(taskId: Int) = call { RetrofitInstance.api.deleteKanbanTask(taskId).body() } + + private fun call(block: suspend () -> KanbanBoard?) = viewModelScope.launch { block()?.let(::update) } + private fun update(board: KanbanBoard) { + _boards.value = (_boards.value.filterNot { it.id == board.id } + board).sortedByDescending { it.updatedAt } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/LockScreenViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/LockScreenViewModel.kt new file mode 100644 index 0000000..4b948ce --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/LockScreenViewModel.kt @@ -0,0 +1,49 @@ +package com.aiwazian.messenger.viewModels + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.services.AppLockService +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class LockScreenViewModel @Inject constructor(private val appLockService: AppLockService) : + ViewModel() { + + var onWrongPasscode: () -> Unit = { } + + var passcode by mutableStateOf("") + private set + + fun onPasscodeChanged(newPasscode: String) { + if (newPasscode.length <= PasscodeLockViewModel.MAX_LENGTH_PASSCODE) { + passcode = newPasscode + } + + if (passcode.length == PasscodeLockViewModel.MAX_LENGTH_PASSCODE) { + checkPasscode() + } + } + + private fun clearPasscode() { + passcode = "" + } + + private fun checkPasscode() { + val isCorrect = appLockService.checkPasscode(passcode) + + if (isCorrect) { + clearPasscode() + viewModelScope.launch { + appLockService.unlock() + } + } else { + onWrongPasscode() + clearPasscode() + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/LogoutViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/LogoutViewModel.kt new file mode 100644 index 0000000..d4881c5 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/LogoutViewModel.kt @@ -0,0 +1,38 @@ +package com.aiwazian.messenger.viewModels + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.util.Log +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.LoginActivity +import com.aiwazian.messenger.services.AuthService +import com.aiwazian.messenger.services.DialogController +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class LogoutViewModel @Inject constructor(private val authService: AuthService) : ViewModel() { + + val logoutDialog = DialogController() + + suspend fun logout(context: Context) { + try { + authService.logout() + } catch (e: Exception) { + Log.e( + "AuthManager", + "Ошибка при выходе: ${e.message}" + ) + } + + val intent = Intent( + context, + LoginActivity::class.java + ).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + context.startActivity(intent) + (context as Activity).finish() + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/MainViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/MainViewModel.kt new file mode 100644 index 0000000..efe556d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/MainViewModel.kt @@ -0,0 +1,531 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.data.ChatInfo +import com.aiwazian.messenger.data.DeleteChatPayload +import com.aiwazian.messenger.data.DeleteMessagePayload +import com.aiwazian.messenger.data.FolderInfo +import com.aiwazian.messenger.data.HistoryClearPayload +import com.aiwazian.messenger.data.Message +import com.aiwazian.messenger.data.ReadMessagePayload +import com.aiwazian.messenger.database.repository.ChatRepository +import com.aiwazian.messenger.database.repository.FolderRepository +import com.aiwazian.messenger.enums.WebSocketAction +import com.aiwazian.messenger.services.AppLockService +import com.aiwazian.messenger.utils.WebSocketManager +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class MainViewModel @Inject constructor( + private val chatRepository: ChatRepository, + private val folderRepository: FolderRepository, + private val appLockService: AppLockService +) : ViewModel() { + + val hasPasscode = appLockService.hasPasscode + + suspend fun lockApp() { + appLockService.lock() + } + + private val _archivedChats = MutableStateFlow>(emptyList()) + val archivedChats = _archivedChats.asStateFlow() + + /** Folder id - Chat id **/ + private val _selectedChats = MutableStateFlow>>(emptyMap()) + val selectedChats = _selectedChats.asStateFlow() + + private val _chatFolders = MutableStateFlow>(emptySet()) + val chatFolders = _chatFolders.asStateFlow() + + private val _allSelectedArePinned = MutableStateFlow(false) + val allSelectedArePinned = _allSelectedArePinned.asStateFlow() + + init { + WebSocketManager.registerMessageHandler(WebSocketAction.NEW_MESSAGE) { message -> + onReceivingMessage(message) + } + + WebSocketManager.registerMessageHandler(WebSocketAction.DELETE_MESSAGE) { message -> + onMessageDeleted( + message.messageId, + message.chatId + ) + } + + WebSocketManager.registerMessageHandler(WebSocketAction.READ_MESSAGE) { message -> + onReadMessage( + message.chatId, + message.messageId + ) + } + + WebSocketManager.registerMessageHandler(WebSocketAction.NEW_CHAT) { chatInfo -> + showNewChat(chatInfo) + } + + WebSocketManager.registerMessageHandler(WebSocketAction.DELETE_CHAT) { payload -> + deleteChat(payload.chatId) + } + + WebSocketManager.registerMessageHandler(WebSocketAction.HISTORY_CLEAR) { payload -> + val chatId = payload.chatId.toLongOrNull() ?: return@registerMessageHandler + clearChatLastMessage(chatId) + } + + viewModelScope.launch { + tryLoadArchiveChats() + } + + viewModelScope.launch { + folderRepository.loadFolders() + } + + viewModelScope.launch { + folderRepository.folders.collectLatest { folders -> + _chatFolders.update { folders.toSet() } + } + } + } + + fun onSendMessage(message: Message) { + processMessage( + message.chatId, + message + ) + } + + fun onReceivingMessage(message: Message) { + processMessage( + message.senderId, + message + ) + } + + fun selectChat( + chatId: Long, + folderId: Int + ) { + _selectedChats.update { currentMap -> + val existingFolders = currentMap[folderId] ?: emptyList() + + if (chatId !in existingFolders) { + val updatedFolders = existingFolders + chatId + currentMap + (folderId to updatedFolders) + } else { + val updatedFolders = existingFolders - chatId + + if (updatedFolders.isEmpty()) { + currentMap - folderId + } else { + currentMap + (folderId to updatedFolders) + } + } + } + + _allSelectedArePinned.update { true } + + _selectedChats.value.forEach { folder -> + val selectedChatFolder = _chatFolders.value.find { it.id == folder.key } + + if (selectedChatFolder == null) { + return@forEach + } + + folder.value.forEach { selectedChatId -> + val selectedChat = selectedChatFolder.chats.find { it.id == selectedChatId } + + if (selectedChat == null) { + return@forEach + } + + if (!selectedChat.isPinned) { + _allSelectedArePinned.update { false } + return + } + } + } + } + + fun unselectAllChats() { + _selectedChats.update { emptyMap() } + } + + suspend fun pinChat( + chatId: Long, + folderId: Int + ) { + val folder = _chatFolders.value.find { it.id == folderId } + val chatToPin = folder?.chats?.find { it.id == chatId } + + if (chatToPin == null || chatToPin.isPinned) { + return + } + + _chatFolders.update { currentFolderList -> + currentFolderList.map { currentFolder -> + if (currentFolder.id == folderId) { + val pinnedChat = chatToPin.copy(isPinned = true) + + val newChatList = currentFolder.chats.filter { it.id != chatId } + .toMutableList() + + newChatList.add(pinnedChat) + + val pinnedChats = newChatList.filter { it.isPinned } + .toMutableList() + val unpinnedChats = newChatList.filter { !it.isPinned } + + pinnedChats.sortByDescending { it.lastMessage?.sendTime } + + val finalChats = pinnedChats + unpinnedChats + + currentFolder.copy(chats = finalChats) + } else { + currentFolder + } + } + .toSet() + } + + try { + chatRepository.pin( + chatId, + folderId + ) + } catch (e: Exception) { + Log.e( + "MainViewModel", + "Ошибка при закреплении чата", + e + ) + } + } + + suspend fun unpinChat( + chatId: Long, + folderId: Int + ) { + val folder = _chatFolders.value.find { it.id == folderId } + val chatToUnpin = folder?.chats?.find { it.id == chatId } + + if (chatToUnpin == null || !chatToUnpin.isPinned) { + return + } + + _chatFolders.update { currentFolderList -> + currentFolderList.map { currentFolder -> + if (currentFolder.id == folderId) { + val updatedChats = currentFolder.chats.toMutableList() + + updatedChats.remove(chatToUnpin) + + val unpinnedChat = chatToUnpin.copy(isPinned = false) + + updatedChats.add(unpinnedChat) + + val pinnedChats = updatedChats.filter { it.isPinned } + val unpinnedChats = updatedChats.filter { !it.isPinned } + + val sortedUnpinnedChats = + unpinnedChats.sortedByDescending { it.lastMessage?.sendTime } + + val finalChats = pinnedChats + sortedUnpinnedChats + + currentFolder.copy(chats = finalChats) + } else { + currentFolder + } + } + .toSet() + } + + try { + chatRepository.unpin( + chatId, + folderId + ) + } catch (e: Exception) { + Log.e( + "MainViewModel", + "Ошибка при откреплении чата" + e.message + ) + } + } + + fun archiveChat(chatId: Long) { + _chatFolders.update { currentFolders -> + currentFolders.map { folder -> + if (folder.id == 0) { + val chat = folder.chats.find { it.id == chatId } + + if (chat != null) { + _archivedChats.update { currentArchived -> + (currentArchived + chat).distinctBy { it.id } + } + } + + val chats = folder.chats.filter { it.id != chatId } + folder.copy(chats = chats) + } else { + folder + } + } + .toSet() + } + + viewModelScope.launch { + try { + chatRepository.archive(chatId) + } catch (e: Exception) { + Log.e( + "MainViewModel", + "Ошибка при архивировании чата", + e + ) + } + } + } + + fun unarchiveChat(chatId: Long) { + var chatToUnarchive: ChatInfo? = null + + _archivedChats.update { currentArchived -> + val mutableList = currentArchived.toMutableList() + val index = mutableList.indexOfFirst { it.id == chatId } + + if (index == -1) { + currentArchived + } else { + chatToUnarchive = mutableList.removeAt(index) + mutableList + } + } + + if (chatToUnarchive == null) { + return + } + + showNewChat( + chatToUnarchive, + chatToUnarchive.lastMessage + ) + + viewModelScope.launch { + try { + chatRepository.unarchive(chatId) + } catch (e: Exception) { + Log.e( + "MainViewModel", + "Ошибка при разархивировании чата", + e + ) + } + } + } + + fun showNewChat( + chatInfo: ChatInfo, + lastMessage: Message? = null + ) { + val newChatInfo = chatInfo.copy(lastMessage = lastMessage) + + _chatFolders.update { currentFolders -> + currentFolders.map { folder -> + if (folder.id == 0) { + val pinnedChats = folder.chats.filter { it.isPinned } + val unpinnedChats = folder.chats.filter { !it.isPinned } + + val updatedUnpinnedChats = unpinnedChats.toMutableList() + updatedUnpinnedChats.add(newChatInfo) + + updatedUnpinnedChats.sortByDescending { it.lastMessage?.sendTime } + + val updatedChats = pinnedChats + updatedUnpinnedChats + folder.copy(chats = updatedChats) + } else { + folder + } + } + .toSet() + } + } + + fun deleteChat(chatId: Long) { + _chatFolders.update { currentFolders -> + currentFolders.map { folder -> + folder.copy(chats = folder.chats.filter { it.id != chatId }) + } + .toSet() + } + + viewModelScope.launch { + chatRepository.deleteChat(chatId) + } + } + + fun clearChatLastMessage(chatId: Long) { + _chatFolders.update { currentFolders -> + currentFolders.map { folder -> + val chatToUpdate = folder.chats.find { it.id == chatId } + if (chatToUpdate == null) return@map folder + val updatedChats = folder.chats.map { + if (it.id == chatId) it.copy(lastMessage = null) else it + } + folder.copy(chats = updatedChats) + }.toSet() + } + } + + private fun onReadMessage( + chatId: Long, + messageId: Int + ) { + _chatFolders.update { currentFolders -> + currentFolders.map { folder -> + val chatToUpdate = folder.chats.find { it.id == chatId } + + if (chatToUpdate == null || chatToUpdate.lastMessage?.id != messageId) { + return@map folder + } + + try { + if (chatToUpdate.lastMessage == null) { + return + } + + val lastMessage = chatToUpdate.lastMessage!!.copy(isRead = true) + + val updatedChat = chatToUpdate.copy(lastMessage = lastMessage) + + val updatedChats = folder.chats.map { + if (it.id == chatId) updatedChat else it + } + + folder.copy(chats = updatedChats) + } catch (e: Exception) { + Log.e( + "MainScreenViewModel", + "Error updating last message after deletion", + e + ) + folder + } + } + .toSet() + } + } + + private fun onMessageDeleted( + messageId: Int, + chatId: Long + ) { + viewModelScope.launch { + _chatFolders.update { currentFolders -> + currentFolders.map { folder -> + val chatToUpdate = folder.chats.find { it.id == chatId } + + if (chatToUpdate == null || chatToUpdate.lastMessage?.id != messageId) { + return@map folder + } + + try { + val lastMessage = chatRepository.getLastMessage(chatId) + + val updatedChat = chatToUpdate.copy(lastMessage = lastMessage) + + val updatedChats = folder.chats.map { + if (it.id == chatId) updatedChat else it + } + + folder.copy(chats = updatedChats) + } catch (e: Exception) { + Log.e( + "MainScreenViewModel", + "Error updating last message after deletion", + e + ) + folder + } + } + .toSet() + } + } + } + + private fun processMessage( + chatId: Long, + message: Message + ) { + var chatFound = false + + _chatFolders.value.forEach { folder -> + if (folder.chats.any { it.id == chatId }) { + updateLastMessage( + chatId, + message + ) + chatFound = true + return@forEach + } + } + + if (!chatFound) { + viewModelScope.launch { + val chatInfo = chatRepository.get(chatId) + + if (chatInfo != null) { + showNewChat( + chatInfo, + message + ) + } + } + } + } + + private fun updateLastMessage( + chatId: Long, + lastMessage: Message + ) { + _chatFolders.update { currentFolders -> + currentFolders.map { folder -> + val chatToUpdate = folder.chats.find { it.id == chatId } + + if (chatToUpdate == null) { + return@map folder + } + + val updatedChat = chatToUpdate.copy(lastMessage = lastMessage) + + val otherChats = folder.chats.filter { it.id != chatId } + + val pinnedChats = + (otherChats.filter { it.isPinned } + (if (updatedChat.isPinned) updatedChat else null)).filterNotNull() + .sortedByDescending { it.lastMessage?.sendTime } + + val unpinnedChats = + (otherChats.filter { !it.isPinned } + (if (!updatedChat.isPinned) updatedChat else null)).filterNotNull() + .sortedByDescending { it.lastMessage?.sendTime } + + val finalChats = pinnedChats + unpinnedChats + + folder.copy(chats = finalChats) + } + .toSet() + } + } + + private suspend fun tryLoadArchiveChats() { + _archivedChats.value = emptyList() + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/NavigationViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/NavigationViewModel.kt new file mode 100644 index 0000000..419db6a --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/NavigationViewModel.kt @@ -0,0 +1,80 @@ +package com.aiwazian.messenger.viewModels + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.AnimationVector1D +import androidx.compose.animation.core.tween +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.AndroidUiDispatcher +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.data.ScreenEntry +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +class NavigationViewModel() : ViewModel() { + + private val _screenStack = MutableStateFlow>(emptyList()) + val screenStack = _screenStack.asStateFlow() + + private val _offsetStack = + MutableStateFlow>>(emptyList()) + + val offsetStack = _offsetStack.asStateFlow() + + val tweenDurationMillis = 200 + + var screenWidth = 0f + + lateinit var scope: CoroutineScope + + fun addScreenInStack( + canGoBackBySwipe: Boolean = true, + screen: @Composable () -> Unit + ) { + _screenStack.update { + it + ScreenEntry( + screen, + canGoBackBySwipe + ) + } + _offsetStack.update { it + Animatable(screenWidth) } + } + + fun removeLastScreenInStack() { + if (_screenStack.value.isEmpty() && _offsetStack.value.isEmpty()) { + return + } + + val screenStack = _screenStack.value.toMutableList() + val offsetStack = _offsetStack.value.toMutableList() + + val lastIndex = screenStack.lastIndex + + if (lastIndex >= offsetStack.size) { + return + } + + if (lastIndex < screenStack.size) { + viewModelScope.launch { + withContext(AndroidUiDispatcher.Main) { + offsetStack.last().animateTo( + screenWidth, + tween(tweenDurationMillis) + ) + + _screenStack.update { it.dropLast(1) } + _offsetStack.update { it.dropLast(1) } + } + } + } + } + + fun goToMain() { + _screenStack.update { emptyList() } + _offsetStack.update { emptyList() } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/PasscodeLockViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/PasscodeLockViewModel.kt new file mode 100644 index 0000000..0fd5535 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/PasscodeLockViewModel.kt @@ -0,0 +1,49 @@ +package com.aiwazian.messenger.viewModels + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.services.AppLockService +import com.aiwazian.messenger.services.DialogController +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class PasscodeLockViewModel @Inject constructor(private val appLockService: AppLockService) : + ViewModel() { + + companion object { + const val MAX_LENGTH_PASSCODE = 4 + } + + private val _passcode = MutableStateFlow("") + val passcode = _passcode.asStateFlow() + + val disablePasscodeDialog = DialogController() + + var onSaveNewPasscode: () -> Unit = { } + + fun onPasscodeChanged(newPasscode: String) { + if (newPasscode.length <= MAX_LENGTH_PASSCODE) { + _passcode.update { newPasscode } + } + + if (_passcode.value.length == MAX_LENGTH_PASSCODE) { + setPasscode() + } + } + + suspend fun disablePasscode() { + appLockService.disablePasscode() + } + + private fun setPasscode() { + viewModelScope.launch { + appLockService.changePasscode(_passcode.value) + onSaveNewPasscode() + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ProfileViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ProfileViewModel.kt new file mode 100644 index 0000000..e3ef773 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/ProfileViewModel.kt @@ -0,0 +1,72 @@ +package com.aiwazian.messenger.viewModels + +import android.content.Context +import android.content.Intent +import android.content.pm.ShortcutInfo +import android.content.pm.ShortcutManager +import android.graphics.drawable.Icon +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.MainActivity +import com.aiwazian.messenger.R +import com.aiwazian.messenger.database.repository.ChannelRepository +import com.aiwazian.messenger.database.repository.GroupRepository +import com.aiwazian.messenger.database.repository.UserRepository +import com.aiwazian.messenger.enums.ChatType +import com.aiwazian.messenger.interfaces.Profile +import com.aiwazian.messenger.services.DialogController +import com.aiwazian.messenger.services.UserManager +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class ProfileViewModel @Inject constructor( + private val userRepository: UserRepository, + private val channelRepository: ChannelRepository, + private val groupRepository: GroupRepository +) : ViewModel() { + + private val _profile = MutableStateFlow(null) + val profile = _profile.asStateFlow() + + val blockUserDialog = DialogController() + + val startSecretChatDialog = DialogController() + + suspend fun open(profileId: Long) { + when (ChatType.fromId(profileId)) { + ChatType.PRIVATE -> { + if (profileId == UserManager.user.value.id) { + viewModelScope.launch { + UserManager.user.collectLatest { collect -> + _profile.update { collect } + } + } + } else { + val user = userRepository.getById(profileId) + + if (user != null) { + _profile.update { user } + } + } + } + + ChatType.CHANNEL -> { + val channel = channelRepository.get(profileId) + _profile.update { channel } + } + + ChatType.GROUP -> { + val group = groupRepository.get(profileId) + _profile.update { group } + } + + else -> {} + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SearchViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SearchViewModel.kt new file mode 100644 index 0000000..a6beba0 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SearchViewModel.kt @@ -0,0 +1,66 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.data.SearchInfo +import com.aiwazian.messenger.services.SearchService +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.Job +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SearchViewModel @Inject constructor(private val searchService: SearchService) : ViewModel() { + + private val _searchResults = MutableStateFlow>(emptyList()) + val searchResults = _searchResults.asStateFlow() + + private val _query = MutableStateFlow("") + val query = _query.asStateFlow() + + private val _isSearching = MutableStateFlow(false) + val isSearching = _isSearching.asStateFlow() + + private var searchJob: Job? = null + + fun onQueryChange(newQuery: String) { + _query.value = newQuery + searchJob?.cancel() + + val normalizedQuery = newQuery.trim().trimStart('@') + if (normalizedQuery.isBlank()) { + _searchResults.value = emptyList() + _isSearching.value = false + return + } + + searchJob = viewModelScope.launch { + _isSearching.value = true + delay(350) + search(normalizedQuery) + } + } + + private suspend fun search(query: String) { + try { + val searchResult = searchService.searchUserByUsername(query) + if (this.query.value.trim().trimStart('@') == query) { + _searchResults.value = searchResult ?: emptyList() + } + } catch (e: Exception) { + Log.e( + "SearchViewModel", + "${e.message}" + ) + } finally { + if (this.query.value.trim().trimStart('@') == query) { + _isSearching.value = false + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsBioViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsBioViewModel.kt new file mode 100644 index 0000000..0270011 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsBioViewModel.kt @@ -0,0 +1,63 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.enums.PrivacyLevel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update + +class SettingsBioViewModel : ViewModel() { + + private val _initialLevel = MutableStateFlow(PrivacyLevel.Everybody) + + private val _currentLevel = MutableStateFlow(PrivacyLevel.Everybody) + val currentLevel = _currentLevel.asStateFlow() + + private val _showSaveButton = MutableStateFlow(false) + val showSaveButton = _showSaveButton.asStateFlow() + + fun init(initialValue: PrivacyLevel) { + _initialLevel.update { initialValue } + _currentLevel.update { initialValue } + hideSaveButton() + } + + fun selectValue(value: PrivacyLevel) { + _currentLevel.update { value } + + if (_currentLevel.value == _initialLevel.value) { + hideSaveButton() + } else { + showSaveButton() + } + } + + suspend fun trySave(): Boolean { + try { + val current = RetrofitInstance.api.getMyPrivacy().body() ?: return false + val response = RetrofitInstance.api.updatePrivacy( + current.copy(bio = _currentLevel.value.ordinal) + ) + + return response.isSuccessful + } catch (e: Exception) { + Log.e( + "SettingsBioViewModel", + "Ошибка при отправке настроек конфиденциальности для раздела о себе", + e + ) + + return false + } + } + + private fun showSaveButton() { + _showSaveButton.update { true } + } + + private fun hideSaveButton() { + _showSaveButton.update { false } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsDateOfBirthViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsDateOfBirthViewModel.kt new file mode 100644 index 0000000..70152a8 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsDateOfBirthViewModel.kt @@ -0,0 +1,63 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.enums.PrivacyLevel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update + +class SettingsDateOfBirthViewModel : ViewModel() { + + private val _initialLevel = MutableStateFlow(PrivacyLevel.Everybody) + + private val _currentLevel = MutableStateFlow(PrivacyLevel.Everybody) + val currentLevel = _currentLevel.asStateFlow() + + private val _showSaveButton = MutableStateFlow(false) + val showSaveButton = _showSaveButton.asStateFlow() + + fun init(initialValue: PrivacyLevel) { + _initialLevel.update { initialValue } + _currentLevel.update { initialValue } + hideSaveButton() + } + + fun selectValue(value: PrivacyLevel) { + _currentLevel.update { value } + + if (_currentLevel.value == _initialLevel.value) { + hideSaveButton() + } else { + showSaveButton() + } + } + + suspend fun trySave(): Boolean { + try { + val current = RetrofitInstance.api.getMyPrivacy().body() ?: return false + val response = RetrofitInstance.api.updatePrivacy( + current.copy(dateOfBirth = _currentLevel.value.ordinal) + ) + + return response.isSuccessful + } catch (e: Exception) { + Log.e( + "SettingsBioViewModel", + "Ошибка при отправке настроек конфиденциальности для раздела даты рождения", + e + ) + + return false + } + } + + private fun showSaveButton() { + _showSaveButton.update { true } + } + + private fun hideSaveButton() { + _showSaveButton.update { false } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsDesignViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsDesignViewModel.kt new file mode 100644 index 0000000..03b2220 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsDesignViewModel.kt @@ -0,0 +1,31 @@ +package com.aiwazian.messenger.viewModels + +import androidx.lifecycle.ViewModel +import com.aiwazian.messenger.enums.PrimaryColorOption +import com.aiwazian.messenger.enums.ThemeOption +import com.aiwazian.messenger.services.ThemeService +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class SettingsDesignViewModel @Inject constructor(private val themeService: ThemeService) : + ViewModel() { + + val dynamicColor = themeService.dynamicColor + + val primaryColor = themeService.primaryColor + + val currentTheme = themeService.currentTheme + + suspend fun setDynamicColor(isEnable: Boolean) { + themeService.setDynamicColor(isEnable) + } + + suspend fun setPrimaryColor(color: PrimaryColorOption) { + themeService.setPrimaryColor(color) + } + + suspend fun setTheme(theme: ThemeOption) { + themeService.setTheme(theme) + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsPrivacyViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsPrivacyViewModel.kt new file mode 100644 index 0000000..706527d --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsPrivacyViewModel.kt @@ -0,0 +1,57 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.enums.PrivacyLevel +import com.aiwazian.messenger.data.PrivacySettings +import com.aiwazian.messenger.services.DialogController +import com.aiwazian.messenger.services.PrivacyService +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SettingsPrivacyViewModel @Inject constructor(private val privacyService: PrivacyService) : + ViewModel() { + + private val _privacySettings = MutableStateFlow(PrivacySettings()) + val privacySettings = _privacySettings.asStateFlow() + + val deleteAccountDialog = DialogController() + + init { + tryLoadValues() + } + + fun updateBioValue(privacyLevel: PrivacyLevel) { + val newValue = _privacySettings.value.copy(bio = privacyLevel.ordinal) + _privacySettings.update { newValue } + } + + fun updateDateOfBirthValue(privacyLevel: PrivacyLevel) { + val newValue = _privacySettings.value.copy(dateOfBirth = privacyLevel.ordinal) + _privacySettings.update { newValue } + } + + fun tryLoadValues() { + viewModelScope.launch { + try { + val myPrivacy = privacyService.getMyPrivacy() + + if (myPrivacy != null) { + _privacySettings.update { myPrivacy } + } + } catch (e: Exception) { + Log.e( + "SettingPrivacyViewModel", + "Ошибка при получении настроек конфиденциальности", + e + ) + } + } + } +} diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsProfileViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsProfileViewModel.kt new file mode 100644 index 0000000..7730d39 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsProfileViewModel.kt @@ -0,0 +1,54 @@ +package com.aiwazian.messenger.viewModels + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.data.UserInfo +import com.aiwazian.messenger.database.repository.UserRepository +import com.aiwazian.messenger.services.DialogController +import com.aiwazian.messenger.services.UserManager +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SettingsProfileViewModel @Inject constructor(private val userRepository: UserRepository) : + ViewModel() { + + private val _userInfo = MutableStateFlow(UserInfo()) + val user = _userInfo.asStateFlow() + + val dataOfBirthDialog = DialogController() + + init { + viewModelScope.launch { + UserManager.user.collectLatest { collect -> + _userInfo.update { collect } + } + } + } + + fun onChangeFirstName(newName: String) { + _userInfo.update { it.copy(firstName = newName) } + } + + fun onChangeLastName(newName: String) { + _userInfo.update { it.copy(lastName = newName) } + } + + fun onChangeBio(newBio: String) { + _userInfo.update { it.copy(bio = newBio) } + } + + fun onChangeDateOfBirth(newDate: Long?) { + _userInfo.update { it.copy(dateOfBirth = newDate) } + } + + suspend fun save() { + UserManager.updateUserInfo(_userInfo.value) + userRepository.updateProfile(_userInfo.value) + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsSecurityViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsSecurityViewModel.kt new file mode 100644 index 0000000..d607977 --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsSecurityViewModel.kt @@ -0,0 +1,41 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.api.RetrofitInstance +import com.aiwazian.messenger.services.AppLockService +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SettingsSecurityViewModel @Inject constructor(appLockService: AppLockService) : + ViewModel() { + + private val _deviceCount = MutableStateFlow(1) + val deviceCount = _deviceCount.asStateFlow() + + val isEnablePasscode = appLockService.hasPasscode + + fun init() { + viewModelScope.launch { + try { + val response = RetrofitInstance.api.getDeviceCount() + + if (response.isSuccessful) { + _deviceCount.update { response.body() ?: 1 } + } + } catch (e: Exception) { + Log.e( + "SettingsSecurityViewModel", + "Error init", + e + ) + } + } + } +} \ No newline at end of file diff --git a/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsUsernameViewModel.kt b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsUsernameViewModel.kt new file mode 100644 index 0000000..f4234ab --- /dev/null +++ b/messenger-client/app/src/main/java/com/aiwazian/messenger/viewModels/SettingsUsernameViewModel.kt @@ -0,0 +1,115 @@ +package com.aiwazian.messenger.viewModels + +import android.util.Log +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aiwazian.messenger.services.UserManager +import com.aiwazian.messenger.services.UserService +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SettingsUsernameViewModel @Inject constructor(private val userService: UserService) : + ViewModel() { + + private val _username = MutableStateFlow("") + val username = _username.asStateFlow() + + private val _canSave = MutableStateFlow(false) + val canSave = _canSave.asStateFlow() + + var errorText by mutableStateOf(null) + private set + + fun init() { + viewModelScope.launch { + UserManager.user.collectLatest { collect -> + _username.update { collect.username.orEmpty() } + } + } + + updateErrorMessage(null) + } + + fun onChangeUsername(newUsername: String) { + val validUsername = newUsername.trim() + + _username.update { validUsername } + + if (validUsername.isEmpty()) { + updateErrorMessage(null) + _canSave.update { true } + return + } + + if (validUsername.isNotEmpty() && validUsername.length < 5) { + updateErrorMessage("Минимальная длина 5 символов") + _canSave.update { false } + return + } + + if (validUsername.length > 20) { + updateErrorMessage("Максимальная длина 20 символов") + _canSave.update { false } + return + } + + if (validUsername == UserManager.user.value.username) { + updateErrorMessage(null) + _canSave.update { true } + return + } + + updateErrorMessage("Проверка имени") + + viewModelScope.launch { + try { + val isAvailable = userService.checkUsername(_username.value) + + updateErrorMessage( + if (isAvailable) { + "Имя пользователя свободно" + } else { + "Имя пользователя занято" + } + ) + + _canSave.update { isAvailable } + } catch (e: Exception) { + _canSave.update { false } + updateErrorMessage("Не удалось проверить имя") + Log.e("SettingsUsernameVM", e.toString()) + } + } + } + + suspend fun trySave(): Boolean { + val username = _username.value.ifEmpty { null } + + if (username == UserManager.user.value.username) { + return true + } + + val isSaved = userService.saveUsername(username ?: "") + + if (isSaved) { + val updatedUser = UserManager.user.value.copy(username = username) + + UserManager.updateUserInfo(updatedUser) + } + + return isSaved + } + + private fun updateErrorMessage(newMessage: String?) { + errorText = newMessage + } +} diff --git a/messenger-client/app/src/main/new_app_icon-playstore.png b/messenger-client/app/src/main/new_app_icon-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..73c0cf0453a750c8f5b8b5c4c9b83f19dca66ebf GIT binary patch literal 17828 zcmeIa`9GA=`v-gvLXoACvPVjU2xZ?%LiUg)+1JWWmXgRa3fcGF*q1@}iY!@UEF(+y zWrl>YjG1|k&*$^Jo*$ln;rl~VoH_S>-PgI!b-mB~df$C`tgU|j9LqTfg3fC^P|<@R zGVo6_h?)}owdXr_3_+^S8Y+qgz82Wl@HAe-FKq<8v7F+!kBrx^GEiJnQ56XxP9%D8M~7f)@Cix2JN^8q{C_|EpAY^Q2Uqhim_?F!_|wkt-mP?4 zQDYK#$FvzC%VdCgXIY(R(FJd0l3p^vSYh5Mb>X_VHt*LSuj&Qks>}#Jv3{t^g36N0 z@^d&(JjGMueT$jJb z3H~;#Ns*3}__N=m<`V5PkM8j=i^jNXD&w<^$??kqZwQ_iRyuN?>=0WMs5R^()EL$o(-?pAXPB z#_Tu7Th_E+^4U_|{32R6cbgUya5oVD@A?qOmBp!U^+s>};|Vv8waI+~TXSy1^Q1k# z$$%zi3<>WO*vdytO~QF%5OVOD;koK*N=fh4I}=;1%V_&tmbA7MN z25J88t&EIg#6N#&??3V4-nt8FXWaXT$xiFbD}I)2m*qszNcVxi*n_BVHt(&`^|^x5 zPig|$ZKc_b;&^EVZ}QQKm_fsAAPJmT%9td@Y%LCI<;{_Y)s)NYv5$~&sNpsVR0CeE z3HRnJ+??G9$9%Ac{!pKmnltRu6&~J*TNlX;#PiM(kur5j-j`fAKh&^$_Vosl2ijqT zAqO@JC`9VtxVEJ;E)D+K<==P@vHJF-@o{nUAjhGK3~nRr_|NJ9b${FvrlYBn)^)2Q z7b|6`jZ;XNr6ym3g&ZqDP%-&S(j}imJL$zir}4pDf}5_DW%~S7_=2vRXwA@Hv7pjN ziS);ky?PN6d~J=~k0jVP>Xfb_gbJXJBV`D>uQLW)_nk>M=M4yQbg;}?nHCJKX|>Dp zW;!P))2X3-ch7=->KA!|%@+t7WG904XF3aZD@k|%XPnnWL^B4mka-S6UF@AjYR07-=2O!e66q-K+sU#_lzYu%j?vSU(zv4?3%yz2qpz=C z4Z##Fu0aYyBk$W}*=;wQZ#?u)2(~G9p4cn*K91g-HpX5Zo{iZAOF}yoyXw@gAaa&W z1=hn#0ri|Wou0t@R$^{V30u%%;-4e(2m=213cckD%?!;AN|x#AyyH#YFef@2WhbQX z&0m5o!N{OGS^i&n@ZevYC?o-|9?(s2@PmADL<|l{V-bS1!hYu!#?oT(IHA5iJcmO0We)2^YvmtLiylcX1>5Q|w-jJbH~Hm302ubbS{uUpdlgZ~Sc%7g-_YVz(OS*>`<;ofm62-Rp+XH*9lkc5gUNih)qXyNSgF&JnESeBUZ7VOP z{L3R3;ByUTREANwv9?CW%>oJd2Ho3OIv;GWNn6b1m8tss)DDgimoo#zrC+@06NM6O zMGTNKK%(@G_{kzKVJ;}_7#pIU=ukVqrB4CtxeQio+1fC*N*q!c37ZwA5}yY!XX>51o^;fs&hnm+;8km3Nf^NNsppqYF1?p{rZ~2u3*_9;WM3-PxWLZ^)H8sFRVi9;kv30CbIOmW+hbDaS(vs|1UE3`Rsqn&eLCq9Xn zdEctJgaG5$B&3BY)>Nu~7MS9pE(dr?Ft0XwsENmRvrV*42kwo11>b+hT51*GmGxFu zVyad*4O}q009=rF%{M`fFuI^ix>scEb1=H|+ye9T@?qCc#hQBxipf)ug9HWSAjPud zB5zVZTgu&R|IRt7rkCEMn9RMw;!J=;uKh(zVf3>iYhG~058#T94r7&{;A%2Dz(TE{ z=wp%XjjO(v!QI3*v9j^=e6N=8h*6P2VrMemj8ohHPRy0Plb9D6fwZ_vwa{I3RR6;L zmgKq8fodoQJjQv|?K@2SBRwm^m0{jmmT=s)ws;?UpYnr^JGVGGDHR>A1LLlw{@bP& zsQ0z(FiVm!YVC$5; z2CagvJb0DqMoM$3gJsIXlwoUgTQWnnB){+6@KCk=ig6U>I<-*86tK%XoEB#j%7 zxj!Vd-Nn=vQEqf?9^D2H^k{My-oC|1HeYrPl&4X~)bn#!rU-ezmmcV0qo^6p^4>Pu zEw;%GG#oW+_TFaiI8AG{3&m#Dikl0A!FBdYzm9kc2d`7?y~KR#%>+0j-w0|Epn!bU z>na~KM+X1^kxGm{VH_=&SmvjAG-Fh!^aQU$-f|WO%`%#6pn0}V5+SW$}c=hxmQ{gt4|lsblp= zfP}Y)h-5GMFtCJ3j=H>!H+Dy>MkCY(aIec^<~pI!=XOPRaP>E!IAQy#Re7JE&h{hD{6vNG92L{sBq2S+{w?W zAxX82b|LzsZ|^p`3Q+PN$l zpjSP!@JPZl-H$Gmh`?)H)@@^tI?6-YHrpi@e60q#prz<|#V%sKSRE_X{oYVZyr@Fw ziJvZpib`6--uMH77w-|m2I}aO>0F!a*outRx?}p&JE+cJmss=RuXMmyEyKNqe zo|S2YD@QyFDJ{j}aH`|_eU+()Y;+C*-~tL6r22SUkW9OKI2q@3Kf@+CatQ29P84;L z6d@Ao^i>iB!fT6;Ww{7nBa4Zl>LBOb{D*v3vjeX|bt3*Rkn1`Pcym|WSiO_xKsnSrt+m#{;uH0-_URW4cT%fc9kw|YR%0Xf z^}8dC+4*_9BXeZApgKnW-_=_WdfUW4lmx4kRVE$0!h8wK!OEFy2we)rC_@ex_Y^k1 zj-fJ>_A$qQxw$QhCvaXaYsXH3P>&q2UXgz3?|I!wdrpEwz=NM_kpU8gb10bq-dU7vGoLNp{2m$c z#JzIetjeNPNqU75RznNpT1=Ol$j8W-wk#gV z9^j_c&a;|J{WBdI$}8{*CQ1(DQeI1)JFhOe8ym5{yYdDu+b&iYN_Un^0Jx>|Y`b;f zgbMD@wMPUV>!y~*fUg{Et5f~#T}#%Y59ER6*(0P<{6pO5Tbbs+@;1MRM@%{)ul+Ty zq^RG$Wc#)jf^qS%dGq7iHIwyzaSgJ8Tu;)FwGNh7 zws}Wgko4@_)}}4FK3{|G{M5k-C^ms_gv=EE?3J9}JQfB1*(-hihA^(8@m2JJFhxj0 z-Uz94BFdZOkQ5mlk$l$6_V2wyeEq-2x2D=D*55%Nt@%GYwUV-i^jm|~ND;~B4fB>l zL)imfswV$_a_&E0c$>?c<|ro-HzLn%r^!U+?^$F2lRoi2<3~Me=$2i8%rWT?rlVqQ zV2zWpc2zKx4c}cetSv(G@gW#ibtdshsCiGkX!xld7Lj~L7;91`tn<%h2h^_ov+Hl6 zk4k&#F7i1e?e4~>#z!Msp$1w{%(kYoz&oV7l!G`$$fXNid8B8o-1xN@<3vW0X~g~E z)$V}$V+Is#loG}jh7mTv05Iyc*>!3`r5y~M2gMqm;Oj$;l%NM!n^d0vPVCvT!*ViC zcMi5frF2P7mVU!Zz`8{RVEj}I*B664+%+YY{#-Q8i)pTI|1w&^T%{LITu?rBd8`&F zN#G3H+hl@OeixB!XvjSO=R+n|pz0!*AOocLjx|O0u6$K#$#Hmu>lzhRv&3uVk;s0s zd@?eH$R{tW(#K9J105I`rxj-|9a;(>)we55+6bK}V_`}cI4 zl8dJFFfLvf8B=ZVUZ(~Zta50?q>$6)`I0F)ahM*67v4P+_Nj96t03S4N-x5E=zLsf z7~vH4EMyAj{w}W0m+HShT}YZakOYH;Xv!Z@I)MCjInS}mL|PN~DaS1?+L`l`N~gDe zC_DSvv6!M^DQZZtkiihsK%?9Y|0W-id{KPzi`U2J7cK1XS_y#sne3(BhnuSYPY5f& zjhL*km@T!M%lxB%F*}R_GVPz=|1={r{Op*M(W3y7F)P_$Jn+07c0c0%_o zFh>;J@`Y&ed(*H=UXboKA0sUFEG+v>OH-vy!}(XqM0J(u*84%sLC@Z5 zlfU4oN@0LfA6;tL4!%u;-HfCKtO%rVuZ=VTdW!Kb`uz6is`0 zqW8bwn|S2AG@Q3Skmp`7LrL#MU6k2v zqEi)O!lB{o+Gm&oY~s3sHy4^G18r?!yf79zSoT@Io~`>P^=XuM2(b}|Zb5;m_C?Bt z5X*Tml(6V6<81$Fkdtxec8f={^YnsZ{A|YXeQHQcVUra6l+Dv|DI#JLb+GT@vI5Ty z19n^@Q@F_YjtLa_iGoi&+}6g10?S=YIg*U}r^kk2E3q)-vTv^&=Z5#`RA0Mx`B9xM z?Q3LWbYu#lBYPxG=}2!^%OXv3b(PM$_?=H~dNMJAP)sP8dJ@O0ZYorGBFw#D65u!V zwp{LM;q4dX*B~*5GsYPt(hi#h#Lb;qx>$c{VAZ?hy&~km#c%7E{kR^lR!xkJ@U4(* zxbuKgclZi5bY8{Tcv>eB+c#TA;sJAFwQ<-8O~~OAMF{1E&;54Wx4j+5A|ejAHmtMv z)u*V2`M{h`fmBfUz5Y8eD>_{Lr8)99%`n&L<$O#@R*7>3x;((U(*V7`cZ=Yo9y=XU zVuk3Xm;zqNFhO87yQ8d0$EFT9r>G|xP6wThHe(Yo6@Stp1r-^~c6osZl=>^{)BDKT=BkdK)d8jLm)dv zh(GW?gn(5YKmMTW6662Xd~T?^QtM^>pxw8XjzkQN%Vza3T_zk;$DG2fvO)rUskx97w>+v1ZIH@wY?KaUve^H(^bU25vJe+Iy`WPQ=;Y^|{LwNgkKkg2?Gm6}L zi8qio3@~gq#2ZQnIX4?g8wbq!i# zw4SalsywrcSAkUYb{HUfTx-%(R*qPSq-}Z^Qi;>eOKP7~?MoJorAxfRmC_n{t5z@j z03t!QWM)fnZR5hrc@kZIP;RM7ab$MG(ec6j{_;(@w*8Qf?) zvVF@|wwajWxBstkX6D{6q`jqX@_xK`3C^z~%j+6(7r!`UIuvI296U^IEbU8-wbBHs zL;z*n70NGk1_6)`Wp)$l`?$y1k7_5zIH5`AAJXH&$SltrEHG3X#gO_vqLlO^{4<_4iGlT z3gp9XC{Pxf#TH~rZaHYNI}iA6!8_oR_VWBvX8ZfvO`po;7|>BaU*pHtUc(;?e+XV_ zelLw{4$BloUz{9Kn*2C)?0X{p+ST15_~{aF0EO7}V|;5}vy)}kmF4UDIDrL5{0B;; zbKuO8GEFLVu!eE8l0?#^05v`6AI!`(Eh_9XUL)Ta4-i>@T#`2?B?m_ z!W_qy7WqGON)1?|l%HBlEP`vW|0+^z9(OKqpN5MQYsV)h(B5-~ZL)WMAb)!7nFu&I zj%L~^;W81yJqW`rWKa?MPH{-ms;uzoL1XNPwVu`a4JueRY^|~Hz;0!i#mbB5(=A+T zA@F+IiyQM#&pF}QNzK^p@6oP`7sxzg9IyxDZiwCB7iG@M3v`ZIQu&lV#Egw?-FcR3 zxhmo4A$96u|8}Wh*TS(MZFYgh=8q41PToVveV8+k6Kw3%$CH-DlX>yG#uR*4 zkLW$(@&dx8o7#F(a}p^ok#T%b?g*In#Tw-4#+-!z$RK@!ube4w@E6;nR(GL}O9|1O zZhZc051+I!XnB*Tj#dvZDW)u|BL&NQknBs zZ!cp{U7d3vr-wHMu50HAjp1*X9&Ko4zeM&QpIuDsx0o@miKYFi0}YRnb}Ns1M+(r) zMgpj#{Uo0=y>0KjuL=f=5luYRKu&QEo;C9Seb)8xc*AWUy)7AqXf1Baf>$9P>tKhb zAMU3UJWAXf&O2p!2TBBaA>5m_8KDh;%?1xuYe7B5y-_@(hFHR0+t#Ed$dw1`B2BfX zI4}`$9-G)IeRCv}SYD3fyx1f4cEdnydX)TFQ->I1Kl0 z>C{5}RAmIi$MV#W*AD?Bmt$P+j99j;n$mW@8Yc^Z6sRF{>@&&?#j2OA%&kuo;wqO_-9bE(%tVEdvsyU#-V z@1V!_1|?3v#;t2~OY30`X)K?d1YiBx%3e+zneF|~op(KX%_jV@!VnL zEb7*J=&c~#hcOE`T+fQinj`ctH=%U8x1568#7gS3&3DlS7Wlh1s>t|i*3hN#HguM- z)k2OWr{*nJrzX$26226rO2XBe+&)&}nWVw?(z zQO0}TE(6cV6lAYKV^`0Fym8K}=a=)iVfc4hz4mvZ#i7SFZ{JVnpDx}^Y8oTnHu<}) z*^=M%3_J8$4Y~d=%yxQ( zm3NbzP-+UF!v_Bq{;V}*Qa9!lLbbj6L&o(VTZ7I)u5!FZ&*8zoh7Ckp9%wDP3DIPp z^>r~tYE|}Cpq0h&{_4ZLW4UhkbE1B7=2&IC>94k_8hzPdQ*={K@I+R@%$R65LK(mt zC8+rBIVjLr-L?IO&-0USM;<2&l6pOA(Bq;yE1%?E8t2*R@6{r#qaH)wnoG7lUdcob zTB~-jELIkP3Ot<`M-Bs2J33sqeH3Qnr-Yexl^VGAXbSnm4EZ z2xnrgN|c2h^@aBwF))Wn@Fx@VzdZK5iwGEZpCNrskBB8^yb|nNc+V(XpoakAww6sk`O8drNT#DZA?nYvzd=AnFCVHQ;%#DH=y($H+Bda zD=#>x%?{1bmXH}^+g2awQDqZBTt<_14DaijJ(b71Aui09-8Ljk|1=Zn7^~&&YGT9> zyw3ZSsYN%Xd*Ir1|b^-oLUu>G^O) z^t~cpADGLiIW&b$*y0#8ha3}{p$)*o4PI}6xeX4vhRFZyaSf45EZhh~$}1a<-KY!} z(jpaVBEtaYlu$s%zf7xn!D^L|5Ha|@>$#p{_%yUh1Ex2=gpym3$!zhZt{vFIaZS$D zdGxm#MMRNitfz{`;}Qa~HeYTN07}>Wubxy;OnUo)9&Wps)XR2n|C#ehW=EUMh%3Hk z@$?9f9H0nkI$dy!5tkpQ8L)~#9x~`RC(-jky|69g!Fq+`#6*;6U96q&ar>y*qJ+3p zXcpQQLYXF4P3fRjum_pq+tJfMe>VSWUdsJhZt-;G=Fb--jMW8ie0 zv9k!>u{Z8@``O!+t}XrAE7G}?F5mrbwnRRAq&g|sVvM6Z-@ruY?o~5*A^3G$R(ba~ zn}<#8YWYsW!M>BYYA%Zl^8m3fWqE=*d)M_LTA2Ow3Up0d9&^l>+5EF-vA0rB=Z2v z!1SlKT!mCu{fsbrTDSjS?NNCNJ@L-A@u445hd!pBIXv;bCmFX?U?UvjO>~b^&zH}d z;NbbCExvFHCogZGkI$;ct-6JQQo2=|soq|8-p*9Yu=!{`eIr`aRGXr>zviK-^R`y= z1WU<&^WDJdX~qARYyHUSA~@o=yp%jlA&=oRCGpQ~VM#Y*{4b|4MCwF9K~}%^SWvr( zF*A#!ziHST)7B%s;P!K*Vh%#g)fR{KnX$I0ErAmoWh<6MGK0g_b;%0zxys|;sGxQ% z=0C9DaY^9vw=)17++A)AbjsNH`f_U4E2yHaD8Ng3p47H7of%(F1M}B#zNKWpvdy|) zXB#Hgdgx_j4zr&t84n!SW6vAR4SxMDzU~crTYM8i_{~akLH{ncO)`2P(z@fZe{w-s zl5PT?wcmV%SAE0&@_+SjOy)4N~W zZMXmzA12>ZWyqo&EE`b#EFFLD7Z4{jr&?&2l~6x5giG2=Ujqb}0%@so###1n zDrD`$pXU&q*I9W;Y=Ps*4UQ09)~H@{fm5tCFWe* zh+nH^^09x@vOD(cFgRZ>!iRfNU)Hpl8tZP(>s0#J+qgS)ryu)hANwD(J2kX}f|wed z`PQfi95mRllTkkjOSjt+(^+;*oJ*d4-RcNx?x>|d?=5O+vZK`Mm;HRSo+3=Oa zfYHt{csX|Z>8GJ8Fy>X^Hyb5<%d-+bphODM%(F+u2oIJIh##a=P&(<*eLmQ}RL(hr zZkSOKb#{0}JWvgpHGNcEna3^9bB_XtT}RCj{eHh2FF~hhC&@^TB6rfrru|xivXGgv z`{Cc0d=3jfRG7~cH4)A6vP%Qf@0;qabZ(W@lI;W92O4`|j|FT@r=OwlqZsSV^!2I9 z!>}(K3dxVAd=6J7{C{cUUZ^{;E;29GO_1Yfl!oNQ(OODs*tryAasG*aKkx3!ur`#i zH0_y`^8NbXnYC$BokTnw2-5qbqZ)+H$+d1BYYV}vf9d55eE6H=UMFA;cAxf9ZPps) zTnilc7xFy&2|gO+OPxn-0Llf)N-2XHZd+*M95^Tye?nBR_^J5c5P#U(mKC3H$B_4K zs~9*}y9UTK8T4Arv=uUbjI20R-0vzrZ_Kh@DS72aGaflk$U8h!qAe8LoHJzP#nC`} zd(y|gQDeZ@e56^FSSD_2c(dSd!BFFF?Kny9DRul^g1{pDL9j)Uq-S-kopIg8Hr#dx z!YSN`)+-KfCcTf+Mp>ZTP(diT^fZ!ahJA`P_hK{ZY`-W=<-X z9ye7Q0mO{6xf$sx>n$LI(IU#K<=9uEm(K$hgK!pUj5Nb)=}H>~7&RN=$M@PKaE?aH z)s2Kr$;LvRw!Y)c(z)cV={7ol(tjA4&y5*dlIGRT>Ptl|R;^>2k5>;;WF1>jL#gnh zs|eXr^IemytRbOn>c>2%oR#<}Xa;kn#kE^2L`3Y@}+GJeZ znU!-{SFfib)=8THBq$bFbHG`#t3Nz00J81%SaolE%VqT03YZ%;AVG3tLUaaJu0z}l zN4~1=-R~=6EZUJ}na9Pzy)fk)DBo?j#djkK zp|}VZ7$!)*X4i4xxs4tM1gLx~(7BoER1xPKPT6T!-_??u8L?pvp@w2t3?Om~V|8}p zc1e4rm@vSFk0o=aEKRBQgH>tEGbI%fgBJlsb{0!Mj7&_zVbGI|jMYvJ7I48?qcOe^*!OuQg=>IoO#ME=riY z4eYlY_)`;TRrOsI1c2F?^bQSZDn#xP2f!-Z!2Os4UL%GaA(hUC;)0QO!LufKcW#Q1 z8+pib=0tUGElxKo6_tckVz4D?V@KYB1GGe{_}rFG%`<9!GD=#Mm0qjDSAw30X-98% zoS65FuOXg`i+g1Nr~+|CT?k?~nZjMrFM`Bh8lGuMwS`przktgH2Y0Vvg{p~jHlWdD z{bx3AM($m%LPWAV@@N~hp)>xj6Vm|wp~`mK01&wUX)%+(iAZLyTq|EEg^UE#fChNP zhGWQZ#dbG%uoeB!#8%LrqQO<++nIndJ$<3P%^p{NLJ`S2r%_d@WqS}@3MMhMKdHW1 zc`2jW;WRr4>;Is*Ils71U~-uS-&fq~A-{AKh>L&!l9~YQb@d!x%*D zomO_!Mg!GIf}jCm-BN7bZh2|a%Y{;xa>u{^#1lr8F)&OJ(!69H5{2vbOueiggaKQ2~Qb1?G#j8 z?Dyf#9*xeM@L_xdXyrW|)}B5=}+PSZ&?{#JxI$bY+j$+Y^9vSiJ2DjFfGYXxU(wcVClgl^o>0Gj>V}(8M-TBbw-^~N) z1Aza(Z>-I&c02D`+U;eDf_AM6eJ?Ja3BQxxQL*v;HpFeGUrv}~izSlkuh+q=a9UL5 z@1c)+-{Pii%fgwJYaB1F_%=nF8hH zv~K;J5G|%D2;>m!$u~0`@M%U79!BhJOHh#2k5B+ofuIofB zWG7Qln|z6Ikxyfuw3R*eo+kp<*R9?p0lGPE2KdXNb&60AHE1x#e+hb3QIE?}R(TZK z)OV6pNzoe;)=Sz`hI$~hO0AXqty{%kFF@Rdy5`S_Q!g_ICUxt$Ye^{~&_~#b^}bt3 zEL|Qy7kA-k8l{0Ik>mCq+|W6S5ZV{NODD4|X|U)v(D|}HHWCVvI0T_suP*n*XDs zcsM8DQT+xa!t4dh8(;&b16dR`#iBUw>0##%sYxKUC(Y8kjNDw?a z%O`bKC=*DkonyWlCvwMIny8;aYsA{~;L2q(1~tMu3x}NCh21(a-mY7N7xYQ4pjF=$ zJ^Qq-`F$sU6e7a$%+a>Go9YlZ$RfUk(tqKja@lo$$UwL z=^U}{G>zpPllZIs1SUw_)=@1LmCsv^)xCce?Yi589iu!!BDz>uO;iCV2tK|SOZ&QbXwW~1eBzVuLLa>oCuV{F$jv=&*6LihX!)5) zcOP^3lNCH!wz~UXVeX9fk)?{u+l`Y-xHKuN|GbOko5dhMAfCC9-h(-aA`9T$1QHG_ z)KTf!p?)p7S-?9i(Ju@PduItvHxzmhgt;XwTJ77U3jAAz?FqXyK*iD0)L;Y7S2tE) zICC1Qbo%?*Zab~Y`xxJn^rJXBol993!$*pWIB&>93crci75;SuHre^L)PbVaSEm;o zbld46U|&GPM2&>8&KRrVh_FXsa|ar(k~*FYf%jqhW7bao$e&6; zE(Uc4$%OBps?Sn!6FtE;zmKx^)=zQ(AAGrX=gE{DvwVJ2XfqB5v~Qf1YgnM92#~PT zACXZb{*^ctiR`hf;^!H{k4X_vn32<@KN^`@v!-=q&cwfTr^7&i5dZVO6Q{LGr^kMu z?-Hp1JX(FL!?k9@A9GO4KW5wD)@)+Iv+cYcqg`ME55H5=HZX0zkS?Fj1dOO5*i3D) zY`r3KG7e2I8MOl;q})L5QS+^B8hZen!=k6yrUuAQ_r$LLHryF6rNKLb3jgUzd;!FF zrYcwDi`&gEp~cxq%ALD^WoKx-0cs4A5U$!+|M`1^YLylM6pU~Jwz@ad{Kv68cV-@Q z*T%mp=A>}%;hfd*T>y%?$JvFZ)!)~ENM9{1B*=?(R<}7TNiP^hZ*dL+R3CMvPUzwI zmJ_ENKw!JAJ0X9f7F%tK+AYfhOQCcSZkMw=iDNGEC8Or}5Fjq-{pl}>n@MRClvP-z z-+u$tD+VOe?57IzexSw33~RcLIkL^c%5-T57juHie>d9VW~6$wym!Xs)*>P@oMJyZ zg*o&-P9yMbQGsT|u#KldQFkBTt>3!%Djsfc1kJZLnciAsTmr`P@t8mC!fR}CN0vH`(8@P_o0b=Xa{!?|yeGu%260@@3kQSxN(*VL2Kb;Yy9i|5G zQw`bVbrSopJ>t;FD}L_c=<5JKonE;Aqa)>0n4AJ2X9|(zyO zeqX&*{bUWFa~0g-!IK&r{h=<|rZ$Ry*+E-ol#;lv51E8OM~7fP!P7k8?WiqJ-`}ut z*u2j_$$ZlnsB~?pXfXf6SHNL`ds@c`gJVl18Sd8vyl?I;;LVd@az*95()(u6om%KB z47gXkw;^Yu>K*wF>c9A7X`pAAySy!Ia?K`>Qw)&B@x$L`clP)NM3r6RwWfNIcrSz1&;|RcrnO3@PAB?R2|U8p)hj&sD+f3pRPBFq zmDbgkIEK}MlV1F=G7+z;_^Q4ES1>HJVG~+$GZ0AZgM$R?cFee^U(~r2osckl&Leg= z2dE$YHmy6=lzS1-^4FgcU%SU{@X8GdQUj%|o;dA<94({;7LsD`W9dod_%Yh`*isnD z3Z7zJ#6q-7-bL9)6PM%?oD&zlHFQQRv_kf2J*a88$0sK1x5X5p+KNm+S)S9^kR}II zr~Tq|<@3o;k4kGk;MJ+tN-ec|{~X8NU+l^=Hk}pgc<@?W@1elVrj{*t9L&Kceqq|Cbjpi=Qcd z6Emk*CmvpEpXl{1Cv$DnRnnq9XEV=tX^A%}=dsM$+Fb4W-*RKsoI^YDt2V)JG+%QC zf>2PnB7aCCyc%BS{p5{Wcit=aB2fMC#f|#C*|%in-AtlN^%VJ#$Y?Qb`B3d~7W*o1 z8ec72epRdCgVyTy=RojoGAEwnDrHokJ^1HJwgor>M<4fmckAM~vgze#l8+iRUE{;*<)H2o8Fwql+$!Ncvq{O*R!v3L zlFU>rNDfUJhN^F&`iHXjjJuxg&E8KS{`=ff=q`NYnfUo3np5?>!<|$jYn4RJ&wzs6 zW6RbKG20UJ6ZzCdvu%{F=yF9;a@#>&Yxf?(SG6{#yKmfGE8!C3uMvdit;%REqX26$ zP2AqoxgV~#&=vR7#{-0E6?nkbWAHL6S{T`lU8N{tDcD%cEIiz1*+Lr^`D$ob#60!R zKvWnPmXFF`Jm$zKwl1YlDqBSib7XA*K$dPZ;e{QFdLnGN^zg1N|Ev9(q}QxX*J@mE zt{+|l@^_Yq@xBAEgn0i0q;Q;3aYpaPb;Br2b<7X&c8@exCwyRPc!GNGs`MvbO(q2A zU*vsiAZP2v2GUI4NB$l&nR(T7++z`&#a{V9g!2??QRWUf12yjgv$}I3NqjTAv`~*laE1ynw641Cx zIGEd{#R9QQNEtZrahaBGec|8ur{`Gb@93D+BGJ3vPvm4i(<>CjH0gLy^3b*IRo({2 zn=OIwO9h0lUxflF{-zstSK5j)HM4vXsmZu%%1wTs^_1)p{;>Emymb8=npu-)>}XNI zU%Gei;HG*r?)y|*OoXNBW^Cfnm+S7$*-6O6`v%Pln&b%n;#T@gm%cUVp`Ag@ ztdy7D&?dm&&FTQYhe>S%7rbZ4hiMsIm@*~{uyq%iV*P%X0t*V2V)4qsm}}S4;5IsG zAPk|~XSnkKm*`tpNv14SD<5Fri}N(#yLU|I;HOY4dI}4ScQlD@x)n3`74Q^@=4NMk zdlz@q`X+i~aCMFI=Qo=nZPN`4NbEG|hu8j8YJO{q5tY8Tx2}|f2hTm~7gQ4!Y)O@u zu&cy6xjo(%A(c>bX^%y z8*e7sLI%4AO;0wGJzsBs(rELtWSj!}Yw7jToe6S56x)kF@FGDkaTPTzC(`7<^U?0i zq`)wTxA!p%);YG{esP4zd6}wSCI}A4%cy*`JmtdKYvJeCFJz#TMw&~KKHHu5TzN7& zYMDGgm9>zBdfVESU(6sz7ubXdxgVsNV4yli_af$!@VW^h~qI#j^h~p=f7=A zT+sC!XgLVPxzg$}>5JzT(@^cg8~C-u%y`T~)}g+Ebv6K)~c;JOl9>q5eDfy`Uy#i~IK2^Oe+y!q1OohKs zKRRibB2I@JSw0cQ@=f(-`^%iK2`78ALDO=9)JFR9i21@%?;|=*iWq%c)3cMA$KP7s=vNE>rj#8om>xqV$$;GTd11NDMsp%bk` zx!?F;9KrFWgJr5gxmYmf5CN%4V{XD#o4^GDlDv+K9^?6Lg@he zNaZaC%crc~bdEm<PyWb`{(0pc}^DzdMHEN?Di~X>Hwc zC}7ad5sod6|8+YyF-&YRZ~5&^QD6Pa3-L=Qc8XT9S|#tv%%9}P4Wcz)2oA-j5E{r3--Lo|l`O@jAbJFj?Q$GF=wSF-f#zKB7{IRWcv|{Ip^7Z>_R-AEd z7`@NfV4W75v{?0|=4D!*%@{r^DRk*_cP!n+$afb`X@l$$G2%@%h=n9pET*Z1NiY&V}_9w-Nc_ZBCFth4TAC+ z_M@cObLsT(YQKy9DRl2rZagsLdN{iLlP=MPxD}^0ZSlwnO>eCV+n!A)vh(6pNJ4^k!(CB76-jlZ^zgXL%mUUxEeEL)L+Eo;JJ{=jPK)Igo zsCR$()muAyv6u?@flZkN7lKEQ&8LTIp`)rY&m}+_vAKy>6=vd|MHDXXlQxIehBoK) z!-FQvg9HP$!Wd%ak#d!E7Md0rtY+);up00`4nPoBI0N{EUQz$w5C7+b|1S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/messenger-client/app/src/main/res/drawable/ic_launcher_foreground.xml b/messenger-client/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/messenger-client/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/messenger-client/app/src/main/res/mipmap-anydpi-v26/new_app_icon.xml b/messenger-client/app/src/main/res/mipmap-anydpi-v26/new_app_icon.xml new file mode 100644 index 0000000..fa6f40f --- /dev/null +++ b/messenger-client/app/src/main/res/mipmap-anydpi-v26/new_app_icon.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/messenger-client/app/src/main/res/mipmap-anydpi-v26/new_app_icon_round.xml b/messenger-client/app/src/main/res/mipmap-anydpi-v26/new_app_icon_round.xml new file mode 100644 index 0000000..fa6f40f --- /dev/null +++ b/messenger-client/app/src/main/res/mipmap-anydpi-v26/new_app_icon_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/messenger-client/app/src/main/res/mipmap-hdpi/new_app_icon.webp b/messenger-client/app/src/main/res/mipmap-hdpi/new_app_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..4c24dc52b685d45cd2dd2562573c9b8c43e92117 GIT binary patch literal 1014 zcmV6 zPysm+J$MQ3P9F?+P5=l92nc9F6#@bR3Q&g%1e7upa0XBC51ILg-wY^`gam{X5<)Ua zk`NLQk`$(q+&A7OMS<+eFA=B-QX@&-)VAH&&eV-l+qRWD{ax>@p4s5zKC^fu`tQJPBt>#|j~RQv;4t(qIFLyw zLl9?_Cg*YZU%hnYGH7-Kb?HUp0T)B`aQO5KrzDnO&d=*TOwvy~aTH_mb0Iz9ObTuP z&n;1oXITmBeBda~=}b5yX4icuaW1!53F~_7BH<=GkEGmT=V?C^lQMS3;?;cVobjnK zEG16gRzd`o?wFUtN{U|8LPW!o<(Vu*O+M5_Bx^pL69X=3MFo*n^|~}*>6_|^%<4A} z2bHw3fyl0DOB$f4f;yt0hV`*M$3gTpZ<{Nx3!KwO09jZ z*hekqm{vW%nz9nYGRnSdh`7dPJ0hZGqa)(=eUuIAp`Ih^xk!Jyp(KR){P(Btqm~Wv z`;gneey_9zYWe-tCf2Iu_q?EmsO0};58+%D|99y%Hfs3)onoi3p9dn>6H24ZYphKR z2NSoKa9&@yG4G&^J2heFr4bFJZrALra4ls~A=~+F)`2A>HM)dp+locLJ3Hq>&y$() z5pw3+nd4GXJ@fVe?KV44q}*V)z4lPbU3S}#ucW*V59?+@4?X$W<)xTlXODYbro|wW zKlgG*2eCf6etUMJqYJ#w<1fCuesvJL zN*Wr0uV+ak|40D+M?lCR2tonj2cblTfFOJ!2mzr)g$!9?sH2BE#u%pqtz zsYX(4k4ln)60UL|R4L-fszm*X8jWuLGg=MS>$8ZXS)ax@v0>7Pz3!P^|6e|@s?B$0 ztl8T>uO_4S_uONv#?z#7FBJm9HHiF>NsB6C%@fnXJm=ocbxL1v-hMy7AHTmfW+fe$ z1lf{go3=IAv2Am#W81cEUEh1mYumPsjepc!d#^dhypKDg{|?+nQY6{2K&eDY{3+FA$hcg@&8C zBB>W>Y_S!DX4Fi6E1f4xh9ol*N^fM0zlet}izL}C631VJ z_J)FO+BD!L#?Qh>YeU4}DH6iN6Lff|km0+n3_r2_??3giI{AHaW}h*bV90Gt@Ee@D z9KpBXyNt|r<%;a#+x8aC7t4cpW=q;w8}7#tSUfmse<-8YhrX9 z*QhY+)l115qm&7byw_{LU(V&|GPV67sn%3v|AhN)`;5Cj?!4MFj8-0jRq^sQh4Yj> zJ+3;XZk1eB;Sqq`w;R8iM)szP9rbF7Vr6Fcz&FQAo_?R7u5h5b_5JEInuV+erz(WM YejM-bwW$zZJhcAYz$6%#|6IXf0JsVQtN;K2 literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/mipmap-hdpi/new_app_icon_round.webp b/messenger-client/app/src/main/res/mipmap-hdpi/new_app_icon_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..a8d20904405906a60b2de52a39d3253630cc702b GIT binary patch literal 2462 zcmV;P31Rk9Nk&GN2><|BMM6+kP&iD92><{uN5Byf^@f7BZ5W3?>>UgdF#+~MMKsa= z!cm3Tp49*UGbA~6!P9*d+qP}nwr!gaZQHhO+uF13*{SY&jcR&&{(*0t!z${Sb+$Rz z;koaEjw-Lr#pjOud@r`KZACf#r=&CjEf9l-4xwAR>oAQZTdJh~r@hoiQaB=bS>TXh z+qP*(`BrS(wr$(CZI)eKux;DwLTuZ~yZ3DdZW}3TrVDeo$M^+EwzV0O_P+qzwr$(C zZM(A~{)~)WbZOMKyJxn|E!f>NYv!;40J7=-@od|+ZQHhu!hrw)W-4skA=|d?n(bv* z{~5S#q$pjcFVUgU8_8;9%FWji|`2<01e<#877#Fw8{vH`;}6 zjNY>A0AQ#wLKvNln~dL#5yrC0j>^IFDJsj>-@h?B8ZguV)Uowc9Rpx!G0GS(7z-*e z6~M(bn=qb#S|2d#=r)H7FnkzS7^|i!6exu_3WP#CDzJV!TBRJPxe(?{Wj_I2Tc0ez z2xfd_z!asNjv_1_ol-)WAAS$$kaS%zOc)QPDV*j)Bh4Kl%fh(jzoON#&I(D2#}hG-0Z|{ut>InPJZuH`5fT(1DI=LS@{8Lj+L=UZOrT zL$Z1#750k~jXIj!lyoU5MCgViC@4r4(ly#kWRP_X(+hGFt10ThgZ*a#>l+^S6LHos z(FH@XovFdKBq+LslSjpX{LsO*H_~d_Qb$whX-ga(J+@M!Em5;$(y zToR4pUHwN9jkdnhCMMu8sNGfxkHZ{sJ*qcux zY4o#`Hp|tL0KR`2D8lX?Sit6saz9)>9a`(Ea4&pPDYEbW`B6PZ!c7$9|8X|sldvj;C2FGhxSWy$#l3&3#)gqUM`*fxlt_vpp1e{ z+zjcu$bp8!GJh#q>y#?@ECK$xOObU?o#w$s^0RU*`f!8m!j!6jLV2DwH;Q~3GF0o8 z9}I;O;1247D?472XWagDWUD2My{Ir1R33CggA;i};MxEf99)koWscjg!Qld*jx@zy z^%p|b+$`*Y4h+CX4nj=sQr;z?KPC7v-8yvZ76q3Rhb!O*rsSuC+dpvh?)kK^wsNyL z3d95Mxb8cmk= z#!=y3jCINj&iTKV#5u*VvhmQw+$?T}K3o?UU`*NI%FHOE$kJYs-Fn#{Rp20Vm(W)k zD9({}(aT>!fXx+@wWkUkl>cDsI*Ojmgvih4o>&ER9+s3{(VQcFm5E~OI#iNWH9!mu z#Ena6d2?W3U=uB_4-5=!**Xs>>iiS*ipbCIo;U_{7FK-e%4`Hl@aI-Xh%@tT|jojDWKyp^|C2C>RZ^jXx5~o%*)me*upiiD>_Lm=$jsl z=r! zzmF)mjYnVF0E15uK1jbA<@;KJJarLg8q@)70{=qdOzunJ@*L3bIa7l}3E~wC=;6%D>-HHGJ41!>BY>KnU?Pi)T92$P;{GPI8R+eYQ z`8xvvPDV&jeT195Zns}{{K}{M-Bch+;7T5rdoJXApw^zmCjrhYrj`KaCW(nOzvC2E z<^$W1UMpw{fOQcOv@`LUQ&oI?a`YDuioU`TxA2po^8`ZFpP;Z086`nzl{_w@k($q` zBJ+YBDQJ5T0)(;xVuJ2{Jf|S!`^_W1#CmD@E(ONEk~gnC1&&UJ*LF$#^RsCNEu{F- zVWiQpy_7-UEJ1riB;bm`nHmLx>D|1y6&SxB9B;g~lr%&~-^?Uy zm8v5s#wSNK+xjY#03C@PQtgQa*D8#C6`u)aed6GAPf!^er$k0Xnh=+#z_IbefH+KmEBkWwXUv8W@E)||5tp5>?e4MStN$U4A!m~7r z1pQqp%>$MC{vXM#&~2z97%YuqT!Z2ZpiD5{gN9sCS(yU8RGPxbR=d*j`P`^zF%X*u zmE;{L&%%aKVM^=d&&)x~DN&69+G1wZ2qw#r_yD6NfeN+skoBYo+{Ngkq*Q<2 zZ>=#qssy71Jg(tG0U#?=*hp2SvaEI)pAzu=`(^D0;i)V zBN!6wHl*ZQzPEo{GN=Nv!Va%uId92E?OSe0S%(*^_C^p9CPzdonc%oO`RDWCG3I~y zQ%V)0Kpe{pwfxk!oKix{KMRAlU#&_(pX7i1SzUNzaukP0C%MDegzUq>mArq1>3pCl zuoWOfFzsR>KX{bst9Vxy9g=%HZxG~kX;o7Aixiz6}s04JfW#sB~S literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon.webp b/messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..83d06d4c7249dd48f6dae05de703ae3540f5fb52 GIT binary patch literal 888 zcmV-;1Bd)lNk&F+0{{S5MM6+kP&iCu0{{RoFTe{BS0*`<^! zBt#5#STVo<0zd*O6p%m)88ov15uWgZFGPqCGH}cas6k2sqN?Bzmn?@Q3((ADNFg}s zvyuVn2mwhN$gvP24F$4+Bn=1ugwq}Sp8U_U_enyw zG9eAsvS!1{9Mm`|Y@EQqSLU{L5H_qs8j_@@Ao;%{qhU=!Z3*F_P_{C*$Rq`h6UY=W z)>|1uL`G7QgCJ#;tRYEKlN1UF2?Pu#APGqb3CP27F7SiiF>9Sg2+K|~S6u5S#osd< zE)GA7`~4-H)KsV2;qi29{qO(z*ZXq^%Pjlf|4BAFW>wkkn00==y|j;6*Wceyx$Jb= z@%i$2KArD_zyGhF@AvBE`W$A-_vdTB>=e>&Z9DAdjs2cU&O5Pfv$kzJHB(!u9UF5; zwQb{Xjh=T_^F5;f6TpVckYMQ{);MPlTJL!SjPZuV3W zPJH5F6v76gMU*>IvO7xY|G+|Y!R%$Mh!oNzmA+3b*yw$XL%vvub;!5>hMGEV;l^!S z*Ul-;bVlxyGhHyevukp;1E!yc)sF3X(pI&>=EaecR&~JkwF)WIT0nRtO+wB&P--h9 z$kfH4yny#fw*WIE4xLicF9zgxlS;qhzoxQ9HXkIsa zAAp7`sx1I^CMVA9M$7EP#QnhWl*GpXw9!=608TwfTCSmMS>nT5;Oe8qxd6IGQLO;b zbM{apfTo(-UZD3_~LSJFSS;SvBMw7A3o literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon_foreground.webp b/messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..204eac16b8b44695940a9dfa9b6213235e989fa9 GIT binary patch literal 692 zcmV;l0!#f;Nk&Gj0ssJ4MM6+kP&iDW0ssInYrq;1$KxuJY**Myq)wr%7{^jyB{zu1p<9Z9yT%)#9uUGn3f5ZoQEoh6&J z*^{()fT*26A0L0Xf1o&DWjf=0miM73?w>M#F`dfz$8y8*DCZm32gkjn$bbTZAP5eJ zkl_&gcj3<=BO@T8ARt3&JXn_)9v{M&Y1tk-z*a8QMry$YaR+g?WMWNg3f+O}DbAV%2@2?HQ1y%cN|2m^Zr^n*C<@?91P1P9Vhf=J`iH3?PqCwm{n z=0vh(!Db{I73@Q@cPtw4N3eL%8;oNSe;|srNY;#m9gNvSX!bD1JZK8p8FPe@8p#?E zH#6f(aDvQAkdtsRGj60vvN~SU$*jaUUXG6wV-{x;6$WZ8)H!KTo9Bfp)dO0$N_CF5t5p4VSEN#1dIq3Sy**}9XB_b;$^?n|O1G#o?px$% zMaHwAmHB;C(?kQK=~WW| literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon_round.webp b/messenger-client/app/src/main/res/mipmap-mdpi/new_app_icon_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..2f2ee0eeadd14ef090499a99cfd38eda4e2dfb0c GIT binary patch literal 1724 zcmV;t21EH$Nk&Gr1^@t8MM6+kP&iDe1^@srFTe{B^@f794Vcxx?L7$*F#+-bA1g`P z{xwp5m%z^8dH`QO!@{NzLFqa!S#%k)2zO2+j#c3Z398uw&4$C18^PQb2D(;NRfL>$NUIH3BxcPBRJ6D zYY25dJb%Yns86q7B4g3A9oToXbZU?mo!Edz1@=BXarLiv~fT%iX)4EcBy z;25#2Mnx2GWkeX@lPgq2sR5j*tukmUU|ti3xMm9B8IH>Q0(5}6`QteW=lKtk0hTbj z#scJ_o6mm`Ph*He2pLh*KQ;Hy+>tS*QcP#S!ZDuH(verNw2FpOZU3-PWI}Zw6AJ2_ zDEEYy=FCa-VlVh|kv{nAcM_vL<^6`Cr+{sKng>XN@H#~6?6=25MHJwd&iye>o18G` zg0u9=miuGF`Gc|JeYq>HQWJ*Wn+S~}+(H#rBeQ(4U0X;x7A9AwzMK*xJ&wXRv>Z3Z zOl;TG8a+NQzic zkUjsSdR)aVp0`d|@9Cazkl%#Msb!P#OBDJWb|yaEz!4ZMee3B2XFDSD?Q5J>2odg@ zLt&3gJ1rU@v<4MT99@R(4wj5*_PpyH=OTR&hk>RIaHzX7OqnK(gICM>hr-t@GH-lDA;upqSb2RnO ztX;^fb8I<3h%0MrV_yydrVaMQhu%Ea)|&QdhWN+;r>YasLb>XOmxL&H#TDZydMO`O z?e;zdSrO6Na~HB(IW04elwB2!e7fw#hK39qP{eIT9T3J@Vc{iXD#*NsEcSvAtFb#o zH~Ed#C}_w3^40HoX->e?DyVaydA1TlfJou{yzXtFnY8ZG;Etvr6BP{qZ_bqFoK%gg z&YR#QdYSrig73+Qc_Kt_C(Q5)aqXH{qpx0`$}_wVbIKAM?%$5P;wr{JR=+5!os|WeH!MGXXYteZfrpTn zpr`=v+2WtliT;5EfH%Z$-F?`N_UP7d= zZI`mb{Z{`kherKL+IJXM0USyDEXV+KhU6Up{ zi|@Bynqe7p99W-3_9>4NOJRNcb0GpTQyv^m=b9@pcTnQ?Z$}@boDD?(f{$3CQN+!G SM?@pWoo$Z-n;9V#bteGBn^5}z literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/mipmap-xhdpi/new_app_icon.webp b/messenger-client/app/src/main/res/mipmap-xhdpi/new_app_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..97550e94fdbfd6ca81bedd6212009d92085d78be GIT binary patch literal 1396 zcmV-)1&jJpNk&F&1pok7MM6+kP&iCq1pojqU%(d-^#-E0ZRGHWz3pBHAR;C}HwW6x ze6*`{>Xjthwq)4W|9^mO+qP}nwyna6h{x7xJ;bwZvwF|=YudJL4F?VY5K8~wS=qL2 z+qP}H90UMBwt{Bc)@|Fijs81u8%dE|3&#xI{RFA9wk=!roCWR{IRc05P#LmCI*sm< zN$%b(GBk$d?(X0FKk<8q?>&I0lH5rSO*8W~oTl4-@8m8e0*-BM$E%e;wr$%+nUx6` zqsdB{K6R>OG`1?+xW2C%w{0UaJ=V_sfqE)y5J9v6zN_NqhQ<-fqel!8Vo`!BR4VM; z-rcX!4d)$AI6}|>0}-g2QJ;nDdP6-d%~)k$(hvI; zz|=>zZ&Jvm8#%^`2+}wE-xR_L`yPhM5=Y-D8_$}m^t&mDPn(ThKMH-9-d8BuaZ~ye zrR&Enr#KT`l?12~3wwxE+cVbtTpAz+R-tNrMEQ=T0XoAjRISg@0HCM9bl$P*rJU0Y zV&cUBd&gZjaaPWqlnXcQ)Zf;Pik7n)QPo^&zYzm}fSS$+Rx&h$y-gd@)_{0ufW9c(kTvgMq2Z}<;ZTVWz7mgVCcBvc9IPP#+-XT(9G}i3cxJ5jSJ1AtUMXm` zYtfK?ho+0Y%cmN&g06EE8mE`z&=N8^7BV0oR{Wg>@1TpmMCjp9Oa6Z4DiJRaZFwak zEKq|M>}v`+D3+yjrSl85zmc4dYs|a~Sn~FTL!;vh-=B6);O_QauXn!}@-hyg`I!3x zYpOQF+RbH3ClZ1vC%cSins;zCWh@gXm$;aaP_RbARPH z=l_p;5W56y#T)tv9(g5o1oI;8FC@F`!CZv?4blHz)Bjxp|6R40tf>F4ZVn68ssAr* zE+1<||JOv1o}m7}yg9QL0oN51qq=DMXQp1)*$B5xye_R-N;8;g*VW1SG>@X(7o71j z4#8-_-^fS>sjt~$!99Ylq5k^v%{a=&`WnHxWc$jPXpvzU((ibEaqky)R?Y>j`{Iaj z)ypuX+1EGhITPk(%*y~r`&s7$>;Hp2Z#btJ*orpy<^C6>m*SXniM)E*brxyqHptrrS)t`ZTd*a){#k#hAy+PGOHolmS}WCr`1S48JR`uKBk zptD`rcd+L|b!(yhPRN;S<+K8^xz@6QKR|!3IEAnE!Bv(+tSvmqQ@lw!iB!Wm#4X?V zRU7V5PoRGpwPI{7UX4eSoER+7%gbY+`Ii30Xzc$(FJxCHUXgr2@$}TrN8tnexgPsd z+_m)c;ihcq8~|!CPCh_+Q$QS)E?;)TCV~Le9w=P}=6}0TpOZYmSaLvPA5E^7&8n~U zulnb$qP}0NxqV2e*~Tu+x&Mfx=YY2oU4TtD>>2mX_@os!>rOZF|6*_cIq?7l2qt_j zC1}A2CdIAqE`IxQOnjaL7RY*RV}X&-K%}tW`)&;3gr~)}FR`-!Cgv2*VoP ztCMvL+Ju=&)v>+=mA-y{TL+4Q!TN=wgZYd3MF)xw3W^Ta4;1r<`33RyfwvPB#K#?l zuNM@buTXqEpm;pS`!y8b-BnW{( z!VrQW1QG%PA<#ic5IX1|0YOL*gn<4N2m~G1cn^Q&UHy}VSt-UtuwhIw!VDu!F_I;Y zYQOXqSA+2c!|DllMbR%6(L@)Fhhmk~)8IstWj0iK!^2ke>_YxCJ!F zUb8g)?qnV%>nmretuX&(V>5m(*WVS_CG#=$e`;5brk%9sbhG!v-#O0ar@pWA`u?on zU*a}or{2HFLH~en+wbwq{;NQuZCi#UMccM*jBVStZQIOzW81cE+xATTNh2aF^TmsC zMf4wn8%c^J=iDzpZ4>E}d)7qjuv>QM1N z2s7k61#Zv72wqX3GoUocNq+BU;iQ$9Uo$|O4)PCZ499BbGuhS9v4WMq zZ?Qp3a!V|trl+rk0i_ay-CcZRG7QL$3vzW0iqAG6Gsf4&JtU!|0exh)PAn_bxk$WI zgwg_v-XQ-}p%m|;Hz+hqY>&*=3Y89XE*7tJ(dhu^VhIqPO!smwmax)7<7Bo%D9M?V zD1mrqPT~b3ojFMsPjZsk9-#;xk9_{61@Qze=F0cri4dA6v!TLIS|1+gG_E{X9=Ck{ z+ufPRXR)xYF0e+r| z7q;f!7cxAakISB?bR5?MR7Mor0#Z3u>F}3~4&TS3sb?V)_Os!>pC%t)B*rlIPm0iW+X3L zj>DE>!&r}KT$Ve+KM)HXPQx zcA-Q3^9o|nw2meE{|(u${*&0YZQFKccNC5?vu)07+qP}nHm-edcki{jt83S(J}cvY zY}Kk5ePXBLUa^x?@kQSgJ3We>3iis(P9FN%uVU@z{p_Hg9XsjgvtmR@qix%CvynW; zwrktA+t0Rb+qP}n=D*suZ6i1i9La5)JyV6GD5to*L5{ZnrtS2Z|Fvz~wr$(C_qluh z*Iw()AhuQ;qegeJtMGJj$}@x5$pGBhY>jSDAXe?nLDh9ANs?jh|Hrd!+qP}nHqQ5+ z!vFxwR#H;i)@<9h?U4yXgwp?|l{t_kHEw3Xx3Qc9Njw1;Jwzyk8Y76GVlgAW5hG~C zMvCl6Bo=SJFPmU~F+wL|q9NAAeuurn5B|X~w6Sdj9y?+nBEg9*nMih%`{WPFC-tO@ z43ME!Keh#_+wHyEKYah2&my7`u>*_btcjdVBiBhb=_lX;#@rw$#@Js;*4_7gS@OvP znBg4}7MVnzk{0gEbsOCJa9GpaMz1u>10#Y+%*iFv&6(Te9+QhH30*m7vX|Z==70jrfPCNVRGwiv}0=R zhDhR;<7U`YRbJ=eI-;#s4fh_e_eN7?-S`Q{vhM{7MpQA|{g5-4-VA^eOqT7@=%@>xSkXqzR?VjZVa=msdMu&5=UE@P%zSaRjG$zlkH5pi)92yt^Y(WI zCK_U@Ia!lH^;OgYkva$r_DPT41*snkj4AK4@8*s|>-huqPfkiF#@p9nCf`%1f2dIY z5K^OknMjU2Tz!enq?)Us`wwB7$CwS~->GfW^bI!9EM

4`YH%kAD+cC}@F67}xNOFymYWosFqDo^tk-NoAvdv}p?yELGZ% zr>Cdk&B8g9vT|r4+Ehf=gIs~t-gwrUHAX}x(xdXDsvAHGNFGBLnB}CfseKwVPZx6; zsZ^e1Hrf@543e2_uXtksEy`1Nk7l72K8XHOqAop{$u- z>*=8P8`nzYkc_1#^=}TiVvBSRZG)3w^6|`jIQ5Ed$1nl021Zn~S|E}F5HbF4+M}}J z7>>?#7t*UFH51esA7oLb{zT-9lu!_JzLNI%7?X>q8&ALHDozR`@fjm5J>E^>(gM&8 zz+a|=31`ZL4a3U(n0iNg<>l-8LK?}@Jk^0?pycuOnO*^682J>7Yp;L}<|8NP_IFV`~{o^bSu8qs|c#X(ZJS=E!Gu zkqF;#8>1u_`&b8tLiawz_`8V@O9F-gXu3PJo5mz7^%^YJ9p3eY)RIMoxt48xZR zc*dVJ>Ypr4<{Jva$>|}GyInBDf1qQ`i%7xDl4Cwaxu}7D@e9;;uo)*9QmMTtDD}-z zP#s_V1<@8gOR`nbNbba;(Ba+%Bx_QKVTqj>2g}qJ1e(kjPk&c(KjQG%M+93O%u}1^ zuhQY&p$N~H01%kFwpq2XeGG2yYN6E%FO(oKlAIK54WcNv{t#h>qG7(LPXcX!NEAng z_%^)nq$rAW{vhxTv_YZfZ|m4Wf;FBspY+{ z4GY+5elZI5FP7ZorK$b{-)fKQr9Bjw3*MvAiW1}_ue!ivxNw5!!1{%Oh?8Ka&AgZ0 zNO>;!M%rlM;u!0|QRt4Jm@>fdCr`ToeE>Q33`Tpdr4J)C7;o~?uce0Gm%KUXVy(iV}t+{xQlt79Zd1QbLcb|Is@sM#4b}Eby~Q#$iujFrp9{Q zzVZu{sy+h5b38K>C^UWa=Oj)HkrEJ}+1p zx>)&}pZfEc(@HW=SxC9{bpz-SV~p;+Ml+`@Ezb6|U!cF5qVGM?F&D_c+BHKI8~q9g z)p=PGF{XimFYf(glwrR-jeDhQkuSVlkAFk@B4f!3Jg?+4wKW`+r)feCaWBXxz5cW# zM{+w(B8-`AZ#m>HSSlS1@c`ua3Y60lH#O>)rd76^#owkkub;8K;n16!BvBSo0}GU6 zoyh_+T?d9TlAMvnL~`_Y4ZJ?C|Eu@DDNtT1aNw8ZFn5W}wRaC$XrfYA(OfWTc`0td zzZ5BmhFPHKWo3HcjQ3h`td|u0txEYB*5luJ`MPqZp2jyriJ0dUEN$-Y z0g`paD4$K=>axueLa0Q5RV)UJ!A_!K;$7;j&fnPLxJ7d4R{ zdAR$Y*W3h{bbf-#0aw@c33SNn zy0MikA$8rPJyOCTZ?0YXj{=p+Dw7Qga2)?6meg5ak0^@Kz z{RKL39pl$=JnDi#phtO181^rCocQZ0=R$0Eg%U6W=iy#12t2F@z`}ff82Amith3W@ z&IMYTq7!%P}ca8C5r%CDyqsQk`!Hve|y5x_BOwnD1bFeGir?1P?v>eCYb{noS zq2IUmHctanxAb;({lzbQ=~WBWlXwVNrK@v*V@=Tm+?%HP+fTnd`*j!g0k-Sw*_V1s zc&GpSHN@_g<6vOPr4hR7)nY}Z=)n5TYNC3(Fk#`m5Mg{NC+Z~WvP*S6$%#5kah?(G zJGIw~RmHsd*gvj)Rg$LeAURmHq-?XtcFW7Ft#w1Zo3i%49iHZ#FO{f0_0&_*s5ehb zT#9q9N7kCMW{v;k<-OZutA0F~EHD7F01Lj9JI4?5axN#d?TrIJ9xrpo_63Z`eL5@X zj7!AyumA4Wg^V+|ji33(30wXE>~rLPDfp12W?%+Df1m_qA!d((Ltf5#dDflS#=2h4 z4EbX8e-mdnsO&NmJ&R`idpLjnUV zVI^-JEQEK~_e<684dyu>1Dk6PI_RKlAItIQy>oy6tcQYICtH4_cn~`0E5R>qQM~Y_ gv%GpKw8fW#UpYrM7EeOLvH%Gsdld>DO7C;djQUP@+Y9uKt|1LKBT23Vd z5m-QgqPC6Xw7-L3AdHs8zV2N}+O{2Ae%rQf+kdqLyHO)+1#VP(>1g=R={umJ$F>HnE++qP|6HD+55 z0{|deSKSVzA&V}J(0Jv3& zej!gkh^!P%7(M~~QY1)}nX)<~JRHSIk|-mUaVkJSCTX&VegNovpmkfm6xH*mPWB+k z=qEG#iR^JuxUeg5rRhNTydkOA{esIeHK~#F^YyJ&2Sff-mmBJ^LM`T3i}BTD`~-zI zGtyy4dfbn(==Flk5;E)F-cl4WMsBxBzh3ZYtnyTWewxqZ&+INexdxiW2rn5b_$-Z$zQxwXush* zh6!tpgpc%YviAc?ftrhv=|2<8xG?!j#R{~ghGgqJcCYV~OjxA>js7nlmPlBzx zeb)6vK!+Ibktqf^xj6^a=p+a*yXBNvIZf zL0}+wRZ$Wkv$nb&flw8Zs{>L38!v-EEET7&7Xn9EszG4XWq(Q_0}SGR%D*lKq?6zRQ`0L6+ePz1-?1WIjIR0LX3I2zVqtbGTF-ZwNSj_h1B*+rN05leOV zKXb!k?OOb2a+et7LLj!>jdq#4bCM64wFjo|L>Hr~U$Cb{)91fJ(v31wu0K&Vdp2w8 zIT+UhlFD3mPU@zswtW4Ws$2_k^}MO~x#vJI0CZ_(C48 zF@oykaZY5-jy)IQN*-u&qBDlR0%;M5!i9AiQd~99F=ov?1=HQzInmw!m|v)eP%01F z-!Mbtm9SJEkuC-zf97a2A{13FXfu^j^4(1Tyu!f6)$$0Qo)O2`@qwJJ3#0`gUcC${ zV-heGW2%yA?s}%kdK%79L3A*zn{K#>tI`K?C4vx|t#|%G5$zv1AkxvG z|B=k37a(>{Bau_j*~f9?+wF}T6^ii8+gEYib?L*nvG`6e}px zAlvJ%_eElPr}u+i@RjIZT_k}WIMK_KYf zo)HlI!D3*&6$rWpjPE{yBDPclN(ihJ$F?g0$-VmpVAlZ(3C$gQ zTU2jiDJ-)U+JMTfjjI$XEK}E2&PKD}3Cz%5Rr_Bsw<$1h{a3X$$3hcdDJ)R&CA%mv zy+6p!K2x!U{a)f2G)v8-SGB6g^;bL62~REncXEqSpWYwx5+7` zR9?T~{x=dlB)03|#Cop%j#C!mvW5_{cJlqKe!S&GZKBLm$K7fwx$ct0f{l8gP%per zS&7N)4Eg!_1J7-vVs2_YFlRX$)+=@mj>1@U_jZqRC*EetQcRXj1V*~Wkhzf#>U_;o zOls!bZPUe{6-aA`rzZk}-KO&?hBG83>e_DvpeBBunCp$kUVW6qKZ7aIG#XY$+V3(LCzSWHIYo z^J;-d3Jb^T0G0(pKs|_#UIs}P1>{Ijn*%`eM#K;ov2`O>#sWDcQDi{d7g(}x9Tf=% z9vVKN42-uQ_kZ>g#MUqx)Zrxn!Dqn{a0~!93>v_im#IF$cAqUNYz?d>NYC8y3nm-@ z2ap890{ARh?F_zZwdTVFG;6h^KnswQ?b!jb0upBoRFtg!;s(N5n5)lAPcRJV83||h z0@Zmm-kJs`IGE$DW3_V3lE<(yNc U<|BMM6+kP&iBw2><{uL%~oG=1|mO%P3tL&_2;ve^Lc zZsU{w5e~7#3fv)e*nzvtUu5p??zVyH7$S=%#NB-bT@&MwkHomUMeY{4>jSxMBuTQO z_F}I>WiWc~d9DKk$!#M^(*Hl&d-qJ5&Z@eF1O@=eMzU?&wr$(CZQHhO+culCZQFW4 zVk1eBSBq@?}mIh8s%?}7(n4$g0{Kx#q{Kx#q{Kxz^c(UgA zH)7OK6;+bN+(j@d8#FiupfipYumyI&He!tg03(hTN(+%j0egs2qn5GpEg1bC1L{lK zH0}>M%Hnq61StiJ;2!*f|8WBTg6B(7&5pogw_M}dxRu9%`;Nx{16iE#B7(p$c(SAc z-(Z1Aj}qm=<%{GmHYZU;S_Ce^KT9dlH_!vIC|nK#A5rlc2s*0eA8}JJ0cA-P> z7lLQN{zu*BPs<|26(kWt?Gdp5$xzAQ&aw*ldLAP9sUN_;$h!V#SqA*MorY)|{ke7E zgEa7IndjIMl-JwW1Ku@0KUp4f_(qYFSaVS;eyZgqmmzhj_zZ;B3Ky6lzrk{p9i!Q7 zI=3Y;TNZL;`O1HU|7;4s&MO-%cR>y9s;zfO0Lx>*4H6Yy9k`|CGvKGyYE|uq0lPG4HPl!BP%gB*2VA<@torE;#x4ILu0~Mr zelTVn0bWVj~Fx_X;<9nRC`0$7?*(k#yyD?Ynl_O#wR4ecWOcFR%XPY?UnC= z(yEv8aAOq^snm!UxHMj>fu=@UW?&GL#x3As6@@q=j9bkrGR)o3NuK!h3R zfaztF&{VOPXU*J1RS9Tgj5o;K{5stIiMg3wqo9Hg#yyVFHVSC`J8;V6 zf&>s8v`r8{(R&c&p0m8BAgUWDG-7ME7TWuQumi<5MnfXvAk-AGZNObq>7Gx!VCpMW z8ika^0H{b{bCWwI)1#0JW+t!Oq|_>$ITG0VT~o;QbQ}(1yCTsSMPI2Qqs{pLTuIok zLnK>is505V-f8cTob-RaQa!T|XTo8TD^CV0-J}7D7aLOJ1SFw&l>Yt5oAAl1a~S^q znrJln@{u>m*KeZHO)xb!hmRL|bMIcrRSGVu#72o%f@kxpCh|?pe3hvTb=r^o(tir| z96Mj+o9=qJ^Th^@i_gmCNJwCJCBO)y%Hmq&pW0WL%1acV7JAA2vOHh)USwVh?Peq#=_?C)r-V-QfvY3 zCQEsI1w2E{Avw(uq7SlwR>Q~Diw)Wl`?(P z1Q=sx3!o=eh;e{%h#vr>mEd7#UUgHG=iE73Qhc-mjv<;eXZJ`RxVw97Eo6b676)KX zxJ;SPPx?7pyYC?3>Nd8a_JNnJ62977E3FE4INoiKeBW>Mg2&jcDiRJ zGpC+ztkz7br~l+{J`bv=Q(}^&zsNn8_k7H%aTwlSWUSGo%g>zlqOkGuYcD#YYA;f$ z-%`liZfPIM)^CcaGT5)y{oH%c=-MsqLs`z#ZYkXSrf`ecHc8lj{?Eqmf}Bv9(-K#7%6iy}l++;_9+hR5_z~5YAEax%1Ta;QLIf zn1rce=GO%nV>%n)2VJhwBk2FJ^x8#17rPrr?KTO@aFtReFFSv{@)+=utL9_p;1@0j zK?6VFq9&+=)X3ObbBv%5NEyEcFkON^)@Rq>RQW%1-H7&J)CB zO;9Tv#%uy2vL0v?1`-;g`Dr};M5(i4b%iZcj$x5w9a`IkK}h4@8yu;}mibt3aJy0O&70<^-sQhxS5&V*VUcj zPvfuk{nX7#m6LiMo_DO(+t&j=Xc*U+nOUg^wYuqbKXfa0%k>23sr{!q!L?hvb>Igj zgQ}kS)U(zN>E`~4CUFda$K=0zUCqDe8U;=3lHG9eOqzXdHs8nLu+i5)m15S%`(=HH z1KkPh)8I?#_Od&Pt=Hm+Ew*f*U#V4cQZn4$g0{Kx#q{Kx#q K{Kx!PC@27K1e4|f literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/mipmap-xxhdpi/new_app_icon_round.webp b/messenger-client/app/src/main/res/mipmap-xxhdpi/new_app_icon_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..8041fbcb079d16f28393b25ccd3dffe6d444d65d GIT binary patch literal 5920 zcmV+*7vJboNk&E(7XScPMM6+kP&iBs7XSb+kH8}kRfmGMZKRq%?0u(05D^oQe=XEh zD6{1YQS90WUPVsxvrJh|SOh^5YbJRb~GFCp?#myF+s_mE;gTxshaBRW8A(}DiR)Bi}T;zl^5j{9;0Dx@zf2`TIZQHhO8x8{iEL&l#&6Trl+cuN5 zTmK=rk)%k97-~GO2F-ndTg%%ZdJuvcLL`~lEVt$J^bnF-FBkgF@V^(c+&0$Kdh)jb zVMB}{RuE^12qHc9R{!1D8P`por&rsml3XuXgBU=3APXT!Ax|I?kQ_)2qzfX4s3BSi z@E%_O)ouR3uI``x;lzjki(pAFw?!HAzafhucOc1-R?IgZ5N4RLi$Ibfw|oA#*>)t% zYC^Ye$Qa0FNXAzMdU(!9q zkeiSSevOC5Rbuk80f^>hlDJB=7~_6l02!ucvz-6qGzQrZ$;TM;(D6`9D7DB^iR)Xm z80WrLWBgwrTO&vyK=cmYL)&+RS{329;BbXnq<5$ETE`s+E_O48H#6-k!QO#w-3ew2m zY+e~?3Wpt|p`J?(A5zHQtX|qQ6jzM_gJ0ClMS#L1ndo4-eM^;!v}HnP?1C)kj66Ov zx7&VLqKL1Zm3fQ|*K?_`hIBIUn6C}MhH{3^7sl+n8su{pHBe;6yZHD! z#Y?^UO$snKOi5QYIC6R>L_A^{xOF#w$b?$jLA6$cea@~H1}C$JZtE9k&dLfBkOUyo z*QkxzI7VMIG|xu1mvKQ8t2RpuTKx6a^9$>Js~5$v_*=Fy)^kS7fv1O>mP2_ zT=;IrIw?Rf!i-fwqM6h1NTHh>3d@vr=^rkvCfr+MBh~uD8MES(2_Vx;sf}6LN;9V@ z-Ks9Sxdwu`&}!mn_o|b?mX#JnU_Y&t*_aSZ9$nZ(i>!XgOmN{+aKv7@Dc{OWiwkXH zy34`AXr@uuSo4rxuH{2SWQv*?kJV9+OV8WlD`|$qGfx!$D9p${6~k~bIo-$&>33=yzc5>N#bQJq<1%?~W0(Ge7{PjTt0OZz0&Qtkf$e7MRJiExD((I>|T z)2WBrkD-YpE^W0)m^ZO{;KhkRg$zS;dQDdD)A0NMf-jf8=KOQLK!TO)5|WM>WAA(??7rfRv34^t0kq84mcvxnmog^ovX$fM%2nuO}r4YmwDe2SK0y z;#hQ4uj+0rxN>4p9%D5^#ph6DDw3(J&H{sER-@x#M8mRh&cUc?Ga+C`4DM z_afRPzymjAKPz?;w6ZiBrL#j|lnXm2Vi?wR(Q(X0uD z1CL(h?);fG#c^TEzg8S1Xye%QuK=;87wYcB%*A5FeQOWTfFt9^m|_kXiuaHdRKRM5 z6%@*fAuX4&H5x?vKNTC?PPv69cU&D03{(aA3?KrinTbT^Lh7)Gj^Wac3Y_d@1))gP z)gh;a-?ADr}v=(V+_e!n36w;8-4&rkP=`F;kosVUR*psLJgh9Ut7)Fz*9l zjSk00y-GqAD}hX*w8UX1=AlFMv5!L>4Iu`MXXQbJRfOmcQ5q{O8>7HIIeW1+TEy2+ zYF^LrQ-q9U4_p}H)Swd1xKpq(SsHGkDo;^S`-mJE4NX>{lhbN=E~8-4kaQXNhDz;~ zvk;w7GT9Alm<7~KIDqj1GLwenmWfm?;^AZ+>WdO9@!=v6MWvz10kBVG6lBp5ETe~$ zm10!#r{;}-uw^MZIBJ)clA|ULA?T1_8~M&rvosT))leUReA-^Mc2KX3Ikyoy+n)nN z8=i_0V_-R$AiY=?jd3>WwI(!@TM16%>RI+-;YO`_(6w)Br-HTS;qGZ*h=vaJ35eHA z4pPmNUQ&H$a;D~Qv>-5O#JNY7a^)Ak_C?)Ub!QUWackM0IuV#Im>aObhojIm3v4VO zAYoV`w$^l@5}7YjV`yNax@3Nb^&i4NR#(S7${AhBH2$&q9ai4hS@r?tD_)y3Gdh1d z#e3OCwxb=|1UMf^OuFWYJAh2ay#$kT zFcQ0bM*8+#O=7lV&{P3n?aX47hj>W{--VTH8GUdjRHH0LFa4{k*PyA z8!WO=he}K-$7$YMxK?lN_`*u|(y9?MN2_?SL#lTH{?K)qW7}MG;$)RiZgqM`OiFCV zPoa(>IU@&1M4G0Ilk7xf0K&`^q28x5df`Fpq0f5xN9(EmaPGpm+%MWNWIs5~7eC`M z8~FBsEjm3@hpQqBx$LQxGd1EH30LD($!Qp{p0Ew5qS`Q208C_c2m&CC8X7>5fn-!R zXrLZo)-=3+7&I4a>*DK`a?sX}76JBvEYr+*mzoO?yZ8ko8(?rJjUdKJLj&+r@)h@q zM%7U?V7)j-?d01o;O=FWgu5J#%p73=c!{`;O2eJDS8PzSFKk|_Ob5#6mG9e(B<2Gh zz>UIwjChz>j*{4N7C28Huw*VcPyygn!#w0ybYI_ykg39j0bEBU1j}b#lN8JYYQdEf zV1rzXxXQMQCJGU9P3@Hf4hu0*EQm1$XAOk4nQ0cOn^};!nJ)O9{qwXd>oq8Op3skRg##0q%ag53C#>(0rX>W1*4KP zbhbmsbp3+?w#-*Lk9|7UP%sS`E|s$wSy+E(Y-Kxi%(jn2V9oeoxomd1J_W|9Ky{ce zl5BJ$zmO4;En!28fSLU;3=@t(&&&ySIGT}y7KaN5V3vwlRH0aP5)GJ7WH_o;4G$Vf zo+?NOSZ<+33OL2YU;~UJau%5hZ+{op*1^bAz_d6yD1rMy6N01QD9}t1rq8OFB++`Q z5HEd)p~6aXJQqf@I69hzvA}22uryQ{M-SB(V4aFwWY-2@yJNb^;;Wf%VEWF=Ot6Wwu;X|z09b|Qk)H&qGdxqe5etv5X}Q3yQ9Tb$GEf5V{Ktu*;F-Gl z7XZ@*Gd3Mcj3PeoBs>Eq@~7*X#bHp*p6R(p3zy$5?5GEk2Iq_&EWKJ44j|~g zz=MLJv{P(zC-w(Sr&JsjERU<7ZL~=P;n7_HKrk$90It;&v15vXTdJhD2l@ZPil|)S zN5Uw)G%8;(xKn_eV2a4DXfYb)E`#{By_>a1I=-nxhN%mk{SX)J_vKYUCndXQTj8vX2I zSQZy8S(D(@!9R2KYE$5X9({wz}YtDyM6#>0|%D zFB}@}d|3b4QDNgC*h43!vmZJ3c5C3m#oi)#dkD6fq06!>cSPoj%i!PLx*PlN@)JRC zX1=)b)~a4Can=W_*lo60WUyRr*qz;8Czzv`s(YB&1Ki8!eNKr0g%Y0H$oNaqEwVUK zd*L=D)>7}RFc+RLoYp46ZL%rlZKL{(moevVDLOi9m%BapTK9Kr6$2(!#s;hAdmC4) zo0OxODmYY3j|}jrg6M9QD#omTY1vNMVVm@BB()t|o!W_|_akcx=f;nZDO3!ZRCzHg z5&)tj4+XP=0y(-)Bl8_LR-Xlkt0Oa?r&PsalX_mWO!5G-&*t%!X#_oOjmwCz1vrl$ z{~9T~ji;2&J0&Qe%Fz;ZE3*rQh_(j6@Hu{__ObW`U;;?pSznr51VKarTl2uSSe@4TQpe>1#-u9kNQh*r#{{iX*>mhB$| zL$eI7d*{7cklV>4Xb0G{(^Wi{00+yi@5Qqvy%E2d%2tng7uTa-oqQZg9gK$tH+z7^h;ePhW4W9U z&cHQ`nWU`vYTZ`Lz*4#F(Z;)5ws#ZUq6jQH06*6-a2yUE-qT@9StLXOKTwLLqK=g3 zI+hhlQ)9aKN8g{TfX+g{$}~@HGU%=&!acY1QaDmI_4o8sdWkTQdMUN>KxH&8hU3n; z4}RC6CIudcig3C2YTw~7a2gsO-lHIR)x4;gzRpyhCaI_to;YWX^sR(fBPZ1RX2Za_ zL;GIcskdlG=zKdTk{(lG>KgbS5{17?X_7LYkP>t7HAA3SEkCEsG=8>oUmbadNRzUH zJ{=AT#}VQg=sYv#m&otn40d;}V#H{MXYau;0SLz6>iIJh7CHyEd4mpp3d+b?ktZF3 zoEjJ*qGvl#jp-}rMO8GMytq~@W-1|V)+EL)ed>KH<>geF;r#5wGyt#)auAvo?MTN0 zo%;_RmyZTIkC4D6ak4DZLNeH027tv%Q?pXqHKiEWnE-@haQBPn)CdT24*cjx{5vn; zNHLQYNsFvkm;85apv^#!At0L`^On!O3djwO{GP>C{1PFR3LPhvN}DapuW4IqC@k^^ z|7*I;e~w3Bn+@DGze}$&i$IoTLFfKA7!e*rLo@_L&aKasMa$t<86;Lu>#HtS+z;bD zD3wZ6(W1mjKxdLDm3zQg+EQW=4P2*85>7cYmJ9)JXYX3peFK11=PtblkRp}^0lgNe zyTeTm9oII8h^L41pkrtBeA&Dr?w3k*6;y$)vR!wycG=!inG@W7T4o7zwIz!S{6Ajf+RXK&_kX#bKR>8BSaQ2Uz89e@j zI(vB6(&h~Tc24aBy#PICuu~rGq|aNBxbAVPj+L z1eq{#CY|nyvIq4y1bkW_l&=lEQJdKtIeyDTrq=+2LNH=&z?TyV`=DG-#~%_7AIaY4 z$Pgc<7H`5l2=gYamc!(1Gy6wAe0--|LH0z3uNREipKvSa>vFly0cI`xAAghGf4Gs4 zeB_2V{K!Wd`Ed7}JidR+19W~l7vF+z)EV25P*@BAs?M?3CVgG(eJ)pbQ0IgN)qOc1 zdl%m(dv(;w3>F1d#`cs5sm0(f3()D@1Wcz3khvQygqFHy+oZ%ez9|UP@XcrxwUz^& C#}8Nl literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/mipmap-xxxhdpi/new_app_icon.webp b/messenger-client/app/src/main/res/mipmap-xxxhdpi/new_app_icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..3363171122a861fd8b39f7003ef246bc9f9ba3e9 GIT binary patch literal 3358 zcmV+(4dL=qNk&E%4FCXFMM6+kP&iBp4FCWyzrZgLRfpQPZ5ZqS$DN)rA|`;=Wdpr5 zLsPN;U$x!Le*l3;&0}U}X67(6GbbwVoqgWD{~b;y&=H`dDP+|?7qv5|tF!9jvueYM zZCqCdP-bpOo)L5aoj`N#E~*z!PBdiorsV z0Dx@M|DU3*wr$(CZ5wgnFaQ8D71eCp*|u#Cx%xi=bhH0oWhuX1+}(0AOGzCnAa_aK zJ#u$EL#C5W4Y>6%H>8KXMPOxY5z_%v07bZj{{krDm)-)%rVtvq z(M(CW^xz$w3V5b~OAjaAd<)nTBH(P>cDy-a+qP5Nw%fUzIoa+X&~8udX4}?e&vEih z0By5Pfe4VOA?7_u`XaM4KRDX%dw=fS@cIC(EyB;dv?`mCcuJ2+Q_!*1;0y4Pv!^ zDj=E7^=dGC8i$cM1W02;-x`q4z1M?9_5s5VjxevAr1dxQ5sxklQ|9rk7#vfe0k!e4 zekvfLPyIjh*jd$4IO?NK4)k48vOdgl0Yudu5<~T~rjz;J^gc3j*CsH}XRpSy2Et$% z8T-*Zfrd>^_K7ZP8!GOjzHu1F#{qVxuwC`0ZW(!BFX|j9xy%rFPCC8{@Y9DIj;N$8 z?CdYq?VW%E2vbDLOJC^;6!(^%G)i9j$SB<%5rMiFNE1cNOK+L>sj436RGH}|%kGGT zfKRo@kC7N4S71SSyKynKf3ccBu*MszMk7@zq$+__A<)&UkZ4sBsYb!oX}HD*s`Ulx zvLs#8iyy?S-DF_8=IR^Tn3g80gP!=RB?z)`qgA-~EWAit=o?7SW}2P7b>z2mnnOeSyrnz>jjyy9k|14%?{Z`nT=OOuW;kBZu`zimTVq0lD%Ulh4 zWn}*d>ls-8Ozf{FFLd(_a*dtzx*0{@sp;$)W%-X}B&joVJ~|@bH{LA16Knl|x|GT| z7S~RhYW6DNhX|$y@^G+C^G(g_Z@4a`GJ(alQYOlMX7+~&t{U`u?s!pM#(KHOwuOH4 zAQ5ae_~q;#728Sjx(G>`3*+wVt3q!g_{me3)HNtJZ9#-mX|CB8*(&0?gC*{PekRVB z2&+2sjH>2p&`{k#iIZR~KM*12T|A@87=}G@&XKF}{~*F`tT>cB@|dgn0V67fF+|vP zM7R7i18bt-Ttx+Z6XDn52VY3=CGt-eyuNG%QP@%S0vp1|r8Yt{HdxLNEO?h;^S+52$` zX0i|B4?;t<1%9bBhnKQ<`V#`LlVe<+f^nko40U;cRDgHZP7)`_|3e@)l%2{wXndqw zo0bG*WniXOiveIGTQ89r_`pQ&oQsR}VFc)m%%5+(CBa0FzLyLYnP2us<3Vm^SP`(5 zA-OUh3a+#PwUdBP zv;sErf*8CxGT=1%VYN2`-uXOm{B_WY?W}VGeF}6UEkOvLn|II^xN>(Y6YC3J`)V`{ zT)vq}z}NVD^Z_n~9W~^sC%G6%PyLlFsX{MZ$<;u1(&U9wmS!#eUP~CrSdo=FbFg)r z!p8i-LZ!%2DDxu9qImHu8`DXdYIaH%`uijr1$T0pCs7u|OWc{PL(kH<>dt~X@^FuI z^RLy?PjXbLJC$>0+1h6PSRnc4CTumopo@Em#+#^ig%2W^VA&V$9_~t!zR$bVs{R13 z&hiB6o35(>Z=`KKAZuP6+Z(u&rmQUnB7jj`8fo zdPlX=N@m2;u=#uT7{`{ z$8k#z|DGVr9NnWLC*f6&=&Bp56IeGtIUiVUgd) z#Xoo=x}EaR)+`L`S%ghZUg+c=by*gaFWXq=!wHLRifm-yvUL+|K&t}0%RedLHh^zw zI&iCx2JbTkaB0TM19<+4MmONPtqAD2I z;Cw|1TKB>mg~C^SFOC6CPjX$1fwWXhL zp?L92H3_iNMU_yT;zhnEFw$0iC}y5lN1m{J`${N&N}ajxD1+}#8CUT|>^M>w_?JIlj|wyx)7miV*V-@H zD6*DQDWz!zSDKA^v0UI<>`?m3QUQlT?C6}3#Fg_~eNho5y3vHw<2$JXy9?B4TgxK< z+)z+F?e|nd{NP7Y_7YRZ8%;BkANvW+=w|mhESH|5w(uGwVcX%~K3=E77a zunuVwD&$b$ys1hIr`)wq_-@=N!zw4~=mNGLGrntwh@myS-HUmX4=pFZ&-&9==y$CW z5CF0XtPPy?PNig1Fx>0Hly@Mq8^|+UKxj!zx%A#=Zqrsv)w+2mqC6nhTPFif;M+eaW!= z8^iR_LrtVfUg9hifUk#9zXUYnjVu8hd)~KX!t%#wgF$D5M}O*KAO%>UHYfxon8#UM z2sVI%xMj(KWyK3BUOwc~69+aR3YAePKC)AdC_x9_!%xi)%fs(}zd!xH>8I0ve{@Bd z1_qi3pKr4%`y)jN`79S`z;93s#+rP(s~zY5@+DwRs2I?uAN^o$SQ=)5Q64(4&)?;y zulIG&Vhp4{vVjHSy7YB;<<}I{Rnss_<2+CPKbw6{*BnlhpTjkqW2*nLpNCrRqNS$b z{8w-Oa4-8KMJV|!zyT!|sYTnc&sR11)#P7eSStnX6t!1s_U)FPc-VhcFaGN8=OeMV zi=D+dh&?wHi-5XjQ$xND`PJlmaa9St_{qwZx6g~jLaxVzMR{&01;Q#p(AVr$uWy6? zjRiCoX!8FaTCdN;Zw9NJkP5k;LPM;)V&4G+xP>4CMP3lJrXS3^=a0hca=$C)DJHzE z&MK35J2!P52u>(8{Szu(m&$!RQRXbggqoFC#nasYS?`*e>rp+}qoQR$i^nsB+FZXK2|u=lA;)+J8kQ&>{DAFsBkpXw zF{x?WfZ>m~yI21wz>59<>t;7wA0O;9&+qe_f4P;}WVxOH1K;oWs(j0fV8!iox|6Kn zKDxAn?qOWE5qn)(U03wo0B+#A!q3ea_ZMXfE?^cAmGiiJ>aQGEmmPEkLEn+%;-duH?$G0a<3&_xgfo$y^&wT$#BYUl?0v4lbaufr~pR%*a%68?%&9+irO`LlBHUSiR8X>)449xmk9vFbmgDJ;=rwvl(D;)#_Ti+1mISMVMD1OMw4`~n}2JIDg05>0>;mAY=4T|B?R zLk4!Y4eV6A51<M=JB2Ce80Kf^{T44u29aXinC`2jQ7Bymp|5QHgz9vUYgQylOh5?M$ zT`@|Lw|PHf#S*+t*;NKbf)+#Td1Nb|Y3qveQ+qjt4+&OOUxRL?M0nhg02fwlOH0iv zIW_-5m;yem_@>Z~Xbyqgd<$vGSS!ko-9@CvFSxx{tii*~GBX^pWyQPYNQuC>6~Wh7 zF>hYIOIi|y*rlwvr+pP+!5jtfV#Pjqaw?+YOACBj@eh#lilEHAuu(9e@-nwU7L%bJ zM#BJ2jDCYCB*^B!lu63GzItlVlgr$iuEon z6zhRUqiPBXl!>c>Nu%pvT@SZNoFNd#oGdOT5dE7OY0r>|!(vTF+l~v0!+ulZSW}lU zWNvVNY1Az_w1ol07=2GZ)oy^Iu(Medn-M51FA0fDi;cqFa|uFi%hFCF+e!|qK5C4{ z>)u-o{2Y$aM6#{K;9o}N?)MA9aPUqha|8*&UyRPz-0kiIC<6c9noz;1sR&%rDD9YO z6oAFRDyhs8v<5fxvTtXK*G(+zWFJ~Xqc)nJgnLco+U%Undw&PH z%!v*2d}|cw1^Sr>>Wtnk)8!wXb&G9Hu;5CQbwdNe%mZcJQbzHU_b{%@GfuLx{fyiB zd1G!yGDBm*xMLa3eOt=7rxWcU6~1}eh<4-^*|s#;BbptHZMCx~8mP8B+x~AdAa z&SYDIZTleGx;0m#l^DYI%v+&G`ch17|j+q#+XCab}$m#Dq(q^djphdNcWWx5#G`BW&LoQ^& zvspExel8V``hClGvQo%E8UV_=)c<-?Y5$v*bID*JE14~t5mKROUW>(qOMID@&E{*) zfxHs-Ihj=1?{WoHMAI5(BBXK=tD)sr@~Kqm$SWlae_`4!EdE?v_Pv-?J>YhEghVo8 zg;XnI4Wv9G4!E0C-S1*I7(mrB?NIThhoQ@&60rMzaX20!)e8?!Mikykz%I+W@jOFJ zyJCDb!j_3amXOgFid};4z#GN1BgAHzFoPbKjYULe-!pa0R!~z%A22W^64xg=#k~f-4ay(T~t>R;ZTkqCJ^updc=- z@7bVCH(V9JCA1UHZ9>IsSnD(GH*sYpanRGChP+>givaV%=|kTSbzl?LSf(8@E`7+` zpoV?@23*rpz?zf-cjGQpNXH6H+h1Ip4nTQyxCk&GoPHGQz$UD*OnXjTT0E4Q9tt=o zSY@x_+$L1KhP6J^_7N97fNDD}!MhTH68&(r25JdmKbdKLu~qOGs!G5J-T+YV!!jU% za2#qP+Nqf435m^G1@rkd0@aBdD25PEe})OKM!Pc8kh;f4HA04oB1|g`5^Z5n6wDh! zAH}rJ_}u#;y6qN+LS>x_0*Gsb8utsL^So|6Fvzr9#78&!o==^*j&O~J=?GOK*}$Ru zrn;56I3)bZOgmaBK1y(?dFm%@Em^1tCToO!;;9-(0x{?-ooUf+Q8nZMWyZ5vB|#;k zWh?Ut-?-NAYKp>TT`~xN-d>?3_{<^}cVybdx6TDh3q%pEo`-A=dHcI!2Biamn6zR7 zi8c~{Mp?vUvcJO(|k_< zJ!1Cz#sAk&rq0=}8^q>VhzQek?i`sAZTK|T99d*rw})%Mg=}jm*N;WEceCxB3sY@* zwnfJQ9Ghy#Vw<{ZA=;6nUQ)izM6`oc_~t{LXqzhE|9xbdxx}1t)en$tY(L`^6+yC- z_i*k7DaD?noNwHkVBxi_)5!!I{WspZ&{So6_nz%Kyp$snP=rfVy%FlzL^O1YG5WgbJN1f=-eNb=&Cp z0?5EQHlx$iRS4frrtWACffTGaNF`6SN@2}5aF7Zjb>CYIG<(CeK8-+>%3U=;-zckK9+M)ETto%)Ti2vV+WKmh%%e4vqx9fe zRW#8A7&WhXi$rB}3^B%f+M-@k70z!B#+P2xC#m0YvKWfRk*~OzO6M0sT;*1v^DWh$ zrOHJij2W)-`C*H-bSl?+ygJc6P5%0>Q24HYo-UQo${I0*9UK{p&Z>LmtlNLQz^#AY z6;(q2xqiJ3Hof+5y0_l@8iNHa9dWZnMRdPbzv-yu@2&Of7iLszTByK5=hak5H?5Cw z+rQkjQR{oY>z=*65MB9-4^SzMjsrOP-nQ8fzwX~A?{+|)y#COE#JQ{mj5A=F3 zQF%RE$;`smpRJn+G-`fU-*JC1xqe=xw|&k$7gv!zf>}%J#U7w}y)(sw8vkqcG`Bi> zk@y{^s#5#3fv>DMpXPlM9S86SCsq#`wROma(QVMKr$6f7RTbRq9L`y_VAlKx;h)z% z#5LXpJq0i2P(STYKGld5%yg$=lXOU9a+auNx!LcR?|TlYL(_AiSFSNI0G)dY=)c3e sQE6x0{!Vp0+)*!SMQ8Ls_doYP_doYP_doYP_doYP_doYP_dlmK0G&2Nq5uE@ literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/mipmap-xxxhdpi/new_app_icon_round.webp b/messenger-client/app/src/main/res/mipmap-xxxhdpi/new_app_icon_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..17ec02729a6fb4c794a6f20030a7c62c16f258e4 GIT binary patch literal 8210 zcmV+tAno5$Nk&ErAOHYYMM6+kP&iEf9{>O^zrZgLRR`m?Z6rzkmz{HFcK;DE0sN`u zz;@wc2K4AUU!pltGq2+^Hz_xCg&PtBvtYheV|JTSk-9cEGxQ5ETZYIHhHa+kmSwiH zt}@%5PA;=&!>M+ra}{|iuLhbS}KOXiMzoiR;Shc{P;6PlvAofy(v)q!c@C3NVB+u>$<0lk?Sm2Jz| zp`mN)z5oN8NVX!i|A;F>15Pl23W$h~T~?7KJ5Be?WDk6!0t*==(6(*5)o5cosg2mR z@on3-ZQHhOv$kz3wPPI#ZW~FGsie$vnL-2eN%@0p0kcUa&)Ss(-8ksS{+gxHgF;hXFo*?X7o1k91wJ`|6O4jt77 zIGPELro$My7=U;jvbW^;&F+irc99m zSODS^MRUQmG|d=D6vyM303>7pijSt30g?q6z<~n*gwp?K+qP}nw(ZU;hXDYPsixVs zvu)eNdT17$BGp`XTzlM z%}(KSlKC|R&;U*VFMtT(4+sZD0Y+Z?tKRwJeaeMh!~ZlSvkRZ3K4%h32mk@#0f+@G z0vrT90Q>-?1IhudfPR1uU<6nIRsf)4_4&{8dq4V`cIh)8>-|6RRPV+TBFX6sUzj8( ziw6J;-~pxr4g+2TiUFN!BousrED$l&M>~P}uK-g3+^1*pa3=Y}jr~5szW)Hs2i&j& z`Vb+C`B?avwPBd?2*W}W4FsX(_*fAkZqT0c?Em2-zGUXZDcBFd1451khy!#ZL1_7y zwB9hR)-XWquv)zhPOh~eJpQcYSO@(D!s}-C{}f3ImTd?K0vrQm0rUtDfcfN{RYyr! zyAG@`Fg zBH=x`79n)BU%3SZ6RmwoEc*-34v0qx6$>+xBEAbD{yVOu&~RV6sUx%3!<>iB722F)F+# zw1kj1Jic@piX^r!3P8QUgJEGk9SWvlMEvP-g({qEC^3L8bp93{^Ma2N1=BS$qv&w1 z!pHKM2v8G}ks}24$V_E@3W?VkHaw=xBF2#nIx!gCh|Kgzx=ix$m_SU%jtS5W%QR1t zgfo<=-ykG|$9SlRWRxdKqB%ZtKnEe2Jal8zIVgdiBuU;kfLal5%rxTxV^TjLTvk%U z$&Lk$PYxj&KSm|L4_FdgQJo(cO%+aze3F|(RK6> zZ9Fq8$K2AfuyQVJ-BYLFz&+XVFIA(u>FP_T(M4|YX44TOkAlhsiRg5}z=(XoK(IbZ z9LRdYIE&Q95@E71wC+w1Zj>AXBNO9ROZE`419|38j{fJC0`sfP4Rqu;Q}f0p(hqGG z8l04lk|?mM#|MVyiicH5!hy#Ugw)jcGEuDFP7AD*&21|YH)Ig03O?_KHS-NlYBrAG z_rWY<1GQP}Ns>U0j~`$Fose?hMpyX*W8+Ru_?Bn<7*u^U#7|SpCZthpau>4+M8GRP zX4z;A_D?9~!^zf$%qNd>Q4Wqo_fyucxeDKBxTG$6*?A^4mQD_VV1B$1U^t3`pnIIu ziWD9mwT|bFx*mLeGT=8uvUJ{d>V+e&1k@YEcP^{lJks?6Q5>uItnur!OBaRL^NMtdx{+< zvk4SqR2LYQwx00t^a_%~voLIVJg1V&rQpPw_iRrlDJgNn9`z1d6+Y{8_*%SEvI^=P zLzsooENp{aDnNOrT18Bf(vUm@%9RWR$7X$WqXPZ2#FIoBH!>VPRn&2^#HlA%otcC+ z-%xjGa8&buAhr&NqP85)R8hZb4&@?spW{e_NWWrDnIFh8{!HT1lsw9_a1@vI84DPU z+vZ=Th?{@_fSNMLs9odZ$gFOA$rS4Xj;W=eQpfZch z@VCFu69kS&Iz@9u%pj@C|1grIDSgyhTV+_H=7W>FRY)EmESi`nWGO{+$FOEz#0eQ$ z(hxsm2T2@<)iM%Lg-zxl(9mdH9ZkpXZ zF4L%)UnpTjBFFfP)#ntD#?i^JK(8z|&kl9x_(S3$vUCwO@KE(^5C@X9Ut@FK#2|IxU59T z3XL?F)YlxR5e>8RO)^j%-th=PZ|qQtEB2W&P@(*yKwagNYcRs4$d1B0ISh^aCjkRz z_K7zWbI{9zph zpwuG+y>rShp12IQ=CyzeB>^>nzVIV^nPud|lsHkHodIq<9?&0|OM`5FRPoja!jFP= zDoFKWH0ZfZ37 z7(M9gj=%|s_RIsL+9?vh$i|smH>gHdST&;v5jO;OY(+z2>73cFGN47kb0*{HY=`b# zU}0a<#59*!ABIeQjBYq#Jd;Pnt+RZP1>^Amx-)kkO|TOxARA)7C7l9vhb%ryKW@x3of6VAoK&1jZS$pPzP;C`o*G55! zP#XIq_`{JG4!J*gIb~Qm=e>cJb8ysqW{i=c zvLDhg$gYbb^)fCHN(kAAhXoEz?}EDMg^B{>dxD}yTC)3^ z07Se%TYkG=M}Af2`N-%gFTcQ;5U5Pa++Z6olN8b0!=Wzau&BRR5nuhG)ilSjZl>;8 zZu(}nsDG6r2PqTtMv)UCE@5cO9=_#Dt-aRx#WnlT4evty(zW%DmH9rRX;c+{T%z5i zjn(ME|J?Y=)!gbX$*zX@iRezxYyRS3U1ip!b}e{ClfiSJ(R;@qkVeKG(lM#V(uScMl%DMnR8R&i8FmlGQ5HoQ{jhim2@}iaY$=B_NZ2vd z=VzT#DVKtp1x04Wi!$Gjn|miqIaGaPs)^o6->LX<9K<`Pg$i9)eqW-d|PX%I2Z&S@|Ai)E@|> z7P=iXR{lg}cp`aM1cjl7#qKEl*YF|mj0^_41Mj%?IM2K45F9W*`4nqBgtT)=*QZ8w zvcM)opxpr@yha$pB93U1TlkofonC)QOXp zFkxcaAYIuRJxl``l!0v%O^)@0mG2b^k9Gu!kXn(UXwS|kbI=^5jEq~xZ&~6O?vY%v zV|Xy1|84OtRR?elib1Wy6cj}4AYm2*+RcIK-W;Lw*Cxjf@C~5>7BT%4l4+i1W?eP? zFoj7)vD5pYe6LsKFsgp#3d*=PC3+Mue2ht0Iz-tcTV-;ZJ>%=vf zGFa4HStHOKLw)Trb{0#;u=a)b{&6LmTeeP6qtK~+;mkiBBZFlOMPIt5+og-!r#kzT zswx5>apk7*MS_u1g_;$^lP@1E877xwu*N3~77fn|>ecKbZeU?wjE^2Aq9+OeTG`4q zL%xjUsps9Zt%yPT;|T|>GoPWU&vh=*ZfGa_ad<3#*gpeRYP7Kj+MzLU6`+9YmIE@hH74aOA0jEt%K(Q#*&x2b)T3!2 zzvMrWGMq#G*}!FkDzvT=sdP!;%^sG-YQbPI$Qbrxk$`xZb#URCZpktJbg?yb}n%vb-<3Eh9NxOM-&I9*7<2d##Y) zqfgiI;AH6jnNghE&C02(TJ7FvgBpl(jU- zeh)bwB7PHygQTu$K_{Du~;Fqk5&9P{IV zHP6^JX&A0K^8~LXhdKI@Otm---Kg-+HRjW^YZ%o}3&5II9dp<8NYS_#`Nm~KE2+R- zJ|@_P(EQ0M^8#uRtIog+n7x+4Fz<+UCCh-0?<9w7X^_*_k8}d+pc^t<&y*I^GymlZ z7+n26X;}p!X@s5R!e40*28Qzpd_-OytXPHTQ-X@Xe^dare7$n~&;RaU@q0u-iGf`b zObmy9*kQ3)A#vMKN@Dk9rwoP_)dBX*>6j(JDo~1o*|>P97-QdDCu5YsT+M&K{Bsc=CLDyoN90`uC@fr_MKc&6R2pd+f` zSTL;QzSt}KUf5;9ANY+1@4Y1X!+MZ<}z#D+{*fG4p~!a7D;skQRnRVok1Ps^PwO$Id$;9(nrjn;aYw zpr{W7?3ZVW&pCx)jg(ywYz*hEGkRmF+BFq>Tv*wDIF$?2*=Jnxm~~z_YdrV9TP1WCtNK6V&nE; zCS!1Gk)9&{lsNaEBHP=wam`WyTEGxrSvd+Y_{r_U5>g{JmM#eA+VkmtJI0*Hc~+rZGG> zzp;Mrz`!23n>`;qv+{_}P;Kd)aLnxx$-v~lq&QD6=Z+-R)9u>iCJI<2<73J%OIZgf za_5MXl+cHpT=Iw)&E7eShryWX6^)QaaX!jx)|5QHojkm+gwc}TgKMRZm;zV7Z;V@E zUG|Gc$jSN;+vDy4&$#Y+{Cd-fo-X76zMU~Kq+a}bGhw5eYum`M?vi;d1Q?~kRb;YImQP4J$NJ9UCjzR~0=V!Z8{m78r(JUI7z zG3Agv@KUhl$cMxb_f7Ka{U#}uiDB;+dcC^xt4F%M6wyjFe{lZA>XJS<$Ld?G(Kko| zC;_8n+5-cfk&PiaWQVws?t$N;FPRHo%~nP105s41o1{N9H>kaR))YUwPEP*P=s)zz z%VUShSsJ3}2rS&)Q+(@WM?Edx@aUCjTM1*E{db9;WDoonoQjzzzURI(R$oO+GR=J> z+8MZ@YN_E_hEB{jYH(75>m_5;4n7E8TE(`*?LPlc>nIHw_maJ%+dA9MT@!f;B}`Z;i#gfz+gX8X}B1o3cP3(iq$HFPiXOGD+Fw+NQa1~525cTUiB)Ga^LkiFqp)$a2j9I?z%M>l>j1#s z`560iZQ`z(LM#sEKT6%N6ZiQ&5Z5Xc%hT#46{mf!3;)u0c)Hgbe5?>RO2m)jYhAJJ zRd20bCb9dMbAtmNlZqh~+?WMKM+zwnJO(Xh&iJ1Df(h)MyqSJe$MDd;Ul)`tkkE6V zJto~C9tU-RBc`1vTnxdAiS3)}D`WW3erQ?hm&cfIod>*WBgh_iDb=J!%^m&;*3IN9 zv^+Ww6N4c;`EWo5RBL4V2`)M+jZ8$XMz6teoe#p;jWVMjR7@TxzpsjPtebhU^G1}f z(HHp5EcGz^9a0RA{heYr#+<%UjRY{ZslCJsbgrKTu~%q!OC5d^j$#8xjvK>$ZU|#H z%&b0Xxvx;nRwlx#ZB!oB(PJMi(VgQUcc9$dlz4?jYh`k;R5z-Ng?U5vz1})Nm(;C} z=|%HKoM;m5PW^ck{bJFwiS3rW_Y1-5Wm1eGU#FrZ}vW~DZzKVZM4%#)C!xgwq@CSEQwDL+pz@C~Jqcg)KHfteXKw1=+@ z?1lG%*o#RNq!Ld_4^!eC5XP25x<}4dLwjYvX=Ms))#mqtZl_#IjlG0KlTb>0q?_#R z!Y_>|b(^f~nWp!vi`B~%kJ>;vS~kz-)MLMy-IOjWC1{r8#&B%|-?<_wg=9I5>WUOx zWn}{Uk~M(+k-l8Ue%oA-{#?F0$KVnqErzrtD&f70N+H`bH~T@;>Lt9iXVsV3Gn!p- zH&FE62~j0d;;Hl)4ryAlZ4QWvR2ye$B}xYdTA$oXYxd;h1D6^^`NmnHD*9<#a+=gZ zNSX|P!4z4A6Sa#VGPN!I_ra5X(0*tpN83ur@qt#ix<_8LMPO>={Z3SvHAR76kn|bR zdGRLuAs_qORGVUXdGasy9MgE|nQCq<;Nv@|a3ic%ecP;uw437dq6tZ(p)|^KN|J5u zB8*Heg>rXX?TL<)y`+|-;UU`kC+nJyopGZS{;84wZ%Z!8ksFm_q{Pp4IrLeD81C6P zxpF4%mydm+Zc(4(XvN4l?##E}8|uCBWu;73ecNMaCl+Su9U_jTkwsp*8^gs`8o^wU zr3N;}vd&4Uf^le|zLuj=r9E@2zA^5Pqz$t&keX4?7UfRIAd-8~Ol6SbFbGm`s4Hw4i7dpVqtw0Cjy=k62T0Z94qFHn73$?TMa&fJe{dIIB!zjFsbb=lJ6u>D>q4Ho}U4>f16N(3WqC&ErgiI2Q7Bz2F9dlW#cEi1uFa@t>t(RagOv{l+ zl1!KCkEj67G(Bj&LrxTBN+YkB zRpdz{+|$}^+4T-OSqA#_S}SKr4c?*he(@dw2cgx;_(HI&prpj7S5=pGhqcxTM08(&8!Uxb{f#Z= zfpR`5Gde*2;3^UE;D^aL)`zwD#$(ru%f@?Ah3+%~6OHT5qzqH#0s@1e&xuHL$0X+` z=GqRK-7F4+{|(1J=s_bRo8l1}dC-F%`y0+Zu37dWZMlj0$uaJiXFPn;;%X0s*Wfji|+lxWY7N-i|HHCgdez1&b>Bxk}0g3yX~81gVk z(wy{&tTauD+ifzLVq$Qe+g+kb%Zffh%jGf}jnRZK8jUWO%P-g~N*i9a2w^6M5)U&TL_b>g ESSz@l2mk;8 literal 0 HcmV?d00001 diff --git a/messenger-client/app/src/main/res/values/new_app_icon_background.xml b/messenger-client/app/src/main/res/values/new_app_icon_background.xml new file mode 100644 index 0000000..23d0d63 --- /dev/null +++ b/messenger-client/app/src/main/res/values/new_app_icon_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/messenger-client/app/src/main/res/values/strings.xml b/messenger-client/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..246a13c --- /dev/null +++ b/messenger-client/app/src/main/res/values/strings.xml @@ -0,0 +1,118 @@ + + + Messenger + Поиск + Сообщение + Настройки + Удалить чат + Уведомления + Выйти + Помощь + Конфиденциальность + Аккаунт + Профиль + Избранное + Новое сообщение + Информация + Тёмная тема + Безопасность + Устройства + Создать группу + Создать канал + Данные и память + Папки с чатами + Вопросы о приложении + Цветовая тема + Напишите немного о себе + Защитите свой аккаунт + Код-пароль + О себе + Имя пользователя + Поделиться + Облачный пароль + Вкл. + Выкл. + Все + Никто + Сообщения + Время захода + Это устройство + Участники + Имя + Фамилия + Включить код-пароль + Другие возможности + Очистить кэш + Архив + Настройки архива + Как это работает? + Дата рождения + Соединение + Приглашения + Динамичные цвета + Создать новую папку + Все чаты + Сохранить + Удалить папку + Закрепить + Открепить + Название папки + Выбранные чаты + Добавить чаты + Вы можете установить пароль, который будет запрашиваться при входе с нового устройства. + Введите пароль + После установки кода-пароля над списком чатов появится значок замка для блокировки и разблокировки приложения. + Отмена + Завершить + Завершить сеанс + Активные сессии + Завершить все другие сеансы + Удалить + Вы можете создать папки с чатами и переключаться между ними. + Выйти на всех устройствах, кроме этого. + Подключить устройство + Отключить + Выключить код-пароль + Копировать + Новая папка + Сменить код-пароль + Ок + Чат в архиве + Удалить сообщение + Также удалить для + Вы точно хотите удалить это сообщение? + Заблокировать + Начать секретный чат + Создать ярлык + Вы точно хотите заблокировать + Секретный чат + Хотите начать секретный чат? + Начать + Изменить информацию + Изменить цвет профиля + Изменить имя + Убрать звук + Вкл. звук + Присоединиться + Покинуть канал + Вы точно хотите покинуть + Черный список + Подписчики + Пригласительные ссылки + Оформление + Тип канала + Удалить канал + Очистить историю + Публичная ссылка + Ссылка-приглашение + Частный канал + Публичный канал + Название канала + Описание + Удалить дату рождения + Подписчиков + Покинуть группу + Добавить участников + Удалить группу + Сохранить в загрузки + diff --git a/messenger-client/app/src/main/res/values/themes.xml b/messenger-client/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..76808e4 --- /dev/null +++ b/messenger-client/app/src/main/res/values/themes.xml @@ -0,0 +1,4 @@ + + + + + + +

+ +
+
+

Как скачать Messenger на Android

+

Поддерживаются устройства от Android 9

+ + Скачать из RuStore + +
+ +
+
1
+

Скачайте файл Messenger.apk на свой смартфон

+ +
+ +
+
2
+

Разрешите загрузку файла

+
+ Android покажет стандартное предупреждение для неизвестных файлов. Нажмите «Все равно скачать» — файл + безопасен +
+
+ +
+
3
+

Подтвердите установку приложения

+
Нажмите «Установить». Файл можно найти в браузере: Меню > Загрузки > Messenger.apk +
+
+ +
+
+ + + +
+

Готово

+
Общайтесь, не беспокоясь о безопасности
+
+
+ +
+
+
+
+

Messenger

- открытая и безопасная платформа для общения. +
+
+
+

Приложения

+
+
+ Android +
+
+
+
+

Открытый код

+
+ + +
+
+
+ + +
+ + + \ No newline at end of file diff --git a/messenger-server/public/app-ads.txt b/messenger-server/public/app-ads.txt new file mode 100644 index 0000000..066efa9 --- /dev/null +++ b/messenger-server/public/app-ads.txt @@ -0,0 +1,555 @@ +yandex.com, 105284619, DIRECT +betweendigital.com, 43554, RESELLER +openx.com, 541177349, RESELLER, 6a698e2ec38604c6 +pubmatic.com, 159668, RESELLER, 5d62403b186f2ace +rubiconproject.com, 19724, RESELLER, 0bfd66d529a55807 +adcolony.com, 29b7f4a14dc689eb, RESELLER, 1ad675c9de6b5176 +emxdgt.com, 2047, RESELLER, 1e1d41537f7cad7f +onetag.com, 5d1628750185ace, RESELLER +loopme.com, 11278, RESELLER, 6c8d5f95897a5a3b +appnexus.com, 13817, RESELLER, f5ab79cb980f11d1 +yahoo.com, 59966, RESELLER, e1a5b5b6e3255540 +silvermob.com, 449, RESELLER +pubmatic.com, 160707, RESELLER, 5d62403b186f2ace +video.unrulymedia.com, 3734122830, RESELLER +rhythmone.com, 3734122830, RESELLER, a670c89d4a324e47 +engagebdr.com, 10308, RESELLER +yeahmobi.com, 5135322, RESELLER +apptv.com, 3992, RESELLER +app.tv, 3992, RESELLER +conso.la, 3992, RESELLER +readserver.net, 3992, RESELLER +adro.io, 3992, RESELLER +adne.tv, 3992, RESELLER +adtarget.me, 64, RESELLER +uis.mobfox.com, 165, RESELLER +video.unrulymedia.com, 456081263, RESELLER +appnexus.com, 2637, RESELLER, f5ab79cb980f11d1 +openx.com, 539249210, RESELLER, 6a698e2ec38604c6 +pubmatic.com, 156451, RESELLER, 5d62403b186f2ace +rubiconproject.com, 13132, RESELLER, 0bfd66d529a55807 +xad.com, 589, RESELLER, 81cbf0a75a5e0e9a +inmobi.com, a5e661acdc384e91a79a58eb3418e99f, RESELLER, 83e75a7ae333ca9d +vidcrunch.com, 5fb267bc6e2dd520fd551415, RESELLER +freewheel.tv, 895601, RESELLER +google.com, pub-9417114411593463, RESELLER, f08c47fec0942fa0 +spotxchange.com, 271911, RESELLER, 7842df1d2fe2db34 +spotx.tv, 271911, RESELLER, 7842df1d2fe2db34 +rhythmone.com, 456081263, RESELLER, a670c89d4a324e47 +indexexchange.com, 192806, RESELLER, 50b1c356f2c5c8fc +rubiconproject.com, 17608,RESELLER, 0bfd66d529a55807 +triplelift.com, 10522, RESELLER, 6c33edb13117fd86 +smartadserver.com, 4140, RESELLER +conversantmedia.com, 100269, RESELLER, 03113cd04947736d +aol.com, 58935, RESELLER, e1a5b5b6e3255540 +yahoo.com, 58935, RESELLER, e1a5b5b6e3255540 +synacor.com, 82460, RESELLER, e108f11b2cdf7d5b +video.unrulymedia.com, 123476257, RESELLER +rhythmone.com, 123476257, RESELLER, a670c89d4a324e47 +openx.com, 544015448, RESELLER, 6a698e2ec38604c6 +mgid.com, 528163, RESELLER, d4c29acad76ce94f +cgnl.io, k18s, RESELLER, d9819e7b540bd6e3 +bizzclick.com, 30, RESELLER, 7e936b1feafdaa61 +onetag.com, 66cff8e37d871be, RESELLER +tpmn.io, 472, RESELLER +mobilefuse.com, 3719, RESELLER, 71e88b065d69c021 +lumate.com, 966389a1, RESELLER +bigo.sg, 136, RESELLER +pubmatic.com, 161151, RESELLER, 5d62403b186f2ace +pubnative.net, 1007334, RESELLER, d641df8625486a7b +ignitemediatech.com, pub_61128, RESELLER +admixer.net, 2f833c20-7378-4b86-9b73-a2b56263d4d4, RESELLER +inmobi.com, 062029933580429f9920bad476d8d70a, RESELLER, 83e75a7ae333ca9d +loopme.com, 11295, RESELLER, 6c8d5f95897a5a3b +openx.com, 542281387, RESELLER, 6a698e2ec38604c6 +pubnative.net, 1007615, RESELLER, d641df8625486a7b +silvermob.com, 464, RESELLER +smaato.com, 1100044156, RESELLER, 07bcf65f187117b4 +webeyemob.com, 70100, RESELLER +openx.com, 540679900, RESELLER, 6a698e2ec38604c6 +adcolony.com, 801e49d1be83b5f9, RESELLER, 1ad675c9de6b5176 +meitu.com, 663, RESELLER +ignitemediatech.com, 61119, RESELLER +video.unrulymedia.com, 564934834, RESELLER +conversantmedia.com, 100342, RESELLER, 03113cd04947736d +mobimight.com, 30271, RESELLER +appnexus.com, 11450, RESELLER, f5ab79cb980f11d1 +elixirvideo.co, 30271, RESELLER +video.unrulymedia.com, 144481089, RESELLER +pubmatic.com, 161373, RESELLER, 5d62403b186f2ace +ubrikvideo.com, 30271, RESELLER +rhythmone.com, 564934834, RESELLER, a670c89d4a324e47 +algorix.co, 60444, RESELLER, 5b394c12fea27a1d +ucfunnel.com, par-D2346AAB7ABD36B4CDD7BBD264BA92E2, RESELLER +aralego.com, par-D2346AAB7ABD36B4CDD7BBD264BA92E2, RESELLER +themediagrid.com, fh3tkj, RESELLER, 35d5010d7789b49d +appnexus.com, 13297, RESELLER, f5ab79cb980f11d1 +xandr.com, 13297, RESELLER, f5ab79cb980f11d1 +pubmatic.com, 160974, RESELLER, 5d62403b186f2ace +rubiconproject.com, 20050, RESELLER, 0bfd66d529a55807 +openx.com, 540838151, RESELLER, 6a698e2ec38604c6 +pubnative.net, 1007262, RESELLER, d641df8625486a7b +loopme.com, 11424, RESELLER, 6c8d5f95897a5a3b +olaex.biz, 100039, RESELLER +peak226.com, 12900, RESELLER +engagebdr.com, 10423, RESELLER +smartadserver.com, 3817, RESELLER +rhythmone.com, 1295892552, RESELLER, a670c89d4a324e47 +e-planning.net, 53f866af404c4b62, RESELLER, c1ba615865ed87b2 +brightcom.com, 15800, RESELLER +onetag.com, 5a02ff98ba6be67, RESELLER +advertising.com, 28246, RESELLER +inmobi.com, 22e5354e453f49348325184e25464adb, RESELLER, 83e75a7ae333ca9d +tpmn.io, 415, RESELLER +bold-win.com, 45325, RESELLER +gamoshi.io, 267-b4627, RESELLER +meitu.com, 581, RESELLER +admixer.co.kr, 1629, RESELLER +mintegral.com, 10046, RESELLER, 0aeed750c80d6423 +criteo.com, B-057955, RESELLER, 9fac4a4a87c2a44f +themediagrid.com, NG9STC, RESELLER, 35d5010d7789b49d +loopme.com, 11414, RESELLER, 6c8d5f95897a5a3b +admanmedia.com, 894, RESELLER +pubmatic.com, 160113, RESELLER, 5d62403b186f2ace +acd.op.hicloud.com, PUB_HW_1003, RESELLER +adx-dre.op.hicloud.com, PUB_HW_1003, RESELLER +webeyemob.com, 70098, RESELLER +indexexchange.com, 198417, RESELLER, 50b1c356f2c5c8fc +video.unrulymedia.com, 3383599585, RESELLER +rhythmone.com, 3383599585, RESELLER, a670c89d4a324e47 +rubiconproject.com, 24526, RESELLER, 0bfd66d529a55807 +ignitemediatech.com, pub_61170, RESELLER +inmobi.com, 6cc71dd159864641a03ce0c8792d801f, RESELLER, 83e75a7ae333ca9d +152media.info, 152M312, RESELLER +appnexus.com, 3153, RESELLER, f5ab79cb980f11d1 +adtelligent.com, 640813, RESELLER +pubmatic.com, 157113, RESELLER, 5d62403b186f2ace +motionspots.com, 166484, RESELLER +opera.com, pub7319665936192, RESELLER, 55a0c5fd61378de3 +triplelift.com, 11656, RESELLER, 6c33edb13117fd86 +pubmatic.com, 158565, RESELLER, 5d62403b186f2ace +appnexus.com, 13227, RESELLER, f5ab79cb980f11d1 +outbrain.com, 002d7f7ba0bd74452f2b155d0dfb5cd6c8, RESELLER +acexchange.co.kr, 1416775282, RESELLER +admixer.co.kr, 1610, RESELLER +adyoulike.com, 22389b7165228ff4ecbe2b72818ae524, RESELLER, 4ad745ead2958bf7 +pubmatic.com, 157704, RESELLER, 5d62403b186f2ace +contextweb.com, 562842, RESELLER, 89ff185a4c4e857c +google.com, pub-2843405949989126, RESELLER, f08c47fec0942fa0 +rtbsape.com, 1622050, RESELLER +smartyads.com, 100135, RESELLER, fd2bde0ff2e62c5d +adriver.ru, 187150, RESELLER +appnexus.com, 12447, RESELLER, f5ab79cb980f11d1 +rubiconproject.com, 23946, RESELLER, 0bfd66d529a55807 +advertising.com, 28764, RESELLER +google.com, pub-5289985627731322, RESELLER, f08c47fec0942fa0 +sovrn.com, 273644, RESELLER, fafdf38b16bf6b2b +ssp.e-volution.ai, AJxF6R111a9M6CaTvK, RESELLER +smartadserver.com, 1247, RESELLER +adform.com, 2664, RESELLER +loopme.com, 11342, RESELLER, 6c8d5f95897a5a3b +conversantmedia.com, 100264, RESELLER, 03113cd04947736d +ampliffy.com, amp00293, RESELLER +publiffy.com, pub00293, RESELLER +indexexchange.com, 186318, RESELLER, 50b1c356f2c5c8fc +rhythmone.com, 1575167821, RESELLER, a670c89d4a324e47 +appnexus.com, 4052, RESELLER, f5ab79cb980f11d1 +openx.com, 540031703, RESELLER, 6a698e2ec38604c6 +contextweb.com, 562669, RESELLER, 89ff185a4c4e857c +yahoo.com, 59338, RESELLER +buzzoola.com, 579132, RESELLER +marversal.com, 116, RESELLER +e-planning.net, b9165ad221c51225, RESELLER, c1ba615865ed87b2 +triplelift.com, 8446, RESELLER, 6c33edb13117fd86 +sharethrough.com, 23830661, RESELLER, d53b998a7bd4ecd2 +axonix.com, 56222, RESELLER +uis.mobfox.com, 1916, RESELLER, 5529a3d1f59865be +vidoomy.com, 6858194, RESELLER +adform.com, 2742, RESELLER +instal.com, 5a59277b-91e8-4b5c-a4b5-ee9a7a6c0644, RESELLER +openx.com, 540773939, RESELLER, 6a698e2ec38604c6 +appnexus.com, 11236, RESELLER, f5ab79cb980f11d1 +silvermob.com, 357, RESELLER +aceex.io, 6, RESELLER +spinx.biz, spnx-1000021, RESELLER +pubmatic.com, 161853, RESELLER, 5d62403b186f2ace +contextweb.com, 562899, RESELLER, 89ff185a4c4e857c +adsyield.com, 1069, RESELLER +e-planning.net, 45845eaf076148f9, RESELLER, c1ba615865ed87b2 +loopme.com, 11569, RESELLER, 6c8d5f95897a5a3b +xandr.com, 13799, RESELLER +triplelift.com, 12158, RESELLER, 6c33edb13117fd86 +152media.info, 152M499, RESELLER +appnexus.com, 11924, RESELLER, f5ab79cb980f11d1 +gamoshi.io, 267-b5428, RESELLER, 20e30b2ae1f670f2 +brightcom.com, 20498, RESELLER +sharethrough.com, r4ScMSsf, RESELLER, d53b998a7bd4ecd2 +video.unrulymedia.com, 2464975885, RESELLER +rhythmone.com, 2464975885, RESELLER, a670c89d4a324e47 +pubmatic.com, 162223, RESELLER, 5d62403b186f2ace +pubmatic.com, 161162, RESELLER, 5d62403b186f2ace +pubnative.net, 1007349, RESELLER, d641df8625486a7b +bematterfull.com, 22289765, RESELLER +inmobi.com, 30f3830cfef249a3ad46ee1a0bba7af3, RESELLER, 83e75a7ae333ca9d +lunamedia.io, fa0c2eaa5fae45b888d23460e1cac6e7, RESELLER, 524ecb396915caaf +themediagrid.com, R28I9J, RESELLER, 35d5010d7789b49d +pubmatic.com, 160492, RESELLER, 5d62403b186f2ace +pubmatic.com, 160493, RESELLER, 5d62403b186f2ace +loopme.com, 11367, RESELLER, 6c8d5f95897a5a3b +rubiconproject.com, 24170, RESELLER, 0bfd66d529a55807 +inmobi.com, ddb41d8a9f434a918d05a0fc9999d9f9, RESELLER, 83e75a7ae333ca9d +yahoo.com, 59627, RESELLER +video.unrulymedia.com, 4631344382657206988, RESELLER +contextweb.com, 562329, RESELLER, 89ff185a4c4e857c +smartadserver.com, 4539, RESELLER, 060d053dcf45cbf3 +consumable.com, 2001470, RESELLER, aefcd3d2f45b5070 +conversantmedia.com, 100322, RESELLER, 03113cd04947736d +flatads.com, 276, RESELLER +adview.com, 77646260, RESELLER, 1b2cc038a11ea319 +openx.com, 540326226, RESELLER, 6a698e2ec38604c6 +conversantmedia.com, 100081, RESELLER, 03113cd04947736d +adcolony.com, 382d79cd1387e603, RESELLER, 1ad675c9de6b5176 +contextweb.com, 562122, RESELLER, 89ff185a4c4e857c +inmobi.com, 867c89bb53994aaeb9dae3ce75b03e78, RESELLER, 83e75a7ae333ca9d +bidence.com, 3de04db04d6eb28b13281a39b1c16d67, RESELLER +smartyads.com, 368, RESELLER, fd2bde0ff2e62c5d +loopme.com, 10178, RESELLER, 6c8d5f95897a5a3b +pubmatic.com, 156835, RESELLER, 5d62403b186f2ace +pubnative.net, 1006936, RESELLER, d641df8625486a7b +rixengine.com, 604513, RESELLER +pubmatic.com, 163075, RESELLER, 5d62403b186f2ace +mangomob.net, ozgarer34a, RESELLER +start.io, mgr, RESELLER +themediagrid.com, 6XGFYQ, RESELLER, 35d5010d7789b49d +smartadserver.com, 4655, RESELLER, 060d053dcf45cbf3 +inmobi.com, 12a9a79d60214a40a444a6103b81747c, RESELLER, 83e75a7ae333ca9d +conversantmedia.com, 100339, RESELLER, 03113cd04947736d +loopme.com, 11318, RESELLER, 6c8d5f95897a5a3b +pubmatic.com, 157559, RESELLER, 5d62403b186f2ace +rubiconproject.com, 24400, RESELLER, 0bfd66d529a55807 +outbrain.com, 0023749a2264ea0429a71b54ac9ca0de9a, RESELLER +opera.com, pub5925993551616, RESELLER, 55a0c5fd61378de3 +xapads.com, 155075, RESELLER +pubmatic.com, 162882, RESELLER, 5d62403b186f2ace +pubmatic.com, 163319, RESELLER, 5d62403b186f2ace +video.unrulymedia.com, 524101463, RESELLER, 29bc7d05d309e1bc +google.com, pub-3990748024667386, RESELLER, f08c47fec0942fa0 +lijit.com, 224984, RESELLER, fafdf38b16bf6b2b +criteo.com, B-072395, RESELLER, 9fac4a4a87c2a44f +display.io, 156748, RESELLER +rubiconproject.com, 19938, RESELLER, 0bfd66d529a55807 +pubmatic.com, 158101, RESELLER, 5d62403b186f2ace +loopme.com, 11229, RESELLER, 6c8d5f95897a5a3b +inmobi.com, b164fef73b06493b92a9fae09941eef4, RESELLER, 83e75a7ae333ca9d +sonobi.com, 4980f2fde3, RESELLER, d1a215d9eb5aee9e +admanmedia.com, 34, RESELLER +visiblemeasures.com, 1009, RESELLER +conversantmedia.com, 100260, RESELLER, 03113cd04947736d +gothamads.com, 1950, RESELLER, d9c86e5dec870222 +ushareit.com, LCfafa51927e71233e, RESELLER +pubmatic.com, 163307, RESELLER, 5d62403b186f2ace +loopme.com, 11633, RESELLER, 6c8d5f95897a5a3b +opera.com, pub8049291171776, RESELLER, 55a0c5fd61378de3 +webeyemob.com, 70121, RESELLER +lenovoads.com, 4000, RESELLER +contextweb.com, 563047, RESELLER, 89ff185a4c4e857c +sharethrough.com, 6qlnf8SY, RESELLER, d53b998a7bd4ecd2 +pubmatic.com, 158154, RESELLER, 5d62403b186f2ace +contextweb.com, 562499, RESELLER, 89ff185a4c4e857c +conversantmedia.com, 100246, RESELLER, 03113cd04947736d +openx.com, 540298543, RESELLER, 6a698e2ec38604c6 +engagemedia.tv, 1063, RESELLER, cb58d2185b16309a +loopme.com, 11591, RESELLER, 6c8d5f95897a5a3b +freewheel.tv, 1137745, RESELLER +smartadserver.com, 4564, RESELLER, 060d053dcf45cbf3 +video.unrulymedia.com, 8373427519576873959, RESELLER +opera.com, pub8625217480640, RESELLER, 55a0c5fd61378de3 +improvedigital.com, 2273, RESELLER +onetag.com, 7d9af0b85b5070e, RESELLER +pubmatic.com, 162239, RESELLER, 5d62403b186f2ace +empower.net, 63cb0332e4b01718f069d4cb, RESELLER +google.com, pub-7983651257838282, RESELLER, f08c47fec0942fa0 +opera.com, pub9443931419968, RESELLER, 55a0c5fd61378de3 +improvedigital.com, 2320, RESELLER +rubiconproject.com, 26442, DIRECT, 0bfd66d529a55807 +rubiconproject.com, 26440, DIRECT, 0bfd66d529a55807 +smartadserver.com, 3172, RESELLER, 060d053dcf45cbf3 +rubiconproject.com, 20086, RESELLER, 0bfd66d529a5 +adform.com, 2904, RESELLER +appnexus.com, 14416, RESELLER +orangeclickmedia.com, C-1054, RESELLER +spinx.biz, 1373698864, RESELLER +display.io, 201090, RESELLER +dauup.com, 34109, RESELLER +rhythmone.com, 3948367200, RESELLER, a670c89d4a324e47 +rubiconproject.com, 14558, RESELLER, 0bfd66d529a55807 +rubiconproject.com, 25386, RESELLER, 0bfd66d529a55807 +instreamatic.com, 78, RESELLER +vidoomy.com, 2704434, RESELLER +adswizz.com, entravision, RESELLER +video.unrulymedia.com, 2979066401945419350, RESELLER +blueseasx.com, 203620, RESELLER, 7998eac5087f6110 +rubiconproject.com, 26132, RESELLER, 0bfd66d529a55807 +outbrain.com, 00ab8f68679cc060c8bbc1035e70030614, RESELLER +pangleglobal.com, 82832, RESELLER +bigo.sg, 196, RESELLER +openx.com, 537045659, RESELLER, 6a698e2ec38604c6 +appnexus.com, 7597, RESELLER, f5ab79cb980f11d1 +netsvision.com, 9992301, RESELLER +netsvision.com, 9992310, RESELLER +netsvision.com, 9992311, RESELLER +netsvision.com, 9992315, RESELLER +netsvision.com, 9992397, RESELLER +rtbsape.com, 1728038, RESELLER +yeahmobi.com, 115446, RESELLER +zmaticoo.com, 115446, RESELLER +rubiconproject.com, 24362, RESELLER, 0bfd66d529a55807 +freewheel.tv, 1599106, RESELLER +freewheel.tv, 1599109, RESELLER +admanmedia.com, 990, RESELLER +visiblemeasures.com, 1020, RESELLER +pubmatic.com, 161136, RESELLER, 5d62403b186f2ace +smaato.com, 1100051149, RESELLER, 07bcf65f187117b4 +smaato.com, 1100004890, RESELLER, 07bcf65f187117b4 +conversantmedia.com, 100455, RESELLER, 03113cd04947736d +smartadserver.com, 4457, RESELLER, 060d053dcf45cbf3 +sharethrough.com, DQQogebZ, RESELLER, d53b998a7bd4ecd2 +pubnative.net, 1007475, RESELLER, d641df8625486a7b +pubnative.net, 1007303, RESELLER, d641df8625486a7b +pubnative.net, 1007311, RESELLER, d641df8625486a7b +Contextweb.com, 562762, RESELLER, 89ff185a4c4e857c +rubiconproject.com, 25482, RESELLER, 0bfd66d529a55807 +admixer.co.kr, 1654, RESELLER +tpmn.io, 663, RESELLER +tpmn.io, 664, RESELLER +loopme.com, 11605, RESELLER, 6c8d5f95897a5a3b +rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807 +freewheel.tv, 1138513, RESELLER +media.net, 8CUN37DCC, RESELLER +improvedigital.com, 2110, RESELLER +improvedigital.com, 1532, RESELLER +onairglobal.com, 4357627, RESELLER +thebrave.io, 1234585, RESELLER, c25b2154543746ac +videoheroes.tv, 212503, RESELLER, 064bc410192443d8 +Se7en.es, 212503, RESELLER, 064bc410192443d8 +opera.com, pub7275292332480, RESELLER, 55a0c5fd61378de3 +pokkt.com, 7606, RESELLER, c45702d9311e25fd +appads.in, 107606, RESELLER +rubiconproject.com, 23644, RESELLER, 0bfd66d529a55807 +lijit.com, 411121, RESELLER, fafdf38b16bf6b2b #SOVRN +admanmedia.com, 2050, RESELLER +xandr.com, 13238, RESELLER, f5ab79cb980f11d1 +opera.com, pub5865193350528, RESELLER, 55a0c5fd61378de3 +sonobi.com, a85c5f6129, RESELLER, d1a215d9eb5aee9e +improvedigital.com, 2276, RESELLER +inmobi.com, 7847fe1f9ac54b4abe609cde4011243b, RESELLER, 83e75a7ae333ca9d +rubiconproject.com, 17608, RESELLER, 0bfd66d529a55807 +axonix.com, 59089, RESELLER, bc385f2b4a87b721 +display.io, 173162, RESELLER +mman.kr, 33000, RESELLER +betweendigital.com, 44659, RESELLER +hyperad.tech, 172, RESELLER +hyperad.tech, 182, RESELLER +inmobi.com, 38e36193f3c944d0b6254c71e511041b, RESELLER, 83e75a7ae333ca9d +webeyemob.com, 70104, RESELLER +meitu.com, 699, RESELLER +eskimi.com, 2020000011, RESELLER +video.unrulymedia.com, 498216989, RESELLER +admatic.de, ade-pub-5648520832, RESELLER, uufps1dh5stc6euk +luponmedia.com, 19956462, RESELLER +indexexchange.com, 188165, RESELLER, 50b1c356f2c5c8fc +indexexchange.com, 196757, RESELLER, 50b1c356f2c5c8fc +adform.com, 1985, RESELLER, 9f5210a2f0999e32 +rubiconproject.com, 12398, RESELLER, 0bfd66d529a55807 +pubmatic.com, 158697, RESELLER, 5d62403b186f2ace +pubmatic.com, 159760, RESELLER, 5d62403b186f2ace +adipolo.com, 23092378058, RESELLER +adipolosolutions.com, 23092378058, RESELLER +pmbmonetize.com, 23092378058, RESELLER +opamarketplace.com, 23092378058, RESELLER +google.com, pub-2930805104418204, RESELLER, f08c47fec0942fa0 #GreeterAPL +google.com, pub-4903453974745530, RESELLER, f08c47fec0942fa0 #APL +google.com, pub-4836542095728076, RESELLER, f08c47fec0942fa0 #Positive +google.com, pub-9135355251665930, RESELLER, f08c47fec0942fa0 #opa +freewheel.tv, 1605950, RESELLER +freewheel.tv, 1605951, RESELLER +themediagrid.com, DJQVCM, RESELLER, 35d5010d7789b49d +video.unrulymedia.com, 270404831, RESELLER +adform.com, 3035, RESELLER, 9f5210a2f0999e32 +onetag.com, 61d88450bdb25bc, RESELLER +onetag.com, 61d88450bdb25bc-OB, RESELLER +loopme.com, 11647, RESELLER, 6c8d5f95897a5a3b +netaddiction.it, 1064, RESELLER +adform.com, 2668, RESELLER +appnexus.com, 11673, RESELLER, f5ab79cb980f11d1 +pubmatic.com, 155968, RESELLER, 5d62403b186f2ace +rubiconproject.com, 11398, RESELLER, 0bfd66d529a55807 +smartadserver.com, 989, RESELLER, 060d053dcf45cbf3 +gumgum.com, 15747, RESELLER, ffdef49475d318a9 +openx.com, 541163168, RESELLER, 6a698e2ec38604c6 +improvedigital.com, 1616, RESELLER +rtbhouse.com, e3qznauVqenvza0c5wWJ, RESELLER +criteo.com, B-064389, RESELLER, 9fac4a4a87c2a44f +themediagrid.com, BIH5U6, RESELLER, 35d5010d7789b49d +appnexus.com, 12290, RESELLER, f5ab79cb980f11d1 +rubiconproject.com, 17960, RESELLER, 0bfd66d529a55807 +adform.com, 2865, RESELLER +appnexus.com, 9393, RESELLER, f5ab79cb980f11d1 +indexexchange.com, 191503, RESELLER, 50b1c356f2c5c8fc +openx.com, 559680764, RESELLER, 6a698e2ec38604c6 +rubiconproject.com, 23844, RESELLER, 0bfd66d529a55807 +smartadserver.com, 3056, RESELLER, 060d053dcf45cbf3 +yahoo.com, 49648, RESELLER +pubmatic.com, 161527, RESELLER, 5d62403b186f2ace +pubmatic.com, 158355, RESELLER, 5d62403b186f2ace +lijit.com, 260380, RESELLER, fafdf38b16bf6b2b +amxrtb.com, 105199787, RESELLER +appnexus.com, 11786, RESELLER +eskimi.com, 2020000676, RESELLER +rubiconproject.com, 26250, RESELLER, 0bfd66d529a55807 +lijit.com, 502284, RESELLER, fafdf38b16bf6b2b +pubmatic.com, 162270, RESELLER, 5d62403b186f2ace +appnexus.com, 15670, RESELLER +contextweb.com, 562818, RESELLER, 89ff185a4c4e857c +vidoomy.com, 3655923, RESELLER +smartadserver.com, 4998, RESELLER, 060d053dcf45cbf3 +onetag.com, 8c90176af2e65c8, RESELLER +adtarget.com.tr, 751601, RESELLER +admatic.com.tr, adm-pub-2977111241, RESELLER, uufps1dh5stc6euk +pixad.com.tr, px-pub-6514176248, RESELLER, uufps1dh5stc6euk +google.com, pub-8929667634210480, RESELLER, f08c47fec0942fa0 +rubiconproject.com, 24266, RESELLER, 0bfd66d529a55807 +pubmatic.com, 158849, RESELLER, 5d62403b186f2ace +adform.com, 2083, RESELLER +adform.com, 2968, RESELLER +rtbhouse.com, eqt3MD0DmNFukxfZqFm0, RESELLER +rtbhouse.com, 36401e736811e8034581, RESELLER +rtbhouse.com, Bl90aHDHpnUdxORfqhhI, RESELLER +rtbhouse.com, KicWDRpi0GCWX2lQJcYn, RESELLER +rubiconproject.com, 25100, RESELLER, 0bfd66d529a55807 +rubiconproject.com, 25102, RESELLER, 0bfd66d529a55807 +pubmatic.com, 157800, RESELLER, 5d62403b186f2ace +rubiconproject.com, 18364, RESELLER, 0bfd66d529a55807 +smartadserver.com, 4456, RESELLER, 060d053dcf45cbf3 +themediagrid.com, SWH94X, RESELLER, 35d5010d7789b49d +xandr.com, 13293, RESELLER, f5ab79cb980f11d1 +bidmachine.io, 200, DIRECT +betweendigital.com, 44727, RESELLER +pubmatic.com, 163420, RESELLER, 5d62403b186f2ace +pubmatic.com, 165340, RESELLER, 5d62403b186f2ace +pubnative.net, 1009485, RESELLER, d641df8625486a7b +openx.com, 540543195, RESELLER, 6a698e2ec38604c6 +showheroes.com, 6036, RESELLER +rubiconproject.com, 26476, RESELLER, 0bfd66d529a55807 +openx.com, 540022851, RESELLER, 6a698e2ec38604c6 +adform.com, 2845, RESELLER, 9f5210a2f0999e32 +appnexus.com, 11487, RESELLER, f5ab79cb980f11d1 +pubmatic.com, 120391, RESELLER, 5d62403b186f2ace +adform.com, 2688, RESELLER, 9f5210a2f0999e32 +appnexus.com, 13774, RESELLER, f5ab79cb980f11d1 +rubiconproject.com, 11762, RESELLER, 0bfd66d529a55807 +adform.com, 3116, RESELLER, 9f5210a2f0999e32 +opera.com, pub9166643429696, RESELLER, 55a0c5fd61378de3 +contextweb.com, 562791, RESELLER, 89ff185a4c4e857c +pubnative.net, 1009046, RESELLER, d641df8625486a7b +lijit.com, 465542, RESELLER, fafdf38b16bf6b2b +onetag.com, 82e44d118b79600, RESELLER +startapp.com, ope, RESELLER +start.io, ope, RESELLER +start.io, 116712987, RESELLER +freewheel.tv, 1600180, RESELLER +freewheel.tv, 1600214, RESELLER +lacunads.com, LCfafa51927e71233e, RESELLER +rubiconproject.com, 26846, RESELLER, 0bfd66d529a55807 +Vidoomy.com, 1320781, RESELLER +freewheel.tv, 1607802, RESELLER +freewheel.tv, 1607807, RESELLER +smaato.com, 1100058043, RESELLER, 07bcf65f187117b4 +smartyads.com, 100016, RESELLER, fd2bde0ff2e62c5d +inmobi.com, 791b84bdd791470faa8dca5f04e6a83b, RESELLER, 83e75a7ae333ca9d +smartadserver.com, 4467, RESELLER +contextweb.com, 562827, RESELLER, 89ff185a4c4e857c +lijit.com, 273644, RESELLER, fafdf38b16bf6b2b +pubmatic.com, 166180, RESELLER, 5d62403b186f2ace +criteo.com, B-057601, RESELLER, 9fac4a4a87c2a44f +loopme.com, 11347, RESELLER, 6c8d5f95897a5a3b +inmobi.com, 33f042dcf10549ae9fb1b9e2ee0ecfc3, RESELLER, 83e75a7ae333ca9d +onairglobal.com, 4357629, RESELLER +openx.com, 540396775, RESELLER, 6a698e2ec38604c6 +thebrave.io, 9840732, RESELLER, c25b2154543746ac +start.io, 146282053, RESELLER +themediagrid.com, FWN84J, RESELLER, 35d5010d7789b49d +triplelift.com, 14127, RESELLER, 6c33edb13117fd86 +openx.com, 559912325, RESELLER, 6a698e2ec38604c6 +pubmatic.com, 163476, RESELLER, 5d62403b186f2ace +markappmedia.site, C-1054, RESELLER +rubiconproject.com, 20086, RESELLER +appnexus.com, 14808, RESELLER +bidease.com, bidease_seller_19, RESELLER +pubnative.net, 1009966, RESELLER, d641df8625486a7b +pubmatic.com, 166078, RESELLER, 5d62403b186f2ace +adagio.io, 1514, RESELLER +inmobi.com, 6dc038804add44ffa2d5f61854f6ab33, RESELLER, 83e75a7ae333ca9d +adbro.me, eb76b782-9af7-4536-aac7-3d280f1f6652, RESELLER +opera.com, pub6148735850944, RESELLER, 55a0c5fd61378de3 +sabio.us, 100092, RESELLER, 96ed93aaa9795702 +freewheel.tv, 1606620, RESELLER +freewheel.tv, 1606633, RESELLER +themediagrid.com, A6CWLO, RESELLER, 35d5010d7789b49d +onetag.com, 925c32ef718e9fe, RESELLER +smaato.com, 1100057547, RESELLER, 07bcf65f187117b4 +zmaticoo.com, 5135063, RESELLER +admanmedia.com, 613, RESELLER +smartadserver.com, 3713, RESELLER, 060d053dcf45cbf3 +pubmatic.com, 165117, RESELLER, 5d62403b186f2ace +sharethrough.com, XeKuhSkz, RESELLER, d53b998a7bd4ecd2 +appnexus.com, 15349, RESELLER, f5ab79cb980f11d1 +video.unrulymedia.com, 3948367200, RESELLER +triplelift.com, 12456, RESELLER, 6c33edb13117fd86 +themediagrid.com, A8X5S7, RESELLER, 35d5010d7789b49d +conversantmedia.com, 100308, RESELLER, 03113cd04947736d +adyoulike.com, a2226c27fc2a6773f6a2b365e013513a, RESELLER, 4ad745ead2958bf7 +pubmatic.com, 158481, RESELLER, 5d62403b186f2ace +media.net, 8CUSC3UJ7, RESELLER +lijit.com, 417620, RESELLER, fafdf38b16bf6b2b +verve.com, 14619, RESELLER, 0c8f5958fc2d6270 +pubmatic.com, 156439, RESELLER, 5d62403b186f2ace +pubmatic.com, 154037, RESELLER, 5d62403b186f2ace +rubiconproject.com, 16114, RESELLER, 0bfd66d529a55807 +openx.com, 537149888, RESELLER, 6a698e2ec38604c6 +appnexus.com, 3703, RESELLER, f5ab79cb980f11d1 +loopme.com, 5679, RESELLER, 6c8d5f95897a5a3b +xad.com, 958, RESELLER, 81cbf0a75a5e0e9a +video.unrulymedia.com, 2564526802, RESELLER, 6f752381ad5ec0e5 +smaato.com, 1100044045, RESELLER, 07bcf65f187117b4 +pubnative.net, 1006576, RESELLER, d641df8625486a7b +verve.com, 15503, RESELLER, 0c8f5958fc2d6270 +adyoulike.com, b4bf4fdd9b0b915f746f6747ff432bde, RESELLER, 4ad745ead2958bf7 +axonix.com, 57264, RESELLER, bc385f2b4a87b721 +admanmedia.com, 43, RESELLER +sharethrough.com, OAW69Fon, RESELLER, d53b998a7bd4ecd2 +toponad.com, 166e12f3c48018, RESELLER, 1d49fe424a1a456d +pubmatic.com, 165329, RESELLER, 5d62403b186f2ace +loopme.com, 11635, RESELLER, 6c8d5f95897a5a3b +conversantmedia.com, 100569, RESELLER, 03113cd04947736d +app-stock.com,558223, RESELLER, ed8c126ea5971415 +rubiconproject.com, 15044, RESELLER, 0bfd66d529a55807 +video.unrulymedia.com, 557688749, RESELLER +rubiconproject.com, 15268, RESELLER, 0bfd66d529a55807 +pubmatic.com, 159277, RESELLER, 5d62403b186f2ace +appnexus.com, 6849, RESELLER, f5ab79cb980f11d1 +opera.com, pub12998959884416, RESELLER, 55a0c5fd61378de3 +dauup.com, 34191, RESELLER, 4daba13e2b0dfd92 +rubiconproject.com, 26270, RESELLER, 0bfd66d529a55807 +lijit.com, 541964, RESELLER, fafdf38b16bf6b2b #SOVRN +inmobi.com, f73add69216f42d9ba45940a548416d3, RESELLER, 83e75a7ae333ca9d +conversantmedia.com, 100949, RESELLER, 03113cd04947736d +munimob.com, 2100033154, RESELLER, 09fcf65f918716a4 +playdigo.com, 2041, RESELLER, 92011346d63d3c30 +improvedigital.com, 2534, RESELLER +acexchange.co.kr, 1288659831, RESELLER +lijit.com, 558045, RESELLER, fafdf38b16bf6b2b #SOVRN +video.unrulymedia.com, 389957698, RESELLER +risecodes.com, 685c25b72cb7980001e4ff27, RESELLER +criteo.com, b-062019, RESELLER, 9fac4a4a87c2a44f +smaato.com, 1100058938, RESELLER, 07bcf65f187117b4 diff --git a/messenger-server/public/icon.webp b/messenger-server/public/icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..17ec02729a6fb4c794a6f20030a7c62c16f258e4 GIT binary patch literal 8210 zcmV+tAno5$Nk&ErAOHYYMM6+kP&iEf9{>O^zrZgLRR`m?Z6rzkmz{HFcK;DE0sN`u zz;@wc2K4AUU!pltGq2+^Hz_xCg&PtBvtYheV|JTSk-9cEGxQ5ETZYIHhHa+kmSwiH zt}@%5PA;=&!>M+ra}{|iuLhbS}KOXiMzoiR;Shc{P;6PlvAofy(v)q!c@C3NVB+u>$<0lk?Sm2Jz| zp`mN)z5oN8NVX!i|A;F>15Pl23W$h~T~?7KJ5Be?WDk6!0t*==(6(*5)o5cosg2mR z@on3-ZQHhOv$kz3wPPI#ZW~FGsie$vnL-2eN%@0p0kcUa&)Ss(-8ksS{+gxHgF;hXFo*?X7o1k91wJ`|6O4jt77 zIGPELro$My7=U;jvbW^;&F+irc99m zSODS^MRUQmG|d=D6vyM303>7pijSt30g?q6z<~n*gwp?K+qP}nw(ZU;hXDYPsixVs zvu)eNdT17$BGp`XTzlM z%}(KSlKC|R&;U*VFMtT(4+sZD0Y+Z?tKRwJeaeMh!~ZlSvkRZ3K4%h32mk@#0f+@G z0vrT90Q>-?1IhudfPR1uU<6nIRsf)4_4&{8dq4V`cIh)8>-|6RRPV+TBFX6sUzj8( ziw6J;-~pxr4g+2TiUFN!BousrED$l&M>~P}uK-g3+^1*pa3=Y}jr~5szW)Hs2i&j& z`Vb+C`B?avwPBd?2*W}W4FsX(_*fAkZqT0c?Em2-zGUXZDcBFd1451khy!#ZL1_7y zwB9hR)-XWquv)zhPOh~eJpQcYSO@(D!s}-C{}f3ImTd?K0vrQm0rUtDfcfN{RYyr! zyAG@`Fg zBH=x`79n)BU%3SZ6RmwoEc*-34v0qx6$>+xBEAbD{yVOu&~RV6sUx%3!<>iB722F)F+# zw1kj1Jic@piX^r!3P8QUgJEGk9SWvlMEvP-g({qEC^3L8bp93{^Ma2N1=BS$qv&w1 z!pHKM2v8G}ks}24$V_E@3W?VkHaw=xBF2#nIx!gCh|Kgzx=ix$m_SU%jtS5W%QR1t zgfo<=-ykG|$9SlRWRxdKqB%ZtKnEe2Jal8zIVgdiBuU;kfLal5%rxTxV^TjLTvk%U z$&Lk$PYxj&KSm|L4_FdgQJo(cO%+aze3F|(RK6> zZ9Fq8$K2AfuyQVJ-BYLFz&+XVFIA(u>FP_T(M4|YX44TOkAlhsiRg5}z=(XoK(IbZ z9LRdYIE&Q95@E71wC+w1Zj>AXBNO9ROZE`419|38j{fJC0`sfP4Rqu;Q}f0p(hqGG z8l04lk|?mM#|MVyiicH5!hy#Ugw)jcGEuDFP7AD*&21|YH)Ig03O?_KHS-NlYBrAG z_rWY<1GQP}Ns>U0j~`$Fose?hMpyX*W8+Ru_?Bn<7*u^U#7|SpCZthpau>4+M8GRP zX4z;A_D?9~!^zf$%qNd>Q4Wqo_fyucxeDKBxTG$6*?A^4mQD_VV1B$1U^t3`pnIIu ziWD9mwT|bFx*mLeGT=8uvUJ{d>V+e&1k@YEcP^{lJks?6Q5>uItnur!OBaRL^NMtdx{+< zvk4SqR2LYQwx00t^a_%~voLIVJg1V&rQpPw_iRrlDJgNn9`z1d6+Y{8_*%SEvI^=P zLzsooENp{aDnNOrT18Bf(vUm@%9RWR$7X$WqXPZ2#FIoBH!>VPRn&2^#HlA%otcC+ z-%xjGa8&buAhr&NqP85)R8hZb4&@?spW{e_NWWrDnIFh8{!HT1lsw9_a1@vI84DPU z+vZ=Th?{@_fSNMLs9odZ$gFOA$rS4Xj;W=eQpfZch z@VCFu69kS&Iz@9u%pj@C|1grIDSgyhTV+_H=7W>FRY)EmESi`nWGO{+$FOEz#0eQ$ z(hxsm2T2@<)iM%Lg-zxl(9mdH9ZkpXZ zF4L%)UnpTjBFFfP)#ntD#?i^JK(8z|&kl9x_(S3$vUCwO@KE(^5C@X9Ut@FK#2|IxU59T z3XL?F)YlxR5e>8RO)^j%-th=PZ|qQtEB2W&P@(*yKwagNYcRs4$d1B0ISh^aCjkRz z_K7zWbI{9zph zpwuG+y>rShp12IQ=CyzeB>^>nzVIV^nPud|lsHkHodIq<9?&0|OM`5FRPoja!jFP= zDoFKWH0ZfZ37 z7(M9gj=%|s_RIsL+9?vh$i|smH>gHdST&;v5jO;OY(+z2>73cFGN47kb0*{HY=`b# zU}0a<#59*!ABIeQjBYq#Jd;Pnt+RZP1>^Amx-)kkO|TOxARA)7C7l9vhb%ryKW@x3of6VAoK&1jZS$pPzP;C`o*G55! zP#XIq_`{JG4!J*gIb~Qm=e>cJb8ysqW{i=c zvLDhg$gYbb^)fCHN(kAAhXoEz?}EDMg^B{>dxD}yTC)3^ z07Se%TYkG=M}Af2`N-%gFTcQ;5U5Pa++Z6olN8b0!=Wzau&BRR5nuhG)ilSjZl>;8 zZu(}nsDG6r2PqTtMv)UCE@5cO9=_#Dt-aRx#WnlT4evty(zW%DmH9rRX;c+{T%z5i zjn(ME|J?Y=)!gbX$*zX@iRezxYyRS3U1ip!b}e{ClfiSJ(R;@qkVeKG(lM#V(uScMl%DMnR8R&i8FmlGQ5HoQ{jhim2@}iaY$=B_NZ2vd z=VzT#DVKtp1x04Wi!$Gjn|miqIaGaPs)^o6->LX<9K<`Pg$i9)eqW-d|PX%I2Z&S@|Ai)E@|> z7P=iXR{lg}cp`aM1cjl7#qKEl*YF|mj0^_41Mj%?IM2K45F9W*`4nqBgtT)=*QZ8w zvcM)opxpr@yha$pB93U1TlkofonC)QOXp zFkxcaAYIuRJxl``l!0v%O^)@0mG2b^k9Gu!kXn(UXwS|kbI=^5jEq~xZ&~6O?vY%v zV|Xy1|84OtRR?elib1Wy6cj}4AYm2*+RcIK-W;Lw*Cxjf@C~5>7BT%4l4+i1W?eP? zFoj7)vD5pYe6LsKFsgp#3d*=PC3+Mue2ht0Iz-tcTV-;ZJ>%=vf zGFa4HStHOKLw)Trb{0#;u=a)b{&6LmTeeP6qtK~+;mkiBBZFlOMPIt5+og-!r#kzT zswx5>apk7*MS_u1g_;$^lP@1E877xwu*N3~77fn|>ecKbZeU?wjE^2Aq9+OeTG`4q zL%xjUsps9Zt%yPT;|T|>GoPWU&vh=*ZfGa_ad<3#*gpeRYP7Kj+MzLU6`+9YmIE@hH74aOA0jEt%K(Q#*&x2b)T3!2 zzvMrWGMq#G*}!FkDzvT=sdP!;%^sG-YQbPI$Qbrxk$`xZb#URCZpktJbg?yb}n%vb-<3Eh9NxOM-&I9*7<2d##Y) zqfgiI;AH6jnNghE&C02(TJ7FvgBpl(jU- zeh)bwB7PHygQTu$K_{Du~;Fqk5&9P{IV zHP6^JX&A0K^8~LXhdKI@Otm---Kg-+HRjW^YZ%o}3&5II9dp<8NYS_#`Nm~KE2+R- zJ|@_P(EQ0M^8#uRtIog+n7x+4Fz<+UCCh-0?<9w7X^_*_k8}d+pc^t<&y*I^GymlZ z7+n26X;}p!X@s5R!e40*28Qzpd_-OytXPHTQ-X@Xe^dare7$n~&;RaU@q0u-iGf`b zObmy9*kQ3)A#vMKN@Dk9rwoP_)dBX*>6j(JDo~1o*|>P97-QdDCu5YsT+M&K{Bsc=CLDyoN90`uC@fr_MKc&6R2pd+f` zSTL;QzSt}KUf5;9ANY+1@4Y1X!+MZ<}z#D+{*fG4p~!a7D;skQRnRVok1Ps^PwO$Id$;9(nrjn;aYw zpr{W7?3ZVW&pCx)jg(ywYz*hEGkRmF+BFq>Tv*wDIF$?2*=Jnxm~~z_YdrV9TP1WCtNK6V&nE; zCS!1Gk)9&{lsNaEBHP=wam`WyTEGxrSvd+Y_{r_U5>g{JmM#eA+VkmtJI0*Hc~+rZGG> zzp;Mrz`!23n>`;qv+{_}P;Kd)aLnxx$-v~lq&QD6=Z+-R)9u>iCJI<2<73J%OIZgf za_5MXl+cHpT=Iw)&E7eShryWX6^)QaaX!jx)|5QHojkm+gwc}TgKMRZm;zV7Z;V@E zUG|Gc$jSN;+vDy4&$#Y+{Cd-fo-X76zMU~Kq+a}bGhw5eYum`M?vi;d1Q?~kRb;YImQP4J$NJ9UCjzR~0=V!Z8{m78r(JUI7z zG3Agv@KUhl$cMxb_f7Ka{U#}uiDB;+dcC^xt4F%M6wyjFe{lZA>XJS<$Ld?G(Kko| zC;_8n+5-cfk&PiaWQVws?t$N;FPRHo%~nP105s41o1{N9H>kaR))YUwPEP*P=s)zz z%VUShSsJ3}2rS&)Q+(@WM?Edx@aUCjTM1*E{db9;WDoonoQjzzzURI(R$oO+GR=J> z+8MZ@YN_E_hEB{jYH(75>m_5;4n7E8TE(`*?LPlc>nIHw_maJ%+dA9MT@!f;B}`Z;i#gfz+gX8X}B1o3cP3(iq$HFPiXOGD+Fw+NQa1~525cTUiB)Ga^LkiFqp)$a2j9I?z%M>l>j1#s z`560iZQ`z(LM#sEKT6%N6ZiQ&5Z5Xc%hT#46{mf!3;)u0c)Hgbe5?>RO2m)jYhAJJ zRd20bCb9dMbAtmNlZqh~+?WMKM+zwnJO(Xh&iJ1Df(h)MyqSJe$MDd;Ul)`tkkE6V zJto~C9tU-RBc`1vTnxdAiS3)}D`WW3erQ?hm&cfIod>*WBgh_iDb=J!%^m&;*3IN9 zv^+Ww6N4c;`EWo5RBL4V2`)M+jZ8$XMz6teoe#p;jWVMjR7@TxzpsjPtebhU^G1}f z(HHp5EcGz^9a0RA{heYr#+<%UjRY{ZslCJsbgrKTu~%q!OC5d^j$#8xjvK>$ZU|#H z%&b0Xxvx;nRwlx#ZB!oB(PJMi(VgQUcc9$dlz4?jYh`k;R5z-Ng?U5vz1})Nm(;C} z=|%HKoM;m5PW^ck{bJFwiS3rW_Y1-5Wm1eGU#FrZ}vW~DZzKVZM4%#)C!xgwq@CSEQwDL+pz@C~Jqcg)KHfteXKw1=+@ z?1lG%*o#RNq!Ld_4^!eC5XP25x<}4dLwjYvX=Ms))#mqtZl_#IjlG0KlTb>0q?_#R z!Y_>|b(^f~nWp!vi`B~%kJ>;vS~kz-)MLMy-IOjWC1{r8#&B%|-?<_wg=9I5>WUOx zWn}{Uk~M(+k-l8Ue%oA-{#?F0$KVnqErzrtD&f70N+H`bH~T@;>Lt9iXVsV3Gn!p- zH&FE62~j0d;;Hl)4ryAlZ4QWvR2ye$B}xYdTA$oXYxd;h1D6^^`NmnHD*9<#a+=gZ zNSX|P!4z4A6Sa#VGPN!I_ra5X(0*tpN83ur@qt#ix<_8LMPO>={Z3SvHAR76kn|bR zdGRLuAs_qORGVUXdGasy9MgE|nQCq<;Nv@|a3ic%ecP;uw437dq6tZ(p)|^KN|J5u zB8*Heg>rXX?TL<)y`+|-;UU`kC+nJyopGZS{;84wZ%Z!8ksFm_q{Pp4IrLeD81C6P zxpF4%mydm+Zc(4(XvN4l?##E}8|uCBWu;73ecNMaCl+Su9U_jTkwsp*8^gs`8o^wU zr3N;}vd&4Uf^le|zLuj=r9E@2zA^5Pqz$t&keX4?7UfRIAd-8~Ol6SbFbGm`s4Hw4i7dpVqtw0Cjy=k62T0Z94qFHn73$?TMa&fJe{dIIB!zjFsbb=lJ6u>D>q4Ho}U4>f16N(3WqC&ErgiI2Q7Bz2F9dlW#cEi1uFa@t>t(RagOv{l+ zl1!KCkEj67G(Bj&LrxTBN+YkB zRpdz{+|$}^+4T-OSqA#_S}SKr4c?*he(@dw2cgx;_(HI&prpj7S5=pGhqcxTM08(&8!Uxb{f#Z= zfpR`5Gde*2;3^UE;D^aL)`zwD#$(ru%f@?Ah3+%~6OHT5qzqH#0s@1e&xuHL$0X+` z=GqRK-7F4+{|(1J=s_bRo8l1}dC-F%`y0+Zu37dWZMlj0$uaJiXFPn;;%X0s*Wfji|+lxWY7N-i|HHCgdez1&b>Bxk}0g3yX~81gVk z(wy{&tTauD+ifzLVq$Qe+g+kb%Zffh%jGf}jnRZK8jUWO%P-g~N*i9a2w^6M5)U&TL_b>g ESSz@l2mk;8 literal 0 HcmV?d00001 diff --git a/messenger-server/public/index.html b/messenger-server/public/index.html new file mode 100644 index 0000000..d35c52f --- /dev/null +++ b/messenger-server/public/index.html @@ -0,0 +1,119 @@ + + + + + + + Messenger + + + + + + +
+ +
+
+
+
+

Messenger нового поколения

+

Быстрый. Приватный. Безопасный.

+ + Скачать для Android + +
+
+ +
+

Создан для приватности

+
+
+
+ + + + +
+

Приватность

+

Для регистрации не требуется номер телефона или email. Создайте аккаунт и начните общаться, + сохраняя свою анонимность.

+
+
+
+ + + +
+

Открытый код

+

100% открытый исходный код. Прозрачность, которой можно доверять. Никаких сюрпризов.

+
+
+
+ +
+
+

Прозрачность и доверие

+

+ Мы верим в силу сообщества. Исходный код нашего клиента и сервера доступен на GitHub. + Присоединяйтесь к разработке, предлагайте улучшения или просто убедитесь в нашей честности. +

+ +
+
+
+ +
+
+
+
+

Messenger

– открытая и безопасная платформа для общения. +
+
+
+

Приложения

+
+
+ Android +
+
+
+
+

Открытый код

+
+ + +
+
+
+ + +
+ + + \ No newline at end of file diff --git a/messenger-server/public/style.css b/messenger-server/public/style.css new file mode 100644 index 0000000..ee97fec --- /dev/null +++ b/messenger-server/public/style.css @@ -0,0 +1,310 @@ +:root { + --text-color: #222222; + --primary-color: #388bfd; + --primary-hover-color: #006aff; + --transition: 0.3s; + --border-color: rgb(211 211 211 / 60%); + --border-radius: 40px; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: sans-serif; +} + +a, +li, +button { + -webkit-tap-highlight-color: transparent; +} + +html::selection { + color: white; + background-color: var(--primary-color); +} + +html { + color: var(--text-color); +} + +header { + position: sticky; + top: 0; + z-index: 10; + backdrop-filter: blur(10px); + background: rgb(255 255 255 / 40%); +} + +header nav ul { + display: flex; +} + +header nav ul li { + cursor: pointer; + position: relative; +} + +header nav ul li a { + font-size: 18px; + padding: 14px 20px; + display: block; +} + +header nav ul li::after { + pointer-events: none; + content: ''; + position: absolute; + left: 50%; + bottom: 0; + width: 0; + height: 4px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: var(--primary-color); + transition: var(--transition); +} + +header nav li:hover::after, +header nav li.active::after { + left: 20px; + width: calc(100% - 40px); +} + +h2, +h3 { + font-weight: 500; +} + +li { + list-style-type: none; +} + +a { + color: var(--primary-color); + text-decoration: none; +} + +footer .mobile { + display: none; + text-align: center; + padding-block: 20px; + border-top: 1px solid var(--border-color); +} + +footer .desktop { + display: flex; + justify-content: space-between; + padding-block: 20px; + border-top: 1px solid var(--border-color); +} + +footer a:hover { + color: var(--primary-hover-color); +} + +footer .slang h3 { + display: inline-block; +} + +footer .col { + max-width: 300px; + width: 100%; +} + +footer .title { + padding-bottom: 10px; +} + +.container { + max-width: 1024px; + padding-inline: 20px; + margin-inline: auto; +} + +.hero { + text-align: center; + margin-block: 50px; +} + +.hero h1 { + font-size: 3rem; + font-weight: 800; + margin-bottom: 2rem; + background: linear-gradient(90deg, #58a6ff, #a371f7); + background-clip: text; + -webkit-text-fill-color: transparent; +} + +.hero p { + font-size: 1.5rem; + margin-bottom: 2.5rem; + font-weight: 400; + opacity: 0.8; +} + +.btn-hero { + display: inline-block; + text-decoration: none; + color: white; + font-size: 24px; + font-weight: 500; + border-radius: 20px; + padding: 16px 24px; + background-color: var(--primary-color); + transition: var(--transition); +} + +.btn-hero:hover { + color: white; +} + +.btn-hero:active { + scale: 0.98; +} + +section { + padding-block: 100px; +} + +.section-title { + font-size: 2rem; + text-align: center; + margin-bottom: 40px; +} + +.features-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + grid-gap: 20px; + justify-items: center; +} + +.feature-card { + text-align: center; + max-width: 500px; + padding: 28px; + border-radius: var(--border-radius); + border: 1px solid var(--border-color); + background: rgb(252 252 252); + transition: var(--transition); +} + +@starting-style { + .feature-card { + opacity: 0; + translate: 0 10px; + } +} + +.feature-card:hover { + border-color: var(--primary-color); +} + +.feature-card:hover .icon svg { + fill: var(--primary-color); +} + +.feature-card .icon { + margin-bottom: 20px; +} + +.feature-card .icon svg { + width: 48px; + height: 48px; + transition: var(--transition); +} + +.feature-card h3 { + font-size: 1.6rem; + margin-bottom: 10px; +} + +.feature-card p { + line-height: 1.4; +} + +.opensource-content { + padding: 28px; + margin-inline: auto; + border-radius: var(--border-radius); + border: 1px solid var(--border-color); + background: rgb(252 252 252); +} + +.opensource p { + line-height: 1.4; + text-wrap: balance; + text-align: center; +} + +.opensource-buttons { + display: flex; + justify-content: center; + gap: 20px; + margin-top: 2rem; +} + +.opensource-buttons a { + display: inline-block; + text-align: center; + text-decoration: none; + font-weight: 600; + padding: 14px 28px; + color: var(--primary-color); + border-radius: 20px; + border: 2px solid var(--primary-color); + transition: var(--transition); +} + +.opensource-buttons a:hover { + background-color: var(--primary-color); + color: white; +} + +@media screen and (width <=768px) { + .hero h1 { + font-size: 28px; + line-height: 34px; + margin-bottom: 0; + } + + .hero p { + font-size: 16px; + margin-block: 16px 32px; + } + + .hero .btn-hero { + font-size: 18px; + } + + .btn-hero { + display: block; + } + + .features-grid { + grid-template-columns: 1fr; + grid-template-rows: repeat(2, 1fr); + } + + .opensource-content { + max-width: 500px; + } + + .opensource-buttons { + flex-direction: column; + } + + .opensource-buttons a { + width: 100%; + } + + .desktop { + display: none !important; + } + + .mobile { + display: block !important; + } +} \ No newline at end of file diff --git a/messenger-server/src/app.controller.ts b/messenger-server/src/app.controller.ts new file mode 100644 index 0000000..e3f6f28 --- /dev/null +++ b/messenger-server/src/app.controller.ts @@ -0,0 +1,7 @@ +import { Controller } from '@nestjs/common' +import { AppService } from './app.service' + +@Controller() +export class AppController { + constructor(private readonly appService: AppService) {} +} diff --git a/messenger-server/src/app.module.ts b/messenger-server/src/app.module.ts new file mode 100644 index 0000000..3e801a3 --- /dev/null +++ b/messenger-server/src/app.module.ts @@ -0,0 +1,62 @@ +import { MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common' +import { ConfigModule } from '@nestjs/config' +import { AppController } from './app.controller' +import { AppService } from './app.service' +import { UsersModule } from './modules/users/users.module' +import { ChannelsModule } from './modules/channels/channels.module' +import { AuthModule } from './modules/auth/auth.module' +import { AuthMiddleware } from './common/middlewares/auth.middleware' +import { SessionsModule } from './modules/sessions/sessions.module' +import { RealtimeModule } from './modules/realtime/realtime.module' +import { GroupsModule } from './modules/groups/groups.module' +import { ChatsModule } from './modules/chats/chats.module' +import { MessagesModule } from './modules/messages/messages.module' +import { PrismaModule } from './providers/prisma/prisma.module' +import { SearchModule } from './modules/search/search.module' +import { PushModule } from './modules/push/push.module' +import { StorageModule } from './modules/storage/storage.module' +import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler' +import { APP_GUARD } from '@nestjs/core' +import { KanbanModule } from './modules/kanban/kanban.module' + +@Module({ + imports: [ + ConfigModule.forRoot({ isGlobal: true }), + ThrottlerModule.forRoot([{ + ttl: 60000, + limit: 100, + }]), + PrismaModule, + UsersModule, + ChannelsModule, + AuthModule, + SessionsModule, + RealtimeModule, + GroupsModule, + ChatsModule, + MessagesModule, + SearchModule, + PushModule, + StorageModule, + KanbanModule + ], + controllers: [AppController], + providers: [ + AppService, + { + provide: APP_GUARD, + useClass: ThrottlerGuard, + } + ] +}) +export class AppModule { + configure(consumer: MiddlewareConsumer) { + consumer + .apply(AuthMiddleware) + .exclude( + { path: 'auth/*path', method: RequestMethod.ALL }, + { path: 'auth', method: RequestMethod.ALL } + ) + .forRoutes('*path') + } +} diff --git a/messenger-server/src/app.service.ts b/messenger-server/src/app.service.ts new file mode 100644 index 0000000..5965cb5 --- /dev/null +++ b/messenger-server/src/app.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common' + +@Injectable() +export class AppService {} diff --git a/messenger-server/src/common/constants/db.constants.ts b/messenger-server/src/common/constants/db.constants.ts new file mode 100644 index 0000000..f976634 --- /dev/null +++ b/messenger-server/src/common/constants/db.constants.ts @@ -0,0 +1,2 @@ +export const MAX_INT64 = 9223372036854775807n +export const MIN_INT64 = 0n diff --git a/messenger-server/src/common/constants/param.constants.ts b/messenger-server/src/common/constants/param.constants.ts new file mode 100644 index 0000000..447b341 --- /dev/null +++ b/messenger-server/src/common/constants/param.constants.ts @@ -0,0 +1,8 @@ +export const PARAMS = { + USER_ID: 'userId', + GROUP_ID: 'groupId', + CHANNEL_ID: 'channelId', + SESSION_ID: 'sessionId', + CHAT_ID: 'chatId', + MESSAGE_ID: 'messageId' +} \ No newline at end of file diff --git a/messenger-server/src/common/decorators/omit-null.decorator.ts b/messenger-server/src/common/decorators/omit-null.decorator.ts new file mode 100644 index 0000000..adb4151 --- /dev/null +++ b/messenger-server/src/common/decorators/omit-null.decorator.ts @@ -0,0 +1,5 @@ +import { Transform } from 'class-transformer' + +export const OmitNull = () => { + return Transform(({ value }) => value ?? undefined, { toPlainOnly: true }) +} diff --git a/messenger-server/src/common/decorators/trim.decorator.ts b/messenger-server/src/common/decorators/trim.decorator.ts new file mode 100644 index 0000000..3e9d4ca --- /dev/null +++ b/messenger-server/src/common/decorators/trim.decorator.ts @@ -0,0 +1,10 @@ +import { Transform, TransformFnParams } from "class-transformer" + +export function Trim() { + return Transform(({ value }: TransformFnParams) => { + if (typeof value === 'string') { + return value.trim() + } + return value + }) +} \ No newline at end of file diff --git a/messenger-server/src/common/decorators/user-id.decorator.ts b/messenger-server/src/common/decorators/user-id.decorator.ts new file mode 100644 index 0000000..b3b4b13 --- /dev/null +++ b/messenger-server/src/common/decorators/user-id.decorator.ts @@ -0,0 +1,9 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common' + +export const CurrentUserId = createParamDecorator((_data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest() + if (!request.user) { + throw new Error('User not found in request') + } + return request.user.id +}) diff --git a/messenger-server/src/common/decorators/user-token.decorator.ts b/messenger-server/src/common/decorators/user-token.decorator.ts new file mode 100644 index 0000000..17e2c2e --- /dev/null +++ b/messenger-server/src/common/decorators/user-token.decorator.ts @@ -0,0 +1,10 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common' + +export const CurrentUserToken = createParamDecorator( + (data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest() + const authHeader = request.headers['authorization'] || '' + const token = authHeader.replace(/^Bearer\s+/i, '') + return token + } +) diff --git a/messenger-server/src/common/enums/chat-type.enum.ts b/messenger-server/src/common/enums/chat-type.enum.ts new file mode 100644 index 0000000..d9a8d13 --- /dev/null +++ b/messenger-server/src/common/enums/chat-type.enum.ts @@ -0,0 +1,6 @@ +export enum ChatType { + PRIVATE = 0, + GROUP = 1, + CHANNEL = 2, + UNKNOWN = 3 +} diff --git a/messenger-server/src/common/filters/all-exceptions.filter.ts b/messenger-server/src/common/filters/all-exceptions.filter.ts new file mode 100644 index 0000000..a6bfc8d --- /dev/null +++ b/messenger-server/src/common/filters/all-exceptions.filter.ts @@ -0,0 +1,38 @@ +import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus, Logger } from '@nestjs/common'; +import { HttpAdapterHost } from '@nestjs/core'; + +@Catch() +export class AllExceptionsFilter implements ExceptionFilter { + private readonly logger = new Logger(AllExceptionsFilter.name); + + constructor(private readonly httpAdapterHost: HttpAdapterHost) { } + + catch(exception: unknown, host: ArgumentsHost): void { + const { httpAdapter } = this.httpAdapterHost; + const ctx = host.switchToHttp(); + + if (host.getType() !== 'http') { + this.logger.error(`Unhandled exception in ${host.getType()}:`, exception); + return; + } + + const httpStatus = + exception instanceof HttpException + ? exception.getStatus() + : HttpStatus.INTERNAL_SERVER_ERROR; + + const responseBody = { + statusCode: httpStatus, + timestamp: new Date().toISOString(), + path: httpAdapter.getRequestUrl(ctx.getRequest()), + message: exception instanceof Error ? exception.message : 'Internal server error', + }; + + this.logger.error( + `Unhandled Exception: ${JSON.stringify(responseBody)}`, + exception instanceof Error ? exception.stack : '' + ); + + httpAdapter.reply(ctx.getResponse(), responseBody, httpStatus); + } +} diff --git a/messenger-server/src/common/guards/auth.guard.ts b/messenger-server/src/common/guards/auth.guard.ts new file mode 100644 index 0000000..bd0a79c --- /dev/null +++ b/messenger-server/src/common/guards/auth.guard.ts @@ -0,0 +1,47 @@ +import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common' +import { SessionsService } from 'src/modules/sessions/sessions.service' +import { JwtAuthService } from 'src/modules/security/jwt.service' +import { TokenPayload } from '../types/token-payload.type' + +@Injectable() +export class AuthGuard implements CanActivate { + constructor( + private readonly sessionService: SessionsService, + private readonly jwtService: JwtAuthService + ) { } + + async canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest() + let token = request.token + + if (!token) { + const authHeader = request.headers['authorization'] || request.headers['Authorization'] + + if (!authHeader || typeof authHeader !== 'string' || !authHeader.startsWith('Bearer ')) { + throw new UnauthorizedException('Authorization header is missing or invalid') + } + + token = authHeader.slice(7).trim() + + if (!token) { + throw new UnauthorizedException('Token is missing') + } + } + + let payload: TokenPayload + try { + payload = this.jwtService.verifyToken(token) + } catch (err) { + throw new UnauthorizedException('Invalid or expired token') + } + + const session = await this.sessionService.findByTokenAndUserId(token, payload.userId) + if (!session) { + throw new UnauthorizedException('Invalid token') + } + + request.user = { id: payload.userId, token: token } + + return true + } +} diff --git a/messenger-server/src/common/guards/can-delete-message.guard.ts b/messenger-server/src/common/guards/can-delete-message.guard.ts new file mode 100644 index 0000000..5079b45 --- /dev/null +++ b/messenger-server/src/common/guards/can-delete-message.guard.ts @@ -0,0 +1,61 @@ +import { CanActivate, ExecutionContext, ForbiddenException, Injectable, NotFoundException } from "@nestjs/common" +import { PrismaService } from "src/providers/prisma/prisma.service" +import { UserId } from "../types/user-id.type" +import { PARAMS } from "../constants/param.constants" +import { detectChatType } from "../utils/detect-chat-type.util" +import { ChatType } from "../enums/chat-type.enum" +import { ConversationType } from "generated/prisma/client" + +@Injectable() +export class CanDeleteMessageGuard implements CanActivate { + constructor(private readonly prisma: PrismaService) { } + + async canActivate(context: ExecutionContext): Promise { + const request = context.switchToHttp().getRequest() + const userId: UserId = request.user.id + const messageId = parseInt(request.params[PARAMS.MESSAGE_ID]) + + if (isNaN(messageId)) { + throw new NotFoundException('Message not found') + } + + const message = await this.prisma.message.findUnique({ + where: { id: messageId }, + include: { conversation: true } + }) + + if (!message) { + throw new NotFoundException('Message not found') + } + + // 1. User is sender + if (message.senderId === userId) { + return true + } + + // 2. User is a member of the direct chat (allow deleting anyone's message in DM) + if (message.conversation.type === ConversationType.DIRECT) { + const member = await this.prisma.conversationMember.findFirst({ + where: { conversationId: message.conversation.id, userId: userId } + }) + if (member) return true + } + + // 3. User is owner of the group/channel + if (message.conversation.type === ConversationType.GROUP) { + const group = await this.prisma.group.findFirst({ + where: { id: message.conversation.id, ownerId: userId } + }) + if (group) return true + } + + if (message.conversation.type === ConversationType.CHANNEL) { + const channel = await this.prisma.channel.findFirst({ + where: { id: message.conversation.id, ownerId: userId } + }) + if (channel) return true + } + + throw new ForbiddenException('You cannot delete this message') + } +} diff --git a/messenger-server/src/common/guards/can-read-chat.guard.ts b/messenger-server/src/common/guards/can-read-chat.guard.ts new file mode 100644 index 0000000..e25aeab --- /dev/null +++ b/messenger-server/src/common/guards/can-read-chat.guard.ts @@ -0,0 +1,29 @@ +import { CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common' +import { ChatId } from '../types/chat-id.type' +import { UserId } from '../types/user-id.type' +import { PARAMS } from '../constants/param.constants' +import { ChatsService } from 'src/modules/chats/chats.service' + +@Injectable() +export class CanReadChatGuard implements CanActivate { + constructor(private readonly chatsService: ChatsService) { } + + async canActivate(ctx: ExecutionContext): Promise { + const request = ctx.switchToHttp().getRequest() + const userId: UserId = request.user.id + + const rawChatId = request.params[PARAMS.CHAT_ID] || request.params[PARAMS.GROUP_ID] || request.params[PARAMS.CHANNEL_ID] + const chatId = rawChatId ? ChatId(rawChatId) : undefined + const messageId = request.params[PARAMS.MESSAGE_ID] ? Number(request.params[PARAMS.MESSAGE_ID]) : undefined + + if (messageId !== undefined) { + return this.chatsService.canReadMessage(userId, messageId, chatId) + } + + if (chatId !== undefined) { + return this.chatsService.canReadChat(userId, chatId) + } + + throw new ForbiddenException('Chat is not specified') + } +} diff --git a/messenger-server/src/common/guards/can-send-message.guard.ts b/messenger-server/src/common/guards/can-send-message.guard.ts new file mode 100644 index 0000000..3c82fb3 --- /dev/null +++ b/messenger-server/src/common/guards/can-send-message.guard.ts @@ -0,0 +1,57 @@ +import { CanActivate, ExecutionContext, ForbiddenException, Injectable } from "@nestjs/common" +import { ChatType } from "../enums/chat-type.enum" +import { PrismaService } from "src/providers/prisma/prisma.service" +import { ChatId } from "../types/chat-id.type" +import { UserId } from "../types/user-id.type" +import { PARAMS } from "../constants/param.constants" +import { detectChatType } from "../utils/detect-chat-type.util" + +@Injectable() +export class CanSendMessageGuard implements CanActivate { + constructor(private readonly prisma: PrismaService) { } + + async canActivate(ctx: ExecutionContext): Promise { + const request = ctx.switchToHttp().getRequest() + + const chatId: ChatId = ChatId(request.params[PARAMS.CHAT_ID]) + const userId: UserId = request.user.id + + const chatType = detectChatType(chatId) + + if (chatType === ChatType.PRIVATE) { + return true + } + + if (chatType === ChatType.GROUP) { + const member = await this.prisma.groupMember.findFirst({ + where: { + groupId: chatId, + userId: userId + } + }) + + if (!member) { + throw new ForbiddenException('User is not a group member') + } + + return true + } + + if (chatType === ChatType.CHANNEL) { + const admin = await this.prisma.channel.findFirst({ + where: { + id: chatId, + ownerId: userId + } + }) + + if (!admin) { + throw new ForbiddenException('Only channel admins can write') + } + + return true + } + + return false + } +} diff --git a/messenger-server/src/common/guards/channel-exists.guard.ts b/messenger-server/src/common/guards/channel-exists.guard.ts new file mode 100644 index 0000000..6faa510 --- /dev/null +++ b/messenger-server/src/common/guards/channel-exists.guard.ts @@ -0,0 +1,21 @@ +import { CanActivate, ExecutionContext, Injectable, NotFoundException } from '@nestjs/common' +import { ChannelId } from '../types/channel-id.type' +import { ChannelsService } from 'src/modules/channels/channels.service' +import { PARAMS } from '../constants/param.constants' + +@Injectable() +export class ChannelExistsGuard implements CanActivate { + constructor(private readonly channelsService: ChannelsService) { } + + async canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest() + const channelId: ChannelId = request.params[PARAMS.CHANNEL_ID] + + const channel = await this.channelsService.isExists(channelId) + if (!channel) { + throw new NotFoundException('Channel not found') + } + + return true + } +} diff --git a/messenger-server/src/common/guards/channel-owner.guard.ts b/messenger-server/src/common/guards/channel-owner.guard.ts new file mode 100644 index 0000000..ad94f15 --- /dev/null +++ b/messenger-server/src/common/guards/channel-owner.guard.ts @@ -0,0 +1,21 @@ +import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common' +import { ChannelsService } from 'src/modules/channels/channels.service' +import { PARAMS } from '../constants/param.constants' + +@Injectable() +export class ChannelOwnerGuard implements CanActivate { + constructor(private readonly channelsService: ChannelsService) { } + + async canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest() + const user = request.user + const channelId = request.params[PARAMS.CHANNEL_ID] + + const isOwner = await this.channelsService.isOwner(channelId, user.id) + if (!isOwner) { + throw new ForbiddenException('User is not the owner of the channel') + } + + return true + } +} diff --git a/messenger-server/src/common/guards/group-exists.guard.ts b/messenger-server/src/common/guards/group-exists.guard.ts new file mode 100644 index 0000000..743c33a --- /dev/null +++ b/messenger-server/src/common/guards/group-exists.guard.ts @@ -0,0 +1,21 @@ +import { CanActivate, ExecutionContext, Injectable, NotFoundException } from '@nestjs/common' +import { GroupId } from '../types/group-id.type' +import { GroupsService } from 'src/modules/groups/groups.service' +import { PARAMS } from '../constants/param.constants' + +@Injectable() +export class GroupExistsGuard implements CanActivate { + constructor(private readonly groupsService: GroupsService) { } + + async canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest() + const groupId: GroupId = request.params[PARAMS.GROUP_ID] + + const group = await this.groupsService.isExists(groupId) + if (!group) { + throw new NotFoundException('Group not found') + } + + return true + } +} diff --git a/messenger-server/src/common/guards/group-owner.guard.ts b/messenger-server/src/common/guards/group-owner.guard.ts new file mode 100644 index 0000000..812f359 --- /dev/null +++ b/messenger-server/src/common/guards/group-owner.guard.ts @@ -0,0 +1,21 @@ +import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common' +import { GroupsService } from 'src/modules/groups/groups.service' +import { PARAMS } from '../constants/param.constants' + +@Injectable() +export class GroupOwnerGuard implements CanActivate { + constructor(private readonly groupsService: GroupsService) { } + + async canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest() + const user = request.user + const groupId = request.params[PARAMS.GROUP_ID] + + const isOwner = await this.groupsService.isOwner(groupId, user.id) + if (!isOwner) { + throw new ForbiddenException('User is not the owner of the channel') + } + + return true + } +} diff --git a/messenger-server/src/common/guards/privacy.guard.ts b/messenger-server/src/common/guards/privacy.guard.ts new file mode 100644 index 0000000..b7355a9 --- /dev/null +++ b/messenger-server/src/common/guards/privacy.guard.ts @@ -0,0 +1,48 @@ +import { CanActivate, ExecutionContext, Injectable, NotFoundException } from '@nestjs/common' +import { PARAMS } from '../constants/param.constants' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { UserId } from '../types/user-id.type' + +@Injectable() +export class PrivacyGuard implements CanActivate { + constructor(private readonly prisma: PrismaService) { } + + async canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest() + const targetUserIdRaw = request.params[PARAMS.USER_ID] + if (!targetUserIdRaw) return true + + const targetUserId = UserId(targetUserIdRaw) + const currentUserId = request.user?.id + + const settings = await this.prisma.privacySettings.findUnique({ + where: { userId: targetUserId } + }) + + if (!settings) { + const userExists = await this.prisma.user.count({ where: { id: targetUserId } }) > 0 + if (!userExists) throw new NotFoundException('User not found') + + request.privacy = { + canSeeBio: true, + canSeeDateOfBirth: true + } + return true + } + + if (targetUserId === currentUserId) { + request.privacy = { + canSeeBio: true, + canSeeDateOfBirth: true + } + return true + } + + request.privacy = { + canSeeBio: settings.bio === 0, + canSeeDateOfBirth: settings.dateOfBirth === 0 + } + + return true + } +} diff --git a/messenger-server/src/common/guards/session-owner.guard.ts b/messenger-server/src/common/guards/session-owner.guard.ts new file mode 100644 index 0000000..1156bac --- /dev/null +++ b/messenger-server/src/common/guards/session-owner.guard.ts @@ -0,0 +1,22 @@ +import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common' +import { SessionsService } from 'src/modules/sessions/sessions.service' +import { PARAMS } from '../constants/param.constants' +import { SessionId } from '../types/session-id.type' + +@Injectable() +export class SessionOwnerGuard implements CanActivate { + constructor(private readonly sessionsService: SessionsService) { } + + async canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest() + const user = request.user + const sessionId: SessionId = request.params[PARAMS.SESSION_ID] + + const isOwner = await this.sessionsService.isOwner(sessionId, user.id) + if (!isOwner) { + throw new ForbiddenException('You are not allowed to delete this session') + } + + return true + } +} diff --git a/messenger-server/src/common/guards/user-exists.guard.ts b/messenger-server/src/common/guards/user-exists.guard.ts new file mode 100644 index 0000000..617622f --- /dev/null +++ b/messenger-server/src/common/guards/user-exists.guard.ts @@ -0,0 +1,21 @@ +import { CanActivate, ExecutionContext, Injectable, NotFoundException } from '@nestjs/common' +import { PARAMS } from '../constants/param.constants' +import { UsersService } from 'src/modules/users/users.service' +import { UserId } from '../types/user-id.type' + +@Injectable() +export class UserExistsGuard implements CanActivate { + constructor(private readonly usersService: UsersService) { } + + async canActivate(context: ExecutionContext) { + const request = context.switchToHttp().getRequest() + const userId: UserId = request.params[PARAMS.USER_ID] + + const user = await this.usersService.isExists(userId) + if (!user) { + throw new NotFoundException('User not found') + } + + return true + } +} diff --git a/messenger-server/src/common/interceptors/big-int.interceptor.ts b/messenger-server/src/common/interceptors/big-int.interceptor.ts new file mode 100644 index 0000000..ead3322 --- /dev/null +++ b/messenger-server/src/common/interceptors/big-int.interceptor.ts @@ -0,0 +1,32 @@ +import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common' +import { map } from 'rxjs' + +@Injectable() +export class BigIntInterceptor implements NestInterceptor { + intercept(_: ExecutionContext, next: CallHandler) { + return next.handle().pipe( + map((data) => { + return this.serialize(data) + }) + ) + } + + private serialize(obj: any): any { + if (obj === null || obj === undefined) return obj + if (typeof obj === 'bigint') return obj.toString() + if (Array.isArray(obj)) return obj.map((item) => this.serialize(item)) + if (typeof obj === 'object') { + // Check if it's a plain object or instance (avoid serializing complex objects like Date, if any) + if (obj instanceof Date) return obj.getTime() + + const newObj = {} + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + newObj[key] = this.serialize(obj[key]) + } + } + return newObj + } + return obj + } +} diff --git a/messenger-server/src/common/middlewares/auth.middleware.ts b/messenger-server/src/common/middlewares/auth.middleware.ts new file mode 100644 index 0000000..4f3a9da --- /dev/null +++ b/messenger-server/src/common/middlewares/auth.middleware.ts @@ -0,0 +1,27 @@ +import { Injectable, NestMiddleware, UnauthorizedException } from '@nestjs/common' +import { Response, NextFunction } from 'express' + +interface AuthRequest extends Request { + token?: string +} + +@Injectable() +export class AuthMiddleware implements NestMiddleware { + use(req: AuthRequest, res: Response, next: NextFunction) { + const authHeader = req.headers['authorization'] || req.headers['Authorization'] + + if (!authHeader || typeof authHeader !== 'string' || !authHeader.startsWith('Bearer ')) { + throw new UnauthorizedException('Authorization header is missing or invalid') + } + + const token = authHeader.slice(7).trim() + + if (!token) { + throw new UnauthorizedException('Token is required') + } + + req.token = token + + next() + } +} diff --git a/messenger-server/src/common/pipes/parse-channel-id.pipe.ts b/messenger-server/src/common/pipes/parse-channel-id.pipe.ts new file mode 100644 index 0000000..b4eca7c --- /dev/null +++ b/messenger-server/src/common/pipes/parse-channel-id.pipe.ts @@ -0,0 +1,21 @@ +import { PipeTransform, BadRequestException } from '@nestjs/common' +import { MAX_INT64 } from '../constants/db.constants' +import { ChannelId } from '../types/channel-id.type' + +export class ParseChannelIdPipe implements PipeTransform { + transform(value: string): ChannelId { + let id: ChannelId + + try { + id = ChannelId(value) + } catch { + throw new BadRequestException('Invalid channel id') + } + + if (id > MAX_INT64) { + throw new BadRequestException('Id is too large') + } + + return id + } +} diff --git a/messenger-server/src/common/pipes/parse-chat-id.pipe.ts b/messenger-server/src/common/pipes/parse-chat-id.pipe.ts new file mode 100644 index 0000000..e4b91e4 --- /dev/null +++ b/messenger-server/src/common/pipes/parse-chat-id.pipe.ts @@ -0,0 +1,21 @@ +import { PipeTransform, BadRequestException } from '@nestjs/common' +import { MAX_INT64 } from '../constants/db.constants' +import { ChatId } from '../types/chat-id.type' + +export class ParseChatIdPipe implements PipeTransform { + transform(value: string): ChatId { + let id: ChatId + + try { + id = ChatId(value) + } catch { + throw new BadRequestException('Invalid channel id') + } + + if (id > MAX_INT64) { + throw new BadRequestException('Id is too large') + } + + return id + } +} diff --git a/messenger-server/src/common/pipes/parse-group-id.pipe.ts b/messenger-server/src/common/pipes/parse-group-id.pipe.ts new file mode 100644 index 0000000..c663845 --- /dev/null +++ b/messenger-server/src/common/pipes/parse-group-id.pipe.ts @@ -0,0 +1,21 @@ +import { PipeTransform, BadRequestException } from '@nestjs/common' +import { MAX_INT64 } from '../constants/db.constants' +import { GroupId } from '../types/group-id.type' + +export class ParseGroupIdPipe implements PipeTransform { + transform(value: string): GroupId { + let id: GroupId + + try { + id = GroupId(value) + } catch { + throw new BadRequestException('Invalid group id') + } + + if (id > MAX_INT64) { + throw new BadRequestException('Id is too large') + } + + return id + } +} diff --git a/messenger-server/src/common/pipes/parse-user-id.pipe.ts b/messenger-server/src/common/pipes/parse-user-id.pipe.ts new file mode 100644 index 0000000..859e49a --- /dev/null +++ b/messenger-server/src/common/pipes/parse-user-id.pipe.ts @@ -0,0 +1,21 @@ +import { PipeTransform, BadRequestException } from '@nestjs/common' +import { MAX_INT64 } from '../constants/db.constants' +import { UserId } from '../types/user-id.type' + +export class ParseUserIdPipe implements PipeTransform { + transform(value: string): UserId { + let id: UserId + + try { + id = UserId(value) + } catch { + throw new BadRequestException('Invalid user id') + } + + if (id > MAX_INT64) { + throw new BadRequestException('Id is too large') + } + + return id + } +} diff --git a/messenger-server/src/common/socket/socket-events.ts b/messenger-server/src/common/socket/socket-events.ts new file mode 100644 index 0000000..66816c3 --- /dev/null +++ b/messenger-server/src/common/socket/socket-events.ts @@ -0,0 +1,20 @@ +export const SocketEvent = { + MESSAGE_NEW: "message:new", + MESSAGE_EDIT: "message:edit", + MESSAGE_UPDATE: "message:update", + MESSAGE_DELETE: "message:delete", + + CHAT_TYPING: "chat:typing", + CHAT_OPEN: "chat:open", + CHAT_CLOSE: "chat:close", + CHAT_READ: "chat:read", + CHAT_NEW: "chat:new", + HISTORY_CLEAR: "chat:history_clear", + + USER_ONLINE: "user:online", + USER_OFFLINE: "user:offline", + AUTH_ERROR: "auth:error", + KANBAN_UPDATE: "kanban:update" +} as const + +export type SocketEventType = typeof SocketEvent[keyof typeof SocketEvent] diff --git a/messenger-server/src/common/types/brand.ts b/messenger-server/src/common/types/brand.ts new file mode 100644 index 0000000..b525c7b --- /dev/null +++ b/messenger-server/src/common/types/brand.ts @@ -0,0 +1 @@ +export type Brand = K & { __brand: T } diff --git a/messenger-server/src/common/types/channel-id.type.ts b/messenger-server/src/common/types/channel-id.type.ts new file mode 100644 index 0000000..bd309bd --- /dev/null +++ b/messenger-server/src/common/types/channel-id.type.ts @@ -0,0 +1,11 @@ +import { Brand } from './brand' + +export type ChannelId = Brand + +export function ChannelId(value: string | bigint | number) { + if (!/^\d+$/.test(value.toString())) { + throw new Error('Invalid channel id') + } + + return BigInt(value) as ChannelId +} diff --git a/messenger-server/src/common/types/chat-id.type.ts b/messenger-server/src/common/types/chat-id.type.ts new file mode 100644 index 0000000..08a3dcd --- /dev/null +++ b/messenger-server/src/common/types/chat-id.type.ts @@ -0,0 +1,11 @@ +import { Brand } from './brand' + +export type ChatId = Brand + +export function ChatId(value: string | bigint | number) { + if (!/^\d+$/.test(value.toString())) { + throw new Error('Invalid chat id') + } + + return BigInt(value) as ChatId +} diff --git a/messenger-server/src/common/types/group-id.type.ts b/messenger-server/src/common/types/group-id.type.ts new file mode 100644 index 0000000..b1da201 --- /dev/null +++ b/messenger-server/src/common/types/group-id.type.ts @@ -0,0 +1,11 @@ +import { Brand } from './brand' + +export type GroupId = Brand + +export function GroupId(value: string | bigint | number) { + if (!/^\d+$/.test(value.toString())) { + throw new Error('Invalid group id') + } + + return BigInt(value) as GroupId +} diff --git a/messenger-server/src/common/types/session-id.type.ts b/messenger-server/src/common/types/session-id.type.ts new file mode 100644 index 0000000..bb3a4ea --- /dev/null +++ b/messenger-server/src/common/types/session-id.type.ts @@ -0,0 +1,11 @@ +import { Brand } from "./brand" + +export type SessionId = Brand + +export function SessionId(value: number) { + if (!/^\d+$/.test(value.toString())) { + throw new Error('Invalid session id') + } + + return Number(value) as SessionId +} \ No newline at end of file diff --git a/messenger-server/src/common/types/token-payload.type.ts b/messenger-server/src/common/types/token-payload.type.ts new file mode 100644 index 0000000..12c1b11 --- /dev/null +++ b/messenger-server/src/common/types/token-payload.type.ts @@ -0,0 +1,5 @@ +import { UserId } from "./user-id.type" + +export type TokenPayload = { + userId: UserId +} \ No newline at end of file diff --git a/messenger-server/src/common/types/user-id.type.ts b/messenger-server/src/common/types/user-id.type.ts new file mode 100644 index 0000000..b0d2c84 --- /dev/null +++ b/messenger-server/src/common/types/user-id.type.ts @@ -0,0 +1,11 @@ +import { Brand } from './brand' + +export type UserId = Brand + +export function UserId(value: string | bigint | number) { + if (!/^\d+$/.test(value.toString())) { + throw new Error('Invalid user id') + } + + return BigInt(value) as UserId +} diff --git a/messenger-server/src/common/utils/detect-chat-type.util.ts b/messenger-server/src/common/utils/detect-chat-type.util.ts new file mode 100644 index 0000000..5d59b92 --- /dev/null +++ b/messenger-server/src/common/utils/detect-chat-type.util.ts @@ -0,0 +1,21 @@ +import { ChatType } from "../enums/chat-type.enum" +import { ChannelId } from "../types/channel-id.type" +import { ChatId } from "../types/chat-id.type" +import { GroupId } from "../types/group-id.type" +import { UserId } from "../types/user-id.type" + +export function detectChatType(id: UserId | ChannelId | GroupId | ChatId): ChatType { + const idString = id.toString() + const firstDigit = Number(idString[0]) + + switch (firstDigit) { + case 1: + return ChatType.PRIVATE + case 2: + return ChatType.CHANNEL + case 3: + return ChatType.GROUP + default: + return ChatType.UNKNOWN + } +} \ No newline at end of file diff --git a/messenger-server/src/common/utils/id-generator.util.ts b/messenger-server/src/common/utils/id-generator.util.ts new file mode 100644 index 0000000..ea8463a --- /dev/null +++ b/messenger-server/src/common/utils/id-generator.util.ts @@ -0,0 +1,36 @@ +import { randomInt } from 'crypto' +import { ChatType } from '../enums/chat-type.enum' +import { ChannelId } from '../types/channel-id.type' +import { GroupId } from '../types/group-id.type' +import { UserId } from '../types/user-id.type' + +const prefixes = { + user: 1, + channel: 2, + group: 3, + invite: 4 +} + +export function generateUserId(): UserId { + return generateUniqueId(prefixes.user) +} + +export function generateChannelId(): ChannelId { + return generateUniqueId(prefixes.channel) +} + +export function generateGroupId(): GroupId { + return generateUniqueId(prefixes.group) +} + +export function generateInviteLinkId(): bigint { + return generateUniqueId(prefixes.invite) +} + +function generateUniqueId(prefix: number): T { + const timestamp = Date.now().toString() + + const randomNumber = randomInt(10000, 99999).toString() + + return BigInt(`${prefix}${timestamp}${randomNumber}`) as T +} diff --git a/messenger-server/src/common/utils/password.util.ts b/messenger-server/src/common/utils/password.util.ts new file mode 100644 index 0000000..2ac1a47 --- /dev/null +++ b/messenger-server/src/common/utils/password.util.ts @@ -0,0 +1,14 @@ +import * as bcrypt from 'bcrypt' + +const SALT_ROUNDS = 12 + +export async function hashPassword(password: string): Promise { + return bcrypt.hash(password, SALT_ROUNDS) +} + +export async function verifyPassword( + plainPassword: string, + passwordHash: string +): Promise { + return bcrypt.compare(plainPassword, passwordHash) +} diff --git a/messenger-server/src/main.ts b/messenger-server/src/main.ts new file mode 100644 index 0000000..ee68ce9 --- /dev/null +++ b/messenger-server/src/main.ts @@ -0,0 +1,40 @@ +import { HttpAdapterHost, NestFactory, Reflector } from '@nestjs/core' +import { AppModule } from './app.module' +import { ClassSerializerInterceptor, Logger, ValidationPipe } from '@nestjs/common' +import { ConfigService } from '@nestjs/config' +import { BigIntInterceptor } from './common/interceptors/big-int.interceptor' +import { AllExceptionsFilter } from './common/filters/all-exceptions.filter' + +async function bootstrap() { + const logger = new Logger('Bootstrap') + const app = await NestFactory.create(AppModule) + const configService = app.get(ConfigService) + const httpAdapter = app.get(HttpAdapterHost) + + app.setGlobalPrefix('api') + app.useGlobalInterceptors(new BigIntInterceptor()) + app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector))) + app.useGlobalFilters(new AllExceptionsFilter(httpAdapter)) + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + transformOptions: { + enableImplicitConversion: true + } + }) + ) + + process.on('uncaughtException', (err) => { + logger.error(`Critical Uncaught Exception: ${err.message}`, err.stack) + }) + + process.on('unhandledRejection', (reason, promise) => { + logger.error(`Unhandled Rejection: ${reason instanceof Error ? reason.message : reason}`) + }) + + const port = configService.get('SERVER_PORT') + await app.listen(port) +} +bootstrap() diff --git a/messenger-server/src/modules/auth/auth.controller.ts b/messenger-server/src/modules/auth/auth.controller.ts new file mode 100644 index 0000000..bc7e66a --- /dev/null +++ b/messenger-server/src/modules/auth/auth.controller.ts @@ -0,0 +1,42 @@ +import { Body, Controller, Get, Param, Post, Req, UseGuards } from '@nestjs/common' +import { AuthService } from './auth.service' +import { SigninDto } from './dto/signin.dto' +import { SessionsService } from '../sessions/sessions.service' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { SignupDto } from './dto/signup.dto' +import { CurrentUserId } from 'src/common/decorators/user-id.decorator' +import { UserId } from 'src/common/types/user-id.type' +import { CurrentUserToken } from 'src/common/decorators/user-token.decorator' +import { SessionOwnerGuard } from 'src/common/guards/session-owner.guard' +import { ThrottlerGuard } from '@nestjs/throttler' + +@Controller('auth') +@UseGuards(ThrottlerGuard) +export class AuthController { + constructor( + private readonly authService: AuthService, + private readonly sessionService: SessionsService + ) { } + + @Get('check/:login') + isLoginAvailable(@Param('login') login: string) { + return this.authService.isLoginAvailable(login) + } + + + @Post('signin') + signin(@Body() dto: SigninDto) { + return this.authService.signin(dto) + } + + @Post('signup') + signup(@Body() dto: SignupDto) { + return this.authService.signup(dto) + } + + @Post('logout') + @UseGuards(AuthGuard, SessionOwnerGuard) + logout(@CurrentUserToken() token: string) { + return this.sessionService.deleteByToken(token) + } +} diff --git a/messenger-server/src/modules/auth/auth.module.ts b/messenger-server/src/modules/auth/auth.module.ts new file mode 100644 index 0000000..9137b57 --- /dev/null +++ b/messenger-server/src/modules/auth/auth.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common' +import { AuthService } from './auth.service' +import { AuthController } from './auth.controller' +import { JwtAuthModule } from 'src/modules/security/jwt.module' +import { SessionsModule } from '../sessions/sessions.module' + +@Module({ + imports: [JwtAuthModule, SessionsModule], + controllers: [AuthController], + providers: [AuthService] +}) +export class AuthModule { } diff --git a/messenger-server/src/modules/auth/auth.service.ts b/messenger-server/src/modules/auth/auth.service.ts new file mode 100644 index 0000000..1900fad --- /dev/null +++ b/messenger-server/src/modules/auth/auth.service.ts @@ -0,0 +1,99 @@ +import { ConflictException, Injectable, UnauthorizedException } from '@nestjs/common' +import { SigninDto } from './dto/signin.dto' +import { SignupDto } from './dto/signup.dto' +import { generateUserId } from 'src/common/utils/id-generator.util' +import { SessionsService } from '../sessions/sessions.service' +import { Prisma, SenderType } from '../../../generated/prisma/client' +import { hashPassword, verifyPassword } from 'src/common/utils/password.util' +import { UserId } from 'src/common/types/user-id.type' +import { AuthResponseDto } from './dto/auth-response.dto' +import { JwtAuthService } from 'src/modules/security/jwt.service' +import { plainToInstance } from 'class-transformer' +import { LoginAvailableDto } from './dto/check-login.dto' +import { PrismaService } from 'src/providers/prisma/prisma.service' + +@Injectable() +export class AuthService { + constructor( + private readonly prisma: PrismaService, + private readonly sessionService: SessionsService, + private readonly jwtAuth: JwtAuthService + ) { } + + async isLoginAvailable(login: string): Promise { + const user = await this.prisma.user.findUnique({ + where: { login: login } + }) + + return plainToInstance(LoginAvailableDto, { available: !user }) + } + + async signin(dto: SigninDto): Promise { + const user = await this.prisma.user.findUnique({ + where: { login: dto.login } + }) + + if (!user) throw new UnauthorizedException('Invalid credentials') + + const isValid = await verifyPassword(dto.password, user.password) + if (!isValid) throw new UnauthorizedException('Invalid credentials') + + const userId = UserId(user.id) + + // Generate both access and refresh tokens + const tokens = this.jwtAuth.generateTokenPair(userId) + + await this.sessionService.create({ + userId: userId, + token: tokens.accessToken, + deviceModel: dto.deviceModel, + osVersion: dto.osVersion, + osName: dto.osName + }) + + return plainToInstance(AuthResponseDto, { token: tokens.accessToken, userId: userId }) + } + + async signup(dto: SignupDto): Promise { + const userId = generateUserId() + const passwordHash = await hashPassword(dto.password) + + try { + await this.prisma.$transaction([ + this.prisma.user.create({ + data: { + id: userId, + login: dto.login, + password: passwordHash, + firstName: dto.firstName, + lastName: dto.lastName || null + } + }), + this.prisma.sender.create({ + data: { + id: userId, + type: SenderType.USER, + userId: userId + } + }), + this.prisma.privacySettings.create({ + data: { + userId: userId, + lastSeen: 0, + messages: 0, + bio: 0, + dateOfBirth: 0, + invites: 0 + } + }) + ]) + } catch (error) { + if (error instanceof Prisma.PrismaClientKnownRequestError) { + if (error.code === 'P2002') { + throw new ConflictException('User with this login already exists') + } + } + throw error + } + } +} diff --git a/messenger-server/src/modules/auth/dto/auth-credentials.dto.ts b/messenger-server/src/modules/auth/dto/auth-credentials.dto.ts new file mode 100644 index 0000000..03d05a7 --- /dev/null +++ b/messenger-server/src/modules/auth/dto/auth-credentials.dto.ts @@ -0,0 +1,25 @@ +import { Transform } from 'class-transformer' +import { IsNotEmpty, IsString, Matches, MaxLength, MinLength } from 'class-validator' +import { Trim } from 'src/common/decorators/trim.decorator' + +export class AuthCredentialsDto { + @IsString() + @Trim() + @IsNotEmpty() + @MinLength(5) + @MaxLength(32) + @Matches(/^\S+$/, { + message: 'login must not contain spaces' + }) + login: string + + @IsString() + @Trim() + @IsNotEmpty() + @MinLength(5) + @MaxLength(32) + @Matches(/^\S+$/, { + message: 'password must not contain spaces' + }) + password: string +} diff --git a/messenger-server/src/modules/auth/dto/auth-response.dto.ts b/messenger-server/src/modules/auth/dto/auth-response.dto.ts new file mode 100644 index 0000000..00f210a --- /dev/null +++ b/messenger-server/src/modules/auth/dto/auth-response.dto.ts @@ -0,0 +1,4 @@ +export class AuthResponseDto { + userId: string + token: string +} diff --git a/messenger-server/src/modules/auth/dto/check-login.dto.ts b/messenger-server/src/modules/auth/dto/check-login.dto.ts new file mode 100644 index 0000000..03c87c1 --- /dev/null +++ b/messenger-server/src/modules/auth/dto/check-login.dto.ts @@ -0,0 +1,3 @@ +export class LoginAvailableDto { + available: boolean +} \ No newline at end of file diff --git a/messenger-server/src/modules/auth/dto/signin.dto.ts b/messenger-server/src/modules/auth/dto/signin.dto.ts new file mode 100644 index 0000000..9d66307 --- /dev/null +++ b/messenger-server/src/modules/auth/dto/signin.dto.ts @@ -0,0 +1,20 @@ +import { IsNotEmpty, IsString } from 'class-validator' +import { AuthCredentialsDto } from './auth-credentials.dto' +import { Trim } from 'src/common/decorators/trim.decorator' + +export class SigninDto extends AuthCredentialsDto { + @IsString() + @Trim() + @IsNotEmpty() + deviceModel: string + + @IsString() + @Trim() + @IsNotEmpty() + osVersion: string + + @IsString() + @Trim() + @IsNotEmpty() + osName: string +} diff --git a/messenger-server/src/modules/auth/dto/signup.dto.ts b/messenger-server/src/modules/auth/dto/signup.dto.ts new file mode 100644 index 0000000..8d991b1 --- /dev/null +++ b/messenger-server/src/modules/auth/dto/signup.dto.ts @@ -0,0 +1,17 @@ +import { AuthCredentialsDto } from './auth-credentials.dto' +import { IsNotEmpty, IsOptional, IsString, MaxLength } from 'class-validator' +import { Trim } from 'src/common/decorators/trim.decorator' + +export class SignupDto extends AuthCredentialsDto { + @IsString() + @Trim() + @IsNotEmpty() + @MaxLength(32) + firstName: string + + @IsOptional() + @IsString() + @Trim() + @MaxLength(32) + lastName?: string +} diff --git a/messenger-server/src/modules/channels/channels.controller.ts b/messenger-server/src/modules/channels/channels.controller.ts new file mode 100644 index 0000000..7382d61 --- /dev/null +++ b/messenger-server/src/modules/channels/channels.controller.ts @@ -0,0 +1,96 @@ +import { Body, Controller, Delete, Get, HttpCode, Param, Patch, Post, Query, UseGuards } from '@nestjs/common' +import { ChannelsService } from './channels.service' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { ParseChannelIdPipe } from 'src/common/pipes/parse-channel-id.pipe' +import { ChannelId } from 'src/common/types/channel-id.type' +import { CreateChannelDto } from './dto/create-channel.dto' +import { CurrentUserId } from 'src/common/decorators/user-id.decorator' +import { UserId } from 'src/common/types/user-id.type' +import { ChannelOwnerGuard } from 'src/common/guards/channel-owner.guard' +import { ChannelExistsGuard } from 'src/common/guards/channel-exists.guard' +import { UpdateChannelDto } from './dto/update-channel.dto' +import { PARAMS } from 'src/common/constants/param.constants' +import { ParseUserIdPipe } from 'src/common/pipes/parse-user-id.pipe' + +@Controller('channels') +@UseGuards(AuthGuard) +export class ChannelsController { + constructor(private readonly channelsService: ChannelsService) { } + + @Post() + createChannel(@CurrentUserId() userId: UserId, @Body() dto: CreateChannelDto) { + return this.channelsService.create(userId, dto) + } + + @Get(`:${PARAMS.CHANNEL_ID}`) + @UseGuards(ChannelExistsGuard) + getChannelById( + @CurrentUserId() userId: UserId, + @Param(PARAMS.CHANNEL_ID, ParseChannelIdPipe) id: ChannelId + ) { + return this.channelsService.getById(id, userId) + } + + @Get(`:${PARAMS.CHANNEL_ID}/subscribers`) + @UseGuards(ChannelExistsGuard, ChannelOwnerGuard) + getSubscribers( + @Param(PARAMS.CHANNEL_ID, ParseChannelIdPipe) id: ChannelId, + @Query('skip') skip: string = '0', + @Query('take') take: string = '100', + @Query('search') search?: string + ) { + return this.channelsService.getSubscribers(id, parseInt(skip), parseInt(take), search) + } + + @Patch(`:${PARAMS.CHANNEL_ID}`) + @UseGuards(ChannelExistsGuard, ChannelOwnerGuard) + updateChannel( + @Param(PARAMS.CHANNEL_ID, ParseChannelIdPipe) id: ChannelId, + @Body() dto: UpdateChannelDto, + @CurrentUserId() userId: UserId + ) { + return this.channelsService.update(id, dto, userId) + } + + @HttpCode(204) + @Delete(`:${PARAMS.CHANNEL_ID}`) + @UseGuards(ChannelExistsGuard, ChannelOwnerGuard) + delete( + @Param(PARAMS.CHANNEL_ID, ParseChannelIdPipe) id: ChannelId, + @CurrentUserId() userId: UserId + ) { + return this.channelsService.delete(id, userId) + } + + @Post(`:${PARAMS.CHANNEL_ID}/join`) + @UseGuards(ChannelExistsGuard) + join(@Param(PARAMS.CHANNEL_ID, ParseChannelIdPipe) id: ChannelId, @CurrentUserId() userId: UserId) { + return this.channelsService.join(id, userId) + } + + @Delete(`:${PARAMS.CHANNEL_ID}/leave`) + @UseGuards(ChannelExistsGuard) + leave(@Param(PARAMS.CHANNEL_ID, ParseChannelIdPipe) id: ChannelId, @CurrentUserId() userId: UserId) { + return this.channelsService.leave(id, userId) + } + + @Post(`:${PARAMS.CHANNEL_ID}/kick/:userId`) + @UseGuards(ChannelExistsGuard, ChannelOwnerGuard) + kick( + @Param(PARAMS.CHANNEL_ID, ParseChannelIdPipe) id: ChannelId, + @Param('userId', ParseUserIdPipe) targetUserId: UserId, + @CurrentUserId() ownerId: UserId + ) { + return this.channelsService.kick(id, ownerId, targetUserId) + } + + @Post(`:${PARAMS.CHANNEL_ID}/ban/:userId`) + @UseGuards(ChannelExistsGuard, ChannelOwnerGuard) + ban( + @Param(PARAMS.CHANNEL_ID, ParseChannelIdPipe) id: ChannelId, + @Param('userId', ParseUserIdPipe) targetUserId: UserId, + @CurrentUserId() ownerId: UserId + ) { + return this.channelsService.ban(id, ownerId, targetUserId) + } +} diff --git a/messenger-server/src/modules/channels/channels.module.ts b/messenger-server/src/modules/channels/channels.module.ts new file mode 100644 index 0000000..898983a --- /dev/null +++ b/messenger-server/src/modules/channels/channels.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common' +import { ChannelsService } from './channels.service' +import { ChannelsController } from './channels.controller' +import { JwtAuthModule } from 'src/modules/security/jwt.module' +import { SessionsModule } from '../sessions/sessions.module' +import { SearchModule } from '../search/search.module' +import { ChatsModule } from '../chats/chats.module' + +@Module({ + imports: [JwtAuthModule, SessionsModule, SearchModule, ChatsModule], + controllers: [ChannelsController], + providers: [ChannelsService] +}) +export class ChannelsModule { } diff --git a/messenger-server/src/modules/channels/channels.service.ts b/messenger-server/src/modules/channels/channels.service.ts new file mode 100644 index 0000000..20ecf7b --- /dev/null +++ b/messenger-server/src/modules/channels/channels.service.ts @@ -0,0 +1,326 @@ +import { plainToInstance } from 'class-transformer' +import { BadRequestException, ConflictException, ForbiddenException, Injectable, NotFoundException } from '@nestjs/common' +import { ChannelId } from 'src/common/types/channel-id.type' +import { UserId } from 'src/common/types/user-id.type' +import { CreateChannelDto } from './dto/create-channel.dto' +import { generateChannelId } from 'src/common/utils/id-generator.util' +import { ChannelResponseDto } from './dto/channel.dto' +import { SenderType } from 'generated/prisma/enums' +import { UpdateChannelDto } from './dto/update-channel.dto' +import { ChannelType, ConversationRole, ConversationType, Prisma } from 'generated/prisma/client' +import { ChatsService } from '../chats/chats.service' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { RealtimeGateway } from '../realtime/realtime.gateway' +import { SocketEvent } from 'src/common/socket/socket-events' +import { ChatResponseDto } from '../chats/dto/chat-response.dto' +import { MessageResponseDto } from '../messages/dto/message-response.dto' +import { SearchService } from '../search/search.service' +import { InviteLinksService } from '../chats/invite-links.service' +import { UserResponseDto } from '../users/dto/user-response.dto' +import { ConfigService } from '@nestjs/config' + +@Injectable() +export class ChannelsService { + constructor( + private readonly config: ConfigService, + private readonly prisma: PrismaService, + private readonly chatsService: ChatsService, + private readonly realtimeGateway: RealtimeGateway, + private readonly searchService: SearchService, + private readonly inviteLinksService: InviteLinksService + ) { } + + async create(ownerId: UserId, dto: CreateChannelDto): Promise { + if (dto.username && dto.channelType === ChannelType.PUBLIC) { + const isAvailable = await this.searchService.isUsernameAvailable(dto.username) + if (!isAvailable) throw new ConflictException('Username is already taken') + } + + const channelId = generateChannelId() + + try { + const channel = await this.prisma.$transaction(async tx => { + const channel = await tx.channel.create({ + data: { + id: channelId, + name: dto.name, + bio: dto.bio, + ownerId: ownerId, + channelType: dto.channelType, + username: dto.channelType === ChannelType.PUBLIC ? dto.username : null + } + }) + + await tx.sender.create({ + data: { + id: channel.id, + type: SenderType.CHANNEL, + channelId: channel.id + } + }) + + await tx.channelSubscriber.create({ + data: { + userId: ownerId, + channelId: channel.id + } + }) + + const conversation = await tx.conversation.create({ + data: { + type: ConversationType.CHANNEL, + channelId: channel.id, + createdAt: Date.now() + } + }) + + await tx.conversationMember.create({ + data: { + conversationId: conversation.id, + userId: ownerId, + role: ConversationRole.OWNER, + joinedAt: Date.now() + } + }) + + await this.chatsService.create(tx, ownerId, conversation.id) + + if (dto.channelType === ChannelType.PRIVATE) { + await this.inviteLinksService.create(ownerId, { channelId: channel.id.toString() }) + } + + return channel + }) + + return this.getById(ChannelId(channel.id), ownerId) + } catch (e) { + if (e instanceof Prisma.PrismaClientKnownRequestError) { + if (e.code === 'P2002') { + throw new ConflictException('Username already exists') + } + } + throw e + } + } + + async update(id: ChannelId, dto: UpdateChannelDto, userId: UserId): Promise { + const existingChannel = await this.prisma.channel.findUnique({ where: { id } }) + + if (dto.username && dto.username !== existingChannel!.username) { + const isAvailable = await this.searchService.isUsernameAvailable(dto.username) + if (!isAvailable) throw new ConflictException('Username is already taken') + } + + const channelType = dto.channelType ?? existingChannel!.channelType + const username = channelType === ChannelType.PRIVATE ? null : (dto.username ?? existingChannel!.username) + + await this.prisma.channel.update({ + where: { id: id }, + data: { + name: dto.name, + bio: dto.bio, + channelType: channelType, + username: username + } + }) + return this.getById(id, userId) + } + + async join(channelId: ChannelId, userId: UserId): Promise { + const channel = await this.prisma.channel.findUnique({ + where: { id: channelId }, + include: { conversations: true } + }) + + if (channel!.channelType !== ChannelType.PUBLIC) { + throw new BadRequestException('This channel is private. Use invite link to join.') + } + + const isBanned = await this.prisma.channelBlackList.count({ + where: { channelId, userId } + }) + if (isBanned) throw new BadRequestException('You are banned from this channel') + + const conversation = channel!.conversations[0] + if (!conversation) throw new NotFoundException('Channel conversation not found') + + await this.prisma.$transaction(async tx => { + const existingMember = await tx.channelSubscriber.findUnique({ + where: { userId_channelId: { userId, channelId } } + }) + if (existingMember) return + + await tx.channelSubscriber.create({ + data: { channelId, userId } + }) + + await tx.conversationMember.create({ + data: { + conversationId: conversation.id, + userId, + joinedAt: Date.now() + } + }) + + await this.chatsService.create(tx, userId, conversation.id) + }) + + const lastMessage = await this.prisma.message.findFirst({ + where: { conversationId: conversation.id }, + orderBy: { sendTime: 'desc' } + }) + + const chatPayload = plainToInstance(ChatResponseDto, { + id: channel!.id.toString(), + name: channel!.name, + isPinned: false, + lastMessage: lastMessage ? plainToInstance(MessageResponseDto, { + ...lastMessage, + chatId: channel!.id.toString() + }) : null + }) + + this.realtimeGateway.sendToUser(userId, SocketEvent.CHAT_NEW, chatPayload) + } + + async leave(channelId: ChannelId, userId: UserId): Promise { + const channel = await this.prisma.channel.findUnique({ + where: { id: channelId }, + include: { conversations: true } + }) + if (channel!.ownerId === userId) throw new BadRequestException('Owner cannot unsubscribe. Delete it instead.') + + const conversation = channel!.conversations[0] + + await this.prisma.$transaction(async tx => { + await tx.channelSubscriber.delete({ + where: { userId_channelId: { userId, channelId } } + }).catch(() => { }) + + if (conversation) { + await tx.conversationMember.delete({ + where: { conversationId_userId: { conversationId: conversation.id, userId } } + }).catch(() => { }) + + await tx.chat.deleteMany({ + where: { userId, conversationId: conversation.id } + }) + } + }) + } + + async kick(id: ChannelId, ownerId: UserId, targetUserId: UserId): Promise { + if (targetUserId === ownerId) throw new BadRequestException('Cannot kick yourself') + + await this.leave(id, targetUserId) + } + + async ban(id: ChannelId, ownerId: UserId, targetUserId: UserId): Promise { + if (targetUserId === ownerId) throw new BadRequestException('Cannot ban yourself') + + await this.prisma.$transaction(async tx => { + await this.kick(id, ownerId, targetUserId) + await tx.channelBlackList.upsert({ + where: { userId_channelId: { userId: targetUserId, channelId: id } }, + create: { userId: targetUserId, channelId: id }, + update: {} + }) + }) + } + + async getById(channelId: ChannelId, userId: UserId): Promise { + const channel = await this.prisma.channel.findUnique({ + where: { + id: channelId + }, + include: { + _count: { + select: { + subscribers: true, + blockedUsers: true + } + }, + subscribers: { + where: { userId }, + select: { userId: true } + }, + conversations: { + include: { + inviteLinks: { + take: 1 + } + } + } + } + }) + + const isOwner = channel!.ownerId == userId + let inviteLinkCode = channel!.conversations[0]?.inviteLinks[0]?.code + + if (channel!.channelType === ChannelType.PRIVATE && !inviteLinkCode && isOwner) { + const newLink = await this.inviteLinksService.create(userId, { channelId: channelId.toString() }) + inviteLinkCode = newLink.code + } + + const inviteLink = inviteLinkCode ? `https://${this.config.get("SHORT_URL_DOMAIN")}/+${inviteLinkCode}` : null + + return plainToInstance(ChannelResponseDto, { + ...channel, + id: channel!.id.toString(), + isSubscribed: channel!.subscribers.length > 0, + isOwner, + subscribers: channel!._count.subscribers.toString(), + removedUser: channel!._count.blockedUsers.toString(), + inviteLink + }) + } + + async getSubscribers(channelId: ChannelId, skip: number, take: number, search?: string): Promise { + const where: Prisma.ChannelSubscriberWhereInput = { + channelId, + user: search ? { + OR: [ + { firstName: { contains: search } }, + { lastName: { contains: search } }, + { username: { contains: search } } + ] + } : undefined + } + + const subscribers = await this.prisma.channelSubscriber.findMany({ + where, + skip, + take, + include: { + user: true + }, + orderBy: { + user: { + firstName: 'asc' + } + } + }) + + return plainToInstance(UserResponseDto, subscribers.map(s => s.user)) + } + + async delete(id: ChannelId, userId: UserId): Promise { + const channel = await this.prisma.channel.findUnique({ where: { id } }) + if (!channel) throw new NotFoundException('Channel not found') + if (channel.ownerId !== userId) throw new ForbiddenException('Only owner can delete channel') + + await this.prisma.channel.delete({ where: { id: id } }) + } + + async isExists(id: ChannelId): Promise { + return await this.prisma.channel.count({ where: { id } }) > 0 + } + + async isOwner(channelId: ChannelId, userId: UserId): Promise { + const count = await this.prisma.channel.count({ + where: { id: channelId, ownerId: userId } + }) + + return count > 0 + } +} diff --git a/messenger-server/src/modules/channels/dto/channel.dto.ts b/messenger-server/src/modules/channels/dto/channel.dto.ts new file mode 100644 index 0000000..97016ff --- /dev/null +++ b/messenger-server/src/modules/channels/dto/channel.dto.ts @@ -0,0 +1,45 @@ +import { Exclude, Expose } from 'class-transformer' +import { ChannelType } from 'generated/prisma/enums' +import { OmitNull } from 'src/common/decorators/omit-null.decorator' + +@Exclude() +export class ChannelResponseDto { + @Expose() + id: string + + @Expose() + name: string + + @Expose() + @OmitNull() + username?: string + + @Expose() + @OmitNull() + bio?: string + + @Expose() + @OmitNull() + ownerId?: string + + @Expose() + channelType: ChannelType + + @Expose() + @OmitNull() + subscribers: string + + @Expose() + @OmitNull() + removedUser?: string + + @Expose() + isSubscribed: boolean + + @Expose() + isOwner?: boolean + + @Expose() + @OmitNull() + inviteLink?: string +} diff --git a/messenger-server/src/modules/channels/dto/create-channel.dto.ts b/messenger-server/src/modules/channels/dto/create-channel.dto.ts new file mode 100644 index 0000000..3083e8a --- /dev/null +++ b/messenger-server/src/modules/channels/dto/create-channel.dto.ts @@ -0,0 +1,29 @@ +import { IsEnum, IsOptional, IsString, Matches, MaxLength, MinLength, ValidateIf } from 'class-validator' +import { ChannelType } from '../../../../generated/prisma/client' +import { Trim } from 'src/common/decorators/trim.decorator' + +export class CreateChannelDto { + @IsString() + @Trim() + @MinLength(1) + @MaxLength(100) + name: string + + @IsOptional() + @IsString() + @Trim() + @MaxLength(100) + bio?: string + + @IsOptional() + @IsEnum(ChannelType) + channelType: ChannelType + + @ValidateIf((o) => o.channelType === ChannelType.PUBLIC) + @IsString() + @Trim() + @MinLength(3, { message: 'Минимальная длинна 3 символа' }) + @MaxLength(32) + @Matches(/^[a-zA-Z0-9_]+$/, { message: 'Username can only contain letters, numbers and underscores' }) + username?: string +} diff --git a/messenger-server/src/modules/channels/dto/update-channel.dto.ts b/messenger-server/src/modules/channels/dto/update-channel.dto.ts new file mode 100644 index 0000000..2340276 --- /dev/null +++ b/messenger-server/src/modules/channels/dto/update-channel.dto.ts @@ -0,0 +1,4 @@ +import { CreateChannelDto } from './create-channel.dto' +import { PartialType } from '@nestjs/mapped-types' + +export class UpdateChannelDto extends PartialType(CreateChannelDto) { } diff --git a/messenger-server/src/modules/chats/chats.controller.ts b/messenger-server/src/modules/chats/chats.controller.ts new file mode 100644 index 0000000..f8231c1 --- /dev/null +++ b/messenger-server/src/modules/chats/chats.controller.ts @@ -0,0 +1,60 @@ +import { Body, Controller, Delete, Get, Param, Post, Query, UseGuards } from '@nestjs/common' +import { ChatsService } from './chats.service' +import { CurrentUserId } from 'src/common/decorators/user-id.decorator' +import { UserId } from 'src/common/types/user-id.type' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { InviteLinksService } from './invite-links.service' +import { CreateInviteLinkDto } from './dto/create-invite-link.dto' +import { plainToInstance } from 'class-transformer' +import { InviteLinkResponseDto } from './dto/invite-link-response.dto' +import { ChatId } from 'src/common/types/chat-id.type' +import { CanReadChatGuard } from 'src/common/guards/can-read-chat.guard' + +@Controller('chats') +@UseGuards(AuthGuard) +export class ChatsController { + constructor( + private readonly chatsService: ChatsService, + private readonly inviteLinksService: InviteLinksService + ) { } + + @Get() + getAll(@CurrentUserId() userId: UserId) { + return this.chatsService.getAll(userId) + } + + @Get(':chatId') + @UseGuards(CanReadChatGuard) + getById( + @CurrentUserId() userId: UserId, + @Param('chatId') chatId: string + ) { + return this.chatsService.getById(userId, ChatId(chatId)) + } + + @Delete(':chatId') + async deleteChat( + @CurrentUserId() userId: UserId, + @Param('chatId') chatId: string, + @Query('deleteForReceiver') deleteForReceiver?: string + ) { + return this.chatsService.deleteForUser(userId, ChatId(chatId), deleteForReceiver === 'true') + } + + @Post('invite-links') + async createInviteLink( + @CurrentUserId() userId: UserId, + @Body() dto: CreateInviteLinkDto + ) { + const link = await this.inviteLinksService.create(userId, dto) + return plainToInstance(InviteLinkResponseDto, link) + } + + @Get('join/:code') + joinViaLink( + @CurrentUserId() userId: UserId, + @Param('code') code: string + ) { + return this.inviteLinksService.join(userId, code) + } +} diff --git a/messenger-server/src/modules/chats/chats.module.ts b/messenger-server/src/modules/chats/chats.module.ts new file mode 100644 index 0000000..88a4879 --- /dev/null +++ b/messenger-server/src/modules/chats/chats.module.ts @@ -0,0 +1,14 @@ +import { Module, forwardRef } from '@nestjs/common' +import { ChatsService } from './chats.service' +import { ChatsController } from './chats.controller' +import { JwtAuthModule } from '../security/jwt.module' +import { SessionsModule } from '../sessions/sessions.module' +import { InviteLinksService } from './invite-links.service' + +@Module({ + imports: [JwtAuthModule, forwardRef(() => SessionsModule)], + controllers: [ChatsController], + providers: [ChatsService, InviteLinksService], + exports: [ChatsService, InviteLinksService] +}) +export class ChatsModule { } diff --git a/messenger-server/src/modules/chats/chats.service.ts b/messenger-server/src/modules/chats/chats.service.ts new file mode 100644 index 0000000..708fc3b --- /dev/null +++ b/messenger-server/src/modules/chats/chats.service.ts @@ -0,0 +1,614 @@ +import { ForbiddenException, Injectable, NotFoundException } from '@nestjs/common' +import { UserId } from 'src/common/types/user-id.type' +import { ChatResponseDto } from './dto/chat-response.dto' +import { plainToInstance } from 'class-transformer' +import { ChatId } from 'src/common/types/chat-id.type' +import { ConversationType, Prisma } from 'generated/prisma/client' +import { ChatType } from 'src/common/enums/chat-type.enum' +import { detectChatType } from 'src/common/utils/detect-chat-type.util' +import { MessageResponseDto } from '../messages/dto/message-response.dto' +import { PrismaService } from 'src/providers/prisma/prisma.service' + +@Injectable() +export class ChatsService { + constructor(private readonly prisma: PrismaService) { } + + async deleteForUser(userId: UserId, chatId: ChatId, deleteForAll: boolean = false): Promise { + const conversation = await this.findConversationByChatId(chatId, userId) + + if (deleteForAll && conversation.type === ConversationType.DIRECT) { + await this.prisma.chat.deleteMany({ + where: { conversationId: conversation.id } + }) + } else { + await this.prisma.chat.deleteMany({ + where: { userId, conversationId: conversation.id } + }) + } + } + + async getAll(userId: UserId): Promise { + // Optimized: Include members in the initial query to avoid N+1 for direct chats + const chats = await this.prisma.chat.findMany({ + where: { userId: userId }, + include: { + conversation: { + include: { + group: true, + channel: true, + members: { + include: { + user: { + select: { + id: true, + firstName: true, + lastName: true + } + } + } + } + } + } + } + }) + + if (chats.length === 0) { + return [] + } + + // Batch fetch last messages for all conversations in parallel + const conversationIds = chats.map(c => c.conversationId) + const lastMessages = await this.prisma.message.findMany({ + where: { conversationId: { in: conversationIds } }, + orderBy: { sendTime: 'desc' }, + distinct: ['conversationId'], + select: { + id: true, + text: true, + sendTime: true, + senderId: true, + conversationId: true, + files: true + } + }) + + // Create map for O(1) lookup + const lastMessagesMap = new Map(lastMessages.map(m => [m.conversationId, m])) + + const chatsWithTitle = chats.map(chat => { + let title = "" + let chatId: bigint | null = null + + switch (chat.conversation.type) { + case ConversationType.DIRECT: { + const otherMember = chat.conversation.members.find(m => m.userId !== userId) + if (otherMember) { + chatId = otherMember.userId + title = `${otherMember.user.firstName ?? ""} ${otherMember.user.lastName ?? ""}`.trim() + } else { + chatId = userId + title = "Saved messages" + } + break + } + case ConversationType.CHANNEL: { + if (chat.conversation.channel) { + chatId = chat.conversation.channelId + title = chat.conversation.channel.name + } + break + } + case ConversationType.GROUP: { + if (chat.conversation.group) { + chatId = chat.conversation.groupId + title = chat.conversation.group.name + } + break + } + } + + const lastMessage = lastMessagesMap.get(chat.conversationId) + return { + id: chatId, + name: title, + isPinned: chat.isPinned, + lastMessage: lastMessage ? { + ...lastMessage, + chatId: chatId?.toString() || '', + isRead: true, + files: lastMessage.files?.map(f => ({ ...f, size: f.size.toString() })) || [] + } : undefined + } + }) + + return plainToInstance(ChatResponseDto, chatsWithTitle) + } + + async create(tx: Prisma.TransactionClient, userId: UserId, conversationId: number): Promise { + const chat = await tx.chat.upsert({ + where: { + userId_conversationId: { userId, conversationId } + }, + update: {}, + create: { userId, conversationId } + }) + + return plainToInstance(ChatResponseDto, chat) + } + + async resolveConversation( + tx: Prisma.TransactionClient, + userId: UserId, + chatId: ChatId + ): Promise<{ conversationId: number; conversationType: ConversationType; ownerId: bigint; chatType: ChatType }> { + const chatType = detectChatType(chatId) + const now = Date.now() + + if (chatType === ChatType.PRIVATE) { + const existing = await tx.conversation.findFirst({ + where: { + type: ConversationType.DIRECT, + members: { + some: { userId: userId }, + }, + AND: [ + { members: { some: { userId: chatId as bigint } } }, + { members: { none: { userId: { notIn: [userId, chatId as bigint] } } } } + ] + } + }) + + if (existing) { + return { + conversationId: existing.id, + conversationType: existing.type, + ownerId: chatId, + chatType + } + } + + if (userId === (chatId as bigint)) { + const selfConversation = await tx.conversation.create({ + data: { + type: ConversationType.DIRECT, + createdAt: now, + members: { + create: { + userId: userId, + joinedAt: now, + role: 'MEMBER' + } + } + } + }) + + return { + conversationId: selfConversation.id, + conversationType: selfConversation.type, + ownerId: chatId, + chatType + } + } + + const created = await tx.conversation.create({ + data: { + type: ConversationType.DIRECT, + createdAt: now, + members: { + createMany: { + data: [ + { userId: userId, joinedAt: now, role: 'MEMBER' }, + { userId: chatId, joinedAt: now, role: 'MEMBER' } + ] + } + } + } + }) + + return { + conversationId: created.id, + conversationType: created.type, + ownerId: chatId, + chatType + } + } + + if (chatType === ChatType.GROUP) { + let conversation = await tx.conversation.findUnique({ + where: { groupId: chatId }, + include: { group: { select: { ownerId: true } } } + }) + + if (!conversation) { + const group = await tx.group.findUnique({ where: { id: chatId } }) + if (!group) throw new NotFoundException('Group not found') + + conversation = await tx.conversation.create({ + data: { + type: ConversationType.GROUP, + groupId: chatId, + createdAt: now + }, + include: { group: { select: { ownerId: true } } } + }) + } + + return { + conversationId: conversation.id, + conversationType: conversation.type, + ownerId: conversation.group?.ownerId || BigInt(0), + chatType + } + } + + if (chatType === ChatType.CHANNEL) { + let conversation = await tx.conversation.findUnique({ + where: { channelId: chatId }, + include: { channel: { select: { ownerId: true } } } + }) + + if (!conversation) { + const channel = await tx.channel.findUnique({ where: { id: chatId } }) + if (!channel) throw new NotFoundException('Channel not found') + + conversation = await tx.conversation.create({ + data: { + type: ConversationType.CHANNEL, + channelId: chatId, + createdAt: now + }, + include: { channel: { select: { ownerId: true } } } + }) + } + + return { + conversationId: conversation.id, + conversationType: conversation.type, + ownerId: conversation.channel?.ownerId || BigInt(0), + chatType + } + } + + throw new Error('Unsupported chat type') + } + + async findConversationByChatId(chatId: ChatId, userId: UserId) { + const chatType = detectChatType(chatId) + + if (chatType === ChatType.PRIVATE) { + const conversation = await this.prisma.conversation.findFirst({ + where: { + type: ConversationType.DIRECT, + members: { + some: { userId: userId }, + }, + AND: [ + { members: { some: { userId: chatId as bigint } } }, + { members: { none: { userId: { notIn: [userId, chatId as bigint] } } } } + ] + } + }) + + if (!conversation) { + const target = await this.prisma.user.findUnique({ where: { id: chatId as bigint } }) + if (!target) throw new NotFoundException('User not found') + const resolved = await this.prisma.$transaction(async tx => { + const ctx = await this.resolveConversation(tx, userId, chatId) + await Promise.all([ + this.create(tx, userId, ctx.conversationId), + this.create(tx, chatId as unknown as UserId, ctx.conversationId) + ]) + return ctx + }) + return this.prisma.conversation.findUniqueOrThrow({ where: { id: resolved.conversationId } }) + } + + return conversation + } + + if (chatType === ChatType.GROUP) { + const conversation = await this.prisma.conversation.findUnique({ + where: { groupId: chatId } + }) + + if (!conversation) { + throw new NotFoundException('Conversation not found') + } + + return conversation + } + + if (chatType === ChatType.CHANNEL) { + const conversation = await this.prisma.conversation.findUnique({ + where: { channelId: chatId } + }) + + if (!conversation) { + throw new NotFoundException('Conversation not found') + } + + return conversation + } + + throw new NotFoundException('Unsupported chat type') + } + + async canReadChat(userId: UserId, chatId: ChatId): Promise { + const chatType = detectChatType(chatId) + + if (chatType === ChatType.PRIVATE) { + const conversation = await this.prisma.conversation.findFirst({ + where: { + type: ConversationType.DIRECT, + members: { + some: { userId: userId }, + }, + AND: [ + { members: { some: { userId: chatId as bigint } } }, + { members: { none: { userId: { notIn: [userId, chatId as bigint] } } } } + ] + } + }) + + if (!conversation) { + const target = await this.prisma.user.findUnique({ where: { id: chatId as bigint } }) + if (!target) throw new ForbiddenException('User not found') + return true + } + + return true + } + + if (chatType === ChatType.GROUP) { + const member = await this.prisma.groupMember.findFirst({ + where: { + groupId: chatId, + userId + } + }) + + if (!member) { + throw new ForbiddenException('User is not a group member') + } + + return true + } + + if (chatType === ChatType.CHANNEL) { + const channel = await this.prisma.channel.findUnique({ + where: { id: chatId }, + select: { channelType: true, ownerId: true } + }) + + if (!channel) { + throw new NotFoundException('Channel not found') + } + + if (channel.channelType === 'PUBLIC') { + return true + } + + const subscriber = await this.prisma.channelSubscriber.findFirst({ + where: { + channelId: chatId, + userId + } + }) + + if (subscriber) { + return true + } + + if (channel.ownerId !== userId) { + throw new ForbiddenException('User is not a channel member') + } + + return true + } + + throw new ForbiddenException('Unsupported chat type') + } + + async canReadMessage(userId: UserId, messageId: number, chatId?: ChatId): Promise { + const message = await this.prisma.message.findUnique({ + where: { id: messageId }, + include: { conversation: true } + }) + + if (!message) { + throw new NotFoundException('Message not found') + } + + const conversation = message.conversation + + if (chatId) { + const chatType = detectChatType(chatId) + let matches = false + + if (chatType === ChatType.PRIVATE) { + const otherMember = await this.prisma.conversationMember.findFirst({ + where: { + conversationId: conversation.id, + userId: { not: userId } + } + }) + const otherUserId = otherMember?.userId ?? userId + matches = otherUserId === ChatId(chatId) + } else if (chatType === ChatType.GROUP) { + matches = conversation.groupId === (chatId as bigint) + } else if (chatType === ChatType.CHANNEL) { + matches = conversation.channelId === (chatId as bigint) + } + + if (!matches) { + throw new ForbiddenException('Message does not belong to the specified chat') + } + } + + if (conversation.type === ConversationType.DIRECT) { + const member = await this.prisma.conversationMember.findFirst({ + where: { + conversationId: conversation.id, + userId + } + }) + + if (!member) { + throw new ForbiddenException('User is not a chat participant') + } + + return true + } + + if (conversation.type === ConversationType.GROUP) { + const member = await this.prisma.groupMember.findFirst({ + where: { + groupId: conversation.groupId, + userId + } + }) + + if (!member) { + throw new ForbiddenException('User is not a group member') + } + + return true + } + + if (conversation.type === ConversationType.CHANNEL) { + if (!conversation.channelId) { + throw new NotFoundException('Channel not found') + } + + const channel = await this.prisma.channel.findUnique({ + where: { id: conversation.channelId }, + select: { channelType: true, ownerId: true } + }) + + if (!channel) { + throw new NotFoundException('Channel not found') + } + + if (channel.channelType === 'PUBLIC') { + return true + } + + const subscriber = await this.prisma.channelSubscriber.findFirst({ + where: { + channelId: conversation.channelId, + userId + } + }) + + if (subscriber) { + return true + } + + if (channel.ownerId !== userId) { + throw new ForbiddenException('User is not a channel member') + } + + return true + } + + throw new ForbiddenException('Unsupported chat type') + } + + async getById(userId: UserId, chatId: ChatId): Promise { + const conversation = await this.findConversationByChatId(chatId, userId) + + const chat = await this.prisma.chat.findUnique({ + where: { + userId_conversationId: { + userId: userId, + conversationId: conversation.id + } + }, + include: { + conversation: { + include: { + group: true, + channel: true + } + } + } + }) + + if (!chat) { + throw new NotFoundException('Chat not found') + } + + let title = "" + let resolvedChatId: bigint | null = null + + switch (chat.conversation.type) { + case ConversationType.DIRECT: { + const otherMember = await this.prisma.conversationMember.findFirst({ + where: { + conversationId: chat.conversationId, + userId: { not: userId } + }, + include: { + user: { + select: { + id: true, + firstName: true, + lastName: true + } + } + } + }) + + if (otherMember) { + resolvedChatId = otherMember.userId + title = `${otherMember.user.firstName ?? ""} ${otherMember.user.lastName ?? ""}`.trim() + } else { + resolvedChatId = userId + title = "Saved messages" + } + break + } + case ConversationType.CHANNEL: { + if (chat.conversation.channel) { + resolvedChatId = chat.conversation.channelId + title = chat.conversation.channel.name + } + break + } + case ConversationType.GROUP: { + if (chat.conversation.group) { + resolvedChatId = chat.conversation.groupId + title = chat.conversation.group.name + } + break + } + } + + const lastMessage = await this.getLastMessage(chat.conversationId) + if (lastMessage && resolvedChatId) { + lastMessage.chatId = resolvedChatId.toString() + } + + return plainToInstance(ChatResponseDto, { + id: resolvedChatId, + name: title, + isPinned: chat.isPinned, + lastMessage: lastMessage + }) + } + + private async getLastMessage(conversationId: number): Promise { + const message = await this.prisma.message.findFirst({ + where: { conversationId }, + orderBy: { sendTime: 'desc' }, + include: { files: true } + }) + + if (!message) return null + + return plainToInstance(MessageResponseDto, { + ...message, + files: message.files.map(f => ({ ...f, size: f.size.toString() })) + }) + } +} diff --git a/messenger-server/src/modules/chats/dto/chat-response.dto.ts b/messenger-server/src/modules/chats/dto/chat-response.dto.ts new file mode 100644 index 0000000..2a78a32 --- /dev/null +++ b/messenger-server/src/modules/chats/dto/chat-response.dto.ts @@ -0,0 +1,19 @@ +import { Exclude, Expose } from "class-transformer" +import { OmitNull } from "src/common/decorators/omit-null.decorator" +import { MessageResponseDto } from "src/modules/messages/dto/message-response.dto" + +@Exclude() +export class ChatResponseDto { + @Expose() + id: number + + @Expose() + name: string + + @Expose() + isPinned: string + + @Expose() + @OmitNull() + lastMessage?: MessageResponseDto +} \ No newline at end of file diff --git a/messenger-server/src/modules/chats/dto/create-invite-link.dto.ts b/messenger-server/src/modules/chats/dto/create-invite-link.dto.ts new file mode 100644 index 0000000..bdac00b --- /dev/null +++ b/messenger-server/src/modules/chats/dto/create-invite-link.dto.ts @@ -0,0 +1,17 @@ +import { IsOptional, IsString } from 'class-validator' + +export class CreateInviteLinkDto { + @IsOptional() + @IsString() + channelId?: string + + @IsOptional() + @IsString() + groupId?: string + + @IsOptional() + maxUses?: number + + @IsOptional() + expiresInSeconds?: number +} diff --git a/messenger-server/src/modules/chats/dto/invite-link-response.dto.ts b/messenger-server/src/modules/chats/dto/invite-link-response.dto.ts new file mode 100644 index 0000000..e883e2f --- /dev/null +++ b/messenger-server/src/modules/chats/dto/invite-link-response.dto.ts @@ -0,0 +1,33 @@ +import { Exclude, Expose, Transform } from 'class-transformer' +import { OmitNull } from 'src/common/decorators/omit-null.decorator' + +@Exclude() +export class InviteLinkResponseDto { + @Expose() + @Transform(({ value }) => value.toString()) + id: string + + @Expose() + chatId: string + + @Expose() + code: string + + @Expose() + link: string + + @Expose() + @OmitNull() + @Transform(({ value }) => value?.toString()) + expiresAt?: string + + @Expose() + isPermanent: boolean + + @Expose() + @OmitNull() + maxUses?: number + + @Expose() + uses: number +} diff --git a/messenger-server/src/modules/chats/invite-links.service.ts b/messenger-server/src/modules/chats/invite-links.service.ts new file mode 100644 index 0000000..e968344 --- /dev/null +++ b/messenger-server/src/modules/chats/invite-links.service.ts @@ -0,0 +1,162 @@ +import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { UserId } from 'src/common/types/user-id.type' +import { CreateInviteLinkDto } from './dto/create-invite-link.dto' +import { randomBytes } from 'crypto' +import { generateInviteLinkId } from 'src/common/utils/id-generator.util' +import { ConversationType } from 'generated/prisma/client' +import { ChatsService } from './chats.service' +import { ConfigService } from '@nestjs/config' + +export interface InternalInviteLinkResponse { + id: bigint + chatId: string + code: string + link: string + expiresAt: bigint | null + isPermanent: boolean + maxUses: number | null + uses: number +} + +@Injectable() +export class InviteLinksService { + constructor( + private readonly config: ConfigService, + private readonly prisma: PrismaService, + private readonly chatsService: ChatsService + ) { } + + async create(creatorId: UserId, dto: CreateInviteLinkDto): Promise { + const conversation = await this.prisma.conversation.findUnique({ + where: dto.channelId + ? { channelId: BigInt(dto.channelId) } + : { groupId: BigInt(dto.groupId!) } + }) + + if (!conversation) { + throw new NotFoundException(`${dto.channelId ? 'Channel' : 'Group'} conversation not found`) + } + + const conversationId = conversation.id + + await this.prisma.inviteLink.deleteMany({ + where: { conversationId } + }) + + const id = generateInviteLinkId() + const code = randomBytes(8).toString('hex') + + const expiresAt = dto.expiresInSeconds + ? BigInt(Date.now() + dto.expiresInSeconds * 1000) + : null + + const link = await this.prisma.inviteLink.create({ + data: { + id, + code, + conversationId, + creatorId, + maxUses: dto.maxUses, + expiresAt + } + }) + + const chatId = (conversation.channelId || conversation.groupId)?.toString() || "" + + return { + id: link.id, + chatId, + code: link.code, + link: `https://${this.config.get("SHORT_URL_DOMAIN")}/+${link.code}`, + expiresAt: link.expiresAt, + isPermanent: link.expiresAt === null && (link.maxUses === null || link.maxUses === 0), + maxUses: link.maxUses, + uses: link.uses + } + } + + async join(userId: UserId, code: string) { + const link = await this.prisma.inviteLink.findUnique({ + where: { code }, + include: { conversation: true } + }) + + if (!link) { + throw new NotFoundException('Invite link not found or expired') + } + + if (link.expiresAt && link.expiresAt < BigInt(Date.now())) { + await this.prisma.inviteLink.delete({ where: { id: link.id } }) + throw new BadRequestException('Invite link expired') + } + + if (link.maxUses && link.uses >= link.maxUses) { + await this.prisma.inviteLink.delete({ where: { id: link.id } }) + throw new BadRequestException('Invite link limit reached') + } + + const { conversation } = link + + if (conversation.type === ConversationType.GROUP && conversation.groupId) { + const isBanned = await this.prisma.groupBlackList.count({ + where: { groupId: conversation.groupId, userId } + }) + if (isBanned) throw new BadRequestException('You are banned from this group') + } else if (conversation.type === ConversationType.CHANNEL && conversation.channelId) { + const isBanned = await this.prisma.channelBlackList.count({ + where: { channelId: conversation.channelId, userId } + }) + if (isBanned) throw new BadRequestException('You are banned from this channel') + } + + const existingMember = await this.prisma.conversationMember.findUnique({ + where: { conversationId_userId: { conversationId: conversation.id, userId } } + }) + + if (existingMember) return conversation + + await this.prisma.$transaction(async tx => { + if (conversation.type === ConversationType.GROUP && conversation.groupId) { + await tx.groupMember.create({ + data: { groupId: conversation.groupId, userId } + }) + } else if (conversation.type === ConversationType.CHANNEL && conversation.channelId) { + await tx.channelSubscriber.create({ + data: { channelId: conversation.channelId, userId } + }) + } + + await tx.conversationMember.create({ + data: { + conversationId: conversation.id, + userId, + joinedAt: Date.now() + } + }) + + await this.chatsService.create(tx, userId, conversation.id) + + const updatedLink = await tx.inviteLink.update({ + where: { id: link.id }, + data: { uses: { increment: 1 } } + }) + + if (updatedLink.maxUses && updatedLink.uses >= updatedLink.maxUses) { + await tx.inviteLink.delete({ where: { id: link.id } }) + } + }) + + return conversation + } + + async getByConversation(conversationId: number) { + return await this.prisma.inviteLink.findMany({ + where: { conversationId } + }) + } + + async delete(id: bigint) { + await this.prisma.inviteLink.delete({ where: { id } }) + } +} diff --git a/messenger-server/src/modules/groups/dto/create-group.dto.ts b/messenger-server/src/modules/groups/dto/create-group.dto.ts new file mode 100644 index 0000000..6acca12 --- /dev/null +++ b/messenger-server/src/modules/groups/dto/create-group.dto.ts @@ -0,0 +1,29 @@ +import { IsEnum, IsOptional, IsString, Matches, MaxLength, MinLength } from 'class-validator' +import { Trim } from 'src/common/decorators/trim.decorator' +import { GroupType } from 'generated/prisma/client' + +export class CreateGroupDto { + @IsString() + @Trim() + @MinLength(1) + @MaxLength(100) + name: string + + @IsOptional() + @IsString() + @Trim() + @MaxLength(100) + bio?: string + + @IsOptional() + @IsString() + @Trim() + @MinLength(3) + @MaxLength(32) + @Matches(/^[a-zA-Z0-9_]+$/, { message: 'Username can only contain letters, numbers and underscores' }) + username?: string + + @IsOptional() + @IsEnum(GroupType) + groupType?: GroupType +} diff --git a/messenger-server/src/modules/groups/dto/group-response.dto.ts b/messenger-server/src/modules/groups/dto/group-response.dto.ts new file mode 100644 index 0000000..fcaf07e --- /dev/null +++ b/messenger-server/src/modules/groups/dto/group-response.dto.ts @@ -0,0 +1,38 @@ +import { Exclude, Expose } from 'class-transformer' +import { OmitNull } from 'src/common/decorators/omit-null.decorator' +import { GroupType } from 'generated/prisma/client' + +@Exclude() +export class GroupResponseDto { + @Expose() + id: string + + @Expose() + name: string + + @Expose() + @OmitNull() + username?: string + + @Expose() + @OmitNull() + bio?: string + + @Expose() + @OmitNull() + groupType?: GroupType + + @Expose() + @OmitNull() + ownerId?: string + + @Expose() + @OmitNull() + membersCount?: number + + @Expose() + isMember?: boolean + + @Expose() + isOwner?: boolean +} diff --git a/messenger-server/src/modules/groups/dto/update-group.dto.ts b/messenger-server/src/modules/groups/dto/update-group.dto.ts new file mode 100644 index 0000000..fbe9956 --- /dev/null +++ b/messenger-server/src/modules/groups/dto/update-group.dto.ts @@ -0,0 +1,4 @@ +import { CreateGroupDto } from './create-group.dto' +import { PartialType } from '@nestjs/mapped-types' + +export class UpdateGroupDto extends PartialType(CreateGroupDto) { } diff --git a/messenger-server/src/modules/groups/groups.controller.ts b/messenger-server/src/modules/groups/groups.controller.ts new file mode 100644 index 0000000..eb80bed --- /dev/null +++ b/messenger-server/src/modules/groups/groups.controller.ts @@ -0,0 +1,117 @@ +import { Body, Controller, Delete, Get, HttpCode, Param, Patch, Post, Query, UseGuards } from '@nestjs/common' +import { GroupsService } from './groups.service' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { CreateGroupDto } from './dto/create-group.dto' +import { CurrentUserId } from 'src/common/decorators/user-id.decorator' +import { UserId } from 'src/common/types/user-id.type' +import { GroupId } from 'src/common/types/group-id.type' +import { ParseGroupIdPipe } from 'src/common/pipes/parse-group-id.pipe' +import { GroupOwnerGuard } from 'src/common/guards/group-owner.guard' +import { GroupExistsGuard } from 'src/common/guards/group-exists.guard' +import { PARAMS } from 'src/common/constants/param.constants' +import { UpdateGroupDto } from './dto/update-group.dto' +import { ParseUserIdPipe } from 'src/common/pipes/parse-user-id.pipe' +import { CanReadChatGuard } from 'src/common/guards/can-read-chat.guard' + +@Controller('groups') +@UseGuards(AuthGuard) +export class GroupsController { + constructor(private readonly groupsService: GroupsService) { } + + @Post() + createGroup(@CurrentUserId() userId: UserId, @Body() dto: CreateGroupDto) { + return this.groupsService.create(userId, dto) + } + + @Get(`:${PARAMS.GROUP_ID}`) + @UseGuards(GroupExistsGuard) + getById( + @Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, + @CurrentUserId() userId: UserId + ) { + return this.groupsService.getById(id, userId) + } + + @Get(`:${PARAMS.GROUP_ID}/members`) + @UseGuards(GroupExistsGuard, CanReadChatGuard) + getMembers( + @Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, + @Query('skip') skip: number, + @Query('take') take: number, + @Query('search') search?: string + ) { + return this.groupsService.getMembers(id, Number(skip) || 0, Number(take) || 100, search) + } + + @Patch(`:${PARAMS.GROUP_ID}`) + @UseGuards(GroupExistsGuard, GroupOwnerGuard) + update( + @Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, + @Body() dto: UpdateGroupDto, + @CurrentUserId() userId: UserId + ) { + return this.groupsService.update(id, dto, userId) + } + + @HttpCode(204) + @Delete(`:${PARAMS.GROUP_ID}`) + @UseGuards(GroupExistsGuard, GroupOwnerGuard) + delete( + @Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, + @CurrentUserId() userId: UserId + ) { + return this.groupsService.delete(id, userId) + } + + @Post(`:${PARAMS.GROUP_ID}/join`) + @UseGuards(GroupExistsGuard) + join(@Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, @CurrentUserId() userId: UserId) { + return this.groupsService.join(id, userId) + } + + @Post(`:${PARAMS.GROUP_ID}/leave`) + @UseGuards(GroupExistsGuard) + leave(@Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, @CurrentUserId() userId: UserId) { + return this.groupsService.leave(id, userId) + } + + @Post(`:${PARAMS.GROUP_ID}/members/:userId`) + @UseGuards(GroupExistsGuard, GroupOwnerGuard) + addMember( + @Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, + @Param('userId', ParseUserIdPipe) targetUserId: UserId, + @CurrentUserId() ownerId: UserId + ) { + return this.groupsService.addMember(id, targetUserId) + } + + @Delete(`:${PARAMS.GROUP_ID}/members/:userId`) + @UseGuards(GroupExistsGuard, GroupOwnerGuard) + removeMember( + @Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, + @Param('userId', ParseUserIdPipe) targetUserId: UserId, + @CurrentUserId() ownerId: UserId + ) { + return this.groupsService.kick(id, ownerId, targetUserId) + } + + @Post(`:${PARAMS.GROUP_ID}/kick/:userId`) + @UseGuards(GroupExistsGuard, GroupOwnerGuard) + kick( + @Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, + @Param('userId', ParseUserIdPipe) targetUserId: UserId, + @CurrentUserId() ownerId: UserId + ) { + return this.groupsService.kick(id, ownerId, targetUserId) + } + + @Post(`:${PARAMS.GROUP_ID}/ban/:userId`) + @UseGuards(GroupExistsGuard, GroupOwnerGuard) + ban( + @Param(PARAMS.GROUP_ID, ParseGroupIdPipe) id: GroupId, + @Param('userId', ParseUserIdPipe) targetUserId: UserId, + @CurrentUserId() ownerId: UserId + ) { + return this.groupsService.ban(id, ownerId, targetUserId) + } +} diff --git a/messenger-server/src/modules/groups/groups.module.ts b/messenger-server/src/modules/groups/groups.module.ts new file mode 100644 index 0000000..3b2ddac --- /dev/null +++ b/messenger-server/src/modules/groups/groups.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common' +import { GroupsService } from './groups.service' +import { GroupsController } from './groups.controller' +import { JwtAuthModule } from 'src/modules/security/jwt.module' +import { SessionsModule } from '../sessions/sessions.module' +import { SearchModule } from '../search/search.module' +import { ChatsModule } from '../chats/chats.module' + +@Module({ + imports: [JwtAuthModule, SessionsModule, SearchModule, ChatsModule], + controllers: [GroupsController], + providers: [GroupsService] +}) +export class GroupsModule { } diff --git a/messenger-server/src/modules/groups/groups.service.ts b/messenger-server/src/modules/groups/groups.service.ts new file mode 100644 index 0000000..27fdd06 --- /dev/null +++ b/messenger-server/src/modules/groups/groups.service.ts @@ -0,0 +1,278 @@ +import { plainToInstance } from 'class-transformer' +import { BadRequestException, ConflictException, ForbiddenException, Injectable, NotFoundException } from '@nestjs/common' +import { GroupId } from 'src/common/types/group-id.type' +import { UserId } from 'src/common/types/user-id.type' +import { CreateGroupDto } from './dto/create-group.dto' +import { generateGroupId } from 'src/common/utils/id-generator.util' +import { GroupResponseDto } from './dto/group-response.dto' +import { UpdateGroupDto } from './dto/update-group.dto' +import { ChatsService } from '../chats/chats.service' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { ConversationRole, ConversationType, GroupType, Prisma } from 'generated/prisma/client' +import { SearchService } from '../search/search.service' +import { UserResponseDto } from '../users/dto/user-response.dto' + +@Injectable() +export class GroupsService { + constructor( + private readonly prisma: PrismaService, + private readonly chatsService: ChatsService, + private readonly searchService: SearchService + ) { } + + async create(ownerId: UserId, dto: CreateGroupDto): Promise { + if (dto.username) { + const isAvailable = await this.searchService.isUsernameAvailable(dto.username) + if (!isAvailable) throw new ConflictException('Username is already taken') + } + + const groupId = generateGroupId() + + const group = await this.prisma.$transaction(async tx => { + const group = await tx.group.create({ + data: { + id: groupId, + name: dto.name, + username: dto.username, + ownerId: ownerId, + bio: dto.bio, + groupType: dto.groupType || GroupType.PRIVATE + } + }) + + await tx.groupMember.create({ + data: { + userId: ownerId, + groupId: group.id + } + }) + + const conversation = await tx.conversation.create({ + data: { + type: ConversationType.GROUP, + groupId: group.id, + createdAt: Date.now() + } + }) + + await tx.conversationMember.create({ + data: { + conversationId: conversation.id, + userId: ownerId, + role: ConversationRole.OWNER, + joinedAt: Date.now() + } + }) + + await this.chatsService.create(tx, ownerId, conversation.id) + + return group + }) + + return plainToInstance(GroupResponseDto, { ...group, isMember: true, isOwner: true, membersCount: 1 }) + } + + async update(id: GroupId, dto: UpdateGroupDto, userId: UserId): Promise { + const existingGroup = await this.prisma.group.findUnique({ where: { id } }) + + if (dto.username && dto.username !== existingGroup!.username) { + const isAvailable = await this.searchService.isUsernameAvailable(dto.username) + if (!isAvailable) throw new ConflictException('Username is already taken') + } + + const group = await this.prisma.group.update({ + where: { id }, + data: { + name: dto.name, + bio: dto.bio, + username: dto.username, + groupType: dto.groupType + } + }) + return plainToInstance(GroupResponseDto, group) + } + + async join(id: GroupId, userId: UserId): Promise { + const group = await this.prisma.group.findUnique({ + where: { id }, + include: { conversations: true } + }) + + if (group!.groupType !== GroupType.PUBLIC) { + throw new BadRequestException('This group is private. Use invite link to join.') + } + + const isBanned = await this.prisma.groupBlackList.count({ + where: { groupId: id, userId } + }) + if (isBanned) throw new BadRequestException('You are banned from this group') + + const conversation = group!.conversations[0] + if (!conversation) throw new NotFoundException('Group conversation not found') + + await this.prisma.$transaction(async tx => { + const existingMember = await tx.groupMember.findUnique({ + where: { groupId_userId: { groupId: id, userId } } + }) + if (existingMember) return + + await tx.groupMember.create({ data: { groupId: id, userId } }) + await tx.conversationMember.create({ + data: { + conversationId: conversation.id, + userId, + joinedAt: Date.now() + } + }) + await this.chatsService.create(tx, userId, conversation.id) + }) + } + + async leave(id: GroupId, userId: UserId): Promise { + const group = await this.prisma.group.findUnique({ + where: { id }, + include: { conversations: true } + }) + if (group!.ownerId === userId) throw new BadRequestException('Owner cannot leave group. Delete it instead.') + + const conversation = group!.conversations[0] + + await this.prisma.$transaction(async tx => { + await tx.groupMember.delete({ + where: { groupId_userId: { groupId: id, userId } } + }).catch(() => { }) + + if (conversation) { + await tx.conversationMember.delete({ + where: { conversationId_userId: { conversationId: conversation.id, userId } } + }).catch(() => { }) + + await tx.chat.deleteMany({ + where: { userId, conversationId: conversation.id } + }) + } + }) + } + + async addMember(id: GroupId, targetUserId: UserId): Promise { + const group = await this.prisma.group.findUnique({ + where: { id }, + include: { conversations: true } + }) + if (!group) throw new NotFoundException('Group not found') + + const isBanned = await this.prisma.groupBlackList.count({ + where: { groupId: id, userId: targetUserId } + }) + if (isBanned) throw new BadRequestException('User is banned from this group') + + const conversation = group.conversations[0] + if (!conversation) throw new NotFoundException('Group conversation not found') + + await this.prisma.$transaction(async tx => { + const existingMember = await tx.groupMember.findUnique({ + where: { groupId_userId: { groupId: id, userId: targetUserId } } + }) + if (existingMember) return + + await tx.groupMember.create({ data: { groupId: id, userId: targetUserId } }) + await tx.conversationMember.create({ + data: { + conversationId: conversation.id, + userId: targetUserId, + joinedAt: Date.now() + } + }) + await this.chatsService.create(tx, targetUserId, conversation.id) + }) + } + + async kick(id: GroupId, ownerId: UserId, targetUserId: UserId): Promise { + if (targetUserId === ownerId) throw new BadRequestException('Cannot kick yourself') + + await this.leave(id, targetUserId) + } + + async ban(id: GroupId, ownerId: UserId, targetUserId: UserId): Promise { + if (targetUserId === ownerId) throw new BadRequestException('Cannot ban yourself') + + await this.prisma.$transaction(async tx => { + await this.kick(id, ownerId, targetUserId) + await tx.groupBlackList.upsert({ + where: { userId_groupId: { userId: targetUserId, groupId: id } }, + create: { userId: targetUserId, groupId: id }, + update: {} + }) + }) + } + + async getById(id: GroupId, userId?: UserId): Promise { + const group = await this.prisma.group.findUnique({ + where: { id }, + include: { + _count: { + select: { members: true } + }, + members: userId ? { + where: { userId }, + select: { userId: true } + } : undefined + } + }) + + const isMember = userId ? group!.members.length > 0 : false + const isOwner = userId ? group!.ownerId === userId : false + + return plainToInstance(GroupResponseDto, { + ...group, + membersCount: group!._count.members, + isMember, + isOwner + }) + } + + async getMembers(id: GroupId, skip: number, take: number, search?: string): Promise { + const where: Prisma.GroupMemberWhereInput = { + groupId: id, + user: search ? { + OR: [ + { firstName: { contains: search } }, + { lastName: { contains: search } }, + { username: { contains: search } } + ] + } : undefined + } + + const members = await this.prisma.groupMember.findMany({ + where, + skip, + take, + include: { + user: true + }, + orderBy: { + user: { + firstName: 'asc' + } + } + }) + + return plainToInstance(UserResponseDto, members.map(m => m.user)) + } + + async delete(id: GroupId, userId: UserId): Promise { + await this.prisma.group.delete({ where: { id } }) + } + + async isExists(id: GroupId): Promise { + return await this.prisma.group.count({ where: { id } }) > 0 + } + + async isOwner(groupId: GroupId, userId: UserId): Promise { + const count = await this.prisma.group.count({ + where: { id: groupId, ownerId: userId } + }) + + return count > 0 + } +} diff --git a/messenger-server/src/modules/kanban/kanban.controller.ts b/messenger-server/src/modules/kanban/kanban.controller.ts new file mode 100644 index 0000000..f45b038 --- /dev/null +++ b/messenger-server/src/modules/kanban/kanban.controller.ts @@ -0,0 +1,51 @@ +import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, UseGuards } from '@nestjs/common' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { CurrentUserId } from 'src/common/decorators/user-id.decorator' +import { UserId } from 'src/common/types/user-id.type' +import { KanbanService } from './kanban.service' + +@Controller('kanban') +@UseGuards(AuthGuard) +export class KanbanController { + constructor(private readonly kanban: KanbanService) { } + + @Get() + getBoards(@CurrentUserId() userId: UserId) { + return this.kanban.getBoards(userId) + } + + @Post() + createBoard(@CurrentUserId() userId: UserId, @Body('title') title: string) { + return this.kanban.createBoard(userId, title) + } + + @Patch(':boardId') + updateBoard(@CurrentUserId() userId: UserId, @Param('boardId', ParseIntPipe) boardId: number, @Body('title') title: string) { + return this.kanban.updateBoard(userId, boardId, title) + } + + @Delete(':boardId') + deleteBoard(@CurrentUserId() userId: UserId, @Param('boardId', ParseIntPipe) boardId: number) { + return this.kanban.deleteBoard(userId, boardId) + } + + @Post(':boardId/columns') + createColumn(@CurrentUserId() userId: UserId, @Param('boardId', ParseIntPipe) boardId: number, @Body('title') title: string) { + return this.kanban.createColumn(userId, boardId, title) + } + + @Post('columns/:columnId/tasks') + createTask(@CurrentUserId() userId: UserId, @Param('columnId', ParseIntPipe) columnId: number, @Body() body: { title: string; description?: string }) { + return this.kanban.createTask(userId, columnId, body.title, body.description) + } + + @Patch('tasks/:taskId') + updateTask(@CurrentUserId() userId: UserId, @Param('taskId', ParseIntPipe) taskId: number, @Body() body: { title?: string; description?: string; columnId?: number; position?: number }) { + return this.kanban.updateTask(userId, taskId, body) + } + + @Delete('tasks/:taskId') + deleteTask(@CurrentUserId() userId: UserId, @Param('taskId', ParseIntPipe) taskId: number) { + return this.kanban.deleteTask(userId, taskId) + } +} diff --git a/messenger-server/src/modules/kanban/kanban.module.ts b/messenger-server/src/modules/kanban/kanban.module.ts new file mode 100644 index 0000000..5768ef6 --- /dev/null +++ b/messenger-server/src/modules/kanban/kanban.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common' +import { KanbanController } from './kanban.controller' +import { KanbanService } from './kanban.service' +import { SessionsModule } from '../sessions/sessions.module' +import { JwtAuthModule } from '../security/jwt.module' + +@Module({ + imports: [SessionsModule, JwtAuthModule], + controllers: [KanbanController], + providers: [KanbanService] +}) +export class KanbanModule { } diff --git a/messenger-server/src/modules/kanban/kanban.service.ts b/messenger-server/src/modules/kanban/kanban.service.ts new file mode 100644 index 0000000..e533011 --- /dev/null +++ b/messenger-server/src/modules/kanban/kanban.service.ts @@ -0,0 +1,188 @@ +import { BadRequestException, ForbiddenException, Injectable, NotFoundException } from '@nestjs/common' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { UserId } from 'src/common/types/user-id.type' +import { RealtimeGateway } from '../realtime/realtime.gateway' +import { SocketEvent } from 'src/common/socket/socket-events' + +@Injectable() +export class KanbanService { + constructor(private readonly prisma: PrismaService, private readonly realtime: RealtimeGateway) { } + + getBoards(userId: UserId) { + return this.prisma.kanbanBoard.findMany({ + where: { + OR: [ + { ownerId: userId }, + { + messages: { + some: { + conversation: { + members: { some: { userId } } + } + } + } + }, + { + columns: { + some: { + tasks: { + some: { + messages: { + some: { + conversation: { + members: { some: { userId } } + } + } + } + } + } + } + } + } + ] + }, + include: { columns: { include: { tasks: { orderBy: { position: 'asc' } } }, orderBy: { position: 'asc' } } }, + orderBy: { updatedAt: 'desc' } + }) + } + + async createBoard(userId: UserId, title: string) { + this.checkTitle(title) + return this.prisma.kanbanBoard.create({ + data: { + ownerId: userId, title: title.trim(), createdAt: Date.now(), updatedAt: Date.now(), + columns: { create: [{ title: 'Нужно сделать', position: 0 }, { title: 'В работе', position: 1 }, { title: 'Готово', position: 2 }] } + }, + include: { columns: { include: { tasks: true }, orderBy: { position: 'asc' } } } + }) + } + + async updateBoard(userId: UserId, boardId: number, title: string) { + await this.requireBoardAccess(userId, boardId) + this.checkTitle(title) + await this.prisma.kanbanBoard.update({ where: { id: boardId }, data: { title: title.trim(), updatedAt: Date.now() } }) + return this.emitBoard(boardId) + } + + async deleteBoard(userId: UserId, boardId: number) { + await this.requireBoardAccess(userId, boardId) + await this.prisma.kanbanBoard.delete({ where: { id: boardId } }) + } + + async createColumn(userId: UserId, boardId: number, title: string) { + await this.requireBoardAccess(userId, boardId) + this.checkTitle(title) + const position = await this.prisma.kanbanColumn.count({ where: { boardId } }) + await this.prisma.kanbanColumn.create({ data: { boardId, title: title.trim(), position } }) + return this.touchAndEmit(boardId) + } + + async createTask(userId: UserId, columnId: number, title: string, description?: string) { + const column = await this.requireColumnAccess(userId, columnId) + this.checkTitle(title) + const position = await this.prisma.kanbanTask.count({ where: { columnId } }) + await this.prisma.kanbanTask.create({ data: { columnId, title: title.trim(), description: description?.trim(), position, createdAt: Date.now(), updatedAt: Date.now() } }) + return this.touchAndEmit(column.boardId) + } + + async updateTask(userId: UserId, taskId: number, data: { title?: string; description?: string; columnId?: number; position?: number }) { + const task = await this.requireTaskAccess(userId, taskId) + if (data.title !== undefined) this.checkTitle(data.title) + if (data.position !== undefined && data.position < 0) throw new BadRequestException('Invalid position') + if (data.columnId !== undefined) { + const target = await this.requireColumnAccess(userId, data.columnId) + if (target.boardId !== task.column.boardId) throw new BadRequestException('Cannot move a task to another board') + } + await this.prisma.kanbanTask.update({ + where: { id: taskId }, + data: { title: data.title?.trim(), description: data.description?.trim(), columnId: data.columnId, position: data.position, updatedAt: Date.now() } + }) + return this.touchAndEmit(task.column.boardId) + } + + async deleteTask(userId: UserId, taskId: number) { + const task = await this.requireTaskAccess(userId, taskId) + await this.prisma.kanbanTask.delete({ where: { id: taskId } }) + return this.touchAndEmit(task.column.boardId) + } + + private async touchAndEmit(boardId: number) { + await this.prisma.kanbanBoard.update({ where: { id: boardId }, data: { updatedAt: Date.now() } }) + return this.emitBoard(boardId) + } + + private async emitBoard(boardId: number) { + const board = await this.prisma.kanbanBoard.findUnique({ + where: { id: boardId }, + include: { columns: { include: { tasks: { orderBy: { position: 'asc' } } }, orderBy: { position: 'asc' } } } + }) + if (!board) throw new NotFoundException('Board not found') + const members = await this.prisma.conversationMember.findMany({ + where: { conversation: { messages: { some: { OR: [{ kanbanBoardId: boardId }, { kanbanTask: { column: { boardId } } }] } } } }, + select: { userId: true }, + distinct: ['userId'] + }) + const recipients = new Set([board.ownerId, ...members.map(member => member.userId)]) + recipients.forEach(id => this.realtime.sendToUser(UserId(id), SocketEvent.KANBAN_UPDATE, board)) + return board + } + + private async requireBoard(userId: UserId, boardId: number) { + const board = await this.prisma.kanbanBoard.findUnique({ where: { id: boardId } }) + if (!board) throw new NotFoundException('Board not found') + if (board.ownerId !== userId) throw new ForbiddenException() + return board + } + + private async requireColumn(userId: UserId, columnId: number) { + const column = await this.prisma.kanbanColumn.findUnique({ where: { id: columnId }, include: { board: true } }) + if (!column) throw new NotFoundException('Column not found') + if (column.board.ownerId !== userId) throw new ForbiddenException() + return column + } + + private async requireBoardAccess(userId: UserId, boardId: number) { + const board = await this.prisma.kanbanBoard.findFirst({ + where: { + id: boardId, + OR: [ + { ownerId: userId }, + { messages: { some: { conversation: { members: { some: { userId } } } } } }, + { + columns: { + some: { + tasks: { + some: { + messages: { + some: { conversation: { members: { some: { userId } } } } + } + } + } + } + } + } + ] + } + }) + if (!board) throw new ForbiddenException('Kanban board is not available') + return board + } + + private async requireColumnAccess(userId: UserId, columnId: number) { + const column = await this.prisma.kanbanColumn.findUnique({ where: { id: columnId } }) + if (!column) throw new NotFoundException('Column not found') + await this.requireBoardAccess(userId, column.boardId) + return column + } + + private async requireTaskAccess(userId: UserId, taskId: number) { + const task = await this.prisma.kanbanTask.findUnique({ where: { id: taskId }, include: { column: { include: { board: true } } } }) + if (!task) throw new NotFoundException('Task not found') + await this.requireBoardAccess(userId, task.column.boardId) + return task + } + + private checkTitle(title: string) { + if (!title?.trim() || title.trim().length > 120) throw new BadRequestException('Invalid title') + } +} diff --git a/messenger-server/src/modules/messages/dto/file-confirm.dto.ts b/messenger-server/src/modules/messages/dto/file-confirm.dto.ts new file mode 100644 index 0000000..b4bb92f --- /dev/null +++ b/messenger-server/src/modules/messages/dto/file-confirm.dto.ts @@ -0,0 +1,10 @@ +import { IsString, IsOptional } from 'class-validator' + +export class FileConfirmDto { + @IsString() + fileId: string + + @IsOptional() + @IsString() + text?: string +} diff --git a/messenger-server/src/modules/messages/dto/file-init.dto.ts b/messenger-server/src/modules/messages/dto/file-init.dto.ts new file mode 100644 index 0000000..657ce2a --- /dev/null +++ b/messenger-server/src/modules/messages/dto/file-init.dto.ts @@ -0,0 +1,12 @@ +import { IsString, IsNumber, IsMimeType } from 'class-validator' + +export class FileInitDto { + @IsString() + name: string + + @IsNumber() + size: number + + @IsMimeType() + mimeType: string +} diff --git a/messenger-server/src/modules/messages/dto/media-message.dto.ts b/messenger-server/src/modules/messages/dto/media-message.dto.ts new file mode 100644 index 0000000..14aa212 --- /dev/null +++ b/messenger-server/src/modules/messages/dto/media-message.dto.ts @@ -0,0 +1,11 @@ +import { IsString, IsOptional, IsArray } from 'class-validator' + +export class MediaMessageDto { + @IsOptional() + @IsString() + text?: string + + @IsArray() + @IsString({ each: true }) + fileIds: string[] +} diff --git a/messenger-server/src/modules/messages/dto/message-response.dto.ts b/messenger-server/src/modules/messages/dto/message-response.dto.ts new file mode 100644 index 0000000..dd35464 --- /dev/null +++ b/messenger-server/src/modules/messages/dto/message-response.dto.ts @@ -0,0 +1,20 @@ +export class MessageFileDto { + id: string + name: string + size: string + mimeType: string + status: string +} + +export class MessageResponseDto { + id: number + senderId: string + chatId: string + text: string + sendTime: number + editedAt?: number + isRead?: boolean + files: MessageFileDto[] + kanbanBoard?: unknown + kanbanTask?: unknown +} diff --git a/messenger-server/src/modules/messages/dto/text-message.dto.ts b/messenger-server/src/modules/messages/dto/text-message.dto.ts new file mode 100644 index 0000000..e0a011c --- /dev/null +++ b/messenger-server/src/modules/messages/dto/text-message.dto.ts @@ -0,0 +1,18 @@ +import { IsInt, IsNotEmpty, IsOptional, IsString, MaxLength } from 'class-validator' +import { Trim } from 'src/common/decorators/trim.decorator' + +export class TextMessageDto { + @IsString() + @Trim() + @IsNotEmpty() + @MaxLength(5000) + text: string + + @IsOptional() + @IsInt() + kanbanBoardId?: number + + @IsOptional() + @IsInt() + kanbanTaskId?: number +} diff --git a/messenger-server/src/modules/messages/messages.controller.ts b/messenger-server/src/modules/messages/messages.controller.ts new file mode 100644 index 0000000..54ff3f0 --- /dev/null +++ b/messenger-server/src/modules/messages/messages.controller.ts @@ -0,0 +1,127 @@ +import { Body, Controller, Get, Param, Post, UseGuards, ParseIntPipe, Query, Delete } from '@nestjs/common' +import { MessagesService } from './messages.service' +import { TextMessageDto } from './dto/text-message.dto' +import { MediaMessageDto } from './dto/media-message.dto' +import { ParseChatIdPipe } from 'src/common/pipes/parse-chat-id.pipe' +import { ChatId } from 'src/common/types/chat-id.type' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { CurrentUserId } from 'src/common/decorators/user-id.decorator' +import { UserId } from 'src/common/types/user-id.type' +import { CanSendMessageGuard } from 'src/common/guards/can-send-message.guard' +import { CanReadChatGuard } from 'src/common/guards/can-read-chat.guard' +import { CanDeleteMessageGuard } from 'src/common/guards/can-delete-message.guard' +import { FileInitDto } from './dto/file-init.dto' +import { FileConfirmDto } from './dto/file-confirm.dto' + +@Controller('chats/:chatId/messages') +@UseGuards(AuthGuard) +export class MessagesController { + constructor(private readonly messagesService: MessagesService) { } + + @Post() + @UseGuards(CanSendMessageGuard) + sendMessage( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @Body() dto: TextMessageDto, + @CurrentUserId() userId: UserId + ) { + return this.messagesService.sendTextMessage(userId, chatId, dto) + } + + @Post('media') + @UseGuards(CanSendMessageGuard) + sendMediaMessage( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @Body() dto: MediaMessageDto, + @CurrentUserId() userId: UserId + ) { + return this.messagesService.sendMediaMessage(userId, chatId, dto) + } + + @Post('files/init') + @UseGuards(CanSendMessageGuard) + initFileUpload( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @Body() dto: FileInitDto, + @CurrentUserId() userId: UserId + ) { + return this.messagesService.initFileUpload(userId, chatId, dto) + } + + @Post('files/confirm') + @UseGuards(CanSendMessageGuard) + confirmFileUpload( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @Body() dto: FileConfirmDto, + @CurrentUserId() userId: UserId + ) { + return this.messagesService.confirmFileUpload(userId, chatId, dto) + } + + @Get(':messageId/files/:fileId/download') + @UseGuards(CanReadChatGuard) + getFileDownloadUrl( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @Param('messageId', ParseIntPipe) messageId: number, + @Param('fileId') fileId: string, + @CurrentUserId() userId: UserId + ) { + return this.messagesService.getFileDownloadUrl(userId, chatId, messageId, fileId) + } + + @Get() + @UseGuards(CanReadChatGuard) + getMessages( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @CurrentUserId() userId: UserId, + @Query('limit', new ParseIntPipe({ optional: true })) limit?: number, + @Query('offset', new ParseIntPipe({ optional: true })) offset?: number + ) { + return this.messagesService.getAll(userId, chatId, limit, offset) + } + + @Post(':messageId/read') + @UseGuards(CanReadChatGuard) + markRead( + @Param('messageId', ParseIntPipe) messageId: number, + @CurrentUserId() userId: UserId + ) { + return this.messagesService.markRead(userId, messageId) + } + + @Post('read') + @UseGuards(CanReadChatGuard) + markAllRead( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @CurrentUserId() userId: UserId + ) { + return this.messagesService.markAllRead(userId, chatId) + } + + @Delete(':messageId') + @UseGuards(CanDeleteMessageGuard) + deleteMessage( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @Param('messageId', ParseIntPipe) messageId: number, + @CurrentUserId() userId: UserId, + @Query('forEveryone') forEveryone?: string + ) { + return this.messagesService.deleteMessage(userId, chatId, messageId, forEveryone === 'true') + } + + @Delete() + @UseGuards(CanReadChatGuard) + clearHistory( + @Param('chatId', ParseChatIdPipe) chatId: ChatId, + @CurrentUserId() userId: UserId + ) { + return this.messagesService.clearHistory(userId, chatId) + } + + @Post('voice') + sendVoiceMessage() { } + + @Post('reaction') + sendReaction() { } +} + diff --git a/messenger-server/src/modules/messages/messages.module.ts b/messenger-server/src/modules/messages/messages.module.ts new file mode 100644 index 0000000..73bf682 --- /dev/null +++ b/messenger-server/src/modules/messages/messages.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common' +import { MessagesService } from './messages.service' +import { MessagesController } from './messages.controller' +import { JwtAuthModule } from '../security/jwt.module' +import { SessionsModule } from '../sessions/sessions.module' +import { PushModule } from '../push/push.module' +import { ChatsModule } from '../chats/chats.module' +import { StorageModule } from '../storage/storage.module' + +@Module({ + imports: [JwtAuthModule, SessionsModule, PushModule, ChatsModule, StorageModule], + controllers: [MessagesController], + providers: [MessagesService], + exports: [MessagesService] +}) +export class MessagesModule { } diff --git a/messenger-server/src/modules/messages/messages.service.ts b/messenger-server/src/modules/messages/messages.service.ts new file mode 100644 index 0000000..5daf3b2 --- /dev/null +++ b/messenger-server/src/modules/messages/messages.service.ts @@ -0,0 +1,489 @@ +import { ForbiddenException, Injectable, NotFoundException } from '@nestjs/common' +import { UserId } from 'src/common/types/user-id.type' +import { TextMessageDto } from './dto/text-message.dto' +import { MediaMessageDto } from './dto/media-message.dto' +import { ChatId } from 'src/common/types/chat-id.type' +import { plainToInstance } from 'class-transformer' +import { ChatsService } from '../chats/chats.service' +import { ConversationType, Prisma, FileStatus } from 'generated/prisma/client' +import { MessageResponseDto } from './dto/message-response.dto' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { ChatType } from 'src/common/enums/chat-type.enum' +import { PushService } from '../push/push.service' +import { RealtimeGateway } from '../realtime/realtime.gateway' +import { SocketEvent } from 'src/common/socket/socket-events' +import { StorageService } from '../storage/storage.service' +import { FileInitDto } from './dto/file-init.dto' +import { FileConfirmDto } from './dto/file-confirm.dto' +import { detectChatType } from 'src/common/utils/detect-chat-type.util' + +@Injectable() +export class MessagesService { + constructor( + private readonly prisma: PrismaService, + private readonly chatsService: ChatsService, + private readonly pushService: PushService, + private readonly realtimeGateway: RealtimeGateway, + private readonly storageService: StorageService + ) { } + + async sendTextMessage(senderId: UserId, chatId: ChatId, dto: TextMessageDto): Promise { + if (dto.kanbanBoardId) { + const board = await this.prisma.kanbanBoard.findUnique({ where: { id: dto.kanbanBoardId } }) + if (!board || board.ownerId !== senderId) throw new ForbiddenException('Kanban board not found') + } + if (dto.kanbanTaskId) { + const task = await this.prisma.kanbanTask.findUnique({ where: { id: dto.kanbanTaskId }, include: { column: { include: { board: true } } } }) + if (!task) throw new ForbiddenException('Kanban task not found') + } + return this.withChat(senderId, chatId, async (tx, ctx) => { + const sequenceId = await tx.message.count({ where: { conversationId: ctx.conversationId } }) + + const actualSenderId = ctx.conversationType === ConversationType.CHANNEL ? ctx.ownerId : senderId + const isSelfChat = ctx.chatType === ChatType.PRIVATE && senderId === (chatId as bigint) + + const message = await tx.message.create({ + data: { + sequenceId: sequenceId + 1, + conversationId: ctx.conversationId, + text: dto.text, + sendTime: Date.now(), + senderId: actualSenderId, + isRead: isSelfChat, + kanbanBoardId: dto.kanbanBoardId, + kanbanTaskId: dto.kanbanTaskId + }, + include: { + files: true, + kanbanBoard: { include: { columns: { include: { tasks: true }, orderBy: { position: 'asc' } } } }, + kanbanTask: { include: { column: { include: { board: true } } } } + } + }) + + const messageInstance = plainToInstance(MessageResponseDto, { + ...message, + chatId: chatId.toString(), + isRead: true, + files: message.files.map(f => ({ ...f, size: f.size.toString() })) + }) + + await this.notifyRecipients(senderId, chatId, ctx, messageInstance) + + return messageInstance + }) + } + + async sendMediaMessage(senderId: UserId, chatId: ChatId, dto: MediaMessageDto): Promise { + return this.withChat(senderId, chatId, async (tx, ctx) => { + const files = await tx.file.findMany({ + where: { id: { in: dto.fileIds }, status: FileStatus.COMPLETED } + }) + + if (files.length !== dto.fileIds.length) { + throw new NotFoundException('Some files were not found or not uploaded completely') + } + + const actualSenderId = ctx.conversationType === ConversationType.CHANNEL ? ctx.ownerId : senderId + const isSelfChat = ctx.chatType === ChatType.PRIVATE && senderId === (chatId as bigint) + + const results: MessageResponseDto[] = [] + + // Optimize: Get starting sequenceId once + const lastMessage = await tx.message.findFirst({ + where: { conversationId: ctx.conversationId }, + orderBy: { sequenceId: 'desc' }, + select: { sequenceId: true } + }) + let nextSequenceId = (lastMessage?.sequenceId ?? 0n) + 1n + + for (const fileId of dto.fileIds) { + const message = await tx.message.create({ + data: { + sequenceId: nextSequenceId++, + conversationId: ctx.conversationId, + text: results.length === 0 ? dto.text : null, + sendTime: Date.now(), + senderId: actualSenderId, + isRead: isSelfChat, + files: { + connect: { id: fileId } + } + }, + include: { files: true } + }) + + const messageInstance = plainToInstance(MessageResponseDto, { + ...message, + chatId: chatId.toString(), + isRead: true, + files: message.files.map(f => ({ ...f, size: f.size.toString() })) + }) + + await this.notifyRecipients(senderId, chatId, ctx, messageInstance) + results.push(messageInstance) + } + + return results + }) + } + + async initFileUpload(userId: UserId, chatId: ChatId, dto: FileInitDto) { + return this.withChat(userId, chatId, async (tx, ctx) => { + return this.storageService.initUpload(dto.name, dto.size, dto.mimeType) + }) + } + + async confirmFileUpload(userId: UserId, chatId: ChatId, dto: FileConfirmDto): Promise { + return this.withChat(userId, chatId, async (tx, ctx) => { + await this.storageService.confirmUpload(dto.fileId) + + const sequenceId = await tx.message.count({ where: { conversationId: ctx.conversationId } }) + + const actualSenderId = ctx.conversationType === ConversationType.CHANNEL ? ctx.ownerId : userId + const isSelfChat = ctx.chatType === ChatType.PRIVATE && userId === (chatId as bigint) + + const message = await tx.message.create({ + data: { + sequenceId: sequenceId + 1, + conversationId: ctx.conversationId, + text: dto.text, + sendTime: Date.now(), + senderId: actualSenderId, + isRead: isSelfChat, + files: { + connect: { id: dto.fileId } + } + }, + include: { files: true } + }) + + const messageInstance = plainToInstance(MessageResponseDto, { + ...message, + chatId: chatId.toString(), + isRead: true, + files: message.files.map(f => ({ ...f, size: f.size.toString() })) + }) + + await this.notifyRecipients(userId, chatId, ctx, messageInstance) + + return messageInstance + }) + } + + async getFileDownloadUrl(userId: UserId, chatId: ChatId, messageId: number, fileId: string) { + return this.withChat(userId, chatId, async (tx, ctx) => { + const message = await tx.message.findFirst({ + where: { id: messageId, conversationId: ctx.conversationId }, + include: { files: true } + }) + + if (!message) throw new NotFoundException('Message not found') + + const file = message.files.find(f => f.id === fileId) + if (!file) throw new NotFoundException('File not found in this message') + + return this.storageService.getDownloadUrl(fileId) + }) + } + + async getAll(userId: UserId, chatId: ChatId, limit: number = 50, offset: number = 0): Promise { + const conversation = await this.chatsService.findConversationByChatId(chatId, userId) + + const messages = await this.prisma.message.findMany({ + where: { + conversationId: conversation.id, + AND: [ + { + OR: [ + { senderId: { not: userId } }, + { deletedBySender: false } + ] + }, + { + OR: [ + { senderId: userId }, + { deletedByReceiver: false } + ] + } + ] + }, + include: { + readReceipts: { + where: { userId }, + select: { userId: true } + }, + files: true, + kanbanBoard: { include: { columns: { include: { tasks: true }, orderBy: { position: 'asc' } } } }, + kanbanTask: { include: { column: { include: { board: true } } } } + }, + orderBy: { sendTime: 'desc' }, + take: limit, + skip: offset + }) + + const messagesEntity = messages.map(message => { + const isRead = message.isRead || message.readReceipts.length > 0 + return plainToInstance(MessageResponseDto, { + ...message, + chatId: chatId.toString(), + isRead, + files: message.files.map(f => ({ ...f, size: f.size.toString() })) + }) + }) + + return messagesEntity.reverse() + } + + async markRead(userId: UserId, messageId: number): Promise { + const message = await this.prisma.message.findUnique({ + where: { id: messageId }, + include: { conversation: true } + }) + + if (!message) { + throw new NotFoundException('Message not found') + } + + const existing = await this.prisma.messageRead.findFirst({ + where: { messageId, userId } + }) + + if (!existing) { + await this.prisma.messageRead.create({ + data: { + messageId, + userId, + readAt: Date.now() + } + }) + } + + if (message.conversation.type === ConversationType.DIRECT) { + await this.prisma.message.update({ + where: { id: messageId }, + data: { isRead: true } + }) + } + } + + async markAllRead(userId: UserId, chatId: ChatId): Promise { + const conversation = await this.chatsService.findConversationByChatId(chatId, userId) + + const unread = await this.prisma.message.findMany({ + where: { + conversationId: conversation.id, + readReceipts: { none: { userId } } + }, + select: { id: true } + }) + + if (unread.length === 0) return + + const now = Date.now() + + await this.prisma.messageRead.createMany({ + data: unread.map(m => ({ + messageId: m.id, + userId, + readAt: now + })) + }) + + if (conversation.type === ConversationType.DIRECT) { + await this.prisma.message.updateMany({ + where: { id: { in: unread.map(m => m.id) } }, + data: { isRead: true } + }) + } + } + + async deleteMessage(userId: UserId, chatId: ChatId, messageId: number, forEveryone: boolean = false): Promise { + const conversation = await this.chatsService.findConversationByChatId(chatId, userId) + + const message = await this.prisma.message.findFirst({ + where: { id: messageId, conversationId: conversation.id } + }) + + if (!message) { + throw new NotFoundException('Message not found') + } + + const isDirect = conversation.type === ConversationType.DIRECT + + if (!isDirect || forEveryone) { + // Delete files associated with this message + const files = await this.prisma.file.findMany({ + where: { messageId: messageId } + }) + + for (const file of files) { + await this.storageService.deleteFile(file.id) + } + + await this.prisma.message.delete({ + where: { id: messageId } + }) + } else { + // "Delete for me" in DIRECT chat + const isSender = message.senderId === userId + const updateData = isSender ? { deletedBySender: true } : { deletedByReceiver: true } + + const updated = await this.prisma.message.update({ + where: { id: messageId }, + data: updateData + }) + + // If both participants deleted it, remove from DB + if (updated.deletedBySender && updated.deletedByReceiver) { + // Delete files associated with this message + const files = await this.prisma.file.findMany({ + where: { messageId: messageId } + }) + + for (const file of files) { + await this.storageService.deleteFile(file.id) + } + + await this.prisma.message.delete({ + where: { id: messageId } + }) + } + } + + const ctx = await this.chatsService.resolveConversation(this.prisma, userId, chatId) + const recipients = await this.getRecipients(userId, chatId, ctx.chatType) + + // Notify sender always + const senderPayload = { chatId: chatId.toString(), messageId } + this.realtimeGateway.sendToUser(userId, SocketEvent.MESSAGE_DELETE, senderPayload) + + // Notify recipient only if it was deleted for everyone + if (!isDirect || forEveryone) { + const recipientPayload = { chatId: userId.toString(), messageId } + for (const recipientId of recipients) { + this.realtimeGateway.sendToUser(recipientId, SocketEvent.MESSAGE_DELETE, recipientPayload) + } + } + } + + async clearHistory(userId: UserId, chatId: ChatId): Promise { + const conversation = await this.chatsService.findConversationByChatId(chatId, userId) + const chatType = detectChatType(chatId) + + // Fetch all messages to delete their files + const messages = await this.prisma.message.findMany({ + where: { conversationId: conversation.id }, + include: { files: true } + }) + + for (const message of messages) { + for (const file of message.files) { + await this.storageService.deleteFile(file.id) + } + } + + // Delete all messages + await this.prisma.message.deleteMany({ + where: { conversationId: conversation.id } + }) + + // Notify participants + const ctx = await this.chatsService.resolveConversation(this.prisma, userId, chatId) + const recipients = await this.getRecipients(userId, chatId, ctx.chatType) + const targets = Array.from(new Set([...recipients, userId])) + + const payload = { chatId: chatId.toString() } + + // We should add a new SocketEvent for HISTORY_CLEAR or reuse MESSAGE_DELETE with some flag + // Let's assume there is a SocketEvent.HISTORY_CLEAR or similar. + // If not, I'll check socket-events.ts + this.realtimeGateway.sendToChat(chatId, SocketEvent.HISTORY_CLEAR, payload) + this.realtimeGateway.sendToUsersExceptChat(targets, chatId, SocketEvent.HISTORY_CLEAR, payload) + } + + private async withChat( + userId: UserId, + chatId: ChatId, + fn: (tx: Prisma.TransactionClient, ctx: { conversationId: number; conversationType: ConversationType; ownerId: bigint; chatType: ChatType }) => Promise + ): Promise { + return await this.prisma.$transaction(async (tx) => { + const ctx = await this.chatsService.resolveConversation(tx, userId, chatId) + + await this.chatsService.create(tx, userId, ctx.conversationId) + + if (ctx.chatType === ChatType.PRIVATE) { + await this.chatsService.create(tx, UserId(chatId), ctx.conversationId) + } + + return fn(tx, ctx) + }) + } + + private async notifyRecipients( + senderUserId: UserId, + chatId: ChatId, + ctx: { conversationId: number; conversationType: ConversationType; ownerId: bigint; chatType: ChatType }, + message: MessageResponseDto + ): Promise { + const recipients = await this.getRecipients(senderUserId, chatId, ctx.chatType) + const wsTargets = Array.from(new Set([...recipients, senderUserId])) + + const online: UserId[] = [] + const offline: UserId[] = [] + + for (const userId of wsTargets) { + if (this.realtimeGateway.isUserOnline(userId)) { + online.push(userId) + } else if (userId !== senderUserId) { + offline.push(userId) + } + } + + if (ChatId(senderUserId) == chatId) { + this.realtimeGateway.sendToUser(senderUserId, SocketEvent.MESSAGE_NEW, message) + } else { + this.realtimeGateway.sendToChat(chatId, SocketEvent.MESSAGE_NEW, message) + } + + if (online.length > 0) { + this.realtimeGateway.sendToUsersExceptChat(online, chatId, SocketEvent.MESSAGE_NEW, message) + } + + if (offline.length > 0) { + await this.pushService.sendToUsers(offline, { + title: 'Новое сообщение', + body: message.text || 'Вложение', + data: { + type: 'message', + chatId: message.chatId, + messageId: message.id.toString() + } + }) + } + } + + private async getRecipients(senderUserId: UserId, chatId: ChatId, chatType: ChatType): Promise { + if (chatType === ChatType.PRIVATE) { + const recipient = UserId(chatId) + return recipient === senderUserId ? [] : [recipient] + } + + if (chatType === ChatType.GROUP) { + const members = await this.prisma.groupMember.findMany({ + where: { groupId: chatId }, + select: { userId: true } + }) + return members.map(m => UserId(m.userId)).filter(id => id !== senderUserId) + } + + if (chatType === ChatType.CHANNEL) { + const subs = await this.prisma.channelSubscriber.findMany({ + where: { channelId: chatId }, + select: { userId: true } + }) + return subs.map(s => UserId(s.userId)).filter(id => id !== senderUserId) + } + + return [] + } +} diff --git a/messenger-server/src/modules/push/providers/firebase-push.provider.ts b/messenger-server/src/modules/push/providers/firebase-push.provider.ts new file mode 100644 index 0000000..6844913 --- /dev/null +++ b/messenger-server/src/modules/push/providers/firebase-push.provider.ts @@ -0,0 +1,62 @@ +import { Injectable, Logger } from '@nestjs/common' +import { ConfigService } from '@nestjs/config' +import { PushPayload, PushProvider } from '../push.types' +import * as admin from 'firebase-admin' +import * as fs from 'fs' +import * as path from 'path' + +@Injectable() +export class FirebasePushProvider implements PushProvider { + private readonly logger = new Logger(FirebasePushProvider.name) + + constructor(private readonly config: ConfigService) { + this.ensureInitialized() + } + + async sendToTokens(tokens: string[], payload: PushPayload): Promise { + if (tokens.length === 0) return + if (admin.apps.length === 0) return + + try { + const message: admin.messaging.MulticastMessage = { + tokens, + notification: { + title: payload.title, + body: payload.body + }, + data: payload.data + } + + const res = await admin.messaging().sendEachForMulticast(message) + + if (res.failureCount > 0) { + const failed = res.responses + .map((r, i) => (r.success ? null : tokens[i])) + .filter((t): t is string => !!t) + this.logger.warn(`Push failed for ${failed.length} tokens`) + } + } catch (err) { + this.logger.error('Push send failed', err as Error) + } + } + + private ensureInitialized(): void { + if (admin.apps.length > 0) return + + const serviceAccountPath = this.config.get('FIREBASE_SERVICE_ACCOUNT_PATH') + if (!serviceAccountPath) { + this.logger.warn('Firebase service account is not configured; push notifications are disabled') + return + } + + const fullPath = path.resolve(process.cwd(), serviceAccountPath) + if (!fs.existsSync(fullPath)) { + this.logger.warn(`Firebase service account not found at ${fullPath}; push notifications are disabled`) + return + } + + admin.initializeApp({ + credential: admin.credential.cert(fullPath) + }) + } +} diff --git a/messenger-server/src/modules/push/push.module.ts b/messenger-server/src/modules/push/push.module.ts new file mode 100644 index 0000000..575a405 --- /dev/null +++ b/messenger-server/src/modules/push/push.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common' +import { ConfigModule } from '@nestjs/config' +import { PushService } from './push.service' +import { FirebasePushProvider } from './providers/firebase-push.provider' +import { PUSH_PROVIDER } from './push.types' + +@Module({ + imports: [ConfigModule], + providers: [ + PushService, + FirebasePushProvider, + { provide: PUSH_PROVIDER, useExisting: FirebasePushProvider } + ], + exports: [PushService] +}) +export class PushModule { } diff --git a/messenger-server/src/modules/push/push.service.ts b/messenger-server/src/modules/push/push.service.ts new file mode 100644 index 0000000..e4a8850 --- /dev/null +++ b/messenger-server/src/modules/push/push.service.ts @@ -0,0 +1,32 @@ +import { Inject, Injectable } from '@nestjs/common' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { UserId } from 'src/common/types/user-id.type' +import { PUSH_PROVIDER, PushPayload, PushProvider } from './push.types' + +@Injectable() +export class PushService { + constructor( + private readonly prisma: PrismaService, + @Inject(PUSH_PROVIDER) private readonly provider: PushProvider + ) { } + + async sendToUsers(userIds: UserId[], payload: PushPayload): Promise { + if (userIds.length === 0) return + + const tokens = await this.prisma.session.findMany({ + where: { + userId: { in: userIds }, + fcmToken: { not: null } + }, + select: { fcmToken: true } + }) + + const uniqueTokens = Array.from( + new Set(tokens.map(t => t.fcmToken).filter((t): t is string => !!t)) + ) + + if (uniqueTokens.length === 0) return + + await this.provider.sendToTokens(uniqueTokens, payload) + } +} diff --git a/messenger-server/src/modules/push/push.types.ts b/messenger-server/src/modules/push/push.types.ts new file mode 100644 index 0000000..bc12d1f --- /dev/null +++ b/messenger-server/src/modules/push/push.types.ts @@ -0,0 +1,11 @@ +export type PushPayload = { + title: string + body: string + data?: Record +} + +export interface PushProvider { + sendToTokens(tokens: string[], payload: PushPayload): Promise +} + +export const PUSH_PROVIDER = Symbol('PUSH_PROVIDER') diff --git a/messenger-server/src/modules/realtime/realtime.gateway.ts b/messenger-server/src/modules/realtime/realtime.gateway.ts new file mode 100644 index 0000000..20eca78 --- /dev/null +++ b/messenger-server/src/modules/realtime/realtime.gateway.ts @@ -0,0 +1,263 @@ +import { Logger, Inject, forwardRef } from '@nestjs/common' +import { WebSocketGateway, OnGatewayConnection, WebSocketServer, OnGatewayDisconnect, SubscribeMessage, MessageBody, ConnectedSocket, OnGatewayInit } from '@nestjs/websockets' +import { Server, Socket } from 'socket.io' +import { SocketEvent, SocketEventType } from 'src/common/socket/socket-events' +import { UserId } from 'src/common/types/user-id.type' +import { ChatId } from 'src/common/types/chat-id.type' +import { SessionsService } from '../sessions/sessions.service' +import { instanceToPlain } from 'class-transformer' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { ChatsService } from '../chats/chats.service' + +@WebSocketGateway() +export class RealtimeGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect { + private readonly logger = new Logger(RealtimeGateway.name) + + @WebSocketServer() + server: Server + + constructor( + @Inject(forwardRef(() => SessionsService)) + private readonly sessionsService: SessionsService, + private readonly prisma: PrismaService, + private readonly chatsService: ChatsService + ) { } + + afterInit(server: Server) { + server.use(async (socket, next) => { + try { + const token = socket.handshake.auth.token as string + if (!token) { + this.logger.warn(`No token provided for socket ${socket.id}`) + return next(new Error('Unauthorized')) + } + + const session = await this.sessionsService.findByToken(token) + if (!session) { + this.logger.warn(`Invalid token provided for socket ${socket.id}`) + return next(new Error('Unauthorized')) + } + + socket.data.userId = session.userId + socket.data.token = token + next() + } catch (error) { + this.logger.error(`Auth error in socket middleware: ${error.message}`) + next(new Error('Unauthorized')) + } + }) + } + + async handleConnection(client: Socket, ...args: any[]) { + try { + const userId = UserId(client.data.userId) + const userRoom = `user:${userId.toString()}` + + client.join(userRoom) + + this.logger.debug(`Client connected: ${userId.toString()}`) + + const recipients = await this.getPresenceRecipients(userId) + if (recipients.length > 0) { + this.server.to(recipients.map(id => `user:${id.toString()}`)) + .emit(SocketEvent.USER_ONLINE, { userId: userId.toString() }) + } + } catch (error) { + this.logger.error(`Error in handleConnection for client ${client.id}: ${error.message}`, error.stack) + client.disconnect() + } + } + + @SubscribeMessage(SocketEvent.CHAT_OPEN) + async handleChatOpen(@MessageBody() payload: any, @ConnectedSocket() client: Socket) { + try { + const raw = payload?.chatId ?? payload + const chatId = ChatId(raw) + const userId = client.data.userId as UserId + + await this.chatsService.canReadChat(userId, chatId) + + const prev = client.data.activeChatId as ChatId | undefined + if (prev && prev !== chatId) { + client.leave(`chat:${prev.toString()}`) + } + + client.join(`chat:${chatId.toString()}`) + client.data.activeChatId = chatId + this.logger.debug(`Client ${client.id} (user ${userId}) joined room chat:${chatId.toString()}`) + } catch (e) { + this.logger.warn(`Access denied or invalid chat id from client ${client.id}: ${e?.message ?? e}`) + } + } + + async handleDisconnect(client: Socket) { + this.logger.debug(`Client disconnected: ${client.id}`) + const userId = client.data.userId as UserId | undefined + if (!userId) return + + const room = `user:${userId.toString()}` + const sockets = await this.server.in(room).allSockets() + if (sockets.size > 0) return + + const recipients = await this.getPresenceRecipients(userId) + if (recipients.length > 0) { + this.server.to(recipients.map(id => `user:${id.toString()}`)) + .emit(SocketEvent.USER_OFFLINE, { userId: userId.toString() }) + } + } + + kickUser(userId: UserId): void { + const room = `user:${userId.toString()}` + this.server.to(room).emit(SocketEvent.AUTH_ERROR) + this.server.in(room).disconnectSockets(true) + this.logger.log(`Kicked user ${userId.toString()} (all sessions)`) + } + + async kickUserByToken(token: string): Promise { + const sockets = await this.server.fetchSockets() + for (const socket of sockets) { + if (socket.data.token === token) { + socket.emit(SocketEvent.AUTH_ERROR) + socket.disconnect(true) + this.logger.log(`Kicked session with token ${token.substring(0, 10)}...`) + } + } + } + + sendToUser(userId: UserId, event: SocketEventType, message: any): void { + this.server.in(`user:${userId.toString()}`).emit(event, this.prepareData(message)) + this.logger.debug(`Sent message to user ${userId.toString()}:`) + } + + sendToChat(chatId: ChatId, event: SocketEventType, message: any): void { + this.server.in(`chat:${chatId.toString()}`).emit(event, this.prepareData(message)) + this.logger.debug(`Sent message to user ${chatId.toString()}:`) + } + + sendToUsersExceptChat(userIds: UserId[], chatId: ChatId, event: SocketEventType, message: any): void { + const userRooms = userIds.map(id => `user:${id.toString()}`) + const chatRoom = `chat:${chatId.toString()}` + this.server.to(userRooms).except(chatRoom).emit(event, this.prepareData(message)) + } + + isUserOnline(userId: UserId): boolean { + const room = this.server.sockets.adapter.rooms.get(`user:${userId.toString()}`) + return !!room && room.size > 0 + } + + private prepareData(data: any) { + const plain = instanceToPlain(data) + return this.serializeBigInt(plain) + } + + private serializeBigInt(obj: any): any { + if (obj === null || obj === undefined) return obj + if (typeof obj === 'bigint') return obj.toString() + if (Array.isArray(obj)) return obj.map(item => this.serializeBigInt(item)) + if (typeof obj === 'object') { + if (obj instanceof Date) return obj.getTime() + + const newObj = {} + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + newObj[key] = this.serializeBigInt(obj[key]) + } + } + return newObj + } + return obj + } + + private async getPresenceRecipients(userId: UserId): Promise { + const settings = await this.prisma.privacySettings.findUnique({ + where: { userId }, + select: { lastSeen: true } + }) + + const visibility = settings?.lastSeen ?? 0 + + if (visibility === 2) { + return [] + } + + // Use a single optimized query to get all relevant users based on privacy settings + if (visibility === 1) { + // Only show to direct contacts + const directMembers = await this.prisma.conversationMember.findMany({ + where: { + conversation: { + type: 'DIRECT', + members: { some: { userId } } + }, + userId: { not: userId } + }, + select: { userId: true } + }) + return directMembers.map(d => UserId(d.userId)) + } + + // Visibility 0: show to everyone (contacts, group members, channel subscribers) + // Fetch all in parallel for better performance + const [directMembers, groupMembers, channelSubs, channelOwners] = await Promise.all([ + // Direct message contacts + this.prisma.conversationMember.findMany({ + where: { + conversation: { type: 'DIRECT', members: { some: { userId } } }, + userId: { not: userId } + }, + select: { userId: true } + }), + // Group members (where user is also a member) + this.prisma.groupMember.findMany({ + where: { userId }, + select: { groupId: true } + }), + // Channel subscribers + this.prisma.channelSubscriber.findMany({ + where: { userId }, + select: { channelId: true } + }), + // Channel owners + this.prisma.channel.findMany({ + where: { ownerId: userId }, + select: { id: true } + }) + ]) + + // Get other group members if user is in groups + let otherGroupMembers: { userId: bigint }[] = [] + if (groupMembers.length > 0) { + const groupIds = groupMembers.map(g => g.groupId) + otherGroupMembers = await this.prisma.groupMember.findMany({ + where: { groupId: { in: groupIds }, userId: { not: userId } }, + select: { userId: true } + }) + } + + // Get other channel subscribers if user is in channels + let otherChannelSubs: { userId: bigint }[] = [] + if (channelSubs.length > 0) { + const channelIds = channelSubs.map(c => c.channelId) + otherChannelSubs = await this.prisma.channelSubscriber.findMany({ + where: { channelId: { in: channelIds }, userId: { not: userId } }, + select: { userId: true } + }) + } + + // Get channel owners (excluding self) + const otherChannelOwners = channelOwners + .filter(c => c.id !== userId) + .map(c => ({ userId: c.id })) + + // Combine and deduplicate + const allUserIds = [ + ...directMembers.map(d => d.userId.toString()), + ...otherGroupMembers.map(g => g.userId.toString()), + ...otherChannelSubs.map(s => s.userId.toString()), + ...otherChannelOwners.map(o => o.userId.toString()) + ] + + const unique = Array.from(new Set(allUserIds)).map(id => UserId(id)) + return unique + } +} diff --git a/messenger-server/src/modules/realtime/realtime.module.ts b/messenger-server/src/modules/realtime/realtime.module.ts new file mode 100644 index 0000000..6f383fc --- /dev/null +++ b/messenger-server/src/modules/realtime/realtime.module.ts @@ -0,0 +1,12 @@ +import { Global, Module, forwardRef } from '@nestjs/common' +import { RealtimeGateway } from './realtime.gateway' +import { SessionsModule } from '../sessions/sessions.module' +import { ChatsModule } from '../chats/chats.module' + +@Global() +@Module({ + imports: [forwardRef(() => SessionsModule), ChatsModule], + providers: [RealtimeGateway], + exports: [RealtimeGateway], +}) +export class RealtimeModule { } \ No newline at end of file diff --git a/messenger-server/src/modules/realtime/realtime.service.ts b/messenger-server/src/modules/realtime/realtime.service.ts new file mode 100644 index 0000000..0197801 --- /dev/null +++ b/messenger-server/src/modules/realtime/realtime.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common' + +@Injectable() +export class RealtimeService { } diff --git a/messenger-server/src/modules/search/dto/search-query.dto.ts b/messenger-server/src/modules/search/dto/search-query.dto.ts new file mode 100644 index 0000000..5bfd154 --- /dev/null +++ b/messenger-server/src/modules/search/dto/search-query.dto.ts @@ -0,0 +1,9 @@ +import { IsOptional, IsString } from "class-validator" +import { Trim } from "src/common/decorators/trim.decorator" + +export class SearchQueryDto { + @IsOptional() + @IsString() + @Trim() + q?: string +} \ No newline at end of file diff --git a/messenger-server/src/modules/search/dto/search-response.dto.ts b/messenger-server/src/modules/search/dto/search-response.dto.ts new file mode 100644 index 0000000..a67a7d6 --- /dev/null +++ b/messenger-server/src/modules/search/dto/search-response.dto.ts @@ -0,0 +1,14 @@ +import { Exclude, Expose } from "class-transformer" +import { ChatId } from "src/common/types/chat-id.type" + +@Exclude() +export class SearchResponseDto { + @Expose() + chatId: ChatId + + @Expose() + name: string + + @Expose() + publicLink: string +} diff --git a/messenger-server/src/modules/search/search.controller.ts b/messenger-server/src/modules/search/search.controller.ts new file mode 100644 index 0000000..25f2efe --- /dev/null +++ b/messenger-server/src/modules/search/search.controller.ts @@ -0,0 +1,21 @@ +import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common' +import { SearchService } from './search.service' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { SearchQueryDto } from './dto/search-query.dto' + +@Controller('search') +@UseGuards(AuthGuard) +export class SearchController { + constructor(private readonly searchService: SearchService) { } + + @Get('check/:username') + async isUsernameAvailable(@Param('username') username: string) { + const available = await this.searchService.isUsernameAvailable(username) + return { available } + } + + @Get() + search(@Query() query: SearchQueryDto) { + return this.searchService.search(query) + } +} diff --git a/messenger-server/src/modules/search/search.module.ts b/messenger-server/src/modules/search/search.module.ts new file mode 100644 index 0000000..3783fbb --- /dev/null +++ b/messenger-server/src/modules/search/search.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common' +import { SearchService } from './search.service' +import { SearchController } from './search.controller' +import { JwtAuthModule } from '../security/jwt.module' +import { SessionsModule } from '../sessions/sessions.module' + +@Module({ + imports: [JwtAuthModule, SessionsModule], + controllers: [SearchController], + providers: [SearchService], + exports: [SearchService] +}) +export class SearchModule { } diff --git a/messenger-server/src/modules/search/search.service.ts b/messenger-server/src/modules/search/search.service.ts new file mode 100644 index 0000000..773d766 --- /dev/null +++ b/messenger-server/src/modules/search/search.service.ts @@ -0,0 +1,75 @@ +import { Injectable } from '@nestjs/common' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { SearchResponseDto } from './dto/search-response.dto' +import { ChatId } from 'src/common/types/chat-id.type' +import { plainToInstance } from 'class-transformer' +import { SearchQueryDto } from './dto/search-query.dto' + +@Injectable() +export class SearchService { + constructor(private readonly prisma: PrismaService) { } + + async isUsernameAvailable(username: string): Promise { + // Use Promise.all for parallel queries instead of sequential + const [userCount, groupCount, channelCount] = await Promise.all([ + this.prisma.user.count({ where: { username } }), + this.prisma.group.count({ where: { username } }), + this.prisma.channel.count({ where: { username } }) + ]) + + return userCount === 0 && groupCount === 0 && channelCount === 0 + } + + async search(dto: SearchQueryDto): Promise { + const query = dto.q?.trim().replace(/^@+/, '') ?? '' + if (!query) return [] + + const [users, channels, groups] = await Promise.all([ + this.prisma.user.findMany({ + where: { + OR: [ + { firstName: { contains: query } }, + { lastName: { contains: query } }, + { username: { contains: query } } + ] + } + }), + this.prisma.channel.findMany({ + where: { + OR: [ + { name: { contains: query } }, + { username: { contains: query } } + ] + } + }), + this.prisma.group.findMany({ + where: { + OR: [ + { name: { contains: query } }, + { username: { contains: query } } + ] + } + }) + ]) + + const userResults: SearchResponseDto[] = users.map(user => ({ + chatId: ChatId(user.id), + name: `${user.firstName} ${user.lastName || ''}`.trim(), + publicLink: user.username ?? '' + })) + + const channelResults: SearchResponseDto[] = channels.map(channel => ({ + chatId: ChatId(channel.id), + name: channel.name, + publicLink: channel.username ?? '' + })) + + const groupResults: SearchResponseDto[] = groups.map(group => ({ + chatId: ChatId(group.id), + name: group.name, + publicLink: group.username ?? '' + })) + + return plainToInstance(SearchResponseDto, [...userResults, ...channelResults, ...groupResults]) + } +} diff --git a/messenger-server/src/modules/security/jwt.module.ts b/messenger-server/src/modules/security/jwt.module.ts new file mode 100644 index 0000000..0d6f3ed --- /dev/null +++ b/messenger-server/src/modules/security/jwt.module.ts @@ -0,0 +1,20 @@ +import { Module } from '@nestjs/common' +import { JwtModule } from '@nestjs/jwt' +import { JwtAuthService } from './jwt.service' +import { ConfigModule, ConfigService } from '@nestjs/config' + +@Module({ + imports: [ + JwtModule.registerAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (configService: ConfigService) => ({ + secret: configService.get('JWT_SECRET_KEY'), + signOptions: { expiresIn: '1y' } + }) + }) + ], + providers: [JwtAuthService], + exports: [JwtAuthService] +}) +export class JwtAuthModule { } diff --git a/messenger-server/src/modules/security/jwt.service.ts b/messenger-server/src/modules/security/jwt.service.ts new file mode 100644 index 0000000..cc2c70c --- /dev/null +++ b/messenger-server/src/modules/security/jwt.service.ts @@ -0,0 +1,55 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common' +import { JwtService as NestJwtService } from '@nestjs/jwt' +import { TokenPayload } from 'src/common/types/token-payload.type' +import { UserId } from 'src/common/types/user-id.type' + +// Token expiry constants - security best practice +const ACCESS_TOKEN_EXPIRY = '30d' +const REFRESH_TOKEN_EXPIRY = '90d' + +@Injectable() +export class JwtAuthService { + constructor(private readonly jwtService: NestJwtService) { } + + generateToken(userId: UserId, tokenType: 'access' | 'refresh' = 'access'): string { + const expiresIn = tokenType === 'access' ? ACCESS_TOKEN_EXPIRY : REFRESH_TOKEN_EXPIRY + return this.jwtService.sign({ sub: userId.toString(), type: tokenType }, { expiresIn }) + } + + generateTokenPair(userId: UserId): { accessToken: string; refreshToken: string } { + return { + accessToken: this.generateToken(userId, 'access'), + refreshToken: this.generateToken(userId, 'refresh') + } + } + + verifyToken(token: string): TokenPayload { + try { + const payload = this.jwtService.verify(token) + + // Reject refresh tokens as access tokens + if (payload.type === 'refresh') { + throw new UnauthorizedException('Invalid token type') + } + + return { userId: UserId(payload.sub) } + } catch (err) { + throw new UnauthorizedException('Invalid or expired token') + } + } + + verifyRefreshToken(token: string): TokenPayload { + try { + const payload = this.jwtService.verify(token) + + // Only accept refresh tokens + if (payload.type !== 'refresh') { + throw new UnauthorizedException('Invalid token type') + } + + return { userId: UserId(payload.sub) } + } catch (err) { + throw new UnauthorizedException('Invalid or expired refresh token') + } + } +} diff --git a/messenger-server/src/modules/sessions/dto/create-session.dto.ts b/messenger-server/src/modules/sessions/dto/create-session.dto.ts new file mode 100644 index 0000000..a12d4be --- /dev/null +++ b/messenger-server/src/modules/sessions/dto/create-session.dto.ts @@ -0,0 +1,10 @@ +import { UserId } from 'src/common/types/user-id.type' + +export class CreateSessionDto { + userId: UserId + token: string + fcmToken?: string + deviceModel?: string + osVersion?: string + osName?: string +} diff --git a/messenger-server/src/modules/sessions/dto/session-response.dto.ts b/messenger-server/src/modules/sessions/dto/session-response.dto.ts new file mode 100644 index 0000000..46edfaf --- /dev/null +++ b/messenger-server/src/modules/sessions/dto/session-response.dto.ts @@ -0,0 +1,22 @@ +import { Exclude, Expose } from "class-transformer" + +@Exclude() +export class SessionResponseDto { + @Expose() + id: number + + @Expose() + userId: number + + @Expose() + createdAt: string + + @Expose() + deviceModel: string + + @Expose() + osVersion: string + + @Expose() + osName: string +} diff --git a/messenger-server/src/modules/sessions/sessions.controller.ts b/messenger-server/src/modules/sessions/sessions.controller.ts new file mode 100644 index 0000000..d1db99c --- /dev/null +++ b/messenger-server/src/modules/sessions/sessions.controller.ts @@ -0,0 +1,30 @@ +import { Controller, Delete, Get, Param, ParseIntPipe, UseGuards } from '@nestjs/common' +import { SessionsService } from './sessions.service' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { SessionOwnerGuard } from 'src/common/guards/session-owner.guard' +import { CurrentUserId } from 'src/common/decorators/user-id.decorator' +import { UserId } from 'src/common/types/user-id.type' +import { CurrentUserToken } from 'src/common/decorators/user-token.decorator' +import { PARAMS } from 'src/common/constants/param.constants' + +@Controller('sessions') +@UseGuards(AuthGuard) +export class SessionsController { + constructor(private readonly sessionsService: SessionsService) { } + + @Get() + getAll(@CurrentUserId() userId: UserId, @CurrentUserToken() token: string) { + return this.sessionsService.getAll(userId, token) + } + + @Delete(`:${PARAMS.SESSION_ID}`) + @UseGuards(SessionOwnerGuard) + delete(@Param(PARAMS.SESSION_ID, ParseIntPipe) id: number) { + return this.sessionsService.deleteById(id) + } + + @Delete() + deleteAll(@CurrentUserId() userId: UserId, @CurrentUserToken() token: string) { + return this.sessionsService.deleteAll(userId, token) + } +} diff --git a/messenger-server/src/modules/sessions/sessions.module.ts b/messenger-server/src/modules/sessions/sessions.module.ts new file mode 100644 index 0000000..b43ff30 --- /dev/null +++ b/messenger-server/src/modules/sessions/sessions.module.ts @@ -0,0 +1,13 @@ +import { Module, forwardRef } from '@nestjs/common' +import { SessionsService } from './sessions.service' +import { SessionsController } from './sessions.controller' +import { JwtAuthModule } from '../security/jwt.module' +import { RealtimeModule } from '../realtime/realtime.module' + +@Module({ + imports: [JwtAuthModule, forwardRef(() => RealtimeModule)], + controllers: [SessionsController], + providers: [SessionsService], + exports: [SessionsService], +}) +export class SessionsModule { } \ No newline at end of file diff --git a/messenger-server/src/modules/sessions/sessions.service.ts b/messenger-server/src/modules/sessions/sessions.service.ts new file mode 100644 index 0000000..3ad3b2e --- /dev/null +++ b/messenger-server/src/modules/sessions/sessions.service.ts @@ -0,0 +1,114 @@ +import { Injectable, NotFoundException, Inject, forwardRef } from '@nestjs/common' +import { CreateSessionDto } from './dto/create-session.dto' +import { UserId } from 'src/common/types/user-id.type' +import { plainToInstance } from 'class-transformer' +import { SessionResponseDto } from './dto/session-response.dto' +import { SessionId } from 'src/common/types/session-id.type' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { RealtimeGateway } from '../realtime/realtime.gateway' + +@Injectable() +export class SessionsService { + constructor( + private readonly prisma: PrismaService, + @Inject(forwardRef(() => RealtimeGateway)) + private readonly realtimeGateway: RealtimeGateway + ) { } + + async getAll(userId: UserId, excludeToken?: string): Promise { + const sessions = await this.prisma.session.findMany({ + where: { + userId: userId, + NOT: excludeToken ? { token: excludeToken } : undefined + } + }) + return plainToInstance(SessionResponseDto, sessions) + } + + async findByToken(token: string): Promise { + const session = await this.prisma.session.findFirst({ + where: { token: token } + }) + return plainToInstance(SessionResponseDto, session) + } + + async findByTokenAndUserId(token: string, id: UserId): Promise { + const session = await this.prisma.session.findFirst({ + where: { token: token, userId: id } + }) + return plainToInstance(SessionResponseDto, session) + } + + async create(dto: CreateSessionDto): Promise { + const session = await this.prisma.session.create({ + data: { + userId: dto.userId, + token: dto.token, + fcmToken: dto.fcmToken, + deviceModel: dto.deviceModel, + osName: dto.osName, + osVersion: dto.osVersion, + createdAt: Date.now() + } + }) + return plainToInstance(SessionResponseDto, session) + } + + async deleteById(id: number): Promise { + const session = await this.prisma.session.findUnique({ + where: { id } + }) + + if (!session) { + throw new NotFoundException(`Session not found`) + } + + const token = session.token + await this.prisma.session.delete({ where: { id: id } }) + await this.realtimeGateway.kickUserByToken(token) + } + + async deleteByToken(token: string): Promise { + const session = await this.prisma.session.findUnique({ + where: { token } + }) + + if (!session) { + throw new NotFoundException(`Session not found`) + } + + await this.prisma.session.delete({ where: { token } }) + await this.realtimeGateway.kickUserByToken(token) + } + + async deleteAll(userId: UserId, excludeToken?: string): Promise { + await this.prisma.session.deleteMany({ + where: { + userId: userId, + NOT: excludeToken ? { token: excludeToken } : undefined + } + }) + + if (excludeToken) { + // Kick only others? Or excludeToken is the current one? + // Usually deleteAll means logout from other devices. + const userSockets = await (this.realtimeGateway.server as any).fetchSockets() + for (const s of userSockets) { + if (s.data.userId === userId && s.data.token !== excludeToken) { + s.emit('auth:error') + s.disconnect(true) + } + } + } else { + this.realtimeGateway.kickUser(userId) + } + } + + async isOwner(sessionId: SessionId, userId: UserId): Promise { + const count = await this.prisma.session.count({ + where: { id: sessionId, userId: userId } + }) + + return count > 0 + } +} diff --git a/messenger-server/src/modules/storage/dto/file.dto.ts b/messenger-server/src/modules/storage/dto/file.dto.ts new file mode 100644 index 0000000..283c642 --- /dev/null +++ b/messenger-server/src/modules/storage/dto/file.dto.ts @@ -0,0 +1,7 @@ +export class FileDto { + id: string + name: string + size: string + mimeType: string + status: string +} \ No newline at end of file diff --git a/messenger-server/src/modules/storage/dto/init-upload.dto.ts b/messenger-server/src/modules/storage/dto/init-upload.dto.ts new file mode 100644 index 0000000..f934fe6 --- /dev/null +++ b/messenger-server/src/modules/storage/dto/init-upload.dto.ts @@ -0,0 +1,4 @@ +export class InitUploadDto { + signedUrl: string + fileId: string +} \ No newline at end of file diff --git a/messenger-server/src/modules/storage/storage.module.ts b/messenger-server/src/modules/storage/storage.module.ts new file mode 100644 index 0000000..22333bc --- /dev/null +++ b/messenger-server/src/modules/storage/storage.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common' +import { StorageService } from './storage.service' +import { SessionsModule } from '../sessions/sessions.module' +import { JwtAuthModule } from '../security/jwt.module' + +@Module({ + imports: [SessionsModule, JwtAuthModule], + providers: [StorageService], + exports: [StorageService] +}) +export class StorageModule { } diff --git a/messenger-server/src/modules/storage/storage.service.ts b/messenger-server/src/modules/storage/storage.service.ts new file mode 100644 index 0000000..ae25794 --- /dev/null +++ b/messenger-server/src/modules/storage/storage.service.ts @@ -0,0 +1,116 @@ +import { Injectable, NotFoundException } from '@nestjs/common' +import { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand } from '@aws-sdk/client-s3' +import { ConfigService } from '@nestjs/config' +import { getSignedUrl } from '@aws-sdk/s3-request-presigner' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { FileStatus } from 'generated/prisma/client' +import { v4 as uuidv4 } from 'uuid' +import { InitUploadDto } from './dto/init-upload.dto' +import { plainToInstance } from 'class-transformer' +import { FileDto } from './dto/file.dto' + +@Injectable() +export class StorageService { + private s3Client: S3Client + private bucketName: string + + constructor( + private readonly config: ConfigService, + private readonly prisma: PrismaService + ) { + this.s3Client = new S3Client({ + region: config.get("S3_REGION"), + endpoint: config.get("S3_END_POINT"), + credentials: { + accessKeyId: config.get("S3_ACCESS_KEY"), + secretAccessKey: config.get("S3_SECRET_KEY") + }, + forcePathStyle: true + }) + this.bucketName = config.get("S3_BUCKET_NAME") + } + + async initUpload(name: string, size: number, mimeType: string): Promise { + const id = uuidv4() + const path = `files/${id}/${name}` + + const file = await this.prisma.file.create({ + data: { + id, + name, + size: BigInt(size), + mimeType, + path, + status: FileStatus.PENDING, + createdAt: Date.now(), + updatedAt: Date.now() + } + }) + + const command = new PutObjectCommand({ + Bucket: this.bucketName, + Key: path + }) + + const signedUrl = await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }) + + return plainToInstance(InitUploadDto, { + signedUrl: signedUrl, + fileId: file.id + }) + } + + async confirmUpload(fileId: string): Promise { + const exists = await this.prisma.file.findUnique({ where: { id: fileId } }) + if (!exists) throw new NotFoundException('File not found') + + const file = await this.prisma.file.update({ + where: { id: fileId }, + data: { + status: FileStatus.COMPLETED, + updatedAt: Date.now() + } + }) + + return plainToInstance(FileDto, file) + } + + async deleteFile(fileId: string) { + const file = await this.prisma.file.findUnique({ where: { id: fileId } }) + if (!file) return + + try { + await this.s3Client.send(new DeleteObjectCommand({ + Bucket: this.bucketName, + Key: file.path + })) + } catch (e) { + console.error(`Failed to delete file ${file.path} from S3`, e) + } + + await this.prisma.file.delete({ where: { id: fileId } }) + } + + async getDownloadUrl(fileId: string) { + const file = await this.prisma.file.findUnique({ where: { id: fileId } }) + if (!file) throw new NotFoundException('File not found') + + if (file.status !== FileStatus.COMPLETED) { + throw new Error('File upload not completed') + } + + const command = new GetObjectCommand({ + Bucket: this.bucketName, + Key: file.path + }) + + const downloadUrl = await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }) + + return { + downloadUrl, + name: file.name, + size: file.size.toString(), + mimeType: file.mimeType + } + } +} diff --git a/messenger-server/src/modules/users/dto/change-password.dto.ts b/messenger-server/src/modules/users/dto/change-password.dto.ts new file mode 100644 index 0000000..bb94684 --- /dev/null +++ b/messenger-server/src/modules/users/dto/change-password.dto.ts @@ -0,0 +1,11 @@ +import { IsString, MinLength, MaxLength, Matches } from 'class-validator' + +export class ChangePasswordDto { + @IsString() + @MinLength(5) + @MaxLength(32) + @Matches(/^[a-zA-Z0-9_!@#$%^&*()\-+=\[\]{}|;:',.<>?/`"~]+$/, { + message: 'Allowed characters are a-z, 0-9, underscores, and special symbols', + }) + password: string +} diff --git a/messenger-server/src/modules/users/dto/privacy-settings.dto.ts b/messenger-server/src/modules/users/dto/privacy-settings.dto.ts new file mode 100644 index 0000000..396102d --- /dev/null +++ b/messenger-server/src/modules/users/dto/privacy-settings.dto.ts @@ -0,0 +1,18 @@ +import { Expose } from 'class-transformer' + +export class PrivacySettingsDto { + @Expose() + lastSeen: number + + @Expose() + messages: number + + @Expose() + bio: number + + @Expose() + dateOfBirth: number + + @Expose() + invites: number +} diff --git a/messenger-server/src/modules/users/dto/update-privacy-settings.dto.ts b/messenger-server/src/modules/users/dto/update-privacy-settings.dto.ts new file mode 100644 index 0000000..80c38e5 --- /dev/null +++ b/messenger-server/src/modules/users/dto/update-privacy-settings.dto.ts @@ -0,0 +1,33 @@ +import { IsNumber, IsOptional, Max, Min } from 'class-validator' + +export class UpdatePrivacySettingsDto { + @IsOptional() + @IsNumber() + @Min(0) + @Max(2) + lastSeen?: number + + @IsOptional() + @IsNumber() + @Min(0) + @Max(2) + messages?: number + + @IsOptional() + @IsNumber() + @Min(0) + @Max(1) + bio?: number + + @IsOptional() + @IsNumber() + @Min(0) + @Max(1) + dateOfBirth?: number + + @IsOptional() + @IsNumber() + @Min(0) + @Max(2) + invites?: number +} diff --git a/messenger-server/src/modules/users/dto/update-user.dto.ts b/messenger-server/src/modules/users/dto/update-user.dto.ts new file mode 100644 index 0000000..87db7e5 --- /dev/null +++ b/messenger-server/src/modules/users/dto/update-user.dto.ts @@ -0,0 +1,34 @@ +import { IsNumber, IsOptional, IsString, Matches, MaxLength, MinLength } from 'class-validator' +import { Trim } from 'src/common/decorators/trim.decorator' + +export class UpdateUserDto { + @IsOptional() + @IsString() + @Trim() + @MinLength(1) + @MaxLength(32) + firstName?: string + + @IsOptional() + @IsString() + @Trim() + @MaxLength(32) + lastName?: string + + @IsOptional() + @IsString() + @Trim() + @MaxLength(32) + @Matches(/^[a-zA-Z0-9_]*$/, { message: 'Username can only contain letters, numbers and underscores' }) + username?: string | null + + @IsOptional() + @IsString() + @Trim() + @MaxLength(255) + bio?: string + + @IsOptional() + @IsNumber() + dateOfBirth?: number +} diff --git a/messenger-server/src/modules/users/dto/update-username.dto.ts b/messenger-server/src/modules/users/dto/update-username.dto.ts new file mode 100644 index 0000000..0606218 --- /dev/null +++ b/messenger-server/src/modules/users/dto/update-username.dto.ts @@ -0,0 +1,12 @@ +import { IsOptional, IsString, Matches, MaxLength, MinLength } from 'class-validator' +import { Trim } from 'src/common/decorators/trim.decorator' + +export class UpdateUsernameDto { + @IsOptional() + @IsString() + @Trim() + @MinLength(5) + @MaxLength(20) + @Matches(/^[a-zA-Z0-9_]+$/, { message: 'Username can only contain letters, numbers and underscores' }) + username: string | null +} diff --git a/messenger-server/src/modules/users/dto/user-response.dto.ts b/messenger-server/src/modules/users/dto/user-response.dto.ts new file mode 100644 index 0000000..f08d619 --- /dev/null +++ b/messenger-server/src/modules/users/dto/user-response.dto.ts @@ -0,0 +1,28 @@ +import { Exclude, Expose } from 'class-transformer' +import { OmitNull } from 'src/common/decorators/omit-null.decorator' + +@Exclude() +export class UserResponseDto { + @Expose() + id: number + + @Expose() + @OmitNull() + firstName?: string + + @Expose() + @OmitNull() + lastName?: string + + @Expose() + @OmitNull() + username?: string + + @Expose() + @OmitNull() + bio?: string + + @Expose() + @OmitNull() + dateOfBirth?: number +} diff --git a/messenger-server/src/modules/users/users.controller.ts b/messenger-server/src/modules/users/users.controller.ts new file mode 100644 index 0000000..750d305 --- /dev/null +++ b/messenger-server/src/modules/users/users.controller.ts @@ -0,0 +1,77 @@ +import { Body, Controller, Get, Param, Patch, UseGuards, Request, HttpCode, HttpStatus } from '@nestjs/common' +import { UsersService } from './users.service' +import { AuthGuard } from 'src/common/guards/auth.guard' +import { UpdateUserDto } from './dto/update-user.dto' +import { UserId } from 'src/common/types/user-id.type' +import { ParseUserIdPipe } from 'src/common/pipes/parse-user-id.pipe' +import { CurrentUserId } from 'src/common/decorators/user-id.decorator' +import { UserResponseDto } from './dto/user-response.dto' +import { PARAMS } from 'src/common/constants/param.constants' +import { UserExistsGuard } from 'src/common/guards/user-exists.guard' +import { PrivacySettingsDto } from './dto/privacy-settings.dto' +import { UpdatePrivacySettingsDto } from './dto/update-privacy-settings.dto' +import { PrivacyGuard } from 'src/common/guards/privacy.guard' +import { ChangePasswordDto } from './dto/change-password.dto' +import { UpdateUsernameDto } from './dto/update-username.dto' + +@Controller('users') +@UseGuards(AuthGuard) +export class UsersController { + constructor(private readonly usersService: UsersService) { } + + @Patch('me/password') + @HttpCode(HttpStatus.OK) + changePassword(@CurrentUserId() userId: UserId, @Body() dto: ChangePasswordDto): Promise { + return this.usersService.changePassword(userId, dto) + } + + @Get('me') + getMe(@CurrentUserId() userId: UserId): Promise { + return this.usersService.getById(userId) + } + + @Patch('me') + updateMe(@CurrentUserId() userId: UserId, @Body() dto: UpdateUserDto): Promise { + return this.usersService.updateUser(userId, dto) + } + + @Patch('me/username') + updateUsername(@CurrentUserId() userId: UserId, @Body() dto: UpdateUsernameDto): Promise { + return this.usersService.updateUsername(userId, dto.username ?? null) + } + + @Get('me/privacy') + getPrivacySettings(@CurrentUserId() userId: UserId): Promise { + return this.usersService.getPrivacySettings(userId) + } + + @Patch('me/privacy') + updatePrivacySettings(@CurrentUserId() userId: UserId, @Body() dto: UpdatePrivacySettingsDto): Promise { + return this.usersService.updatePrivacySettings(userId, dto) + } + + @Get(`:${PARAMS.USER_ID}`) + @UseGuards(UserExistsGuard, PrivacyGuard) + async getUserProfile( + @Param(PARAMS.USER_ID, ParseUserIdPipe) id: UserId, + @CurrentUserId() currentUserId: UserId, + @Request() req: any + ): Promise { + const response = await this.usersService.getById(id, currentUserId) + + if (id === currentUserId) { + return response + } + + if (req.privacy) { + if (!req.privacy.canSeeBio) { + response.bio = null + } + if (!req.privacy.canSeeDateOfBirth) { + response.dateOfBirth = null + } + } + + return response + } +} diff --git a/messenger-server/src/modules/users/users.module.ts b/messenger-server/src/modules/users/users.module.ts new file mode 100644 index 0000000..eba0066 --- /dev/null +++ b/messenger-server/src/modules/users/users.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common' +import { UsersService } from './users.service' +import { UsersController } from './users.controller' +import { JwtAuthModule } from 'src/modules/security/jwt.module' +import { SessionsModule } from '../sessions/sessions.module' +import { SearchModule } from '../search/search.module' + +@Module({ + imports: [JwtAuthModule, SessionsModule, SearchModule], + controllers: [UsersController], + providers: [UsersService], + exports: [UsersService] +}) +export class UsersModule { } diff --git a/messenger-server/src/modules/users/users.service.ts b/messenger-server/src/modules/users/users.service.ts new file mode 100644 index 0000000..041f25a --- /dev/null +++ b/messenger-server/src/modules/users/users.service.ts @@ -0,0 +1,130 @@ +import { ConflictException, Injectable, NotFoundException, UnauthorizedException } from '@nestjs/common' +import { UpdateUserDto } from './dto/update-user.dto' +import { UserId } from 'src/common/types/user-id.type' +import { plainToInstance } from 'class-transformer' +import { UserResponseDto } from './dto/user-response.dto' +import { PrismaService } from 'src/providers/prisma/prisma.service' +import { SearchService } from '../search/search.service' +import { PrivacySettingsDto } from './dto/privacy-settings.dto' +import { UpdatePrivacySettingsDto } from './dto/update-privacy-settings.dto' +import { hashPassword, verifyPassword } from 'src/common/utils/password.util' +import { ChangePasswordDto } from './dto/change-password.dto' + +@Injectable() +export class UsersService { + constructor( + private readonly prisma: PrismaService, + private readonly searchService: SearchService + ) { } + + async changePassword(id: UserId, dto: ChangePasswordDto): Promise { + const user = await this.prisma.user.findUnique({ where: { id } }) + if (!user) throw new NotFoundException('User not found') + + const passwordHash = await hashPassword(dto.password) + await this.prisma.user.update({ + where: { id }, + data: { password: passwordHash } + }) + } + + async updateUser(id: UserId, dto: UpdateUserDto): Promise { + const user = await this.prisma.user.findUnique({ where: { id } }) + if (!user) throw new NotFoundException('User not found') + + if (dto.username && dto.username !== user.username) { + const isAvailable = await this.searchService.isUsernameAvailable(dto.username) + if (!isAvailable) throw new ConflictException('Username is already taken') + } + + const updatedUser = await this.prisma.user.update({ + where: { id: id }, + data: { + ...(dto.firstName !== undefined && { firstName: dto.firstName }), + ...(dto.lastName !== undefined && { lastName: dto.lastName || null }), + ...(dto.username !== undefined && { username: dto.username || null }), + ...(dto.bio !== undefined && { bio: dto.bio || null }), + ...(dto.dateOfBirth !== undefined && { dateOfBirth: dto.dateOfBirth || null }) + } + }) + + return plainToInstance(UserResponseDto, updatedUser) + } + + async updateUsername(id: UserId, username: string | null): Promise { + const user = await this.prisma.user.findUnique({ where: { id } }) + if (!user) throw new NotFoundException('User not found') + + if (username && username !== user.username) { + const isAvailable = await this.searchService.isUsernameAvailable(username) + if (!isAvailable) throw new ConflictException('Username is already taken') + } + + const updatedUser = await this.prisma.user.update({ + where: { id }, + data: { username } + }) + return plainToInstance(UserResponseDto, updatedUser) + } + + async getById(id: UserId, currentUserId?: UserId): Promise { + const user = await this.prisma.user.findUnique({ + where: { id: id }, + include: { privacySettings: true } + }) + + if (!user) throw new NotFoundException('User not found') + + const response = plainToInstance(UserResponseDto, user) + + if (currentUserId && currentUserId !== id) { + const privacy = user.privacySettings + if (privacy) { + if (privacy.bio === 1) { + response.bio = null + } + if (privacy.dateOfBirth === 1) { + response.dateOfBirth = null + } + } + } + + return response + } + + async getPrivacySettings(userId: UserId): Promise { + const settings = await this.prisma.privacySettings.findUnique({ + where: { userId } + }) + if (!settings) { + return plainToInstance(PrivacySettingsDto, { + lastSeen: 0, + messages: 0, + bio: 0, + dateOfBirth: 0, + invites: 0 + }) + } + return plainToInstance(PrivacySettingsDto, settings) + } + + async updatePrivacySettings(userId: UserId, dto: UpdatePrivacySettingsDto): Promise { + const settings = await this.prisma.privacySettings.upsert({ + where: { userId }, + update: dto, + create: { + userId, + lastSeen: dto.lastSeen ?? 0, + messages: dto.messages ?? 0, + bio: dto.bio ?? 0, + dateOfBirth: dto.dateOfBirth ?? 0, + invites: dto.invites ?? 0 + } + }) + return plainToInstance(PrivacySettingsDto, settings) + } + + async isExists(id: UserId): Promise { + return await this.prisma.user.count({ where: { id } }) > 0 + } +} diff --git a/messenger-server/src/providers/prisma/prisma.module.ts b/messenger-server/src/providers/prisma/prisma.module.ts new file mode 100644 index 0000000..cd413b8 --- /dev/null +++ b/messenger-server/src/providers/prisma/prisma.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from '@nestjs/common' +import { PrismaService } from './prisma.service' + +@Global() +@Module({ + providers: [PrismaService], + exports: [PrismaService] +}) +export class PrismaModule { } \ No newline at end of file diff --git a/messenger-server/src/providers/prisma/prisma.service.ts b/messenger-server/src/providers/prisma/prisma.service.ts new file mode 100644 index 0000000..8fa0ff4 --- /dev/null +++ b/messenger-server/src/providers/prisma/prisma.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@nestjs/common' +import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3' +import { ConfigService } from '@nestjs/config' +import { PrismaClient } from 'generated/prisma/client' + +@Injectable() +export class PrismaService extends PrismaClient { + constructor(private readonly config: ConfigService) { + const adapter = new PrismaBetterSqlite3({ url: config.get('DATABASE_URL') }) + super({ adapter }) + } +} diff --git a/messenger-server/tsconfig.build.json b/messenger-server/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/messenger-server/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/messenger-server/tsconfig.json b/messenger-server/tsconfig.json new file mode 100644 index 0000000..f412e5e --- /dev/null +++ b/messenger-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "moduleResolution": "node", + "esModuleInterop": true, + "isolatedModules": false, + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true + } +} \ No newline at end of file
+ +