├── .gitignore ├── Images ├── Preview-iPhone.jpg └── Preview-mac.jpg ├── LICENSE ├── OpenAISwiftUI.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── swiftpm │ └── Package.resolved ├── OpenAISwiftUI ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── iOS-1024@1x.png │ │ ├── macOS-1024.png │ │ ├── macOS-128.png │ │ ├── macOS-16.png │ │ ├── macOS-256.png │ │ ├── macOS-32.png │ │ ├── macOS-512.png │ │ └── macOS-64.png │ ├── Contents.json │ └── LaunchScreen.imageset │ │ ├── Contents.json │ │ └── LaunchScreen.jpg ├── Extension │ ├── ColorExtensions.swift │ └── StringExtensions.swift ├── Info.plist ├── LottieFiles │ ├── LottieFiles.swift │ └── buymeacoffee.json ├── Model │ ├── Message.swift │ └── SpeechRecognizer.swift ├── OpenAISwiftUI.entitlements ├── OpenAISwiftUIApp.swift ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── Scene │ ├── ChatView.swift │ ├── Launch Screen.storyboard │ ├── SetupView.swift │ ├── TipView.swift │ └── ViewModel.swift └── View │ ├── LoadingView.swift │ └── VoicePicker.swift └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | # *.xcodeproj 44 | # 45 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 46 | # hence it is not needed unless you have added a package configuration file to your project 47 | # .swiftpm 48 | 49 | .build/ 50 | 51 | # CocoaPods 52 | # 53 | # We recommend against adding the Pods directory to your .gitignore. However 54 | # you should judge for yourself, the pros and cons are mentioned at: 55 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 56 | # 57 | # Pods/ 58 | # 59 | # Add this line if you want to avoid checking in source code from the Xcode workspace 60 | # *.xcworkspace 61 | 62 | # Carthage 63 | # 64 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 65 | # Carthage/Checkouts 66 | 67 | Carthage/Build/ 68 | 69 | # Accio dependency management 70 | Dependencies/ 71 | .accio/ 72 | 73 | # fastlane 74 | # 75 | # It is recommended to not store the screenshots in the git repo. 76 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 77 | # For more information about the recommended setup visit: 78 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 79 | 80 | fastlane/report.xml 81 | fastlane/Preview.html 82 | fastlane/screenshots/**/*.png 83 | fastlane/test_output 84 | 85 | # Code Injection 86 | # 87 | # After new code Injection tools there's a generated folder /iOSInjectionProject 88 | # https://github.com/johnno1962/injectionforxcode 89 | 90 | iOSInjectionProject/ 91 | **/.DS_Store 92 | -------------------------------------------------------------------------------- /Images/Preview-iPhone.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/Images/Preview-iPhone.jpg -------------------------------------------------------------------------------- /Images/Preview-mac.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/Images/Preview-mac.jpg -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Ge Will 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /OpenAISwiftUI.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | BE1B90F929B22E55002F61F3 /* ColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE1B90F829B22E55002F61F3 /* ColorExtensions.swift */; }; 11 | BE43A8F029B779C3003D1773 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BE43A8EF29B779C3003D1773 /* Launch Screen.storyboard */; platformFilter = ios; }; 12 | BE51152929B38F820065CAE8 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE51152829B38F820065CAE8 /* LoadingView.swift */; }; 13 | BE51153129B3A9CE0065CAE8 /* SetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE51153029B3A9CE0065CAE8 /* SetupView.swift */; }; 14 | BE56E92529B3BB6400A1D08E /* Glassfy in Frameworks */ = {isa = PBXBuildFile; productRef = BE56E92429B3BB6400A1D08E /* Glassfy */; }; 15 | BE56E92729B3C0E100A1D08E /* TipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE56E92629B3C0E100A1D08E /* TipView.swift */; }; 16 | BE67A58729B0ECED00BBAD4B /* OpenAISwiftUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE67A58629B0ECED00BBAD4B /* OpenAISwiftUIApp.swift */; }; 17 | BE67A58929B0ECED00BBAD4B /* ChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE67A58829B0ECED00BBAD4B /* ChatView.swift */; }; 18 | BE67A58B29B0ECEE00BBAD4B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BE67A58A29B0ECEE00BBAD4B /* Assets.xcassets */; }; 19 | BE67A58F29B0ECEE00BBAD4B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BE67A58E29B0ECEE00BBAD4B /* Preview Assets.xcassets */; }; 20 | BE67A59A29B0ED2700BBAD4B /* ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE67A59829B0ED2700BBAD4B /* ViewModel.swift */; }; 21 | BE67A59B29B0ED2700BBAD4B /* StringExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE67A59929B0ED2700BBAD4B /* StringExtensions.swift */; }; 22 | BE74560B29B1949100E09F7F /* VoicePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE74560A29B1949100E09F7F /* VoicePicker.swift */; }; 23 | BEA9467629B0FAC6005F8F93 /* ChatGPTSwift in Frameworks */ = {isa = PBXBuildFile; productRef = BEA9467529B0FAC6005F8F93 /* ChatGPTSwift */; }; 24 | BEB21FF029B45988006FAE96 /* ConfettiSwiftUI in Frameworks */ = {isa = PBXBuildFile; productRef = BEB21FEF29B45988006FAE96 /* ConfettiSwiftUI */; }; 25 | BEB21FF429B4652E006FAE96 /* buymeacoffee.json in Resources */ = {isa = PBXBuildFile; fileRef = BEB21FF329B4652E006FAE96 /* buymeacoffee.json */; }; 26 | BEB21FF729B465BC006FAE96 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = BEB21FF629B465BC006FAE96 /* Lottie */; }; 27 | BEB21FFA29B465D7006FAE96 /* LottieUI in Frameworks */ = {isa = PBXBuildFile; productRef = BEB21FF929B465D7006FAE96 /* LottieUI */; }; 28 | BEB21FFE29B465FD006FAE96 /* LottieFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEB21FFC29B465FD006FAE96 /* LottieFiles.swift */; }; 29 | BEB2200129B482A6006FAE96 /* SpeechRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEB2200029B482A6006FAE96 /* SpeechRecognizer.swift */; }; 30 | BEB2200629B49844006FAE96 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEB2200529B49844006FAE96 /* Message.swift */; }; 31 | /* End PBXBuildFile section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | BE1B90F829B22E55002F61F3 /* ColorExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorExtensions.swift; sourceTree = ""; }; 35 | BE43A8EF29B779C3003D1773 /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; 36 | BE51152829B38F820065CAE8 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = ""; }; 37 | BE51153029B3A9CE0065CAE8 /* SetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetupView.swift; sourceTree = ""; }; 38 | BE56E92629B3C0E100A1D08E /* TipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TipView.swift; sourceTree = ""; }; 39 | BE67A58329B0ECED00BBAD4B /* VoiceAI Chat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "VoiceAI Chat.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | BE67A58629B0ECED00BBAD4B /* OpenAISwiftUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenAISwiftUIApp.swift; sourceTree = ""; }; 41 | BE67A58829B0ECED00BBAD4B /* ChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatView.swift; sourceTree = ""; }; 42 | BE67A58A29B0ECEE00BBAD4B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | BE67A58C29B0ECEE00BBAD4B /* OpenAISwiftUI.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OpenAISwiftUI.entitlements; sourceTree = ""; }; 44 | BE67A58E29B0ECEE00BBAD4B /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 45 | BE67A59829B0ED2700BBAD4B /* ViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewModel.swift; sourceTree = ""; }; 46 | BE67A59929B0ED2700BBAD4B /* StringExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringExtensions.swift; sourceTree = ""; }; 47 | BE74560A29B1949100E09F7F /* VoicePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoicePicker.swift; sourceTree = ""; }; 48 | BEA9467929B113BD005F8F93 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 49 | BEB21FF329B4652E006FAE96 /* buymeacoffee.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = buymeacoffee.json; sourceTree = ""; }; 50 | BEB21FFC29B465FD006FAE96 /* LottieFiles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LottieFiles.swift; sourceTree = ""; }; 51 | BEB2200029B482A6006FAE96 /* SpeechRecognizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpeechRecognizer.swift; sourceTree = ""; }; 52 | BEB2200529B49844006FAE96 /* Message.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Message.swift; sourceTree = ""; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | BE67A58029B0ECED00BBAD4B /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | BE56E92529B3BB6400A1D08E /* Glassfy in Frameworks */, 61 | BEA9467629B0FAC6005F8F93 /* ChatGPTSwift in Frameworks */, 62 | BEB21FF029B45988006FAE96 /* ConfettiSwiftUI in Frameworks */, 63 | BEB21FFA29B465D7006FAE96 /* LottieUI in Frameworks */, 64 | BEB21FF729B465BC006FAE96 /* Lottie in Frameworks */, 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | /* End PBXFrameworksBuildPhase section */ 69 | 70 | /* Begin PBXGroup section */ 71 | BE56E92829B3D91500A1D08E /* Scene */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | BE43A8EF29B779C3003D1773 /* Launch Screen.storyboard */, 75 | BE51153029B3A9CE0065CAE8 /* SetupView.swift */, 76 | BE67A58829B0ECED00BBAD4B /* ChatView.swift */, 77 | BE67A59829B0ED2700BBAD4B /* ViewModel.swift */, 78 | BE56E92629B3C0E100A1D08E /* TipView.swift */, 79 | ); 80 | path = Scene; 81 | sourceTree = ""; 82 | }; 83 | BE56E92929B3D92400A1D08E /* View */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | BE74560A29B1949100E09F7F /* VoicePicker.swift */, 87 | BE51152829B38F820065CAE8 /* LoadingView.swift */, 88 | ); 89 | path = View; 90 | sourceTree = ""; 91 | }; 92 | BE56E92A29B3D92C00A1D08E /* Extension */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | BE67A59929B0ED2700BBAD4B /* StringExtensions.swift */, 96 | BE1B90F829B22E55002F61F3 /* ColorExtensions.swift */, 97 | ); 98 | path = Extension; 99 | sourceTree = ""; 100 | }; 101 | BE67A57A29B0ECED00BBAD4B = { 102 | isa = PBXGroup; 103 | children = ( 104 | BE67A58529B0ECED00BBAD4B /* OpenAISwiftUI */, 105 | BE67A58429B0ECED00BBAD4B /* Products */, 106 | ); 107 | indentWidth = 2; 108 | sourceTree = ""; 109 | tabWidth = 2; 110 | }; 111 | BE67A58429B0ECED00BBAD4B /* Products */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | BE67A58329B0ECED00BBAD4B /* VoiceAI Chat.app */, 115 | ); 116 | name = Products; 117 | sourceTree = ""; 118 | }; 119 | BE67A58529B0ECED00BBAD4B /* OpenAISwiftUI */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | BEA9467929B113BD005F8F93 /* Info.plist */, 123 | BE67A58629B0ECED00BBAD4B /* OpenAISwiftUIApp.swift */, 124 | BE56E92829B3D91500A1D08E /* Scene */, 125 | BE56E92929B3D92400A1D08E /* View */, 126 | BEB2200429B4865B006FAE96 /* Model */, 127 | BE56E92A29B3D92C00A1D08E /* Extension */, 128 | BEB21FFB29B465FD006FAE96 /* LottieFiles */, 129 | BE67A58A29B0ECEE00BBAD4B /* Assets.xcassets */, 130 | BE67A58C29B0ECEE00BBAD4B /* OpenAISwiftUI.entitlements */, 131 | BE67A58D29B0ECEE00BBAD4B /* Preview Content */, 132 | ); 133 | path = OpenAISwiftUI; 134 | sourceTree = ""; 135 | }; 136 | BE67A58D29B0ECEE00BBAD4B /* Preview Content */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | BE67A58E29B0ECEE00BBAD4B /* Preview Assets.xcassets */, 140 | ); 141 | path = "Preview Content"; 142 | sourceTree = ""; 143 | }; 144 | BEB21FFB29B465FD006FAE96 /* LottieFiles */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | BEB21FFC29B465FD006FAE96 /* LottieFiles.swift */, 148 | BEB21FF329B4652E006FAE96 /* buymeacoffee.json */, 149 | ); 150 | path = LottieFiles; 151 | sourceTree = ""; 152 | }; 153 | BEB2200429B4865B006FAE96 /* Model */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | BEB2200029B482A6006FAE96 /* SpeechRecognizer.swift */, 157 | BEB2200529B49844006FAE96 /* Message.swift */, 158 | ); 159 | path = Model; 160 | sourceTree = ""; 161 | }; 162 | /* End PBXGroup section */ 163 | 164 | /* Begin PBXNativeTarget section */ 165 | BE67A58229B0ECED00BBAD4B /* OpenAISwiftUI */ = { 166 | isa = PBXNativeTarget; 167 | buildConfigurationList = BE67A59229B0ECEE00BBAD4B /* Build configuration list for PBXNativeTarget "OpenAISwiftUI" */; 168 | buildPhases = ( 169 | BE67A57F29B0ECED00BBAD4B /* Sources */, 170 | BE67A58029B0ECED00BBAD4B /* Frameworks */, 171 | BE67A58129B0ECED00BBAD4B /* Resources */, 172 | ); 173 | buildRules = ( 174 | ); 175 | dependencies = ( 176 | ); 177 | name = OpenAISwiftUI; 178 | packageProductDependencies = ( 179 | BEA9467529B0FAC6005F8F93 /* ChatGPTSwift */, 180 | BE56E92429B3BB6400A1D08E /* Glassfy */, 181 | BEB21FEF29B45988006FAE96 /* ConfettiSwiftUI */, 182 | BEB21FF629B465BC006FAE96 /* Lottie */, 183 | BEB21FF929B465D7006FAE96 /* LottieUI */, 184 | ); 185 | productName = OpenAISwiftUI; 186 | productReference = BE67A58329B0ECED00BBAD4B /* VoiceAI Chat.app */; 187 | productType = "com.apple.product-type.application"; 188 | }; 189 | /* End PBXNativeTarget section */ 190 | 191 | /* Begin PBXProject section */ 192 | BE67A57B29B0ECED00BBAD4B /* Project object */ = { 193 | isa = PBXProject; 194 | attributes = { 195 | BuildIndependentTargetsInParallel = 1; 196 | LastSwiftUpdateCheck = 1420; 197 | LastUpgradeCheck = 1420; 198 | TargetAttributes = { 199 | BE67A58229B0ECED00BBAD4B = { 200 | CreatedOnToolsVersion = 14.2; 201 | }; 202 | }; 203 | }; 204 | buildConfigurationList = BE67A57E29B0ECED00BBAD4B /* Build configuration list for PBXProject "OpenAISwiftUI" */; 205 | compatibilityVersion = "Xcode 14.0"; 206 | developmentRegion = en; 207 | hasScannedForEncodings = 0; 208 | knownRegions = ( 209 | en, 210 | Base, 211 | ); 212 | mainGroup = BE67A57A29B0ECED00BBAD4B; 213 | packageReferences = ( 214 | BEA9467429B0FAC6005F8F93 /* XCRemoteSwiftPackageReference "ChatGPTSwift" */, 215 | BE56E92329B3BB6400A1D08E /* XCRemoteSwiftPackageReference "ios-sdk" */, 216 | BEB21FEE29B45988006FAE96 /* XCRemoteSwiftPackageReference "ConfettiSwiftUI" */, 217 | BEB21FF529B465BC006FAE96 /* XCRemoteSwiftPackageReference "lottie-spm" */, 218 | BEB21FF829B465D7006FAE96 /* XCRemoteSwiftPackageReference "LottieUI" */, 219 | ); 220 | productRefGroup = BE67A58429B0ECED00BBAD4B /* Products */; 221 | projectDirPath = ""; 222 | projectRoot = ""; 223 | targets = ( 224 | BE67A58229B0ECED00BBAD4B /* OpenAISwiftUI */, 225 | ); 226 | }; 227 | /* End PBXProject section */ 228 | 229 | /* Begin PBXResourcesBuildPhase section */ 230 | BE67A58129B0ECED00BBAD4B /* Resources */ = { 231 | isa = PBXResourcesBuildPhase; 232 | buildActionMask = 2147483647; 233 | files = ( 234 | BE67A58F29B0ECEE00BBAD4B /* Preview Assets.xcassets in Resources */, 235 | BE67A58B29B0ECEE00BBAD4B /* Assets.xcassets in Resources */, 236 | BE43A8F029B779C3003D1773 /* Launch Screen.storyboard in Resources */, 237 | BEB21FF429B4652E006FAE96 /* buymeacoffee.json in Resources */, 238 | ); 239 | runOnlyForDeploymentPostprocessing = 0; 240 | }; 241 | /* End PBXResourcesBuildPhase section */ 242 | 243 | /* Begin PBXSourcesBuildPhase section */ 244 | BE67A57F29B0ECED00BBAD4B /* Sources */ = { 245 | isa = PBXSourcesBuildPhase; 246 | buildActionMask = 2147483647; 247 | files = ( 248 | BE74560B29B1949100E09F7F /* VoicePicker.swift in Sources */, 249 | BE67A59B29B0ED2700BBAD4B /* StringExtensions.swift in Sources */, 250 | BEB2200129B482A6006FAE96 /* SpeechRecognizer.swift in Sources */, 251 | BE67A58929B0ECED00BBAD4B /* ChatView.swift in Sources */, 252 | BE67A59A29B0ED2700BBAD4B /* ViewModel.swift in Sources */, 253 | BEB21FFE29B465FD006FAE96 /* LottieFiles.swift in Sources */, 254 | BE67A58729B0ECED00BBAD4B /* OpenAISwiftUIApp.swift in Sources */, 255 | BE51152929B38F820065CAE8 /* LoadingView.swift in Sources */, 256 | BE51153129B3A9CE0065CAE8 /* SetupView.swift in Sources */, 257 | BEB2200629B49844006FAE96 /* Message.swift in Sources */, 258 | BE1B90F929B22E55002F61F3 /* ColorExtensions.swift in Sources */, 259 | BE56E92729B3C0E100A1D08E /* TipView.swift in Sources */, 260 | ); 261 | runOnlyForDeploymentPostprocessing = 0; 262 | }; 263 | /* End PBXSourcesBuildPhase section */ 264 | 265 | /* Begin XCBuildConfiguration section */ 266 | BE67A59029B0ECEE00BBAD4B /* Debug */ = { 267 | isa = XCBuildConfiguration; 268 | buildSettings = { 269 | ALWAYS_SEARCH_USER_PATHS = NO; 270 | CLANG_ANALYZER_NONNULL = YES; 271 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 272 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 273 | CLANG_ENABLE_MODULES = YES; 274 | CLANG_ENABLE_OBJC_ARC = YES; 275 | CLANG_ENABLE_OBJC_WEAK = YES; 276 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 277 | CLANG_WARN_BOOL_CONVERSION = YES; 278 | CLANG_WARN_COMMA = YES; 279 | CLANG_WARN_CONSTANT_CONVERSION = YES; 280 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 281 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 282 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 283 | CLANG_WARN_EMPTY_BODY = YES; 284 | CLANG_WARN_ENUM_CONVERSION = YES; 285 | CLANG_WARN_INFINITE_RECURSION = YES; 286 | CLANG_WARN_INT_CONVERSION = YES; 287 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 288 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 289 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 290 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 291 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 292 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 293 | CLANG_WARN_STRICT_PROTOTYPES = YES; 294 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 295 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 296 | CLANG_WARN_UNREACHABLE_CODE = YES; 297 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 298 | COPY_PHASE_STRIP = NO; 299 | DEBUG_INFORMATION_FORMAT = dwarf; 300 | ENABLE_STRICT_OBJC_MSGSEND = YES; 301 | ENABLE_TESTABILITY = YES; 302 | GCC_C_LANGUAGE_STANDARD = gnu11; 303 | GCC_DYNAMIC_NO_PIC = NO; 304 | GCC_NO_COMMON_BLOCKS = YES; 305 | GCC_OPTIMIZATION_LEVEL = 0; 306 | GCC_PREPROCESSOR_DEFINITIONS = ( 307 | "DEBUG=1", 308 | "$(inherited)", 309 | ); 310 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 311 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 312 | GCC_WARN_UNDECLARED_SELECTOR = YES; 313 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 314 | GCC_WARN_UNUSED_FUNCTION = YES; 315 | GCC_WARN_UNUSED_VARIABLE = YES; 316 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 317 | MTL_FAST_MATH = YES; 318 | ONLY_ACTIVE_ARCH = YES; 319 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 320 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 321 | }; 322 | name = Debug; 323 | }; 324 | BE67A59129B0ECEE00BBAD4B /* Release */ = { 325 | isa = XCBuildConfiguration; 326 | buildSettings = { 327 | ALWAYS_SEARCH_USER_PATHS = NO; 328 | CLANG_ANALYZER_NONNULL = YES; 329 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 330 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; 331 | CLANG_ENABLE_MODULES = YES; 332 | CLANG_ENABLE_OBJC_ARC = YES; 333 | CLANG_ENABLE_OBJC_WEAK = YES; 334 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 335 | CLANG_WARN_BOOL_CONVERSION = YES; 336 | CLANG_WARN_COMMA = YES; 337 | CLANG_WARN_CONSTANT_CONVERSION = YES; 338 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 339 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 340 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 341 | CLANG_WARN_EMPTY_BODY = YES; 342 | CLANG_WARN_ENUM_CONVERSION = YES; 343 | CLANG_WARN_INFINITE_RECURSION = YES; 344 | CLANG_WARN_INT_CONVERSION = YES; 345 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 346 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 347 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 348 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 349 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 350 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 351 | CLANG_WARN_STRICT_PROTOTYPES = YES; 352 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 353 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 354 | CLANG_WARN_UNREACHABLE_CODE = YES; 355 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 356 | COPY_PHASE_STRIP = NO; 357 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 358 | ENABLE_NS_ASSERTIONS = NO; 359 | ENABLE_STRICT_OBJC_MSGSEND = YES; 360 | GCC_C_LANGUAGE_STANDARD = gnu11; 361 | GCC_NO_COMMON_BLOCKS = YES; 362 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 363 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 364 | GCC_WARN_UNDECLARED_SELECTOR = YES; 365 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 366 | GCC_WARN_UNUSED_FUNCTION = YES; 367 | GCC_WARN_UNUSED_VARIABLE = YES; 368 | MTL_ENABLE_DEBUG_INFO = NO; 369 | MTL_FAST_MATH = YES; 370 | SWIFT_COMPILATION_MODE = wholemodule; 371 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 372 | }; 373 | name = Release; 374 | }; 375 | BE67A59329B0ECEE00BBAD4B /* Debug */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 379 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 380 | CODE_SIGN_ENTITLEMENTS = OpenAISwiftUI/OpenAISwiftUI.entitlements; 381 | CODE_SIGN_STYLE = Automatic; 382 | CURRENT_PROJECT_VERSION = 1; 383 | DEVELOPMENT_ASSET_PATHS = "\"OpenAISwiftUI/Preview Content\""; 384 | DEVELOPMENT_TEAM = RLK76T8Y89; 385 | ENABLE_HARDENED_RUNTIME = YES; 386 | ENABLE_PREVIEWS = YES; 387 | GENERATE_INFOPLIST_FILE = YES; 388 | INFOPLIST_FILE = OpenAISwiftUI/Info.plist; 389 | INFOPLIST_KEY_CFBundleDisplayName = "VoiceAI Chat"; 390 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; 391 | INFOPLIST_KEY_NSMicrophoneUsageDescription = "Audio is recorded to transcribe the voice. Audio recordings are discarded after transcription."; 392 | INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "You can view a text transcription in the app."; 393 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; 394 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; 395 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; 396 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; 397 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; 398 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; 399 | INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen.storyboard"; 400 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; 401 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; 402 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 403 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 404 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 405 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; 406 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; 407 | MACOSX_DEPLOYMENT_TARGET = 12.0; 408 | MARKETING_VERSION = 1.0.1; 409 | PRODUCT_BUNDLE_IDENTIFIER = org.gewill.OpenAISwiftUI; 410 | PRODUCT_NAME = "VoiceAI Chat"; 411 | SDKROOT = auto; 412 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; 413 | SWIFT_EMIT_LOC_STRINGS = YES; 414 | SWIFT_VERSION = 5.0; 415 | TARGETED_DEVICE_FAMILY = "1,2"; 416 | }; 417 | name = Debug; 418 | }; 419 | BE67A59429B0ECEE00BBAD4B /* Release */ = { 420 | isa = XCBuildConfiguration; 421 | buildSettings = { 422 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 423 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 424 | CODE_SIGN_ENTITLEMENTS = OpenAISwiftUI/OpenAISwiftUI.entitlements; 425 | CODE_SIGN_STYLE = Automatic; 426 | CURRENT_PROJECT_VERSION = 1; 427 | DEVELOPMENT_ASSET_PATHS = "\"OpenAISwiftUI/Preview Content\""; 428 | DEVELOPMENT_TEAM = RLK76T8Y89; 429 | ENABLE_HARDENED_RUNTIME = YES; 430 | ENABLE_PREVIEWS = YES; 431 | GENERATE_INFOPLIST_FILE = YES; 432 | INFOPLIST_FILE = OpenAISwiftUI/Info.plist; 433 | INFOPLIST_KEY_CFBundleDisplayName = "VoiceAI Chat"; 434 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; 435 | INFOPLIST_KEY_NSMicrophoneUsageDescription = "Audio is recorded to transcribe the voice. Audio recordings are discarded after transcription."; 436 | INFOPLIST_KEY_NSSpeechRecognitionUsageDescription = "You can view a text transcription in the app."; 437 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; 438 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; 439 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; 440 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; 441 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; 442 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; 443 | INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen.storyboard"; 444 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; 445 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; 446 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 447 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 448 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 449 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; 450 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; 451 | MACOSX_DEPLOYMENT_TARGET = 12.0; 452 | MARKETING_VERSION = 1.0.1; 453 | PRODUCT_BUNDLE_IDENTIFIER = org.gewill.OpenAISwiftUI; 454 | PRODUCT_NAME = "VoiceAI Chat"; 455 | SDKROOT = auto; 456 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; 457 | SWIFT_EMIT_LOC_STRINGS = YES; 458 | SWIFT_VERSION = 5.0; 459 | TARGETED_DEVICE_FAMILY = "1,2"; 460 | }; 461 | name = Release; 462 | }; 463 | /* End XCBuildConfiguration section */ 464 | 465 | /* Begin XCConfigurationList section */ 466 | BE67A57E29B0ECED00BBAD4B /* Build configuration list for PBXProject "OpenAISwiftUI" */ = { 467 | isa = XCConfigurationList; 468 | buildConfigurations = ( 469 | BE67A59029B0ECEE00BBAD4B /* Debug */, 470 | BE67A59129B0ECEE00BBAD4B /* Release */, 471 | ); 472 | defaultConfigurationIsVisible = 0; 473 | defaultConfigurationName = Release; 474 | }; 475 | BE67A59229B0ECEE00BBAD4B /* Build configuration list for PBXNativeTarget "OpenAISwiftUI" */ = { 476 | isa = XCConfigurationList; 477 | buildConfigurations = ( 478 | BE67A59329B0ECEE00BBAD4B /* Debug */, 479 | BE67A59429B0ECEE00BBAD4B /* Release */, 480 | ); 481 | defaultConfigurationIsVisible = 0; 482 | defaultConfigurationName = Release; 483 | }; 484 | /* End XCConfigurationList section */ 485 | 486 | /* Begin XCRemoteSwiftPackageReference section */ 487 | BE56E92329B3BB6400A1D08E /* XCRemoteSwiftPackageReference "ios-sdk" */ = { 488 | isa = XCRemoteSwiftPackageReference; 489 | repositoryURL = "https://github.com/glassfy/ios-sdk"; 490 | requirement = { 491 | kind = upToNextMajorVersion; 492 | minimumVersion = 1.0.0; 493 | }; 494 | }; 495 | BEA9467429B0FAC6005F8F93 /* XCRemoteSwiftPackageReference "ChatGPTSwift" */ = { 496 | isa = XCRemoteSwiftPackageReference; 497 | repositoryURL = "https://github.com/alfianlosari/ChatGPTSwift"; 498 | requirement = { 499 | kind = upToNextMajorVersion; 500 | minimumVersion = 1.0.0; 501 | }; 502 | }; 503 | BEB21FEE29B45988006FAE96 /* XCRemoteSwiftPackageReference "ConfettiSwiftUI" */ = { 504 | isa = XCRemoteSwiftPackageReference; 505 | repositoryURL = "https://github.com/simibac/ConfettiSwiftUI"; 506 | requirement = { 507 | kind = upToNextMajorVersion; 508 | minimumVersion = 1.0.0; 509 | }; 510 | }; 511 | BEB21FF529B465BC006FAE96 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { 512 | isa = XCRemoteSwiftPackageReference; 513 | repositoryURL = "https://github.com/airbnb/lottie-spm.git"; 514 | requirement = { 515 | kind = upToNextMajorVersion; 516 | minimumVersion = 4.0.0; 517 | }; 518 | }; 519 | BEB21FF829B465D7006FAE96 /* XCRemoteSwiftPackageReference "LottieUI" */ = { 520 | isa = XCRemoteSwiftPackageReference; 521 | repositoryURL = "https://github.com/tfmart/LottieUI"; 522 | requirement = { 523 | kind = upToNextMajorVersion; 524 | minimumVersion = 1.0.0; 525 | }; 526 | }; 527 | /* End XCRemoteSwiftPackageReference section */ 528 | 529 | /* Begin XCSwiftPackageProductDependency section */ 530 | BE56E92429B3BB6400A1D08E /* Glassfy */ = { 531 | isa = XCSwiftPackageProductDependency; 532 | package = BE56E92329B3BB6400A1D08E /* XCRemoteSwiftPackageReference "ios-sdk" */; 533 | productName = Glassfy; 534 | }; 535 | BEA9467529B0FAC6005F8F93 /* ChatGPTSwift */ = { 536 | isa = XCSwiftPackageProductDependency; 537 | package = BEA9467429B0FAC6005F8F93 /* XCRemoteSwiftPackageReference "ChatGPTSwift" */; 538 | productName = ChatGPTSwift; 539 | }; 540 | BEB21FEF29B45988006FAE96 /* ConfettiSwiftUI */ = { 541 | isa = XCSwiftPackageProductDependency; 542 | package = BEB21FEE29B45988006FAE96 /* XCRemoteSwiftPackageReference "ConfettiSwiftUI" */; 543 | productName = ConfettiSwiftUI; 544 | }; 545 | BEB21FF629B465BC006FAE96 /* Lottie */ = { 546 | isa = XCSwiftPackageProductDependency; 547 | package = BEB21FF529B465BC006FAE96 /* XCRemoteSwiftPackageReference "lottie-spm" */; 548 | productName = Lottie; 549 | }; 550 | BEB21FF929B465D7006FAE96 /* LottieUI */ = { 551 | isa = XCSwiftPackageProductDependency; 552 | package = BEB21FF829B465D7006FAE96 /* XCRemoteSwiftPackageReference "LottieUI" */; 553 | productName = LottieUI; 554 | }; 555 | /* End XCSwiftPackageProductDependency section */ 556 | }; 557 | rootObject = BE67A57B29B0ECED00BBAD4B /* Project object */; 558 | } 559 | -------------------------------------------------------------------------------- /OpenAISwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /OpenAISwiftUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /OpenAISwiftUI.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "pins" : [ 3 | { 4 | "identity" : "chatgptswift", 5 | "kind" : "remoteSourceControl", 6 | "location" : "https://github.com/alfianlosari/ChatGPTSwift", 7 | "state" : { 8 | "revision" : "f84d6235d5102fbdf152d25bb73500fff2f7091a", 9 | "version" : "1.0.0" 10 | } 11 | }, 12 | { 13 | "identity" : "confettiswiftui", 14 | "kind" : "remoteSourceControl", 15 | "location" : "https://github.com/simibac/ConfettiSwiftUI", 16 | "state" : { 17 | "revision" : "8d3a15d0aa2991e0761749b767ef8d89bca6275a", 18 | "version" : "1.0.1" 19 | } 20 | }, 21 | { 22 | "identity" : "ios-sdk", 23 | "kind" : "remoteSourceControl", 24 | "location" : "https://github.com/glassfy/ios-sdk", 25 | "state" : { 26 | "revision" : "cdbbc31645a65bfa2cda2319aecd109473d8fb9f", 27 | "version" : "1.3.5" 28 | } 29 | }, 30 | { 31 | "identity" : "lottie-spm", 32 | "kind" : "remoteSourceControl", 33 | "location" : "https://github.com/airbnb/lottie-spm.git", 34 | "state" : { 35 | "revision" : "c3852816c622ad35a03ed39c187c1644ece2382b", 36 | "version" : "4.1.3" 37 | } 38 | }, 39 | { 40 | "identity" : "lottieui", 41 | "kind" : "remoteSourceControl", 42 | "location" : "https://github.com/tfmart/LottieUI", 43 | "state" : { 44 | "revision" : "dd5b2f16213f89ab996a55fc2f51b56236da4bbe", 45 | "version" : "1.3.3" 46 | } 47 | } 48 | ], 49 | "version" : 2 50 | } 51 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xA9", 9 | "green" : "0xE3", 10 | "red" : "0x92" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | }, 20 | "properties" : { 21 | "localizable" : true 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "iOS-1024@1x.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | }, 9 | { 10 | "filename" : "macOS-16.png", 11 | "idiom" : "mac", 12 | "scale" : "1x", 13 | "size" : "16x16" 14 | }, 15 | { 16 | "filename" : "macOS-32.png", 17 | "idiom" : "mac", 18 | "scale" : "2x", 19 | "size" : "16x16" 20 | }, 21 | { 22 | "filename" : "macOS-32.png", 23 | "idiom" : "mac", 24 | "scale" : "1x", 25 | "size" : "32x32" 26 | }, 27 | { 28 | "filename" : "macOS-64.png", 29 | "idiom" : "mac", 30 | "scale" : "2x", 31 | "size" : "32x32" 32 | }, 33 | { 34 | "filename" : "macOS-128.png", 35 | "idiom" : "mac", 36 | "scale" : "1x", 37 | "size" : "128x128" 38 | }, 39 | { 40 | "filename" : "macOS-256.png", 41 | "idiom" : "mac", 42 | "scale" : "2x", 43 | "size" : "128x128" 44 | }, 45 | { 46 | "filename" : "macOS-256.png", 47 | "idiom" : "mac", 48 | "scale" : "1x", 49 | "size" : "256x256" 50 | }, 51 | { 52 | "filename" : "macOS-512.png", 53 | "idiom" : "mac", 54 | "scale" : "2x", 55 | "size" : "256x256" 56 | }, 57 | { 58 | "filename" : "macOS-512.png", 59 | "idiom" : "mac", 60 | "scale" : "1x", 61 | "size" : "512x512" 62 | }, 63 | { 64 | "filename" : "macOS-1024.png", 65 | "idiom" : "mac", 66 | "scale" : "2x", 67 | "size" : "512x512" 68 | } 69 | ], 70 | "info" : { 71 | "author" : "xcode", 72 | "version" : 1 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/iOS-1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/iOS-1024@1x.png -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-1024.png -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-128.png -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-16.png -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-256.png -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-32.png -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-512.png -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/AppIcon.appiconset/macOS-64.png -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/LaunchScreen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "LaunchScreen.jpg", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Assets.xcassets/LaunchScreen.imageset/LaunchScreen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gewill/OpenAISwiftUI/891c0907b211fc3efc5195c41259e3fd2feced64/OpenAISwiftUI/Assets.xcassets/LaunchScreen.imageset/LaunchScreen.jpg -------------------------------------------------------------------------------- /OpenAISwiftUI/Extension/ColorExtensions.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SwiftUI 3 | 4 | extension Color { 5 | /// Fix accentColor not work on macOS 6 | static let accent = Color("AccentColor") 7 | } 8 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Extension/StringExtensions.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SwiftUI 3 | 4 | extension String { 5 | /// SwifterSwift: String with no spaces or new lines in beginning and end. 6 | /// 7 | /// " hello \n".trimmed -> "hello" 8 | /// 9 | var trimmed: String { 10 | return trimmingCharacters(in: .whitespacesAndNewlines) 11 | } 12 | } 13 | 14 | func copyToClipboard(text: String) { 15 | #if os(iOS) 16 | UIPasteboard.general.string = text 17 | #endif 18 | 19 | #if os(macOS) 20 | let pasteBoard = NSPasteboard.general 21 | pasteBoard.clearContents() 22 | pasteBoard.setString(text, forType: .string) 23 | #endif 24 | } 25 | 26 | func getClipboardString() -> String? { 27 | #if os(iOS) 28 | return UIPasteboard.general.string 29 | #endif 30 | 31 | #if os(macOS) 32 | let pasteBoard = NSPasteboard.general 33 | return pasteBoard.string(forType: .string) 34 | #endif 35 | } 36 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ITSAppUsesNonExemptEncryption 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /OpenAISwiftUI/LottieFiles/LottieFiles.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | enum LottieFiles { 4 | static let buyMeACoffee = "buymeacoffee" 5 | } 6 | -------------------------------------------------------------------------------- /OpenAISwiftUI/LottieFiles/buymeacoffee.json: -------------------------------------------------------------------------------- 1 | {"nm":"buyMeaCoffee","mn":"","layers":[{"ty":0,"nm":"coffee","mn":"","sr":1,"st":0,"op":120,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[210,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[514.128,754.34,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"w":420,"h":200,"refId":"comp_0","ind":1},{"ty":0,"nm":"buymea","mn":"","sr":1,"st":0,"op":120,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[250,110,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[501.48,285.88,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"w":500,"h":220,"refId":"comp_1","ind":2},{"ty":0,"nm":"▽ smoke","mn":"","sr":1,"st":0,"op":120,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[70,70,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[511.102,408,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"w":140,"h":140,"refId":"comp_2","ind":3},{"ty":4,"nm":"coffee-cup","mn":"","sr":1,"st":0,"op":125,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[527.243,563.25,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"coffee-cup","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,7.5],[37.5,0],[0,-6],[-29.34,0],[0,12.703],[52.467,0],[0,-19],[-11.5,-25.5],[-27.542,0],[-7.827,23.48],[-4.5,21.5],[-15,-2],[4,-21],[10,1.5],[-1.5,17.5]],"o":[[25,2],[0,-3],[-40.028,0],[0,10],[52.467,0],[0,-12.703],[-52.467,0],[0,14],[12.068,26.76],[27.542,0],[6,-18],[4.5,-21.5],[15,2],[-4,21],[-13.845,-2.077],[0,0]],"v":[[-40.243,-45.75],[43.257,-54.75],[-29.243,-64.75],[-101.243,-47.25],[-24.743,-30.25],[70.257,-53.25],[-24.743,-79.75],[-119.243,-47.25],[-95.743,42.75],[-24.743,79.75],[48.257,45.75],[63.257,-16.75],[98.757,-45.75],[118.257,-9.25],[91.757,26.25],[76.757,-6.75]]},"ix":2}},{"ty":"st","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":2,"ml":1,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"d":[],"c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":0,"nm":"▽ coffee-bean2","mn":"","sr":1,"st":0,"op":125,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[60,70,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[785.5,516.092,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"w":120,"h":140,"refId":"comp_3","tm":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1],"t":90}],"ix":2},"ind":5},{"ty":0,"nm":"▽ coffee-bean","mn":"","sr":1,"st":-45,"op":125,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[60,70,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[241.5,516.092,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"w":120,"h":140,"refId":"comp_3","tm":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":-45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0.5],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[1],"t":45},{"h":1,"s":[1],"t":46},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":75},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[1],"t":165}],"ix":2},"ind":6},{"ty":4,"nm":"circle-01","mn":"","sr":1,"st":0,"op":125,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[512,512,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"circle-01","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-107.303,0],[0,-107.303],[107.303,0],[0,107.303]],"o":[[107.303,0],[0,107.303],[-107.303,0],[0,-107.303]],"v":[[0,-191],[191,0],[0,191],[-191,0]]},"ix":2}},{"ty":"st","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"d":[],"c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7},{"ty":4,"nm":"circle-02","mn":"","sr":1,"st":0,"op":125,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[512,512,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"circle-02","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-152.809,0],[0,-152.809],[152.809,0],[0,152.809]],"o":[[152.809,0],[0,152.809],[-152.809,0],[0,-152.809]],"v":[[0,-272],[272,0],[0,272],[-272,0]]},"ix":2}},{"ty":"st","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":120,"ix":5},"d":[],"c":{"a":0,"k":[0.8039,0.6863,0.549],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8},{"ty":4,"nm":"circle-03","mn":"","sr":1,"st":0,"op":125,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[512,512,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"circle-03","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-205.056,0],[0,-205.056],[205.056,0],[0,205.056]],"o":[[205.056,0],[0,205.056],[-205.056,0],[0,-205.056]],"v":[[0,-365],[365,0],[0,365],[-365,0]]},"ix":2}},{"ty":"st","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"d":[],"c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9},{"ty":4,"nm":"outer-circle","mn":"","sr":1,"st":0,"op":125,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[512,512,0],"ix":2},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12.85],"t":120}],"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"outer-circle","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[3.152,-3.305],[0,0],[3.231,2.139],[0,0],[2.338,-3.923],[0,0],[3.626,1.366],[0,0],[1.406,-4.345],[0,0],[3.839,0.525],[0,0],[0.404,-4.549],[0,0],[3.86,-0.343],[0,0],[-0.619,-4.525],[0,0],[3.687,-1.193],[0,0],[-1.61,-4.274],[0,0],[3.329,-1.983],[0,0],[-2.521,-3.808],[0,0],[2.804,-2.674],[0,0],[-3.305,-3.152],[0,0],[2.139,-3.231],[0,0],[-3.923,-2.338],[0,0],[1.366,-3.626],[0,0],[-4.345,-1.406],[0,0],[0.525,-3.839],[0,0],[-4.549,-0.404],[0,0],[-0.343,-3.86],[0,0],[-4.525,0.619],[0,0],[-1.193,-3.687],[0,0],[-4.274,1.61],[0,0],[-1.983,-3.329],[0,0],[-3.808,2.521],[0,0],[-2.674,-2.804],[0,0],[-3.152,3.305],[0,0],[-3.231,-2.139],[0,0],[-2.338,3.923],[0,0],[-3.626,-1.366],[0,0],[-1.406,4.345],[0,0],[-3.839,-0.525],[0,0],[-0.404,4.549],[0,0],[-3.86,0.343],[0,0],[0.619,4.525],[0,0],[-3.687,1.193],[0,0],[1.61,4.274],[0,0],[-3.329,1.983],[0,0],[2.521,3.808],[0,0],[-2.804,2.674],[0,0],[3.305,3.152],[0,0],[-2.139,3.231],[0,0],[3.923,2.338],[0,0],[-1.366,3.626],[0,0],[4.345,1.406],[0,0],[-0.525,3.839],[0,0],[4.549,0.404],[0,0],[0.343,3.86],[0,0],[4.525,-0.619],[0,0],[1.193,3.687],[0,0],[4.274,-1.61],[0,0],[1.983,3.329],[0,0],[3.808,-2.521],[0,0],[2.674,2.804]],"o":[[-3.152,-3.305],[0,0],[-2.674,2.804],[0,0],[-3.808,-2.521],[0,0],[-1.983,3.329],[0,0],[-4.274,-1.61],[0,0],[-1.193,3.687],[0,0],[-4.525,-0.619],[0,0],[-0.343,3.86],[0,0],[-4.549,0.404],[0,0],[0.525,3.839],[0,0],[-4.345,1.406],[0,0],[1.366,3.626],[0,0],[-3.923,2.338],[0,0],[2.139,3.231],[0,0],[-3.305,3.152],[0,0],[2.804,2.674],[0,0],[-2.521,3.808],[0,0],[3.329,1.983],[0,0],[-1.61,4.274],[0,0],[3.687,1.193],[0,0],[-0.619,4.525],[0,0],[3.86,0.343],[0,0],[0.404,4.549],[0,0],[3.839,-0.525],[0,0],[1.406,4.345],[0,0],[3.626,-1.366],[0,0],[2.338,3.923],[0,0],[3.231,-2.139],[0,0],[3.152,3.305],[0,0],[2.674,-2.804],[0,0],[3.808,2.521],[0,0],[1.983,-3.329],[0,0],[4.274,1.61],[0,0],[1.193,-3.687],[0,0],[4.525,0.619],[0,0],[0.343,-3.86],[0,0],[4.549,-0.404],[0,0],[-0.525,-3.839],[0,0],[4.345,-1.406],[0,0],[-1.366,-3.626],[0,0],[3.923,-2.338],[0,0],[-2.139,-3.231],[0,0],[3.305,-3.152],[0,0],[-2.804,-2.674],[0,0],[2.521,-3.808],[0,0],[-3.329,-1.983],[0,0],[1.61,-4.274],[0,0],[-3.687,-1.193],[0,0],[0.619,-4.525],[0,0],[-3.86,-0.343],[0,0],[-0.404,-4.549],[0,0],[-3.839,0.525],[0,0],[-1.406,-4.345],[0,0],[-3.626,1.366],[0,0],[-2.338,-3.923],[0,0],[-3.231,2.139],[0,0]],"v":[[5.789,-433.93],[-5.789,-433.93],[-39.717,-398.356],[-49.921,-397.206],[-90.914,-424.338],[-102.203,-421.762],[-127.363,-379.53],[-137.056,-376.138],[-183.059,-393.469],[-193.491,-388.445],[-208.624,-341.673],[-217.319,-336.21],[-266.025,-342.87],[-275.077,-335.65],[-279.422,-286.684],[-286.684,-279.422],[-335.65,-275.077],[-342.87,-266.025],[-336.21,-217.319],[-341.673,-208.624],[-388.445,-193.491],[-393.469,-183.059],[-376.138,-137.056],[-379.53,-127.363],[-421.762,-102.203],[-424.338,-90.914],[-397.206,-49.921],[-398.356,-39.717],[-433.93,-5.789],[-433.93,5.789],[-398.356,39.717],[-397.206,49.921],[-424.338,90.914],[-421.762,102.203],[-379.53,127.363],[-376.138,137.056],[-393.469,183.059],[-388.445,193.491],[-341.673,208.624],[-336.21,217.319],[-342.87,266.025],[-335.65,275.077],[-286.684,279.422],[-279.422,286.684],[-275.077,335.65],[-266.025,342.87],[-217.319,336.21],[-208.624,341.673],[-193.491,388.445],[-183.059,393.469],[-137.056,376.138],[-127.363,379.53],[-102.203,421.762],[-90.914,424.338],[-49.921,397.206],[-39.717,398.355],[-5.789,433.93],[5.789,433.93],[39.717,398.355],[49.921,397.206],[90.914,424.338],[102.203,421.762],[127.363,379.53],[137.056,376.138],[183.059,393.469],[193.491,388.445],[208.624,341.673],[217.319,336.21],[266.025,342.87],[275.077,335.65],[279.422,286.684],[286.684,279.422],[335.65,275.077],[342.87,266.025],[336.21,217.319],[341.673,208.624],[388.445,193.491],[393.469,183.059],[376.138,137.056],[379.53,127.363],[421.762,102.203],[424.338,90.914],[397.206,49.921],[398.355,39.717],[433.93,5.789],[433.93,-5.789],[398.355,-39.717],[397.206,-49.921],[424.338,-90.914],[421.762,-102.203],[379.53,-127.363],[376.138,-137.056],[393.469,-183.059],[388.445,-193.491],[341.673,-208.624],[336.21,-217.319],[342.87,-266.025],[335.65,-275.077],[286.684,-279.422],[279.422,-286.684],[275.077,-335.65],[266.025,-342.87],[217.319,-336.21],[208.624,-341.673],[193.491,-388.445],[183.059,-393.469],[137.056,-376.138],[127.363,-379.53],[102.203,-421.762],[90.914,-424.338],[49.921,-397.206],[39.717,-398.356]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-219.101,0],[0,-219.101],[219.101,0],[0,219.101]],"o":[[219.101,0],[0,219.101],[-219.101,0],[0,-219.101]],"v":[[0,-390],[390,0],[0,390],[-390,0]]},"ix":2}},{"ty":"mm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":3},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10}],"ddd":0,"h":1024,"w":1024,"meta":{"a":"","k":"","d":"","g":"LottieFiles AE 0.1.20","tc":"#ffffff"},"v":"5.5.7","fr":60,"op":120,"ip":0,"assets":[{"nm":"","mn":"","layers":[{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":124,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":60},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":85},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":110}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[375.523,67.521,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.92,2.39],[0,0],[0,0],[0,0],[-2.17,-2.12],[-2.43,-2.07],[0,0],[1.6,2.58]],"o":[[0,0],[0,0],[0,0],[1.92,2.39],[2.17,2.13],[0,0],[-1.49,-2.82],[-1.6,-2.58]],"v":[[1.723,-9.711],[-16.177,-32.021],[-27.487,-22.951],[-9.587,-0.641],[-3.447,6.129],[3.453,12.419],[11.643,5.849],[7.003,-2.251]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.29,-1.09],[-0.75,-0.94],[-1,-0.52],[-1.09,-0.11],[-1.11,0.33],[-0.99,0.79],[-0.56,1.01],[-0.14,1.1],[0.31,1.1],[0.75,0.94],[1,0.52],[1.1,0.1],[1.11,-0.32],[0.96,-0.77],[0.55,-1.02],[0.13,-1.09]],"o":[[0.3,1.09],[0.75,0.94],[1.01,0.54],[1.09,0.11],[1.11,-0.33],[0.96,-0.78],[0.56,-1.01],[0.15,-1.1],[-0.31,-1.1],[-0.75,-0.94],[-0.99,-0.52],[-1.11,-0.1],[-1.11,0.31],[-0.99,0.8],[-0.55,1.02],[-0.13,1.09]],"v":[[10.293,25.769],[11.863,28.809],[14.493,31.009],[17.643,31.979],[20.933,31.649],[24.073,29.969],[26.353,27.299],[27.413,24.139],[27.173,20.839],[25.583,17.789],[22.963,15.599],[19.813,14.669],[16.483,14.999],[13.373,16.629],[11.063,19.349],[10.043,22.509]]},"ix":2}},{"ty":"mm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":5},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":124,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":57},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":82},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":107}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[336.11,107.703,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[3.02,-0.34],[3.06,-1.55],[2.2,-2.63],[0.92,-3.08],[-0.35,-3.3],[-1.57,-3.09],[-2.8,-2.47],[-3.18,-1],[-3.37,0.38],[-3.24,1.64],[-1.63,1.1],[-1.44,1.46],[-1.13,1.86],[-0.6,2.36],[0,0],[1.1,-0.56],[0.56,-0.77],[0.67,-0.93],[0.96,-0.97],[1.61,-0.81],[2.78,0.77],[2.41,3.64],[0,0],[-0.32,0.35],[-0.04,0.51],[0.24,0.7],[0.53,1.04],[2.36,2.11],[2.75,0.89]],"o":[[-3.02,0.33],[-3.54,1.79],[-2.19,2.64],[-0.93,3.09],[0.35,3.3],[2.08,4.11],[2.8,2.47],[3.18,1],[3.37,-0.39],[1.57,-0.79],[1.63,-1.11],[1.44,-1.46],[1.13,-1.86],[0,0],[-0.97,-0.52],[-0.83,0.42],[-0.56,0.77],[-0.66,0.93],[-0.96,0.97],[-3,1.52],[-2.78,-0.77],[0,0],[0.63,-0.31],[0.32,-0.35],[0.04,-0.51],[-0.24,-0.7],[-1.69,-3.33],[-2.36,-2.11],[-2.75,-0.89]],"v":[[-4.043,-26.623],[-13.173,-23.793],[-21.773,-17.153],[-26.443,-8.563],[-27.313,1.017],[-24.443,10.607],[-17.123,20.467],[-8.153,25.677],[1.677,26.607],[11.597,23.567],[16.397,20.717],[21.007,16.867],[24.867,11.887],[27.457,5.557],[20.937,2.637],[17.827,2.697],[15.737,4.487],[13.897,7.047],[11.457,9.907],[7.607,12.587],[-1.073,13.707],[-8.853,7.087],[17.817,-6.423],[19.247,-7.423],[19.797,-8.713],[19.497,-10.523],[18.347,-13.133],[12.277,-21.293],[4.617,-25.793]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.73,2.25],[-2.65,1.34],[-1.29,0.04],[-1.05,-0.49],[-0.81,-0.9],[-0.56,-1.1],[0,0]],"o":[[0.73,-2.25],[1.49,-0.76],[1.3,-0.02],[1.05,0.5],[0.81,0.9],[0,0],[-0.95,-3.06]],"v":[[-13.133,-8.993],[-8.073,-14.383],[-3.903,-15.563],[-0.373,-14.853],[2.417,-12.763],[4.467,-9.763],[-12.793,-1.013]]},"ix":2}},{"ty":"mm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":5},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":124,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":54},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":79},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":104}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[272.6,130.722,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[3.02,0.39],[3.34,-0.78],[2.75,-2.02],[1.63,-2.77],[0.45,-3.29],[-0.79,-3.38],[-2.13,-3.06],[-2.85,-1.73],[-3.37,-0.43],[-3.54,0.82],[-1.84,0.69],[-1.75,1.07],[-1.54,1.54],[-1.14,2.15],[0,0],[1.2,-0.28],[0.73,-0.61],[0.87,-0.75],[1.17,-0.72],[1.75,-0.41],[2.52,1.42],[1.47,4.11],[0,0],[-0.4,0.26],[-0.16,0.48],[0.07,0.74],[0.26,1.14],[1.79,2.61],[2.46,1.52]],"o":[[-3.02,-0.39],[-3.86,0.9],[-2.76,2.05],[-1.63,2.77],[-0.46,3.29],[1.04,4.48],[2.13,3.06],[2.85,1.74],[3.37,0.43],[1.72,-0.4],[1.84,-0.68],[1.75,-1.07],[1.55,-1.54],[0,0],[-0.82,-0.73],[-0.91,0.21],[-0.73,0.62],[-0.87,0.75],[-1.17,0.72],[-3.28,0.76],[-2.52,-1.41],[0,0],[0.68,-0.15],[0.4,-0.26],[0.16,-0.48],[-0.07,-0.74],[-0.84,-3.63],[-1.79,-2.61],[-2.45,-1.51]],"v":[[3.226,-26.532],[-6.314,-25.952],[-16.234,-21.562],[-22.814,-14.332],[-25.934,-5.242],[-25.434,4.758],[-20.674,16.068],[-13.204,23.258],[-3.874,26.508],[6.486,25.918],[11.826,24.288],[17.216,21.648],[22.156,17.728],[26.186,12.198],[20.546,7.818],[17.516,7.138],[15.056,8.378],[12.656,10.428],[9.596,12.628],[5.216,14.318],[-3.484,13.338],[-9.464,5.058],[19.656,-1.722],[21.276,-2.352],[22.116,-3.472],[22.256,-5.302],[21.756,-8.112],[17.806,-17.482],[11.436,-23.672]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-1.24,2.02],[-2.89,0.67],[-1.27,-0.28],[-0.91,-0.73],[-0.57,-1.06],[-0.28,-1.2],[0,0]],"o":[[1.24,-2.02],[1.62,-0.37],[1.27,0.29],[0.91,0.73],[0.57,1.07],[0,0],[-0.2,-3.2]],"v":[[-9.794,-11.562],[-3.594,-15.602],[0.736,-15.742],[3.996,-14.212],[6.216,-11.522],[7.496,-8.122],[-11.354,-3.732]]},"ix":2}},{"ty":"mm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":5},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":124,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":51},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":76},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":101}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[214.137,127.026,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.34,1.13],[-0.7,0.7],[-1.06,0.29],[-1.37,0.03],[-0.45,0.11],[-0.36,0.23],[-0.24,0.36],[-0.02,0.53],[0,0],[1.09,0.12],[1.27,-0.03],[2.54,-1],[1.74,-1.74],[0.89,-2.42],[-0.07,-2.97],[0,0],[0,0],[0,0],[-0.73,-0.55],[-1.17,-0.24]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.04,-1.7],[0.34,-1.13],[0.7,-0.7],[1.06,-0.29],[0.43,-0.01],[0.44,-0.11],[0.36,-0.22],[0.24,-0.35],[0,0],[-1.17,-0.3],[-1.09,-0.12],[-3.26,0.08],[-2.55,1],[-1.74,1.75],[-0.89,2.42],[0,0],[0,0],[0,0],[0.03,1.1],[0.73,0.55],[0,0]],"v":[[-9.82,-3.816],[-8.82,37.374],[6.68,36.984],[5.68,-4.156],[17.38,-4.446],[17.12,-15.046],[4.92,-14.746],[4.86,-17.196],[5.31,-21.436],[6.87,-24.176],[9.51,-25.666],[13.15,-26.156],[14.47,-26.336],[15.68,-26.836],[16.58,-27.706],[16.97,-29.036],[17.09,-36.586],[13.7,-37.226],[10.17,-37.366],[1.46,-35.756],[-4.97,-31.646],[-8.92,-25.396],[-10.15,-17.316],[-10.08,-14.366],[-17.38,-14.186],[-17.23,-8.086],[-16.09,-5.616],[-13.24,-4.436]]},"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":124,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":48},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":73},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":98}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[171.887,125.333,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.52,1.05],[-0.81,0.57],[-1.09,0.11],[-1.35,-0.2],[-0.46,0.03],[-0.39,0.16],[-0.3,0.31],[-0.11,0.52],[0,0],[1.05,0.3],[1.25,0.18],[2.68,-0.55],[2.01,-1.42],[1.28,-2.24],[0.43,-2.94],[0,0],[0,0],[0,0],[-0.63,-0.66],[-1.12,-0.43]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.25,-1.68],[0.53,-1.05],[0.81,-0.57],[1.09,-0.11],[0.43,0.06],[0.46,-0.03],[0.4,-0.16],[0.3,-0.31],[0,0],[-1.1,-0.5],[-1.06,-0.3],[-3.23,-0.47],[-2.68,0.55],[-2.01,1.42],[-1.28,2.24],[0,0],[0,0],[0,0],[-0.16,1.09],[0.62,0.67],[0,0]],"v":[[-12.72,-6.503],[-18.68,34.267],[-3.33,36.517],[2.62,-4.203],[14.2,-2.513],[15.73,-13.003],[3.66,-14.763],[4.01,-17.183],[5.17,-21.283],[7.17,-23.723],[10.02,-24.743],[13.69,-24.613],[15.02,-24.573],[16.3,-24.863],[17.34,-25.573],[17.95,-26.823],[19.34,-34.253],[16.11,-35.463],[12.65,-36.193],[3.79,-36.073],[-3.24,-33.113],[-8.19,-27.623],[-10.76,-19.863],[-11.19,-16.943],[-18.41,-18.003],[-19.29,-11.963],[-18.59,-9.333],[-15.98,-7.683]]},"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":124,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":45},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":70},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":95}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[109.302,120.646,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.6,2.29],[3.68,1.38],[3.49,-0.02],[3.01,-1.34],[2.35,-2.63],[1.44,-3.84],[-0.04,-3.56],[-1.39,-2.99],[-2.6,-2.31],[-3.72,-1.39],[-3.47,0.04],[-2.98,1.36],[-2.36,2.66],[-1.45,3.87],[0.05,3.53],[1.36,2.96]],"o":[[-2.6,-2.29],[-3.72,-1.39],[-3.47,0.02],[-3.01,1.34],[-2.35,2.63],[-1.45,3.87],[0.03,3.55],[1.39,2.99],[2.6,2.31],[3.69,1.38],[3.46,-0.03],[2.98,-1.36],[2.37,-2.65],[1.44,-3.84],[-0.05,-3.53],[-1.36,-2.96]],"v":[[18.855,-19.506],[9.435,-25.006],[-1.365,-27.066],[-11.085,-25.046],[-19.125,-19.106],[-24.805,-9.406],[-26.915,1.734],[-24.775,11.554],[-18.785,19.504],[-9.305,25.054],[1.425,27.064],[11.095,24.974],[19.115,18.954],[24.835,9.164],[26.915,-1.886],[24.795,-11.626]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.46,-1.77],[3.34,1.25],[0.69,2.95],[-1.8,4.81],[-2.47,1.75],[-3.44,-1.29],[-0.7,-2.93],[1.8,-4.81]],"o":[[-2.46,1.77],[-3.43,-1.29],[-0.71,-2.95],[1.8,-4.81],[2.46,-1.74],[3.34,1.25],[0.7,2.93],[-1.8,4.81]],"v":[[3.435,13.504],[-5.265,14.284],[-11.465,7.924],[-9.835,-3.716],[-3.435,-13.546],[5.415,-14.236],[11.475,-7.966],[9.825,3.644]]},"ix":2}},{"ty":"mm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":5},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":124,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":42},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":67},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":92}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[54.188,80.062,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0.24,0.36],[0.32,0.23],[0.51,0.09],[0.52,-0.04],[1.14,0.1],[1.09,0.34],[1.12,0.61],[1.24,0.9],[1.29,2.2],[0.26,2.63],[-0.87,2.95],[-2.18,3.03],[-2.5,1.73],[-2.65,0.57],[-2.69,-0.6],[-2.49,-1.79],[-0.91,-0.99],[-0.57,-0.89],[-0.32,-0.78],[-0.26,-0.66],[-0.28,-0.53],[-0.49,-0.35],[-0.63,0.02],[-0.57,0.16],[0,0],[0.74,1.99],[1.21,1.91],[1.68,1.81],[2.22,1.6],[4.86,1.24],[4.64,-0.71],[4.17,-2.6],[3.18,-4.41],[1.34,-4.65],[-0.53,-4.47],[-2.45,-4.09],[-4.49,-3.24],[-4.72,-1],[-4.62,1.39],[0,0]],"o":[[-0.24,-0.35],[-0.41,-0.29],[-0.51,-0.1],[-1.32,0.11],[-1.14,-0.1],[-1.09,-0.33],[-1.12,-0.61],[-2.17,-1.56],[-1.29,-2.2],[-0.26,-2.63],[0.87,-2.94],[2.09,-2.9],[2.5,-1.73],[2.65,-0.58],[2.68,0.6],[1.44,1.03],[0.91,0.99],[0.58,0.89],[0.32,0.79],[0.26,0.67],[0.28,0.53],[0.73,0.52],[0.63,-0.01],[0,0],[-0.27,-1.96],[-0.74,-2],[-1.21,-1.91],[-1.68,-1.81],[-4.57,-3.3],[-4.86,-1.25],[-4.64,0.71],[-4.18,2.6],[-3.12,4.33],[-1.33,4.65],[0.53,4.48],[2.45,4.09],[4.9,3.52],[4.73,1],[0,0],[-0.08,-0.51]],"v":[[4.088,24.978],[3.248,24.098],[1.878,23.518],[0.338,23.428],[-3.352,23.448],[-6.702,22.788],[-10.012,21.358],[-13.552,19.088],[-18.732,13.448],[-21.052,6.198],[-20.132,-2.172],[-15.552,-11.132],[-8.672,-18.072],[-0.942,-21.532],[7.068,-21.492],[14.828,-17.902],[18.348,-14.872],[20.578,-12.062],[21.918,-9.552],[22.788,-7.382],[23.598,-5.592],[24.748,-4.272],[26.788,-3.512],[28.588,-3.782],[37.688,-6.652],[36.168,-12.582],[33.248,-18.452],[28.918,-24.032],[23.078,-29.142],[8.938,-35.952],[-5.322,-36.742],[-18.552,-31.772],[-29.582,-21.262],[-36.262,-7.802],[-37.462,5.878],[-32.982,18.728],[-22.572,29.718],[-8.142,36.508],[5.878,35.918],[4.568,26.278]]},"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7}],"id":"comp_0"},{"nm":"","mn":"","layers":[{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":128,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":25},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":50},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":75}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[438.718,146.26,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.26,-0.81],[-1.06,-1.02],[0,0],[0,0],[-1.06,2.45],[0,2.52],[1.11,2.48],[2.26,2.17],[3.69,1.68],[4.18,0.18],[0,0],[-0.18,-0.89],[-0.77,-0.74],[-0.9,-0.31],[-1.01,-0.28],[-1.12,-0.52],[-1.32,-1.27],[0.04,-1.85],[2.12,-2.2],[0,0],[3.55,1.94],[2.76,0.45],[2.02,-0.75],[1.28,-1.32],[0.71,-1.8],[-0.14,-1.81],[-0.96,-1.79],[-1.71,-1.64],[-1.24,-0.8],[-1.33,-0.47],[-1.44,-0.23],[-1.7,-0.11],[0,0]],"o":[[0.26,0.81],[0,0],[0,0],[2.06,-2.14],[1.06,-2.45],[0,-2.52],[-1.1,-2.48],[-3.15,-3.03],[-3.68,-1.68],[0,0],[-0.22,0.85],[0.18,0.89],[0.86,0.83],[0.9,0.31],[1.01,0.28],[1.12,0.52],[1.66,1.6],[-0.04,1.85],[0,0],[-4.28,-4.12],[-3.55,-1.93],[-2.75,-0.45],[-2.02,0.75],[-1.63,1.68],[-0.71,1.8],[0.14,1.81],[0.96,1.78],[1.27,1.22],[1.24,0.8],[1.33,0.47],[1.44,0.23],[0,0],[-0.51,1.26]],"v":[[-7.608,23.33],[-5.628,26.07],[-0.528,31],[21.952,7.67],[26.632,0.79],[28.222,-6.67],[26.562,-14.17],[21.522,-21.15],[11.272,-28.21],[-0.518,-31],[-1.868,-25.56],[-1.928,-22.94],[-0.508,-20.49],[2.142,-18.77],[5.002,-17.89],[8.192,-16.69],[11.852,-14],[14.272,-8.83],[11.022,-2.75],[9.482,-1.15],[-2.258,-10.23],[-11.718,-13.81],[-18.878,-13.36],[-23.818,-10.25],[-27.328,-5.03],[-28.188,0.37],[-26.538,5.76],[-22.538,10.9],[-18.768,13.94],[-14.918,15.85],[-10.758,16.9],[-6.048,17.41],[-7.228,20.23]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.57,0.54],[1.44,1.39],[0.19,1.18],[-1.24,1.28],[-0.86,0.24],[-1.26,-0.37],[-1.72,-1.1],[-2.23,-2.15],[0,0]],"o":[[-1.57,-0.54],[-1.34,-1.3],[-0.2,-1.19],[0.63,-0.66],[0.86,-0.25],[1.26,0.38],[1.72,1.1],[0,0],[-2.2,0.06]],"v":[[-7.388,9.81],[-11.898,6.92],[-14.198,3.2],[-12.638,-0.51],[-10.398,-1.86],[-7.218,-1.67],[-2.748,0.54],[3.182,5.41],[-1.748,10.52]]},"ix":2}},{"ty":"mm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":5},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":128,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":22},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":47},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":72}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[370.273,95.862,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":4,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[2.13,2.17],[3.11,1.45],[3.43,0.09],[2.99,-1.18],[2.38,-2.31],[1.46,-3.14],[0.21,-3.73],[-1.17,-3.12],[-2.39,-2.42],[-3.29,-1.53],[-1.87,-0.6],[-2.04,-0.23],[-2.16,0.26],[-2.22,0.99],[0,0],[1.12,0.52],[0.95,-0.03],[1.15,-0.05],[1.36,0.16],[1.63,0.76],[1.11,2.67],[-1.38,4.14],[0,0],[-0.48,-0.04],[-0.42,0.28],[-0.4,0.62],[-0.49,1.06],[-0.21,3.16],[1,2.71]],"o":[[-2.14,-2.17],[-3.59,-1.68],[-3.43,-0.09],[-2.99,1.18],[-2.38,2.31],[-1.94,4.17],[-0.21,3.72],[1.17,3.12],[2.39,2.42],[1.6,0.74],[1.87,0.6],[2.04,0.23],[2.16,-0.26],[0,0],[-0.2,-1.09],[-0.85,-0.39],[-0.95,0.03],[-1.14,0.06],[-1.36,-0.15],[-3.05,-1.43],[-1.11,-2.67],[0,0],[0.64,0.29],[0.47,0.04],[0.43,-0.28],[0.4,-0.62],[1.58,-3.39],[0.21,-3.16],[-1,-2.71]],"v":[[19.607,-19.322],[11.737,-24.752],[1.196,-27.402],[-8.443,-25.772],[-16.503,-20.542],[-22.273,-12.362],[-25.503,-0.522],[-24.054,9.748],[-18.714,18.058],[-10.193,23.988],[-4.984,25.998],[0.886,27.248],[7.196,27.208],[13.776,25.338],[12.036,18.408],[10.066,15.998],[7.367,15.458],[4.216,15.588],[0.456,15.438],[-4.034,14.068],[-10.273,7.928],[-9.874,-2.282],[17.227,10.348],[18.896,10.848],[20.247,10.488],[21.487,9.138],[22.826,6.618],[25.497,-3.202],[24.307,-12.002]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-2.22,0.82],[-2.69,-1.25],[-0.83,-1.01],[-0.26,-1.13],[0.21,-1.19],[0.52,-1.12],[0,0]],"o":[[2.23,-0.82],[1.51,0.7],[0.82,1.01],[0.26,1.14],[-0.21,1.19],[0,0],[1.82,-2.64]],"v":[[0.126,-15.572],[7.497,-14.922],[10.997,-12.362],[12.617,-9.152],[12.696,-5.662],[11.607,-2.202],[-5.934,-10.372]]},"ix":2}},{"ty":"mm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":5},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":128,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":19},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":44},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":69}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[297.359,73.56,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[-1.33,0.45],[-1.38,-0.2],[-0.98,-1.36],[0.43,-2.94],[0,0],[0,0],[0,0],[-1.57,1.17],[-2.08,-0.3],[0.77,-5.31],[0,0],[0,0],[0,0],[0.44,2.54],[1.29,1.89],[2.15,1.21],[2.94,0.43],[1.65,-0.1],[1.54,-0.48],[1.4,-0.94],[1.09,-1.46],[1.79,1.9],[3.1,0.45],[1.28,-0.13],[1.15,-0.39],[1.03,-0.61],[0.99,-0.77],[0,0],[0.58,0.52],[0.96,0.14]],"o":[[0,0],[0,0],[0,0],[1.25,-0.9],[1.33,-0.45],[2.24,0.32],[0.98,1.36],[0,0],[0,0],[0,0],[0.37,-2.57],[1.57,-1.17],[4.55,0.66],[0,0],[0,0],[0,0],[0.45,-3.07],[-0.44,-2.54],[-1.29,-1.89],[-2.15,-1.21],[-1.59,-0.23],[-1.65,0.1],[-1.53,0.49],[-1.4,0.94],[-0.66,-2.83],[-1.8,-1.9],[-1.48,-0.21],[-1.28,0.13],[-1.16,0.38],[-1.03,0.61],[0,0],[-0.14,-0.9],[-0.58,-0.52],[0,0]],"v":[[-32.239,-31.06],[-39.699,20.25],[-24.359,22.48],[-18.969,-14.63],[-15.109,-16.65],[-11.039,-17.02],[-6.199,-14.5],[-5.369,-8.06],[-10.109,24.55],[5.231,26.78],[9.971,-5.83],[12.881,-11.44],[18.351,-12.74],[24.021,-3.78],[19.281,28.83],[34.621,31.06],[39.361,-1.55],[39.371,-9.96],[36.771,-16.6],[31.611,-21.24],[23.981,-23.69],[19.131,-23.89],[14.361,-23.02],[9.961,-20.88],[6.231,-17.28],[2.541,-24.36],[-4.809,-27.88],[-8.959,-28],[-12.609,-27.22],[-15.889,-25.73],[-18.919,-23.67],[-19.359,-26.56],[-20.439,-28.69],[-22.739,-29.68]]},"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":128,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":16},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":41},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":66}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[190.41,85.31,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.53,0.63],[-0.2,1.12],[0,0],[0,0],[0.63,-0.69],[0.07,-0.81],[0,0],[0.14,-1.1],[0.06,-1.12],[1.28,1.81],[0,0],[0.78,0.35],[1.16,-0.29],[0,0],[0,0],[0,0],[0,0]],"o":[[0.52,-0.63],[0,0],[0,0],[-0.87,0.22],[-0.64,0.69],[0,0],[-0.1,1.12],[-0.14,1.1],[-0.99,-1.88],[0,0],[-0.44,-0.64],[-0.78,-0.35],[0,0],[0,0],[0,0],[0,0],[1.43,-0.35]],"v":[[14.59,34.2],[15.68,31.58],[26.62,-38.51],[14.5,-35.46],[12.24,-34.09],[11.18,-31.84],[9.14,-8.38],[8.79,-5.05],[8.49,-1.73],[5.09,-7.27],[-8.6,-26.87],[-10.42,-28.37],[-13.33,-28.46],[-26.62,-25.12],[4.99,15.71],[0.41,38.51],[11.66,35.68]]},"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":128,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":13},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":38},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":63}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[138.66,98.407,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.2,2.27],[0,0],[0,0],[0,0],[-1.8,-1.76],[-2.15,-0.86],[-2.39,0.15],[-2.5,1.33],[-1.09,0.94],[-0.82,1.05],[-0.58,1.19],[-0.43,1.32],[0,0],[-1.71,0.91],[0,0],[0,0],[0,0],[0,0],[0.98,-1.31],[1.5,-0.8],[1.69,0.69]],"o":[[0,0],[0,0],[0,0],[1.34,2.53],[1.8,1.76],[2.15,0.86],[2.39,-0.15],[1.47,-0.78],[1.09,-0.94],[0.82,-1.05],[0.58,-1.19],[0,0],[1.34,1.25],[0,0],[0,0],[0,0],[0,0],[-0.64,1.77],[-0.99,1.31],[-2,1.07],[-1.68,-0.69]],"v":[[-3.81,12.553],[-19.22,-16.517],[-32.9,-9.267],[-17.49,19.803],[-12.78,26.243],[-6.85,30.173],[-0.04,31.233],[7.3,29.013],[11.14,26.443],[14,23.453],[16.09,20.083],[17.6,16.313],[19.85,18.523],[24.42,19.043],[32.9,14.543],[8.62,-31.267],[-5.08,-24.007],[12.22,8.643],[9.78,13.273],[6.05,16.433],[0.52,16.993]]},"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5},{"ty":4,"nm":"Vector","mn":"","sr":1,"st":0,"op":128,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.6,"y":0},"i":{"x":0.56,"y":1},"s":[100,100,100],"t":10},{"o":{"x":0.44,"y":0},"i":{"x":0.4,"y":1},"s":[140,140,100],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":60}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[73.761,135.497,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Vector","ix":1,"cix":2,"np":5,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-1.74,3.13],[-0.36,3.03],[0.93,2.77],[2.1,2.28],[3.47,0.36],[4.32,-2.4],[-0.42,1.86],[0.17,1.66],[0.69,1.43],[1.11,1.2],[2.4,1.1],[2.8,-0.26],[3.23,-1.71],[3.7,-3.41]],"o":[[0,0],[0,0],[3.21,-2.96],[1.74,-3.12],[0.36,-3.02],[-0.92,-2.78],[-2.78,-3.02],[-3.47,-0.36],[1.08,-2.08],[0.41,-1.85],[-0.17,-1.65],[-0.69,-1.43],[-2.04,-2.21],[-2.4,-1.1],[-2.8,0.26],[-3.23,1.71],[0,0]],"v":[[-40.761,-12.327],[8.639,41.213],[30.029,21.493],[37.459,12.363],[40.609,3.133],[39.759,-5.567],[35.219,-13.147],[25.849,-18.217],[14.169,-15.167],[16.409,-21.077],[16.779,-26.347],[15.499,-30.977],[12.809,-34.927],[6.159,-39.887],[-1.631,-41.137],[-10.671,-38.177],[-21.061,-30.497]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 2","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[1.37,-1.27],[0,0],[0,0],[0,0],[-1.22,0.72],[-1.13,0.1],[-1.1,-0.55],[-1.17,-1.27],[-0.39,-1.23],[0.32,-1.2],[0.92,-1.21]],"o":[[0,0],[0,0],[0,0],[1.39,-1.29],[1.22,-0.72],[1.13,-0.1],[1.1,0.55],[1.2,1.3],[0.39,1.23],[-0.32,1.2],[-0.92,1.22]],"v":[[-1.091,-7.227],[-7.561,-1.257],[-19.761,-14.487],[-12.481,-21.197],[-8.561,-24.207],[-5.031,-25.427],[-1.681,-24.747],[1.729,-22.007],[4.109,-18.217],[4.209,-14.567],[2.349,-10.947]]},"ix":2}},{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 3","ix":3,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[-1.3,0.66],[-1.12,0.04],[-0.98,-0.55],[-0.9,-0.98],[-0.55,-1.04],[-0.02,-1.2],[0.66,-1.38],[1.64,-1.51]],"o":[[0,0],[0,0],[1.57,-1.44],[1.3,-0.66],[1.12,-0.04],[0.98,0.55],[0.79,0.86],[0.55,1.04],[0.02,1.2],[-0.66,1.38],[0,0]],"v":[[12.419,20.383],[0.109,7.043],[8.789,-0.957],[13.089,-4.107],[16.719,-5.147],[19.869,-4.387],[22.699,-2.097],[24.709,0.743],[25.569,4.103],[24.619,7.973],[21.169,12.313]]},"ix":2}},{"ty":"mm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Merge Paths 1","mm":5},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.5725,0.8902,0.6627],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6}],"id":"comp_1"},{"nm":"","mn":"","layers":[{"ty":4,"nm":"smoke-03","mn":"","sr":1,"st":26,"op":94,"ip":17,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[90.731,73.25,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.49,"y":0},"i":{"x":0.51,"y":1},"s":[0],"t":17},{"o":{"x":0.167,"y":0},"i":{"x":0.51,"y":1},"s":[100],"t":38.592},{"o":{"x":0.167,"y":0},"i":{"x":0.51,"y":1},"s":[100],"t":55.637},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":92}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"smoke-03","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[11.5,46]],"o":[[-6.379,-36],[0,0]],"v":[[-14.868,47.25],[14.132,-43.25]]},"ix":2}},{"ty":"st","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"d":[],"c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.51,"y":0},"i":{"x":0.49,"y":1},"s":[0],"t":17},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":70.408203125}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.51,"y":0},"i":{"x":0.49,"y":1},"s":[0],"t":55.637},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":92}],"ix":1},"m":1}],"ind":1},{"ty":4,"nm":"smoke-02","mn":"","sr":1,"st":0,"op":114,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[67.166,70,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.49,"y":0},"i":{"x":0.51,"y":1},"s":[0],"t":7},{"o":{"x":0.49,"y":0},"i":{"x":0.51,"y":1},"s":[100],"t":27.609},{"o":{"x":0.49,"y":0},"i":{"x":0.51,"y":1},"s":[100],"t":45.641},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":86}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"smoke-02","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[23.637,53]],"o":[[-18.123,-50],[0,0]],"v":[[-8.68,60],[3.697,-65]]},"ix":2}},{"ty":"st","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"d":[],"c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.51,"y":0},"i":{"x":0.49,"y":1},"s":[0],"t":7},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":66.25}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.51,"y":0},"i":{"x":0.49,"y":1},"s":[0],"t":44.783},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":86}],"ix":1},"m":1}],"ind":2},{"ty":4,"nm":"smoke-01","mn":"","sr":1,"st":-1,"op":70,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[41.159,73.5,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.49,"y":0},"i":{"x":0.51,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.51,"y":1},"s":[100],"t":19},{"o":{"x":0.167,"y":0},"i":{"x":0.51,"y":1},"s":[100],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":68}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"smoke-01","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[27.5,36.5]],"o":[[-12.5,-38.5],[0,0]],"v":[[-4.796,47],[-3.296,-42.5]]},"ix":2}},{"ty":"st","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"d":[],"c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.51,"y":0},"i":{"x":0.49,"y":1},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":49}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.51,"y":0},"i":{"x":0.49,"y":1},"s":[0],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100],"t":68}],"ix":1},"m":1}],"ind":3}],"id":"comp_2"},{"nm":"","mn":"","layers":[{"ty":4,"nm":"mask","mn":"","sr":1,"st":0,"op":65,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"td":1,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[60,69.5,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"bean","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-22.191,0],[0,-31.18],[22.191,0],[0,31.18]],"o":[[22.191,0],[0,31.18],[-22.191,0],[0,-31.18]],"v":[[0,-55.5],[39.5,0],[0,55.5],[-39.5,0]]},"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"mark","mn":"","sr":1,"st":0,"op":61,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":1,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[49.397,-0.217,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.49,"y":0},"i":{"x":0.51,"y":1},"s":[100.075,69.875,0],"t":0,"ti":[11.917,0,0],"to":[-11.917,0,0]},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[28.575,69.875,0],"t":60}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"mark","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":1,"k":[{"o":{"x":0.49,"y":0},"i":{"x":0.833,"y":0.723},"s":[{"c":true,"i":[[0,0],[1.446,-20.5],[11.446,-13.684],[0,0],[-1.322,22.5],[13.608,3.5]],"o":[[15.358,8.75],[-1.909,27.056],[0,0],[16.358,-16.5],[1.468,-24.979],[0,0]],"v":[[-22.108,-55.342],[4.554,2.408],[-16.446,55.842],[-14.358,56.908],[12.392,2.658],[-18.608,-55.342]]}],"t":0},{"o":{"x":0.167,"y":0.277},"i":{"x":0.51,"y":1},"s":[{"c":true,"i":[[0,0],[6,-16.606],[-9.912,-14.684],[0,0],[-5.751,19.308],[8.909,17.57]],"o":[[7.845,15.473],[-7.909,21.89],[0,0],[-7.736,-19.794],[7,-23.5],[0,0]],"v":[[-1.858,-56.842],[-4.696,-1.592],[-4.696,57.092],[1.392,56.408],[7.392,2.408],[1.642,-56.842]]}],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[{"c":true,"i":[[0,0],[0.446,-19],[-11.054,-6.434],[0,0],[0.106,20.146],[-8.142,15.5]],"o":[[-8.142,11.25],[-0.547,23.268],[0,0],[-11.892,-12.75],[-0.142,-27],[0,0]],"v":[[8.642,-53.092],[-13.321,-0.092],[12.304,55.842],[15.142,55.158],[-5.983,2.158],[12.142,-53.092]]}],"t":60}],"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8039,0.6863,0.549],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[45.572,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"bean","mn":"","sr":1,"st":0,"op":73,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[60,69.5,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"bean","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-22.191,0],[0,-31.18],[22.191,0],[0,31.18]],"o":[[22.191,0],[0,31.18],[-22.191,0],[0,-31.18]],"v":[[0,-55.5],[39.5,0],[0,55.5],[-39.5,0]]},"ix":2}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.4039,0.2667,0.2078],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3}],"id":"comp_3"}]} -------------------------------------------------------------------------------- /OpenAISwiftUI/Model/Message.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Message.swift 3 | // OpenAISwiftUI 4 | // 5 | // Created by will on 05/03/2023. 6 | // 7 | 8 | import Foundation 9 | import SwiftUI 10 | 11 | struct Message: Identifiable { 12 | enum Role: String { 13 | case user, system 14 | } 15 | 16 | let id: UUID = .init() 17 | let role: Role 18 | var text: String 19 | 20 | var isInteracting: Bool 21 | var errorText: String 22 | } 23 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Model/SpeechRecognizer.swift: -------------------------------------------------------------------------------- 1 | import AVFoundation 2 | import Foundation 3 | import Speech 4 | import SwiftUI 5 | 6 | /// A helper for transcribing speech to text using SFSpeechRecognizer and AVAudioEngine. 7 | class SpeechRecognizer: ObservableObject { 8 | enum RecognizerError: Error { 9 | case nilRecognizer 10 | case notAuthorizedToRecognize 11 | case notPermittedToRecord 12 | case recognizerIsUnavailable 13 | 14 | var message: String { 15 | switch self { 16 | case .nilRecognizer: return "Can't initialize speech recognizer" 17 | case .notAuthorizedToRecognize: return "Not authorized to recognize speech" 18 | case .notPermittedToRecord: return "Not permitted to record audio" 19 | case .recognizerIsUnavailable: return "Recognizer is unavailable" 20 | } 21 | } 22 | } 23 | 24 | @Published var transcript: String = "" 25 | 26 | private var audioEngine: AVAudioEngine? 27 | private var request: SFSpeechAudioBufferRecognitionRequest? 28 | private var task: SFSpeechRecognitionTask? 29 | private var recognizer: SFSpeechRecognizer? 30 | 31 | /** 32 | Initializes a new speech recognizer. If this is the first time you've used the class, it 33 | requests access to the speech recognizer and the microphone. 34 | */ 35 | init() { 36 | recognizer = SFSpeechRecognizer() 37 | 38 | Task(priority: .background) { 39 | do { 40 | guard recognizer != nil else { 41 | throw RecognizerError.nilRecognizer 42 | } 43 | guard await SFSpeechRecognizer.hasAuthorizationToRecognize() else { 44 | throw RecognizerError.notAuthorizedToRecognize 45 | } 46 | #if os(iOS) 47 | guard await AVAudioSession.sharedInstance().hasPermissionToRecord() else { 48 | throw RecognizerError.notPermittedToRecord 49 | } 50 | #endif 51 | } catch { 52 | speakError(error) 53 | } 54 | } 55 | } 56 | 57 | deinit { 58 | reset() 59 | } 60 | 61 | func updateLocale(_ locale: Locale) { 62 | recognizer = SFSpeechRecognizer(locale: locale) 63 | } 64 | 65 | /** 66 | Begin transcribing audio. 67 | 68 | Creates a `SFSpeechRecognitionTask` that transcribes speech to text until you call `stopTranscribing()`. 69 | The resulting transcription is continuously written to the published `transcript` property. 70 | */ 71 | func transcribe() { 72 | DispatchQueue(label: "org.gewill.OpenAISwiftUI.SpeechRecognizerQueue", qos: .background).async { [weak self] in 73 | guard let self = self, let recognizer = self.recognizer, recognizer.isAvailable else { 74 | self?.speakError(RecognizerError.recognizerIsUnavailable) 75 | return 76 | } 77 | 78 | do { 79 | let (audioEngine, request) = try Self.prepareEngine() 80 | self.audioEngine = audioEngine 81 | self.request = request 82 | self.task = recognizer.recognitionTask(with: request, resultHandler: self.recognitionHandler(result:error:)) 83 | } catch { 84 | self.reset() 85 | self.speakError(error) 86 | } 87 | } 88 | } 89 | 90 | /// Stop transcribing audio. 91 | func stopTranscribing() { 92 | reset() 93 | } 94 | 95 | /// Reset the speech recognizer. 96 | func reset() { 97 | task?.cancel() 98 | audioEngine?.stop() 99 | audioEngine = nil 100 | request = nil 101 | task = nil 102 | } 103 | 104 | private static func prepareEngine() throws -> (AVAudioEngine, SFSpeechAudioBufferRecognitionRequest) { 105 | let audioEngine = AVAudioEngine() 106 | 107 | let request = SFSpeechAudioBufferRecognitionRequest() 108 | request.shouldReportPartialResults = true 109 | 110 | #if os(iOS) 111 | let audioSession = AVAudioSession.sharedInstance() 112 | try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers) 113 | try audioSession.setActive(true, options: .notifyOthersOnDeactivation) 114 | #endif 115 | 116 | let inputNode = audioEngine.inputNode 117 | 118 | let recordingFormat = inputNode.outputFormat(forBus: 0) 119 | inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, _: AVAudioTime) in 120 | request.append(buffer) 121 | } 122 | audioEngine.prepare() 123 | try audioEngine.start() 124 | 125 | return (audioEngine, request) 126 | } 127 | 128 | private func recognitionHandler(result: SFSpeechRecognitionResult?, error: Error?) { 129 | let receivedFinalResult = result?.isFinal ?? false 130 | let receivedError = error != nil 131 | 132 | if receivedFinalResult || receivedError { 133 | audioEngine?.stop() 134 | audioEngine?.inputNode.removeTap(onBus: 0) 135 | } 136 | 137 | if let result = result { 138 | speak(result.bestTranscription.formattedString) 139 | } 140 | } 141 | 142 | private func speak(_ message: String) { 143 | transcript = message 144 | } 145 | 146 | private func speakError(_ error: Error) { 147 | var errorMessage = "" 148 | if let error = error as? RecognizerError { 149 | errorMessage += error.message 150 | } else { 151 | errorMessage += error.localizedDescription 152 | } 153 | transcript = "<< \(errorMessage) >>" 154 | } 155 | } 156 | 157 | extension SFSpeechRecognizer { 158 | static func hasAuthorizationToRecognize() async -> Bool { 159 | await withCheckedContinuation { continuation in 160 | requestAuthorization { status in 161 | continuation.resume(returning: status == .authorized) 162 | } 163 | } 164 | } 165 | } 166 | 167 | #if os(iOS) 168 | extension AVAudioSession { 169 | func hasPermissionToRecord() async -> Bool { 170 | await withCheckedContinuation { continuation in 171 | requestRecordPermission { authorized in 172 | continuation.resume(returning: authorized) 173 | } 174 | } 175 | } 176 | } 177 | #endif 178 | -------------------------------------------------------------------------------- /OpenAISwiftUI/OpenAISwiftUI.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.device.audio-input 8 | 9 | com.apple.security.files.user-selected.read-only 10 | 11 | com.apple.security.network.client 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /OpenAISwiftUI/OpenAISwiftUIApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OpenAISwiftUIApp.swift 3 | // OpenAISwiftUI 4 | // 5 | // Created by will on 02/03/2023. 6 | // 7 | 8 | import Glassfy 9 | import SwiftUI 10 | 11 | @main 12 | struct OpenAISwiftUIApp: App { 13 | @AppStorage("hasApiKey") var hasApiKey: Bool = false 14 | 15 | init() { 16 | Glassfy.initialize(apiKey: "90074cc3c28947d3a5c89fada49c4316", watcherMode: false) 17 | } 18 | 19 | var body: some Scene { 20 | WindowGroup { 21 | if hasApiKey { 22 | ChatView() 23 | } else { 24 | SetupView() 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Scene/ChatView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChatView.swift 3 | // OpenAISwiftUI 4 | // 5 | // Created by will on 02/03/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ChatView: View { 11 | @AppStorage("hasApiKey") var hasApiKey: Bool = false 12 | @ObservedObject var viewModel = ViewModel() 13 | @FocusState var isFocus: Bool 14 | @State var isPresentedTipView: Bool = false 15 | @State private var animateMicCircle = false 16 | 17 | // MARK: - life cycle 18 | 19 | var body: some View { 20 | VStack { 21 | ScrollViewReader { scrollViewReader in 22 | ScrollView { 23 | LazyVStack { 24 | ForEach(viewModel.messages) { message in 25 | HStack(alignment: .top, spacing: 6) { 26 | VStack { 27 | switch message.role { 28 | case .user: 29 | Image(systemName: "person.circle") 30 | Text("You") 31 | case .system: 32 | Image(systemName: "person.icloud") 33 | Text("AI") 34 | } 35 | } 36 | .font(.headline) 37 | VStack(alignment: .leading) { 38 | Text(message.text) 39 | Text(message.errorText) 40 | .foregroundColor(Color.pink) 41 | if message.isInteracting { 42 | LoadingView() 43 | } 44 | } 45 | Spacer() 46 | Button { 47 | copyToClipboard(text: message.text.trimmed) 48 | } label: { 49 | Image(systemName: "doc.on.doc") 50 | } 51 | } 52 | .padding() 53 | .background(message.role == .user ? Color.clear : Color.gray.opacity(0.1)) 54 | } 55 | } 56 | } 57 | .onTapGesture { 58 | isFocus = false 59 | } 60 | .onChange(of: viewModel.messages.last?.text) { _ in 61 | scrollToBottom(proxy: scrollViewReader) 62 | } 63 | .onChange(of: viewModel.messages.last?.errorText) { _ in 64 | scrollToBottom(proxy: scrollViewReader) 65 | } 66 | } 67 | VStack(alignment: .leading) { 68 | HStack { 69 | if viewModel.showMoreOptions { 70 | Button { 71 | viewModel.showMoreOptions.toggle() 72 | } label: { 73 | Image(systemName: "chevron.compact.down") 74 | .padding(.vertical, 6) 75 | } 76 | .keyboardShortcut(.downArrow) 77 | } else { 78 | Button { 79 | viewModel.showMoreOptions.toggle() 80 | } label: { 81 | Image(systemName: "chevron.compact.up") 82 | .padding(.vertical, 6) 83 | } 84 | .keyboardShortcut(.upArrow) 85 | } 86 | Button { 87 | hasApiKey = false 88 | } label: { 89 | Image(systemName: "gear") 90 | } 91 | .keyboardShortcut(",") 92 | Button { 93 | isPresentedTipView.toggle() 94 | } label: { 95 | Image(systemName: "cup.and.saucer") 96 | } 97 | .keyboardShortcut("t") 98 | .sheet(isPresented: $isPresentedTipView) { 99 | TipView(isPresented: $isPresentedTipView) 100 | } 101 | Button { 102 | viewModel.clearMessages() 103 | } label: { 104 | Image(systemName: "trash.circle.fill") 105 | } 106 | .tint(.pink) 107 | .keyboardShortcut("d") 108 | if viewModel.showMoreOptions == false { 109 | muteButton 110 | } 111 | Spacer() 112 | } 113 | if viewModel.showMoreOptions { 114 | HStack { 115 | VoicePicker(selectedVoice: $viewModel.selectedVoice) 116 | muteButton 117 | } 118 | } 119 | 120 | HStack { 121 | micButton 122 | Group { 123 | if #available(iOS 16.0, macOS 13.0, *) { 124 | TextField("prompt", text: $viewModel.prompt, axis: .vertical) 125 | .lineLimit(1 ... 5) 126 | } else { 127 | TextField("prompt", text: $viewModel.prompt) 128 | } 129 | } 130 | .onSubmit { 131 | viewModel.requestAI() 132 | } 133 | .focused($isFocus) 134 | .textFieldStyle(.roundedBorder) 135 | Button { 136 | isFocus = false 137 | viewModel.requestAI() 138 | } label: { 139 | Text("Send") 140 | } 141 | } 142 | .disabled(viewModel.isLoading) 143 | } 144 | } 145 | .padding() 146 | .tint(.accent) 147 | .buttonStyle(.borderedProminent) 148 | } 149 | 150 | var muteButton: some View { 151 | Button { 152 | viewModel.isEnableSpeech.toggle() 153 | } label: { 154 | if viewModel.isEnableSpeech { 155 | Image(systemName: "speaker.wave.2.circle.fill") 156 | } else { 157 | Image(systemName: "speaker.slash.circle.fill") 158 | } 159 | } 160 | .tint(viewModel.isEnableSpeech ? Color.green : Color.pink) 161 | .keyboardShortcut("v", modifiers: .shift) 162 | } 163 | 164 | var micButton: some View { 165 | ZStack { 166 | Circle() 167 | .foregroundColor(Color.red.opacity(0.3)) 168 | .frame(width: 50, height: 50) 169 | .scaleEffect(animateMicCircle ? 0.9 : 1.2) 170 | .animation(Animation.easeInOut(duration: 0.4).repeatForever(autoreverses: false), value: animateMicCircle) 171 | .onAppear { 172 | self.animateMicCircle.toggle() 173 | } 174 | .opacity(viewModel.isRecording ? 1 : 0) 175 | Button { 176 | if viewModel.isRecording { 177 | viewModel.stopSpeechRecognizer() 178 | } else { 179 | isFocus = false 180 | viewModel.startSpeechRecognizer() 181 | } 182 | } label: { 183 | ZStack { 184 | Circle() 185 | .frame(width: 40, height: 40) 186 | .foregroundColor(viewModel.isRecording ? .red : .accent) 187 | 188 | Image(systemName: "mic").foregroundColor(.white) 189 | } 190 | } 191 | } 192 | .buttonStyle(.borderless) 193 | .frame(width: 60, height: 50) 194 | .keyboardShortcut("m", modifiers: .shift) 195 | } 196 | 197 | // MARK: - private methods 198 | 199 | private func scrollToBottom(proxy: ScrollViewProxy) { 200 | guard let id = viewModel.messages.last?.id else { return } 201 | proxy.scrollTo(id, anchor: .bottomTrailing) 202 | } 203 | } 204 | 205 | struct ContentView_Previews: PreviewProvider { 206 | static var previews: some View { 207 | ChatView() 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Scene/Launch Screen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Scene/SetupView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SetupView.swift 3 | // OpenAISwiftUI 4 | // 5 | // Created by will on 05/03/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct SetupView: View { 11 | @AppStorage("apiKey") var apiKey: String = "" 12 | @AppStorage("hasApiKey") var hasApiKey: Bool = false 13 | 14 | var body: some View { 15 | VStack(alignment: .leading, spacing: 20.0) { 16 | Text("Hi, there").font(.title) 17 | Text("Welcome to VoiceAI Chat") 18 | Text("an [open source](https://github.com/gewill/OpenAISwiftUI) chat app that uses voice to AI.") 19 | Divider() 20 | 21 | Group { 22 | Text("To proceed, an active OpenAI account is required.").font(.headline) 23 | 24 | Text("Follow these steps:") 25 | Text("1. Visit [https://platform.openai.com/account/api-keys](https://platform.openai.com/account/api-keys)") 26 | Text("2. Click \"Create new secret key\" button") 27 | Text("3. Copy and paste the generated API key.") 28 | } 29 | 30 | HStack { 31 | TextField("API key", text: $apiKey) 32 | .textFieldStyle(.roundedBorder) 33 | Button { 34 | if let string = getClipboardString(), 35 | string.isEmpty == false 36 | { 37 | apiKey = string 38 | } 39 | } label: { 40 | Image(systemName: "doc.on.clipboard") 41 | } 42 | .buttonStyle(.borderedProminent) 43 | } 44 | 45 | HStack { 46 | Spacer() 47 | Button { 48 | if apiKey.isEmpty == false { 49 | hasApiKey = true 50 | } 51 | } label: { 52 | Text("Submit") 53 | .font(.headline) 54 | } 55 | .buttonStyle(.borderedProminent) 56 | Spacer() 57 | } 58 | } 59 | .padding() 60 | .tint(.accent) 61 | } 62 | } 63 | 64 | struct SetupView_Previews: PreviewProvider { 65 | static var previews: some View { 66 | SetupView() 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Scene/TipView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TipView.swift 3 | // OpenAISwiftUI 4 | // 5 | // Created by will on 05/03/2023. 6 | // 7 | 8 | import ConfettiSwiftUI 9 | import Glassfy 10 | import Lottie 11 | import LottieUI 12 | import SwiftUI 13 | 14 | struct TipView: View { 15 | enum Permission: String { 16 | case coffee 17 | } 18 | 19 | enum Offering: String { 20 | case coffee 21 | } 22 | 23 | @Binding var isPresented: Bool 24 | @State var isPay: Bool = false 25 | @State var skus: [Glassfy.Sku] = [] 26 | @State private var confettiCounter: Int = 0 27 | 28 | var body: some View { 29 | VStack { 30 | HStack { 31 | Spacer() 32 | Button { 33 | isPresented.toggle() 34 | } label: { 35 | Image(systemName: "xmark") 36 | } 37 | .buttonStyle(.borderedProminent) 38 | .keyboardShortcut("w") 39 | } 40 | ScrollView { 41 | LottieView(LottieFiles.buyMeACoffee) 42 | .loopMode(LottieLoopMode.loop) 43 | .frame(width: 200, height: 200) 44 | 45 | Text("Hey, if you enjoy this app, please buy me a coffee.") 46 | .font(.headline) 47 | .lineLimit(nil) 48 | 49 | if isPay { 50 | Text("Thanks for your support. 😊") 51 | Button("🎉🎉🎉") { 52 | confettiCounter += 1 53 | } 54 | .onAppear { 55 | confettiCounter += 1 56 | } 57 | .confettiCannon(counter: $confettiCounter, num: 50, openingAngle: Angle(degrees: 0), closingAngle: Angle(degrees: 360), radius: 200) 58 | } 59 | 60 | Divider() 61 | 62 | ForEach(skus, id: \.skuId) { sku in 63 | VStack { 64 | Text(sku.product.localizedTitle) 65 | .font(.headline) 66 | // Text(sku.product.localizedDescription) 67 | Button { 68 | Glassfy.purchase(sku: sku) { transaction, error in 69 | guard let t = transaction, error == nil else { 70 | return 71 | } 72 | if t.permissions[Permission.coffee.rawValue]?.isValid == true { 73 | print("Pay success") 74 | self.isPay = true 75 | confettiCounter += 1 76 | } 77 | } 78 | } label: { 79 | Text("Support \(sku.product.priceLocale.currencySymbol ?? "")\(sku.product.price)") 80 | } 81 | .buttonStyle(.borderedProminent) 82 | } 83 | } 84 | } 85 | Spacer() 86 | } 87 | .padding() 88 | .frame(minWidth: 300, idealWidth: 500, minHeight: 400, idealHeight: 500) 89 | .task { 90 | Glassfy.offerings { offers, _ in 91 | if let offering = offers?[Offering.coffee.rawValue] { 92 | skus = offering.skus 93 | } 94 | } 95 | Glassfy.permissions { permissions, _ in 96 | if permissions?[Permission.coffee.rawValue]?.isValid == true { 97 | self.isPay = true 98 | } 99 | } 100 | } 101 | } 102 | } 103 | 104 | struct TipView_Previews: PreviewProvider { 105 | static var previews: some View { 106 | TipView(isPresented: .constant(true)) 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /OpenAISwiftUI/Scene/ViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewModel.swift 3 | // AI 4 | // 5 | // Created by will on 02/03/2023. 6 | // 7 | 8 | import AVFoundation 9 | import ChatGPTSwift 10 | import Combine 11 | import SwiftUI 12 | 13 | class ViewModel: NSObject, ObservableObject { 14 | var openAI: ChatGPTAPI! 15 | @AppStorage("apiKey") var apiKey: String = "" { 16 | didSet { openAI = ChatGPTAPI(apiKey: apiKey) } 17 | } 18 | 19 | @Published var prompt: String = "" 20 | @Published var messages: [Message] = [] 21 | @Published var isLoading: Bool = false 22 | @AppStorage("showMoreOptions") var showMoreOptions: Bool = true 23 | 24 | let errorMessage = "\nPlease check API key and network." 25 | 26 | // MARK: - Speech properties 27 | 28 | let synthesizer = AVSpeechSynthesizer() 29 | let speechOperationQueue = OperationQueue() 30 | 31 | @AppStorage("isEnableSpeech") var isEnableSpeech: Bool = true { 32 | didSet { 33 | if isEnableSpeech == false { 34 | stopSpeak() 35 | } 36 | } 37 | } 38 | 39 | @Published var selectedVoice: AVSpeechSynthesisVoice? { 40 | didSet { 41 | selectedVoiceIdentifier = selectedVoice?.identifier ?? "" 42 | if let language = selectedVoice?.language { 43 | speechRecognizer.updateLocale(Locale(identifier: language)) 44 | } 45 | } 46 | } 47 | 48 | @AppStorage("selectedVoiceIdentifier") var selectedVoiceIdentifier = "" 49 | 50 | // MARK: - Speech Recognizer properties 51 | 52 | @Published var speechRecognizer = SpeechRecognizer() 53 | @Published var isRecording = false 54 | 55 | private var cancellables = Set() 56 | 57 | // MARK: - life cycle 58 | 59 | override init() { 60 | super.init() 61 | 62 | self.openAI = .init(apiKey: apiKey) 63 | self.selectedVoice = AVSpeechSynthesisVoice(identifier: selectedVoiceIdentifier) ?? AVSpeechSynthesisVoice(language: "en-US") 64 | synthesizer.delegate = self 65 | speechOperationQueue.maxConcurrentOperationCount = 1 66 | speechRecognizer.$transcript.sink(receiveValue: { [weak self] transcript in 67 | self?.prompt = transcript 68 | }) 69 | .store(in: &cancellables) 70 | } 71 | 72 | // MARK: - Request Open API 73 | 74 | func requestAI() { 75 | stopSpeechRecognizer() 76 | 77 | guard apiKey.isEmpty == false else { 78 | showErrorMessage(text: errorMessage) 79 | return 80 | } 81 | guard prompt.isEmpty == false else { 82 | showErrorMessage(text: "Prompt can't be empty.") 83 | return 84 | } 85 | 86 | let prompt = self.prompt 87 | self.prompt = "" 88 | 89 | let promptMessage = Message(role: .user, text: prompt, isInteracting: false, errorText: "") 90 | messages.append(promptMessage) 91 | 92 | Task { 93 | await send(text: prompt) 94 | } 95 | } 96 | 97 | func clearMessages() { 98 | withAnimation { [weak self] in 99 | self?.messages = [] 100 | } 101 | clearSpeak() 102 | openAI.deleteHistoryList() 103 | openAI = .init(apiKey: apiKey) 104 | } 105 | 106 | // MARK: - private methods 107 | 108 | @MainActor 109 | private func send(text: String) async { 110 | isLoading = true 111 | 112 | var streamText = "" 113 | var message = Message(role: .system, text: "", isInteracting: true, errorText: "") 114 | messages.append(message) 115 | 116 | do { 117 | let stream = try await openAI.sendMessageStream(text: text) 118 | for try await text in stream { 119 | streamText += text 120 | message.text = streamText.trimmed 121 | if messages.isEmpty == false { 122 | messages[messages.count - 1] = message 123 | } 124 | } 125 | } catch { 126 | message = Message(role: .system, text: "", isInteracting: false, errorText: error.localizedDescription + errorMessage) 127 | } 128 | 129 | message.isInteracting = false 130 | if messages.isEmpty == false { 131 | messages[messages.count - 1] = message 132 | } 133 | isLoading = false 134 | addToQueue(message.text + message.errorText) 135 | } 136 | 137 | private func showErrorMessage(text: String) { 138 | let message = Message(role: .system, text: "", isInteracting: false, errorText: text) 139 | messages.append(message) 140 | addToQueue(text) 141 | } 142 | } 143 | 144 | extension ViewModel: AVSpeechSynthesizerDelegate { 145 | // MARK: - Speech methods 146 | 147 | func speak(_ text: String) { 148 | setPlaybackMode() 149 | activePlayback() 150 | 151 | let utterance = AVSpeechUtterance(string: text) 152 | utterance.rate = 0.5 153 | utterance.pitchMultiplier = 0.8 154 | utterance.postUtteranceDelay = 0.2 155 | utterance.voice = selectedVoice 156 | synthesizer.speak(utterance) 157 | } 158 | 159 | func addToQueue(_ text: String) { 160 | guard isEnableSpeech else { return } 161 | 162 | speechOperationQueue.addOperation { [weak self] in 163 | self?.speak(text) 164 | } 165 | } 166 | 167 | func stopSpeak() { 168 | synthesizer.stopSpeaking(at: .immediate) 169 | speechOperationQueue.cancelAllOperations() 170 | } 171 | 172 | func clearSpeak() { 173 | stopSpeak() 174 | } 175 | 176 | // MARK: - AVAudioSession PlaybackMode 177 | 178 | func setPlaybackMode() { 179 | #if os(iOS) 180 | do { 181 | try AVAudioSession.sharedInstance().setCategory(.playback, mode: .voicePrompt, options: [.mixWithOthers, .duckOthers]) 182 | } catch { 183 | print(error) 184 | } 185 | #endif 186 | } 187 | 188 | func activePlayback() { 189 | #if os(iOS) 190 | do { 191 | try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation) 192 | } catch { 193 | print(error) 194 | } 195 | #endif 196 | } 197 | 198 | // MARK: - AVSpeechSynthesizerDelegate 199 | 200 | func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) { 201 | print("synthesizer didStart") 202 | } 203 | 204 | func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance) { 205 | // print("synthesizer willSpeakRange") 206 | } 207 | 208 | func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance: AVSpeechUtterance) { 209 | print("synthesizer didPause") 210 | } 211 | 212 | func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didContinue utterance: AVSpeechUtterance) { 213 | print("synthesizer didContinue") 214 | } 215 | 216 | func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) { 217 | print("synthesizer didFinish") 218 | } 219 | 220 | func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didCancel utterance: AVSpeechUtterance) { 221 | print("synthesizer didCancel") 222 | } 223 | } 224 | 225 | extension ViewModel { 226 | // MARK: - Speech Recognizer 227 | 228 | func startSpeechRecognizer() { 229 | isRecording = true 230 | speechRecognizer.reset() 231 | speechRecognizer.transcribe() 232 | } 233 | 234 | func stopSpeechRecognizer() { 235 | isRecording = false 236 | speechRecognizer.stopTranscribing() 237 | } 238 | } 239 | -------------------------------------------------------------------------------- /OpenAISwiftUI/View/LoadingView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingView.swift 3 | // OpenAISwiftUI 4 | // 5 | // Created by will on 04/03/width23. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct LoadingView: View { 11 | let color: Color = .accent 12 | let width: CGFloat = 10 13 | @State private var shouldAnimate = false 14 | 15 | var body: some View { 16 | HStack { 17 | Circle() 18 | .fill(color) 19 | .frame(width: width, height: width) 20 | .scaleEffect(shouldAnimate ? 1.0 : 0.5) 21 | .animation(Animation.easeInOut(duration: 0.5).repeatForever(), value: shouldAnimate) 22 | Circle() 23 | .fill(color) 24 | .frame(width: width, height: width) 25 | .scaleEffect(shouldAnimate ? 1.0 : 0.5) 26 | .animation(Animation.easeInOut(duration: 0.5).repeatForever().delay(0.3), value: shouldAnimate) 27 | Circle() 28 | .fill(color) 29 | .frame(width: width, height: width) 30 | .scaleEffect(shouldAnimate ? 1.0 : 0.5) 31 | .animation(Animation.easeInOut(duration: 0.5).repeatForever().delay(0.6), value: shouldAnimate) 32 | } 33 | .onAppear { 34 | self.shouldAnimate = true 35 | } 36 | } 37 | } 38 | 39 | struct LoadingView_Previews: PreviewProvider { 40 | static var previews: some View { 41 | LoadingView() 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /OpenAISwiftUI/View/VoicePicker.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VoicePicker.swift 3 | // OpenAISwiftUI 4 | // 5 | // Created by will on 03/03/2023. 6 | // 7 | 8 | import AVFoundation 9 | import SwiftUI 10 | 11 | struct VoicePicker: View { 12 | let voices = AVSpeechSynthesisVoice.speechVoices() 13 | var languageGroups: [String: [AVSpeechSynthesisVoice]] { 14 | Dictionary(grouping: voices, by: { $0.language }) 15 | } 16 | 17 | @Binding var selectedVoice: AVSpeechSynthesisVoice? 18 | 19 | var body: some View { 20 | Picker(selection: $selectedVoice, label: Text("Select a voice")) { 21 | ForEach(languageGroups.sorted(by: { $0.key < $1.key }), id: \.key) { language, voices in 22 | Section(header: Text(language)) { 23 | ForEach(voices, id: \.identifier) { voice in 24 | Text(voice.name + "\(voice.gender.title)").tag(voice as AVSpeechSynthesisVoice?) 25 | } 26 | } 27 | } 28 | } 29 | } 30 | } 31 | 32 | public extension AVSpeechSynthesisVoiceGender { 33 | var title: String { 34 | switch self { 35 | case .male: return " - male" 36 | case .female: return " - female" 37 | default: return "" 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenAISwiftUI 2 | 3 | A chat app use OpenAI API and SwiftUI. 4 | 5 | [Download on the App Store](https://apps.apple.com/app/id6445994863) 6 | 7 | ## Useage 8 | 9 | Input your [API key](https://platform.openai.com/account/api-keys) first. 10 | 11 | Here is the Demo video https://www.youtube.com/shorts/qpxkTroEcOY 12 | 13 | ![Preview](./Images/Preview-iPhone.jpg) 14 | 15 | ![Preview-mac](./Images/Preview-mac.jpg) 16 | 17 | ## Thanks 18 | 19 | Use SDK [adamrushy/OpenAISwift](https://github.com/adamrushy/OpenAISwift) 20 | 21 | Use SDK [alfianlosari/ChatGPTSwift](https://github.com/alfianlosari/ChatGPTSwift) 22 | --------------------------------------------------------------------------------