From 6575adda42f88279b3a9b09fa17d7b4c63f67841 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 9 Aug 2021 11:30:47 +0300 Subject: [PATCH] merge changes-5 --- GoogleService-Info.plist | 36 -- android/app/build.gradle | 3 +- android/app/google-services.json | 30 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- android/app/src/main/AndroidManifest.xml | 12 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 2350 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 1742 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 3028 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 4339 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 5703 bytes android/build.gradle | 7 +- android/google-services.json | 30 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- google-services.json | 40 -- ios/Podfile | 1 + .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 815 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 1980 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 3664 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 1297 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 3517 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 5549 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 1980 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 5858 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 11154 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 11154 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 20412 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 5152 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 16469 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 16408 bytes ios/Runner/GoogleService-Info.plist | 20 +- ios/Runner/Info.plist | 2 +- speech_to_text/android/build.gradle | 2 +- .../android/gradle/local.properties | 3 +- .../example/android/app/build.gradle | 2 +- speech_to_text_/.github/workflows/master.yml | 19 + speech_to_text_/.gitignore | 11 + speech_to_text_/.metadata | 10 + speech_to_text_/CHANGELOG.md | 166 +++++ speech_to_text_/LICENSE | 29 + speech_to_text_/README.md | 150 +++++ speech_to_text_/android/.classpath | 6 + speech_to_text_/android/.gitignore | 8 + speech_to_text_/android/.project | 23 + .../org.eclipse.buildship.core.prefs | 13 + speech_to_text_/android/build.gradle | 44 ++ .../android/gradle/gradle.properties | 3 + .../android/gradle/local.properties | 3 + .../android/gradle/settings.gradle | 1 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/src/main/AndroidManifest.xml | 3 + .../speech_to_text/SpeechToTextPlugin.kt | 595 ++++++++++++++++++ speech_to_text_/example/.gitignore | 73 +++ speech_to_text_/example/.metadata | 10 + speech_to_text_/example/README.md | 155 +++++ speech_to_text_/example/android/.project | 17 + .../org.eclipse.buildship.core.prefs | 2 + .../example/android/app/build.gradle | 67 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 32 + .../speech_to_text_example/MainActivity.kt | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + speech_to_text_/example/android/build.gradle | 31 + .../example/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../example/android/settings.gradle | 15 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Flutter.podspec | 18 + .../example/ios/Flutter/Release.xcconfig | 2 + speech_to_text_/example/ios/Podfile | 90 +++ speech_to_text_/example/ios/Podfile.lock | 29 + .../ios/Runner.xcodeproj/project.pbxproj | 578 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + speech_to_text_/example/ios/Runner/Info.plist | 49 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + speech_to_text_/example/lib/main.dart | 275 ++++++++ speech_to_text_/ios/.gitignore | 37 ++ speech_to_text_/ios/Assets/.gitkeep | 0 .../ios/Classes/SpeechToTextPlugin.h | 4 + .../ios/Classes/SpeechToTextPlugin.m | 8 + .../ios/Classes/SwiftSpeechToTextPlugin.swift | 580 +++++++++++++++++ speech_to_text_/ios/speech_to_text.podspec | 22 + 116 files changed, 3678 insertions(+), 127 deletions(-) delete mode 100644 GoogleService-Info.plist delete mode 100644 google-services.json create mode 100644 speech_to_text_/.github/workflows/master.yml create mode 100644 speech_to_text_/.gitignore create mode 100644 speech_to_text_/.metadata create mode 100644 speech_to_text_/CHANGELOG.md create mode 100644 speech_to_text_/LICENSE create mode 100644 speech_to_text_/README.md create mode 100644 speech_to_text_/android/.classpath create mode 100644 speech_to_text_/android/.gitignore create mode 100644 speech_to_text_/android/.project create mode 100644 speech_to_text_/android/.settings/org.eclipse.buildship.core.prefs create mode 100644 speech_to_text_/android/build.gradle create mode 100644 speech_to_text_/android/gradle/gradle.properties create mode 100644 speech_to_text_/android/gradle/local.properties create mode 100644 speech_to_text_/android/gradle/settings.gradle create mode 100644 speech_to_text_/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 speech_to_text_/android/src/main/AndroidManifest.xml create mode 100644 speech_to_text_/android/src/main/kotlin/com/csdcorp/speech_to_text/SpeechToTextPlugin.kt create mode 100644 speech_to_text_/example/.gitignore create mode 100644 speech_to_text_/example/.metadata create mode 100644 speech_to_text_/example/README.md create mode 100644 speech_to_text_/example/android/.project create mode 100644 speech_to_text_/example/android/.settings/org.eclipse.buildship.core.prefs create mode 100644 speech_to_text_/example/android/app/build.gradle create mode 100644 speech_to_text_/example/android/app/src/debug/AndroidManifest.xml create mode 100644 speech_to_text_/example/android/app/src/main/AndroidManifest.xml create mode 100644 speech_to_text_/example/android/app/src/main/kotlin/com/csdcorp/speech_to_text_example/MainActivity.kt create mode 100644 speech_to_text_/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 speech_to_text_/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 speech_to_text_/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 speech_to_text_/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 speech_to_text_/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 speech_to_text_/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 speech_to_text_/example/android/app/src/main/res/values/styles.xml create mode 100644 speech_to_text_/example/android/app/src/profile/AndroidManifest.xml create mode 100644 speech_to_text_/example/android/build.gradle create mode 100644 speech_to_text_/example/android/gradle.properties create mode 100644 speech_to_text_/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 speech_to_text_/example/android/settings.gradle create mode 100644 speech_to_text_/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 speech_to_text_/example/ios/Flutter/Debug.xcconfig create mode 100644 speech_to_text_/example/ios/Flutter/Flutter.podspec create mode 100644 speech_to_text_/example/ios/Flutter/Release.xcconfig create mode 100644 speech_to_text_/example/ios/Podfile create mode 100644 speech_to_text_/example/ios/Podfile.lock create mode 100644 speech_to_text_/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 speech_to_text_/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 speech_to_text_/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 speech_to_text_/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 speech_to_text_/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 speech_to_text_/example/ios/Runner/AppDelegate.swift create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 speech_to_text_/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 speech_to_text_/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 speech_to_text_/example/ios/Runner/Info.plist create mode 100644 speech_to_text_/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 speech_to_text_/example/lib/main.dart create mode 100644 speech_to_text_/ios/.gitignore create mode 100644 speech_to_text_/ios/Assets/.gitkeep create mode 100644 speech_to_text_/ios/Classes/SpeechToTextPlugin.h create mode 100644 speech_to_text_/ios/Classes/SpeechToTextPlugin.m create mode 100644 speech_to_text_/ios/Classes/SwiftSpeechToTextPlugin.swift create mode 100644 speech_to_text_/ios/speech_to_text.podspec diff --git a/GoogleService-Info.plist b/GoogleService-Info.plist deleted file mode 100644 index 0c093a2a..00000000 --- a/GoogleService-Info.plist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - CLIENT_ID - 864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r - API_KEY - AIzaSyA_6ayGCk4fly7o7eTVBrj9kuHBYHMAOfs - GCM_SENDER_ID - 864393916058 - PLIST_VERSION - 1 - BUNDLE_ID - com.cloud.diplomaticquarterapp - PROJECT_ID - diplomaticquarter-d2385 - STORAGE_BUCKET - diplomaticquarter-d2385.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:864393916058:ios:13f787bbfe6051f8b97923 - DATABASE_URL - https://diplomaticquarter-d2385.firebaseio.com - - \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 11e99a2a..336e8e53 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -39,7 +39,8 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.cloud.diplomaticquarterapp" +// applicationId "com.cloud.diplomaticquarterapp" + applicationId "com.ejada.hmg.uat" minSdkVersion 21 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() diff --git a/android/app/google-services.json b/android/app/google-services.json index a4655794..6d1d75a9 100644 --- a/android/app/google-services.json +++ b/android/app/google-services.json @@ -1,37 +1,39 @@ { "project_info": { - "project_number": "864393916058", - "firebase_url": "https://diplomaticquarter-d2385.firebaseio.com", - "project_id": "diplomaticquarter-d2385", - "storage_bucket": "diplomaticquarter-d2385.appspot.com" + "project_number": "815750722565", + "firebase_url": "https://api-project-815750722565.firebaseio.com", + "project_id": "api-project-815750722565", + "storage_bucket": "api-project-815750722565.appspot.com" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:864393916058:android:5b5a65cd6d8c18b4b97923", + "mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063", "android_client_info": { - "package_name": "com.cloud.diplomaticquarterapp" + "package_name": "com.ejada.hmg.uat" } }, "oauth_client": [ { - "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com", + "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { - "current_key": "AIzaSyBdV3mos1BPhUzNKCj2KANJtiO3o2zh9IM" + "current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw" } ], "services": { + "analytics_service": { + "status": 1 + }, "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com", - "client_type": 3 - } - ] + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 } } } diff --git a/android/app/gradle/wrapper/gradle-wrapper.properties b/android/app/gradle/wrapper/gradle-wrapper.properties index 8fc3bbec..a2c20300 100644 --- a/android/app/gradle/wrapper/gradle-wrapper.properties +++ b/android/app/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip +#distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1a3d4cfe..63f94294 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ In most cases you can leave this as-is, but you if you want to provide additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> + @@ -29,12 +30,16 @@ - + + + + + + android:label="Dr. Alhabib"> + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..348b511670c0e98f244aa2c8337fa3cf0b0ce167 100644 GIT binary patch literal 2350 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 UoY!dqQvd(}07*qoM6N<$f~7q{L;wH) literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..410b1b1e59ec6f502163a727e67ceea9a9b48d5a 100644 GIT binary patch delta 1737 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0b9d9359e3dbcedc1337fce588f4c35b2ea84b33 100644 GIT binary patch literal 4339 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 KG-}lBqyGn)&?Wo; literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..aaa9808d6995beb1a391a35dd8ba72fc5a922ef9 100644 GIT binary patch literal 5703 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 UZ+=VB!XXY&SJqOhQm_vFKNIGqH~;_u literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/android/build.gradle b/android/build.gradle index 32bda0b1..c0fc03b3 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -9,16 +9,17 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:3.5.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.google.gms:google-services:4.3.4' + classpath 'com.google.gms:google-services:4.3.8' } } allprojects { repositories { google() - jcenter() +// jcenter() + mavenCentral() } } diff --git a/android/google-services.json b/android/google-services.json index a4655794..dd4038cf 100644 --- a/android/google-services.json +++ b/android/google-services.json @@ -1,37 +1,39 @@ { "project_info": { - "project_number": "864393916058", - "firebase_url": "https://diplomaticquarter-d2385.firebaseio.com", - "project_id": "diplomaticquarter-d2385", - "storage_bucket": "diplomaticquarter-d2385.appspot.com" + "project_number": "815750722565", + "firebase_url": "https://api-project-815750722565.firebaseio.com", + "project_id": "api-project-815750722565", + "storage_bucket": "api-project-815750722565.appspot.com" }, "client": [ { "client_info": { - "mobilesdk_app_id": "1:864393916058:android:5b5a65cd6d8c18b4b97923", + "mobilesdk_app_id": "1:815750722565:android:62281cd3e5df4063", "android_client_info": { - "package_name": "com.cloud.diplomaticquarterapp" + "package_name": "com.ejada.hmg" } }, "oauth_client": [ { - "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com", + "client_id": "815750722565-3a0gc7neins0eoahdrimrfksk0sqice8.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { - "current_key": "AIzaSyBdV3mos1BPhUzNKCj2KANJtiO3o2zh9IM" + "current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw" } ], "services": { + "analytics_service": { + "status": 1 + }, "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com", - "client_type": 3 - } - ] + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 } } } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 1f9de82f..6fdb0e44 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Sep 03 16:26:30 EEST 2020 +#Wed Jul 14 15:55:18 AST 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip diff --git a/google-services.json b/google-services.json deleted file mode 100644 index a4655794..00000000 --- a/google-services.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "project_info": { - "project_number": "864393916058", - "firebase_url": "https://diplomaticquarter-d2385.firebaseio.com", - "project_id": "diplomaticquarter-d2385", - "storage_bucket": "diplomaticquarter-d2385.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:864393916058:android:5b5a65cd6d8c18b4b97923", - "android_client_info": { - "package_name": "com.cloud.diplomaticquarterapp" - } - }, - "oauth_client": [ - { - "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBdV3mos1BPhUzNKCj2KANJtiO3o2zh9IM" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "864393916058-tphjrn8j39ntevt32ekcvmll8aue7qql.apps.googleusercontent.com", - "client_type": 3 - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/ios/Podfile b/ios/Podfile index d68afba2..89424e2a 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -3,6 +3,7 @@ # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' +$FirebaseAnalyticsWithoutAdIdSupport = true project 'Runner', { 'Debug' => :debug, diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0e65243a651fa2330f24384a29d876657308b73f 100644 GIT binary patch delta 792 zcmV+z1Lyp-1g{2=B!3BTNLh0L01m_e01m_fl`9S#0008vNkl2O9_IMehNW~2tN2_eDTF+Ax)xGgn|z(Y12w( zMEc?+VE^iux=`3P9D_~7J6e4l2 zNBDCG1kCvr?D8Tw3nG{^XV8NI#j_3c!y%x!%)yk$-&$klr*-7ibSf@Hij6G>cOO8E z%-mVWfBy~QU4LeK^!N$I#&+h?)s%_|rga)KcMd8*1H_eOa1P3VSy{v`%!4tA2=VAB z?Pc)~hW9qw`Fe)%hpMNG^pTDI1?G?H|pxE3-hex?e z>3*`RO@jg^Dek{rqxI-Ma`s~wjVj@$(Eb5~Umh}g@)XJdn%Wl;RKZB?%L%hqeiH#z zvQY z;jvf|tlIEA#$#jA#CNVxRMGtdLho(9dW1;%_kS*02GB_S=U>8`z2@o_CHnq-)j@^R zo4c4~vVvJ$z%DOU!$BZMV)rfKuid0uX9=^gfLH?}s4Cj+5qIAZ%MuZ(0gtsJl7cF0 z&R&0)G2d!UNdj=yd~S@W3XzGKnAuW*nC+O)NS^cK6Fbixw0S-0`Efn6`Rk^H{{deE WP7z4L{!>)|0000 z_-cHBsnVnni(n&I*!e#wNI)z_s}Kk_X;Y*OwkZM@L99}Q5JXfk*ocY`5X~B8qdRxb z%{fa3_HoBugJ+mKFTUS==P`qh10FEc1G0*!djTaC;zf>@mw!l3D#BD;Cthymh&~=f z$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR& z^p?weGftrtCbjF#+zk_5BJh7;0`#WrgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xc zkpcXC6oou4MSnqn;3m3^$(nLgRStOuoa~_k?BSXTj79in$2xZ2ATz?ejJcSpJR${yA71LEn>R`(gT}YR{(1CZ%rRzZW>-DMa2Z5h$J?ElWw<7g!?opVq9Q dUzU9LFBBHi?hQ;g#7Y1F002ovPDHLkV1gl=`c?n{ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..2e4c79638b62611653dde1e4c3a83e3db156c2ce 100644 GIT binary patch delta 1967 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 WYK#ibz}*4>0000D2MHI(> zXYRdr{78xtwP{*PQBez}fP@g0id3W`3Zk&;2EG6i5(_>COT-3=1$$Nq76_0~7Tq8o zQ7HnI(oIX!2Wd!YoY=8_XAX;*d+%I39m)219_ReebN+Jsz<&u91O*7+BJ4flbqyb> zZ}i|J_7fAxKGUJ`h13*+=7zS4j>pMH%HmX@5Ze z%VqMFUr}ojV@OV&Bt7#YW^T4J(imi60n_a;_~bL}=KWx)AL*pqWp0+no3E2S|E#wn za+eN=j1C& zIvg?n;b+FnmvFsp#9HjyE%e@o2P8$t6wRSz&gO5MO-MEQaJV5J%_ehQ%^_}d(d8FM! zAM_y4ajUn;fBVA&^ce$4>|VcM=H_U=eUa?kS>I)hK{{=u+4M^PUSqs`30=R3?3<%; z;XLN(5ok2XPQO6<^i#pbmht5)xDP+Vt$*DKB~_G+M!mp*%yvkRA0t^>3@=RtOBMP9 z*d3xyVLV26`k?9?L$irA8>I=!_6{;X54Y~tp2V~;x>Ripm}F1RQYF2zXSa!BC905^ zDd1k|q;T~@r-(rug}u@EsYunG9`fFs3Vd0u^}jVd>RVd?hB|Pr4n$*$=Vw#Bw}0@6 z7Rb(U=s$hBk;Ho3Vpfo$@TLY}5>ZhJ=XX&hs+fA63Ly#dJOC?RehUA`jJAqlo|hP63+kC& zu+BoMXVeoRmngTYY}A-NYfM9`dv%%`yD?a*T41lg1oa`*sCpe+Bs{oPB(gWMSYk`d o+Ycks(`XABljZPGeie=X0rv|pc}tL#_y7O^07*qoM6N<$f}68d)c^nh delta 1004 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 literal 1716 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 delta 1906 zcmV-&2aWixD}WD>BYy`+Nkl^fDmF(5(5$|?Cx}D zKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q?YG}tx;sY@GzV#^0C$Z`m}blr)&(OPMHT6T@%AxHOWYGG zm>@=0?<)?0r0XK9>leRXyD^j4O4bXT!@LESVI<~>`yB+S2b_f__vvyMHkwGyyXedq3usx&X*}E{O;}+nJ#G_xm zJbQX5 zuFrVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~ ztSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Yuz!}~S^-;|MX;9Py1im8!}VY-!u4P+ z!nLEvx?+Rogo+Kw9OBXy&lGIvJ51_7Hl6Q>*MAJa!lMDGGML530`Te&0ciU({DC7` z;RKg{uC>($*mdXnVQQBjiVyqYC7mf!Z%e-Q!?Oo{ufu`G3CAC=UjiTpU<94UTFz2KEDuNS@KKkg)K8!v1L8RUP$_! z({LG$Dy&JLEVpiNVe^G(HCbA*SpsX?292)#=JVQDUMp-cOJPl`+yTHTD!AOit-zAD zptXYa!q%OVLa^mo25b7^Z>kE`3rqgr-G4i;Lw<+P(8khESW8aaBmxfY`WS#6j<92Q z-++&Y z$gbH4#2sT0cU0SdFs=*W*4hKGpuR1QGacHFy;`# zR&NJkbTNp}Ee5f08HmLzK%D(q3@lH;Tzx$?VT;&xJq-KyHV__o3dD)?KrE<6*iXV0 z8;6<{IKw@dyDwJ90H5^3h;|9?twz{UGr|>1Pzhdn6W(r0ifeZd=JI+AAz<~yL(QJk zAWW))+=`8mGj|J!70oF@d4B;WxB=jBM1bWWRBb&1!ie3BUzOdm}yC-xA%SY``k$rbfk;CHqifhU*jfGM@DkYCec zD9&E@F9*za0?~OQZiDE|Cf;;0 z`uZ%H=IeGyG^H0ruev{yIVARgwZUG)j7>F#3~dh+8DOtPByR=(VDhz2enf#EjcXCI z=NUPYr4@S)GhX!?s(0Eh(nGe!y$#$r1B$||I~`wPhUuCQEo;#Xb$EXk=6HgBBRd#c ziK|jN$e~{zV~|;*E@Ij-Z(+tI^B8RW51ptE!nMnPyZ`_I07*qoM6N<$f<4WQFaQ7m diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..2e4c79638b62611653dde1e4c3a83e3db156c2ce 100644 GIT binary patch delta 1967 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 a0{1_&;gnn2jcRKE0000tk|)`#2!0#oEV%S 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 delta 1881 zcmV-f2d4PqE$0r9BYy`jNklFQtfgmaf zE#=YDCq`qUBt#QpG%*H6QHY765~R=qZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1 zK4#~5?#|rh?sS)(-JQqX*}ciXJ56_Hdw=^s_srbAdqxlvG=BhaYkq$ewHUPpbsRN- z8b*0hBN-yE`ach%PN2R+y^b1xyS^vYaA%P{0B)C}TGSVIY9nx4Q57f`g-BQ=3(v)D zPe=Wtd7%(WQXl0E1}1Cz!nR|m!dOgn!NW%nYBh5}NtNti2g*!8Xk4x|Mj*C>NiaUs%#fyzU5=HSJJNOHlQqY?|vw)nU< z2QMMS`lwSJ2Hx}P6M{KbaT{e*9AT%9eI(=l&SYCYM|Ig4rI}dB5qd~wj*Nx4QJx9# zIBAs8%j_7~&YS~r*CZ9*v7r#G>JGqH=K`>%Cppo5K7Ymi`@M4Hq%TE)WY?~6BEcUM zP<~#WN8ug07J`z4J}B(;!E97f5}JKL(X{rPu)SY0B9!TP_yhs?Hm~6u1@Dj#7NDxT zd{CK$s#MKEfIkjM={PS|7%w9Lck&33!aK^qBS6Xz>sN&;;@I6+q^RQ>aFs$@8v%HZ zxenykd4DOxJ773GmQ_Cic%3JJhC0t2cx>|vJcVusIB!%F90{+}8hG3QU4KNeK zmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u7JyDj7`6d)qVp^R=%j>UIY6f+3`+qz zIc!Y_=+uN^3BYV|o+$vGo-j-Wm<R zS$}xdX~O$Yg=geSue3vW@1PX^2Pqgc;1#9_uPTP~j9w;ZND^rqkiuhAB8Yn75d}l( zInN4shMvYGf|$&hM>@LV6yMG>^v=H@#E$v_c z;k|a$2M;%S5%$e6j53blnKqfwHmE=(;D0K+l7~0B^#+XJeFJ88=!a+rJX5E$s1u7i z^}~Beg*Rc3BE1mpf@k`KYV%(b?7W;BJgR~O5bcC#>Xg1L$DatG2}6PBj|(s2#67Vg z+6~Y250zrAhS%%7L{8)Zp6LKbxe`)?r-it%>n6kA|=8iMUiFYvM zoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS*ZdmT`g5-`BuJs`0LVhz+D9NN za3<=6m;cQLaF?tCv8)zcRSh66*na@qY=&sd0?S|&MDJ}O7BnNgc7XiN=fOQ^B?u*J zL9DI^H_BDH3B*!+A=rxG>mqY4 zM0QLJ!^4D;-*^T*Q{Mn##xf8~RwJw$1h^p#P^_xgK)hf%MBBgS5EEjH3V*NRG`OEE z2jS^OAQmnMao*=3me)q$QMnh|=R_{PXcGmoX#^&90F0|Y3GPY7AWSX;aVEO2bPYO> zfNO|?7lCL~ICJw=F9o6u+b&CRf6WQVn}V*J@g73MF|WE&Q4DY~AzGMNxcahTP(8<~ zYxxy~;u`S0v;|xX8%Kq#E`Nv?IgtPy0ghS(;=XPW=B@(|LUC0$=muzUVhIp{y>Vup z?1QLwwr<}U5az8<4WhY;g|fOr0JhT0Ri2zkJ6pFm4T$E2Gd)NL0r)J0wVqVe+n)AbQCx)yh9;w+J6?NF5LmoecS@ieAKL8%bVd@+-KT{ zyI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^EkL$}tsQt5>QA^;QgjgMV83iI%^s)DX_K`0jg!)|u7T5Zs=Fm=Ip`s2bC17?Wgj52`x{ zF)qCGsQXk_u6PxE^HG=RsaTF(1Rkk+UXZAgubV0N&N?xah2Uh3^Cs#l56?g(R{cTq zPGkefkY@O5Mm?BRZGDI?1^+6lFUF-zrk8^hfl4?z72Wv(<`ONaT|G}Row-6&0c?N?|!M|-Ax z+*>LNJsAog!r&kTGwovnp$_&}H8a%aQ3FV3&{Tzp^_QlvF?S$rsY*!*q!P)14}=Bk zL{~<#!V!G|(NF}ROygr#07U#*?QG*{;25yTXQ zs`fA$f~xf&j}`41p#p39PXsP~KDI-z{xw^MmYfRlf6>I|F*{TkrCAmTXRR77T66-` z*N6v&<5{|mDAE+M(PhA#YA0DaXBfXt`+G$Jrl1#(-c)t{W{Aw1ZJjk6eAfO@lzzl+ z>JH(yLaLDUb;cZp4lTQBA3K-wk3^~t-Wo5SQ`~kD4eK9KSCM4dM5Vw~=_GY>RjK1P zV;Np9fXzP@xS)z)sb>4?r&(i@UDG=D!dZtK|I}$IeKsbEnX%2wvxSX&%3v2}m_;S+ zH>Hzi;7<9>57VbxM8l_=OLEzjf!0TArbm0RJT*ntPMM1Wc?l{0LPl>amesLrT-%S>h_X~2+Osd z)3#iKqs-J)G&ddHaHL%9$hdV3QK(Tf=n|7SHOZGj3WHi$SbbaIbs)m^k0j$8LMa50 z)Lxn}%?iOhua=ZR(1u$vo@r$ggaA9^SidZd(8hAtRO!&9YjGHqFg2a;gVmP%T$gQj zVw!!BR&rq5kL74&(^z{mdAj+!_9KW#QY;;HTEIuK44eM$cB`!_{}yQ8k-_hMr`C*>|%~Wdj(- zbR>N}zZmj~&D4lAKqg{)SKNv8cqDRH;Mvvqg{pJa5a$01A?or%GwBt?q^3UXM*SpW zmao*W=T~RYBv~2~PN4yK4j#Dimm=JE01tv6y<2LkcM1S114tU% zG)Rou2PxSCw)$UN7+jt35Oo~+EZw8%mzfAO(V@Q=qx~WbEl1@RRs9HAyDc9uCM})*|K)lH=I;5 zcR>gi7II4!7j_Hrw@=+hy0kjD6m&?}&nLAxJf)k{v8>KXJ}3oTVh5t*On+nhQo#*C zpJCEeN&wQhzgQ!Jm;_q?*~h^AWla{hY%zlR9BJv<^(6rkTCdysw=w9Nm>2b~^SplP zde2?uJ|%7tG;A4IAq0$;XsX`>X8}4z5_f57`W7m&buck^}9B3xMnYV^=3^r_K{?!v=p3>Zt80?HH;8ErDp95Jvq4R z*=lHwlJZQZ$iy{`1W;w%Od!arr7_L?Q7!vHVU$C_a-fzofCIo&2{1HGOT&4Y>P?@w z8P7H{ij3MPFeUSp8iynixif%?23l#-hEf?)4&_ElMl@|~u~Y)G{Kpe}z4;>6TE zafL)|iv+RkDMV`$1MPUsBwtDioC0Q&TA$UJ_EN?ErN>4)_rQ+d2;1~eyBO%1W|fp2 zGXGk@F=h$m^eM=>dw~;&9c(d_aZ4N8gq>|Mn1;5!0kbDZC17`>n(##I%s`*ZvOpDX z8;e~X0}x67Ivz*JNv;|>R{pn5Ovm>m-R~_}!eazDbU1GTM=NtrWBKgIvHZlxfYYaD z!PVr)8<09ZDMB@Ms12OKkmzL7vh2WvRNpVZ%$9_SPHrCXC6Q~QY*V_}^j1PnJH{qw>=3bi3Ii<7oVhQzXE=H^ z`;QLt~vummW^js5y;^o z6|LGs#;F+f(XU^OPP=g`> z77NJX3CM{4mwRvxO9F9IQZmmL(ZIO(y@W+9JGbbJjYDClq)Atjqc78W&~?7n;#j%q^g+0?Djs- zf)N!8eg%LG0IzU}Ov#M+nITU}O3fJ~5wAslbdT%P{lx-{3m0(syU$_q#ACo>(FB1t zFf=@j7!qzv0mxlvaqv6OV)^%;4(3vFrGrpX4Frds<9wSXydpSFm3Z?=m1))g?P934A6<(`(Y{9?!Sd-30e74%+LNqOu{su0 z*bUob27u||^Emj}M=;%eH_$SR;GM&v{pYZu7xW&NCTJ{o;zKJU&9%edEt<=}spxJP z+?LGQr`tA`3<^1fv_l6M-BoF+Fqv)ATMfSf%Gx#JFOL}JNZ2Bbb*Un`eOO!wW3>C~w-uE8>zlVRIth30VQ`^o}@Y)Cx{ zSHxx!HMD(Y5ur0>MQLj$Yo0Oc6xlBba_ilgDyvIv8?%)V9%wW(bJ$M=a(GZ8)Dgr9 zjVigm&Jf6n6Tosl^4}(Cx1!b7z7uMMyu~M3qHYe!F_Q-ifo6@O)oY4&=gqt{n8ulD zH|-SEd7`5+;rm3%`_pDo%otg@$cg(R>lqO{8ASx0$TD`)%7>){OR> z_a|YD37mLbMiychoZIfTvBNNU-UU@ss(IAVf$|Y& zsQ45|zsWt8e5>161Gf6CnSKhUlcu#VJ*85hrhA+sAHlcFhql+-%1Em>{m7xRq~&&Y zObK4j$f+~Dlw~q#4u6)K5wrOm6p&9cgee>o zZ35ZN)5NwORaFozDHB6+s<^KMY#p4|U`!%@j#itNQSWUS&OK=JZn9Uvj4xzHHEc92 z`VGDP=4qqmG;a&Xp2b%R6;MT1v}QHupQCuIhr1qp2TUs1xETP*%yM%PCf#jGwe#7! zA0u}qHs<=w-m}RG4hZ~#xDdurH%26lY(XS|CDgY4sst$eDFg+GPCl*(L}$_@E^Om~ zW1pyWTf{vYBT{$-Gb=+ok2VCW-}YtRu8h{)`gzW5`*%caWeE8ue|+Qz9Q@Hp>aR7? zk^NRQNLJbxM`_!iue-3W@emj9y2TPJV z9es4y)Y}Ukd@s$t!)O9wVbIzpDo241*SFVPM!x!Xd|pp0<8I;fF6Odp8D*Tj)gDQj z0?%$7M8=QB#cP`iT;>WbZh}x9f)$?LlzQl{@RASGnV+?BctbhNplWxDtG3AH-7bf2 zy95Hrwwfh12$j0-ktV&BY&S8D*KqXeNA8+NLeP3a~sXY*0L=h-NJTTcsS9>H`hP*D2l~9*_Zo(G)~O1 zjK{+?h+tCh5uA%e9z%j!lDMA%Z3!})X8d&~J~|lLfoaEAZ3wdqp1FIw^3wBT4lD-D z=x{(*?ikadrj8~M@xZvC*)FsID=}&dl4253o2e>vvo5U&^edlTtj5bi&$9(NmW|u84rm=-)cM4h&3~CFH^y9H$Zp+MVGvhng?yD8_$~(~G z<2so58}N#Sw4J5kyf2-k)T{F>Vv5O8m&!c3t;<8g>{Is5B#js`ojzR- z-AR7BpW{<|h9j|kxq#ex1~@zzj?c@cmVx^U?riL_USsphYgoVhDs;7KATkN_v7fhd*iJL{$okABTlVQo4FFZ>uinJbSN{s@mtFx@D~GpThDP96zbVB?oW-*K z;AN7uqi`wRJg4DnkdSb#Vx=3!=H*v$^!Y!B_>Uz^obci!7`&U|CX}MdNtbR{5 zCUeA(S2+H^--fPMIC$nGnC`z1x>%$|RM?sZiNylb`3JH5;FFl{y|?((TPSk!Bo03D z3|8O%E{?zQHR$ylfj~fry0C;yWxj(?ege}&7y9w`Fu{8LIyOIf8S9_C1if}0mXu&t z0q`gI4F}DdsKa|+z;xk39RB`iaN?i*LrfRW*Y^+*EZd^- zX~N>k$8q9c{vmL5jMeimKyTcDY?yduZkZ-b51q&1AAA;vpLq^)`t*RPePO2Swd*+k zt8e1yzy5cue()mn+6@vWVsDLhMPmJ`s}=O>Rp{GSAsc$0iqY*32hyUxC zO|3l$aRI9-5L5d!k4Equ7aq@9n6Af1&^M2gRWKtpGGSI$7cW6ye*;)9aPp7-1>~+f zZ!Jr7>JA({_bjIK58(Lg--5pRR(T*zH;x-N3LG9{@zj$zc;>^H9=N{~q`Bhruh&?; z@B`fVlmCR(|M>=R<7U0rFr|JK5o{{Kvqz*%gfNxLpS1g%(wd`SEUYWwPZxHcaG>sa zn6y>ZT?qyw20+dzs;j170LW^M&1*ly(HFjiw{Q4 z_9(Dkg-dX0(_%7Do`9S(krm$CZR^Wh4}+dF;*_##whN^R`qa>LAu zD-q$`q2KuQhSJdbWJ5UU(8f|v1GwLo>W>YPtW_MwkTIxhYYJ^lib;@ck5&O-y~gIH zSFrxx_i^x{5Bj61?RMfQY43H@RGz;@FLE70_FS5!fb!DoSbh7uz&r2MF++PzAf0Xq zW;#z9epki}he+H^8#`tx8a;Gjs$Z6LbQ-}n@*%DHZ|NW*6lKbWlp4{u&|PD$Nx8p- zg#*PaZ)5$#zl9zhV>;!}s_(T#X-jL2c5TXMoO>Yx6zl)@b8LQo5xU+44${t)3vb?R zU1F8iY^-Coqg(Dz+?gr*I%C;=j)}o5d#n++Nt|81Y;2PX21{w=CM_gi_xs))|1K-X8u`o%?)nvg~ z-Vv4Nds`%3$yTCRRBpb7$5z-nHPUY4uiJtuusVj;#XoAh+uf{abIE0j{g~R#sR|q) z7r*MnjUcoBAN|dmDbt(G6%cOAs>sCiNZweu|8@bEWAfX7V8H@8cSBh<0uH4?-74i{K=H59POP?Lawkf^d{#ET zn?rX^EY}uu=w?mYHFXP7ep1fDj&jYeK`H2xi760>-A-ZizV8v7(Y*dCLReTDxAs-g zL3OZCf+TM(D8IiH{Pw@q6lcmjqC_swV(=U&Za3YT&_3iI+L_Xf13}q)Y(d?7u69VQlI2mI5mwieyS1T78k#BDf@M>0 zL0Q|6UW7*DT99Ram?X0YuCJX7vp5mZ`{wL_0R^T-*}gl7t-oynR(o&Txv5c*HA;;-LK z*r8y|XllF3-vwzhb ze^FZIL%3z1Cb$?TSr9))>5~9%ArXT%-^~d627~#xdhI`}(-WjJ#tE)7d?JRi38@o` zD1rLoA+p0?Q9RIoyPAO=sE^0Ln3#U%gq5!Cbo@2-zwC zfGif69y*Wdq4SWMDQnF%=e^sy>Arh#@XXU#fACaNHwGmU9tj=uP1$lGsMW|*gK%&KW)O$|$vO^Q?|SxXm);Du$yN^MGyR2bm`y+qT% zgdto;d`V9`)PSK20DO!IIDHz^gXhY-s}_rFJ&4d&R6?r`|G}rr`y%f+xihhm0;|mi z>z7}_&HwmcaPxosIdJ((wTfAIE!5k*@)|Z5FF{0b_-mp2NW>p22kPzIgMjg?s}B11Kjt&fQzg=BZPJ zL`$FSADtmbM>ziaH*x&cuLD=!Cgw;rZPuy$(c>emU;HtSzW8M11^c5Wc#b09mgBRZF~Kyx zl_aFrawf~EJ869J4kz zKa4fny+Cx9eBNj1P#24OChDJI`Q+oSxn^QobLVyAX}i)!%iSr9UtB6L2fulQAV<|; zibRX6sRn4H&`Yml{gan~zyI-ihHMK%2@c0)0x(6)D!>p=CKUk4$rCv7d!L40`Xz3> z@pO1)nkpYqVSiwv$7SpCqANjb8yrH`BPS?``qf zmFI3ZHoBbpG(qmV69*svC>D=D3eb|!&9vGRCd6=Kx(M>y>&lwiaQ9zbVKR2dNCagq zYil_6W7JUq$em}fc=Y|4&YYe%k3^hX-L~U4BVo{+N6_Qr`luzj8c72M*jm@8o8rH9 zmERUW2lHr+Jj$|-vSVG)HcglwdJv089xhK-h`1IS@RpKHX^xct%vR9aP2h%pNoR>X zf<|U+OEdtO1akIH$h~(1%f(LZYfGz*`{tILL4q<#YU#e2?i6Zh@rkz}a4ihGGu#aimr9oXj+9Tt2YiIgC~?pC=c40nZFe->a(EChT~<_$XxD}_IPmv<$|zvmiG!_N z`d_@PYDdR0tgZKpP-|*=p3T0%*H}8z)c6aK9~i*hZnteSgZr+1cM~{#R=WUDpl*(n zFEjMEXz@OpJY2rD>-AkYlEvYeFieorHM?s`e6b&v4he7nFf+{&D(=s2f)H-O?@P{simY%G|RaH{u0bO zLw)cex@v9Y5uNq6O$6;V^>%`gkssgI#t~pu<>Y|(Y1ROvXp73eaNpJvshQd7Z-BD? zq;ZMK6kM4us@jnqVx)a~ep6$hjJyRb#B`p8TQ;V7A8nZPTieo^Ntkj^2g{&Vw`nr! zFob7x-L~1a9Gb;Dtwu&f9Ua&(YjQ3KG>P+o$J43|5-_@mb$apUglDi zqjvn+)&p}Uo7LCa1!x?&#P2kO0JL+AHVWoom`hdi^*r91u9&{1bK5%XY06s&!zcW< z*}a_>>@C7O|mW`G7}YM*uS-1qI~T@yF80_g^(a%G&jo^rOZ}c+(T6{k@3!hFp!za7=X!{ z^NZ zK03nYjbD{l8Yy7E(J**^f?|p)!0R>iS8qYDUQcrk(Hm&@T+p|VFqjV>@9511h;B&9 z59fXW?Iz{it)|Z|t=CL%_q4wmBQ~15EpdMJSd!3+}YDs~0MxtuM zYE|BvbLo<6@jlC&eNFj(%Osd*sgbeG-n2-n@y`_r8zycfJR`VQ;zZ0s}X3kpZdehK*wL+Rw21=JU|EE{FLZ zz}K2wHph%Z>sofEXqge_b3KF#9p#|PY>`-CUHx(ijun$XequIVGg-nkC~R}V9C%FE zFw+RIZJ9LE(E2Y0OHKXo-i@1B|KLYB`ofp6e&yAIi;&Y%_yM)(maP<^*t~Ta$6x;6 zIR4i2(6`_5b!oC71iSk|hTEt$fV&%q+6m)hwnvGPWJN=GDqpmkX({?_BZvz9Zjya8 zQM7;tR(irG=1t~ZuU{|kJ-+Kse>x!vOv7v$ouUvaeGLh_J+W`Db*mLNKY0m9U-~kR zzw$NU>NU`6shfW;dJqA0b&U1%FW|crugbJmIAY~R-BuuoE8uU(Q3Sy`{k<2Jvz2t8h9cSiubrYg~aUSL{yE)I`e zy6^!tnyQ(ydRGlvSEO1eM2!K_jHq0U!0l$3?}|9kiF`h4(#UEy(vFG|uA`idGKx_N z2C?x9AZ@NLt3bpgOz;RxYz*_GJ)NvZTmyODcu3CPa+fSASv6H_%Q1y_u-{FJff6Xj z6te9-xzYCn5!$(K<^&xVTtVCA4`-$%hGA{=zQ)2<+ccXm9>@E0vPA4L5j%-#!|;=d zlKX<^2nt0jWUkr=3l+rzT*ORh@;mDOIkdSI($cbjL$aVFl1oH8{XVu^8=`A-pC?V> zKl*?}xjg}3SkA$dd~%(@Bi1JI(wOoDaPmbBf?mEu6!wemU~@amYQ1 zOouMFu`;zoCNn+6QW)x)qW-VXUE94nK#l5D`|U?XgQ!oL0r0+7r@6DQ1SHHXN4=#R z`Qo;3?QeS7*o0DNNfixJDVxq}dLsHoBznx`iUb~NV})ilx=pwtw~?^2Q`@Bos7CBWY!biKYAgzjjF9&8sPoj;Dm)0iH zKEV;acqNpAH)Z;TiMJpwnQwJ+mi=I^H2S(Um;>j|3=-LtwC9@IXl;7^QoRX8>EPN;ZVMXf)Hvq`6>7eHm#2$_UCgT&xmpIuku&E*mmPON@}fs5KxfLp{4gFj-aNw<2Vm zPl{If#bv$u2Y)|is;f6TcTfW@o4;(;ja^c#M>TyAK;1Q|hDb2s|^rofB7<#idGVKwuF-DoMMBbFd zSD58!wbQ&X?%`qNGqH7-UcPGWD^ zU=gHzK~k~G&|F0Ut3`@s0wOy+-Ts=+rlwYYSKz5dyqzOd2J3L zzl_uv!10DCGm%iDcu$GFDbh9;=jkA12J(9E&q zz6jM(KEBQ;;31OJ@pfTZsgiY1n913P`-{*lLzII=p?oUavlw9PgEgAEhz21C2c+Kwi<&&{a~Z4)8L8OaQo3sFmVS{DPl%o}OUsxG{frA$FebXIuP zhVkAJiwCod)${Kvz7b*VeC)dNm?G81)TZk>8)yI~?PjC{Q10$baB@;ml%!Sa?=`^3 z>&&DHgKLPu9!?L$tMOOc1~g5!qb)Wyk*D@mgOdov5iO4&55;F1#k}?WIG>6k6%_!j zpp{jKlDlDRGT=r18%sty_^!>I^Olf^+L&2(_KjF|S{#THQFufjIX$2yoFA#B`RyZhH)k86|mva3Unr|WSq+%OXQH8H3yoskqt zTbuy1+CIXO2++rlipVFoJOZ2RErt&{zKINCbq&G>o;HBG0hx%cHaCP6f7@(p8>OXi z04BLd3N~z9&^&~B>&|y<>-OBDU8PR;Ez2OeYYU#i0{fK{ailys!0m<$1qW|FZ84nJ z=N<@Rb3e>UwmxAJC7B;j8Z|=UkB^EEh+THW4~+Mdl`*SG1B(|^&q*?{r! z$L1@KT|g8v)p7c;-MQhQ$>M^rT9W7Kwi>m*>7cfihG|uJL|bUoFh3q0M zFesq&64WThn3$;G69TfjsAv=f2G9}pgSx99+!YO}2Uveik)GA5ewEg1Va|1@=x;Pyj3t}zC)T-c zzoz+u9TyK|)jteh(` z;D6}gLagCR0hn*76kN#wCv*`b8GyswI1s7kNaT!{fEXv;5ofK|nu3vU_1cRKLBd@TQ@Ei6F6QJ?HM!O!+{x(L<6rNAv)=55QOzlPWhqI{ zjSR5c$#aW1xy}c;$06La(Y*xlX>0w3EDGGn02k}7*%ZplRLFsw%E3MJO@BuPkU#Ja zcbp(_BL!RxGHHe;wff^+2G>u>ah(dq7O)#K0ekx={yBF*$P%aJSOMmjHHmAxvW0cp zt8@K;ETVH`1(=8Ie(Z;Hy+9V#xv>Mxz*+%0w;aeKJ2#eqVJL7nrpksp7|5bKS2)0a zId?FSYb0>4P=MLsl6(J^Q-5;@54jg=+fq2sO~Hz-hVXEO0L<$0j+BKdGX;Npqt{os zJmk~Y_Q1L83|RfW)5G^!;(u>i7{EI*HIqAp9`Cbzna*hHhI2Lm9I{{?%y{Hgdzxli z7Fd?00Ed;L$qk&zI`y$@{Dn;5j(iW`=!aXNV*G=kjb8%Qi`UtJMSq7ZT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah-w13P)xT`>~eFoJC!>{2X zL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw>F+gN+i+VD?gMXwcIhn8 zrz`>e>J^TI3E-MW>VM=sWZual)ns9B%8_$25BcpOz+KP;+J(1(UiAp*Q=dc!FQL}*R43bTaVm7wy#IrC-VD&k-4FWYMd;wg6!1z8a3SP;O>P#-$->_l zEAM2>hI~v3$Y(TlIdJE^0@|6AK_7#uc{~E1^f2gGJ^}i)rGJ>FDPRt4F~}m-WGQZK zw?8N6;NJH#XeW;Webf!0kG=!+v2#G5xX^L14Y#o*Tz9&z7NjOib92f(6aq==Ntoo74a!u6w~r!$mq|FDi7h6+6fTa4$$0Y>@Y*O}J#< z8ic&ucAQ^e_cw)#3uFTLcly|p7IMmPAXha6205mSA%EQja0eR?DV=N%;eS$2zHI*MpiObUuA|j7`m5?j`@^G6SO!-;(G1aCOu{sGli$ zGck~Eqx{gt?U$`9P3JRJO>}Ku- zRew#6AKb$jGi@lro`A;#P%m@cnyJP&(r%f}Zq^V3mIc=hnLfVXHRn=pj;2#4v8WiM zav|%So5|ksmkM-bV7H;F_%f>b72G`eFJ!d@wTC-#ALO^GRCtHl=K|Y}dX%fTm0A$N zzc4;N3AGsYM~OOND&T_#%8wZzWYfL@by`|620=mAU7(LZ-At!cdlWCvu@AK#bt~#< z9;~k^d5}}7VXmK@h?&@_rUHYJ9zD=M%4AFQ`}k8OC$9ssPq=LnkwKG P00000NkvXXu0mjf>-ZXx diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..3eaa1fb65a92fe5fed88b2ffbd811a6c51bcd8ad 100644 GIT binary patch literal 11154 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 P00000NkvXXu0mjf>-ZXx diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..fd80aa4170174408dbd3cc3f8eeacec3c652bba6 100644 GIT binary patch literal 20412 zcmV)tK$pLXP)E3 zkf33Zwhe+tMKQz)3@CyT5H+;XNC=>)1Z*`RK~V$;24kBLjW`ioq@kg0ChdW$qJ}r! zyZmFX;kVXa`<(Aq4|Pj9FYkWm>|yP-)?UMJ?{mKI@H=1pYN5*<%tRvP(<+6C7|ws` zh=X_PJKb?px7CL!>m9G(oAIAJJf9+&XtrX;8aGCbR3zH1#1j!>p2xs)At5HtVvFpm zj7oi{!dg!|Z7a>aW2Pf*|2(!7J|y+;c@vOB3U31Rg*r1ie*EVK&!>2io7ZWMb0$(F z7816BIT&P)ex2iLTN2X##gIjeyfZ9Bqn@=)*y&o|NEAv-osFG9e1`H>CgCLc7=QE^ zbs`~F-_>bwpU&g6Iil9PULX*~7$$?N$l2CjsxK1)*{t5=_FgEb1TQ428^*CJ&y;v} zOLQH8evB820iTOJ9|)@Zqeg6TH{;|fqg=%5#mmhA$0hXl)WhC9%NT9F#AydV7A3up z8K$+B+`h`k5QZ3L!lSVWMW{kr)~E1X#u3@>;|Wb^bCKI*V{F4&es8B^Nz$A3VejXT zjj(X)|J>vG)Vf+F;##9Go?D`^L?zWju$}#tS|9y!{5rUlYgGrZ!zl%cVi?5Uwr<7f ziFDH1)@f;WQs?*Kn{`2qInDx8vAyA&=ID0s#exck(s=^z_EHH4r8;{ddOlKGv z9CLEwKTUBlz}4I2AwW`q#c*k z!DKJ|6F3j1P~pfzHWq9FW~VTg!HOAG>6p-ihQT&ravBNaQWz>bJ&TU?0p?khXZA6I zXRsra%hYU+sX=PmwiDZ_AdQIX0%C21yeup`uUZ9YW$L+%+IHgM2FpE0!!8L@=@yi+ zsFsFSc8G?pC`|p~Q}7yeROu92Ud6E0XJc4IhcPD~2Nui_Y%18InP&xRj?AeWip1T7 zXOCwg;)|-h9iF2EFtkO(9OknxpAdCg#;qW?7|+z+)Q+gn=kH@nBH~ zq6Ho`^3MHZ%*aOUpBT7>pEc(7E7x_Opgwf#*4!Uu_NdekmEcx3p3F;Zcg}s$X}pQ#{?#+n_P8;d+Q;IRrScxJ4TJI3 z;d$IkSm`@>jy8T{Wmvr=W3e(KQA38C4HQOb2AVdxZCH+lg3(AadbABELPiI?L30Wv zC#aH~uB1vy8PAmwx7C48qE$5yV^CH!j!`EHd3HJ2^cAv18b>D@7sfNDT9i{ehDm>?iitsONYkcNKA$l2+hI$iPQtm?Vj|9Vj^S-t@Lqy}~gU?+= z`MlslI(1L854W5zp&8Oni`PnvXi96?XBraDYrh1oprP-(w`1jWJ@F*iXCuwP_zc&X z=lTA^v(K|dV1y}PH+uOLyq{`X&{-2jUh`)&YBFuxKH2F`SHTd;waN z!-9bW9D{7nG{*OZW6B_dRNd2d#g=WWaDdnb3%x`J^NH{=B{G}K6_aU3z{Kh4#L&G& zB;|7Lkj>+os$ccYKrtW0&964ZzYZRyAiCejg= zHsFozptG<>6D-@Bjrz1pLU06>5HPsXRyiR7CfQZ;zSDjY@FFTt$P(n|hpf82@6}-wpQ+}l zspI#~SGm(Q2hI9P3p9vgDF9t5o^er0z;lduaPRPinYDM)I;M4morlc1izv#F7|b9d zxV@CbKxlzcdsb;S@x=*a3TP$FVUfu5kKb()WNJ8oXcVw0ZO>pN?5wxV z#nVD)CqJ;#Pl7pah6qhNhe*YBN_nj}i7abR^;Q6B5wzlbOKJ>sr>oI7WY3eDFY;~Y zJVJkiDRsxS3|~c_ft$qhSj-;G&{!&7k!b)@1`RFXgj93$G9U0d-^iUZIvGI zEzV6oCQdg)q>XOk{he3B+tbw$an~UBk;~H^SD0r4o{{5WAE#vS!H(D}Som|KCxIXw zI|aIYEFml3nnnR5luh^_PQt_?I{QK*M~k%oZR1ZNdVc;p1k3G+m>8ZMl%(+-UGie6 z&;UVJ4_U?SV`=MR`s@ie@}STOkRCkDlj)k*iV3L~;kiD2N{C5sjf! z)El_R@9a^u)_U=_LkMv~1DOb!+vCPMF23sBK_a`8HF&e_Alx@^AEGKN`YBu3Bo}p5 zck#5XJ%}xTi93a;yzU@u^@9gD22WHP#q1m>)fJuDwf;y;^uOuU$1pie&sUP?L2Tw3 zpSFX=VDc^@V%GcV;WX-8@l0?mh=O?=YS=n@nVAxxfr10@_lHSGeXScIX}U%YNm@*4y$WbB(W(3Av)I;S=Lu=0XDnw~AK>KGuiWlrPS z=Ee4KeGC?WgrGm|lhb!No98Cf4?(C1nnsG@hwNl z1bLw$xj#vfHx%rBrZidk4fjS_ye-gXmzmvgvCOkq;W6nGcuMo;vWg|TtS>MYAJ=q9 zneR*Ud|IY1MLYW!P{62>_r(WCtSle7 ze12diuKT_yzKt*NS&wLs3q+>}fi>0pdCx!6ul@4_J;Ar%q%vMn_S6=5bWu6c6)Cz) zI*GvzTtFv3UF!M>o{5>R|Dn&N>!0;$iO2Un&jdV&9LBT$6c~7igbJ(uIHX8|TA3M1 z2mvwJm1X;ulFIEod^sF8CX}7bg+mf{h-1B#%aV>b1c0&a8n=gv(8;L8=B}JOGpVh8 zG8+&00F(uek~+Oipw80nn4rn8O?uB@p<`7*L`nv}*>n{~9g*>Pp6TR-uK%9jMK`|W zPr5>;9iI0Y&sH5qjnQ0xXr{l{Zj9T4Cm2w|$*aVfn>=lz!=)^l_arbfCQz1a$$6Ul zRJc%$ko69y?VrPzGYo=@R;+O8!=B3kSY!s`hHE{`1f+EARpM!$gy0@P2?#b8exWs_ zCr+R?2Ou+?qj|n|jqdrQe}L}$DIbMQmMnHHi_2hDIGre1$6T2UrE@xeA$JQqDIbyIn^F}1NT3WX@5YXSbI5N853CE-J)cQuAOEp*c;NmIfYjx<|9(0=aD(W+`zCo;#_R#e7PrJ{?nhs3 zW8XZoOaBx4VFGJ`p7ZWS&S zwTJ}IBoE&U4Q+j(G!2_OX==^`mZB;6*()!sEgO6WA0_C0p#qHe+%9C z>My6m2frY-t$nxj(&=_jCzt8JqGxs`RBUWEDF2I&;P*SqIP8m!yw+kWH&zBAWHbuW zx=`>u_NarY+$Z)fN1b4svYPBB3jgmJbKd8iX?NxI=q8ki=;Y-ur3b$0Yw6@=FYWtH zyljloj6-C}Z)oTA<6cYm|MkC2ColZqUA{Y=b#>1q80_`$bRLibcF@uqtI#m|dc|zF z=ei!8J{h(}+@Kxy7JkK_@tBQ4)Kf663ZxWr;W%xDF_}McqKOf5HF;YGyH&o2^}4Yu z9cHG(3m%~xU-_j(CnrT0A@ZO>%|zzwq*tPVWW>Zb?xXv^<|~NrzmXTy3;9=@ehd~XhLGuH90Ju4qt13knoZlv6~q3IgoNknLSl(6upQ9p-$ZkPqe5Ni1SM7D=f zEMgP!^=m#+^+>m17j3$u_QUe6vekK4cJ`ZIN2ee2(FsDhCfIaDv7gF;4@V5Z)Eg<; zZq*ABUH|OY)8Qo_I`Q1e*~wM^Uq){$J#CFM)u%B-eu3bJ4=F?&-LvMh)L}$!A(cQ<>tfQjCiB@e#1B4q}II-)ub?iZsj*jth z{SBXyFrTGXwl+W)Q>Q&xqr_mx10KveJEMDE|LJX1-jccg@7h&pQu}w~t)lX3Jd_Qg zglM@g%{-H#5g9Vh@j2@=!&Q4EW3)L%hASDyIxaUqB;PFdVC0U$UgN9LB48SOBb|0I z1dY4Gh|Aza9KVa=s|C^7Ykn=!jr)k7d@8rW3?<@`Do)Fa-HaN>JiP2Bbn?qzk$BtU zWl!c#o@%^XV|0u4E$CM1X+dNsgJiBJ)r%)Cm}hbn2IG%Tc`-iv9BeGsp6%^OSAccL z2S%V=2X=;-h|Lh)X(Tb6>0f?=_SzC{N9r!>cSeqU5)mDK*$e6Lf)`BVcl)lPyP0R^ z%D>RrYd(@_Bb|4~w8GG}ZVP&$jNKS3UhH$(C)p2?2RShIhyj5RRy+sPFlvUo9YeEX zb$q~@G&K~(k(x7;nkEBTWe6hzaqcVHZyOEdF&EJQ>$?fvS_Ibq$CkTN&ra#^q8GyW z+K1xP!2_zDdT>?eoT~2SrL&5odn1V=?+|UY#HVjwq9XItm`JP z<1N)Q6F>L>p?pLcdST?T2XuT&kT#@FBB8^>54U3;vru~`efH*{8ZVwNohcf+&}L&q z$xsYdQ#344Md@Xo_2V5XQ;9(fG3BuEp2`q}C?-lc$>p2e<{3rEWBRX-twkS>vAeib zT$a-*z^%4RLlf38Ohj~Y(($`-teY=>lx9EBh;+TvCz2HGCq^T+}NYdoUNiTR^&sQ?8=ym$rTF-1@_;lR9<8okz z5|k6NmDwB4br>#z&NOgpSp-Zn7XkLL=4xWQ zG-}s%2Vj3(Cf|&7rw8*~k-^A*M3CHq7F)co7L0Y*Vy};t@4*eadjS{Wq^OJW3{VLe z6^D2ype58RRdLI~t9H`9?NnIm!2d~5E`3Uh#T}33IHjzs--82{zpgFTcgAwm;!8@M zM6@wk5j#hxF3Qci*@FYCsEtRrj@Vk89J?mD44>LaKMQ6SLkVf1shbtM4BFWsA9I2n zfK|vMc9X)&V9ofYtfU^!tXD{}w{YoT03J1hY|-1onJbtwwTEco!NdDUL7|@720f__ zr=x>JEBU+j{hHk?n$*R_1vNT80dgZei$%(7pv1fWv~RpHuN7 zxCZBoI*48}f3L=coKygY)4TeO)G5jxaK_L}M_TZ_ zXRw!v_^YzZEhu~F7`6etH5Mw^7IlNDdGRNIPf zX)9?ocJ(0M!}>|isboHm<#~0zD!VKO-)r0Vw-fl>aCYJB`BIwL0y5?@)*kco&`4XX zEi6{*{4@;Nq)w?x>EYv~?f92UX??ryx*FzcaeJAu*+LD?{V<&p4XkK-NMq`st>HRI zb?gFp;uqTP?dGiD-Z5iNJR<)z!?RQwM8fbTo&k|GHoJGkSFmuIB19N>7`(*i&)Rc2 zRqpD~?0S#XzsIy){}D4$Fvx;AzcuVDFrHmEiB zmc;d!JPj~v8VKvhJ{%FcmLG9Elf}*!+`u-S(eADOSM4L8mUhlaT$tV?KJ2Ib&SQu8{EY8!O0ld^*$S2p|Y^V3!Ph#x=tv z`FR7nk6F+p$_XUfZo4F7y+6Vv3Fakv?sD;GuUG|Ax2NJ7r+o^ccCf zj&7ZB46VAZsJh)-t9Utyzoy+`g~?~}5ml#FDeyiE5gNMTXpG^(yOEInI6J&F2*NxT zdPjJeL>xDO`XT)(GuSV;GW--r7cI9^XNRe+Zgs473XU0P3zvq`g4e^Wgr-cPj08OW zCXBe?eRaL6J7$OC*r>aLJ1q~U3xx%-CNszZCMnTAkt;82jkQ?5P42u%dX_^6PmxnA zU=XHki-E}{6|#DvLvvJ6GjY{m_Ez7h+|_FT*eJGjUHRx!f5g_&-i$X4*bUy!EghQ- z3~Beh;1|z3J#0nZRW$F`DXX?#Pb0e8D=Z>V1`KgP9u*KktQxfDyVGVQa zax{+_wL(#CYtcFxBYIJdtn5h>C~&?9T6o zZuJzqKsh4ya<2HR$12ixk@eWjvnucEr=T?16vDE~dukDUa;Cy?f;ZBwf4Z^KIa^zn z7~#||O`7!mSBDw#G3nHlx9Zc?9kbZ9sM8s9N5f#%sH^3xF~~BlUsql2WhiTdJXaa^ z7Lu#7RnS0PuIkHV-HSRwT@>!1Q01}eua@IAQRrp5-bj*LFseH3%E`OF$3*%qJ?|Z3eP9_I%84Vw zdXncxhv5odB^g6w-Mnp=dagnLWsl3yx$Kx-T`=mQik-48m!;ykL~twIML8cGG6@flBZl_PJp>#jSw zyD|H9MaI1rEUnhn2I{GycwG4y~>PC9^ z?h=!2Md|L?OU0e=Te!29W54Xolz!!2bo+u?TwTW6FzRXyTF>M^ePCm(;6``7m5sVS z*snACV>02=*)PtE%myud6zHV7_0s5wxSLha(FAD(tbwQPssN3Finclkgdo;ETzB7zt(zGdHOorWDVM7-RwX_*Q3z8wl9JOBB=UK&5wsDP2H>$8F( z9gP|Vv#gmOKX5T$ytR^&N`;=9Jm^$<~p`%?BE$}==O*q%SB1E_T+4s`<+uyMnVQU1!`mM#|7T(;-2Hnv`!PAd; zHSyu#0YEH7d#Kh!CnWY(0eTUpT_Jw>gXr*KFK&6Nk#Z$}jjXlrWi#TjdOrWrx6+*- zc(Xe>Ny!+Ps?<`GV_3ft861ZXlL391=>t8p_wx8Cd8Bbgr+EQucYKqDsu(W>M;v4> zCqz#?Nl$&%8%b{7+*FpGSNhe+SG*wXz@x**-O)v)(~tPo#Ls_(3_%6<)9C9u2)?i_ zoALWZ5uLsEqluf>r&S(SJa1)}W3t`WSm@L>ThYy1^yF8)k?8JSx0}Ql8RjL27;L&C z(ZFe1Am15ru%Uh3ngsPJWM8V7zV(gsX{mrTQd2P$i?Y!d9+I&?DGEtAm22%^^8f%K z07*naR7Bf5|M~~%$-ng1=;FzzT4nB)ttM`(U3YYoy@jXwk%#HpCw~HEuNT*uMW__P zy-IvmJy4vU()G{y9h*E?+4hcA+r5m`(ddE+5s^H7lb-zQze;!B{6hf`1QxN7k-~Jw zbK?fVZ2z7ds*y%%lbMLpzNUD&4=F@~lZ`0UJi=Q18>x|YDf#HXi3_gr6Qk5$yRHmiEDYTFFC1M7M4e zU7RoU)*Rga+6BqoyL9(Q-a=1*-8a#lH~-Ki&)gv*_3&rWn^GkR5{)Ph1}B7%WW+9$ zXE_ZFVbC0-iU)iA6-nf4etZvjcHA?YzxEcu(grz^hwImguAQ~?U0M;M+qXB`5b^UL zp=+P~Tj;(&_J@fdd3c)qtw^_3Uk&HxKll!M>Px>$U!e@)KmxwyU=UH+LIpqkFg^Hf zf0s^v#jBR%A5*qZJnSQ|upR5QTz^P|W8; zUPKRm>o?G;8Vk`rq}XaVVcUxfy7{JWr>FknUnP3_=0syxniqaBJ@EB!q|;ybQEkMn z<96!?M+b9+WbckYZV_PmGa>~*iDdp_@T>F|Q*FURe!t6^_tp4rdw$0J;;Bza=$_B{-E`wGewl8y%|>|)9z6=D z-n~n7q4?fD@vyS9GorJzrSlw%`M2bd_dH6Ee#&Q&{Or#+j-Cx0jk4CKb6792i2ocz zN23})R?lPOIN5=6JwlUAC7$JAP#pYatcOqP&ef1um72=z?X&))cKUd#3m$viUdAx~ zf{*E|IBaUj5sQiG)<6E|bpG~tOcAczn? z5`a7c&&G>0MfT6K zFi8M_6#LoslL_dE&l%pZ6QcMfsU^?Bi|-^UZHF8ku0pR9^bIYGx>0YyKHXrEP@CS* zar}k88UY*5VI1@_zYWS+X``AWUD*T!v^oFDpCWneal)gExb?uhWVO6AP=o|sSsiyp z3&-tfVgD-6`H#Mp==Pm3I>xy!F)t#MJ|m$xm6aao(%MhkXKd~f+1Np-(?K3>6V7ZU za_ctFzX8+F;4l z4)`J|kwYWDmpdVia26cy+@XsnpWHO8AwnOiD{Saxocnj%YV~{tD>_<7@%q@~5dg{& zi*JaMCHi-My2k+kDL>Z$ZN@;3IMkQGK)C=WAtJfhg&C`Dxvp$)aky8Gc)Y{Zol$RL zd=O%Mc-}45gOUf?6vzyldYJ_?45b165+u+^Wt+jWUM;{vWR~}eXO1t)l92Bwjwlz= zJQ)utSd=1S)_BN-XNHg{Tu(IBnSz$`MfkjkBt>`&h|svdUDwGg7!a(@H!fC2wkq#1 zcW0cnZH>-dB;PY~W+uLVO%0LZr)@(E2@+VnM1Qw6fotb22N|O(7M<(da6N%>bs%;c zm*v@PreNrpNr;el&`-sK+ovM&N%ROg_dR>jQ zo>%8Pc9FQk)O*);j6DpV%XI7kR#i_@jL>E){&+C)|2Z1YyxN+GbY3jGta)B z!e&SD93kF}J0dhZ%aIIu#v(-+A~eE)Pkl;E69U*fV*&;`nU7&42i0)2H3xDUfX#^F zZq~6!7hPlg?dK_0yBM_|$GS}YvAlX6fjS7%wCf*2qz3{R6Eb5CwBi$EGZF9;`&+OB zSvU}UN(IC_JiD7lg&8$5or0|=Jc25%sj%dxgpZQoz-yEN7KSmr4MsRu-W*vaES&P< zFw&4gpx7eP@ee0Xs~Tu$urnme@^;4-v{<#SzQJ?OF54teVOuOeq{zt_&%Zo!k~!V^zm64Cr}a4CDt zf_25d+K8SODMcCI-e-1;7T8IA!3A$JnjdGC;2umW*)0zhzAz!+z> zWfi8%Q{M_v41f8v2A1&(R^x@i)ZGQ_)8XD#)U16ve7(ZPdzgBU@6|Tqa9jkYwT;3y zn0KjI7If?FMzqSoDcMaiX@NFo5CVNf?av8r@l0xS`k&0k#(BKf4Nr=_VjX_Nz%ATi z1{cNuWt>B zcuqq#_%;&qPegp^^rcIs? zIbdfZf&`LqBchIW8HdHK=1^KnOGek)p`m!P$etMWF#+UbclZ1y%FWQU&9zVb&2EV6 zU6yR1tF1h2*F{sT$GWb3%L&kVI-V;J-u{E0N2jm(NKfxt>DCn4%;wCTLfm*Q(hdqW z!G~3#W^Ar7xEKp*_u0LIU~HY%CC{cvBC|7tup}Cxy+10al-s%JfXq=JU?c=Z3~UF( zgF@avVH6DES|_>9m@FGNFqoNk1ao#i?Kr&hWpwts*8)HJ!JvAqqGvVM+P|&8xJdsy zV7c1v>vlx8BDOo=$q8M5!)H3AfQUh{mxj8;G_JZ`0ASx)z+mP4lETC?M~uNids(|` zEB<$jXM*`3Mgc!~PHtds@j*Ee8jCm^0C7<9d;mvzB2e+LC6+Lf35@+=f#H0GMMqJ7 zq?L$>4+pyU3qFtdf%{YB?-p~xCr#(eEixjy`(r;&x4!Fp=={fig5>6{thkGd>32l< z{u^}m@xPv~f5xX0KkuOyCm*}Jvcmn>e#6Jn>BoO8-F@>9`K0GVNCek4EBG_!(&i=l zfD`!GpvP`V63XA!2Rj1Z2i=wcv?*Ju@k29`@X4TZ0r|oxWg{Hp#iA}f)yDHfCFU!A ze`r&DG<>x>5vA5Cih)sId&6hY{eSt-6Q7<=2E7%DJ7cP;U(V0z<~RR+dg_f|NAlE@ z;h04y9`Fj!hgZFv?*AKqg-(CXuXdUp563Jdtq%FTc>6o(vCsT{bn$=QnWqx?tHA{0 zM#pmv7?s9Y7^b+Ld4!U%gRqad=E5^AcphaAIRq4G;oJ-lZ&#wj;QnI%)N?`SV6BCf zG3EZ&c8u5GHfQ4T7Kt4Bu{pMRu{D=rVgh4V2&#Af>{fW#1tqL)oJP=q zc@%;ln(^K~A0;|toaCA%EYB3pTF(katjio_4zGMUoqfzl5kK!CS{-upw*Kta#=%5~ z7yUB2_KCllPG0%)DXQZ5s~wL-Zqe@it#6~pKmGU8#p91t+zI8RDsOKSQNy3oJpGNY zqX)nF>xj?J(imIW<1#$U(>LkXzxn~X`|tieUA*gEMCWTA%H6yE!!+%2_nhSM$LaiS zZ*PB+t(wQWfg%Hplq*7$&Cz6YZqRWHk_J8!CgO{TbXpnL023IA19Sl#9_htNkynxs zKm0J=_oZJ%*MH}4C%Wf)X0n;MDeaf@3Kg~%Q{A!U07&P_FZl~}^B;UimPd_LNYa-# zc$$ppBO=77r}V(Ld_A50hL79iYsJf!tSfzW*TLh4u0)8=&*}VUevWQ_<2Tc-Z~rGG zckj55QWDR>1bK`Vv$fo|>MBDMQYeF!87liev@cDqc`|$+zs4?>rXW=_+=dpzJk`|( z-TC&k(s}Sfy8j#hI$eMLrxD+K&y+F~B}nxh1nAm!6Nvw@yz4)dDYH?$>)mwwU;i7| zfhSU@GxSDIC;pp0G5ON@IoT2^&$pjNq8{V!C6{XZp|V4l~*Y*ft!VzEg-^k+lN#47OkT zvPEL|5yL~|kv%JIw7d6<{{)?V>}#gTvV{||9d30^d)FKNl8B3lycPZK{>WQM-u<5B zs@Y}Z|1=)Z!t*=-;fMW~L03C1-LW!eJdWA9+3HvOdtf;|p?g02v*`Ngz5$S}$*I{M zOq3|w+prmNTcOe})+F)CP#d@#-?7p#?ZO3?k2aDYleFzP+#pvpAJBs+w-uq2U-jX1 z&+9*ZQdFnF+&}ZUnv|`GwrAM&sQbisf8;GBauIbZ)7)Fie}j0nrI5Vm7wF=D{q)2O zo^S0zuga_bR#CmS>oQw+@W~0?_k~|T{QO5W5~B??eBn7qDQYD&74$TzfmJ0+-7okT zhJ9hEUg3+LfGR^!9SK;QuoMZj9b;X8!)K-+CEwa{u+I)Ibo{T{tR}zXp^Mx`_x$be z(1jpt7Q?s!6JoRAuuQkhx>R`UHeLMO&rkezu%L^wtL#$Y#4!f_)ZHx*_ZdnJm5<6N{VSA>0`j{Z-f+uEyE|41_JNogd@a6 zhXY;vq)*s1;w|VfggAbY=R8}ggwKxdo|DOY9wifv0Rv`72BUCVg)WF7LUi#9k0!pi z)&X1cZe^~$z|qlK9mv7i>fA??Gck>VDhYQ*#O7VdDjSRP}b{wOvKW`=k)UW z@y!mK=!iP8qtO_Ft?J!K2p+OqD2|8@FMbgnKIBENl$D|FMU-yEzO{hr((p0;r}DdZ zDB^JFD(;|4iVzrIU_DR16=IVIFC$&?(aCen^)orTwasb=>Eu-}Cw{>rBtQFeMP}qd zWu`Frqz^LfsZtyzKz%a5u$6eg-(KxonM|0tiDXLMje}xv#FJq>QGW8vUzrTPGqesu ztYAeo)~@}EX60cu-W<_!MGngsQIN*53q&PtMjzb`!R5{(vew<5+O}KRc5>FfTYBB2 zk;Xhbqmx&>tn5ezG&b6mD580!R4WrWBkKV~3N9glL1WXEFq zPCjhg^?6_Fxwb#N=!IYpXkQ?^>x(GoH;F5QZkq8pj0+4+KzFzgZD7RkjxAc;p+J!8 zF|74aM~bBl>jaJH%QtQ;7aPYMD6V7$Lu1shTw8(v`y=Vh$9xE?VS7*`pa7W zEo0hR=*hDPjICNu~EP4|qyRs9?ID<0+7{f{bJhW9CDIp8! zLfDw$uL}jjiPSVTtXo9jx9HZGw%fMD>(y4?mSI*JD;_S#4>*YijxMY}#6wspNxWvT5ecHZi<1wjBkc;sfbU9-?mo*oHXp_0{-J&CJdF*HO6 zAUg00RFFMHLKKz`zU6gBk$p0457IG{2-VDbYzkZ{bxXlD67OMa?6-@pOTXlt8g5vX zO$=LlHVLW|#Ec!!o$MX9-h*Ma?lN#~4|At+l2OGuZ0IC=8}<`+6WgGaZ3{xU04BEQ zW|~)ohQ=jqwVV$^w&?NIDMwqpKWOJshL~|3HCIr=6xr3)NP?5!8G^N|Q4Z_248m~S zXcrM%)M>?{fb%OhXAVIKbw}iH#zNj!3&Yh>b+wXtYfZ5=e%C%I7B; z?hL={k9|T1rd$jlxL+ZjW=Yo(0h}$$!1DfW z7f4ScU|(kG;)cec7b1?n4u$QGvzodp-fyg^xkaiZKov%)2*)_=3X2g1U1N2}2)F7l z0||~<)$cjQ(ugY-&Hg*;JOY6pC3I$g9F|c+9h-2Y%CTy{l4TEeZ0Y$psDu4UqisC) zU~@vBb9B*X ztN&iay3DwRGGP>O9YBot{Q?Ezt%G$W+={rBzm-F*^wz2eNZImeJh@4MrWx-W&u|&Ini0*~&UujK(qg-O~AL&C*??wWNrS>nFtp z9rm`?;?RUzo3S=_#GS&_L_Z4->dC=542)@XZl@2Q+`O5}CfbY1TjA)fRsIAKHWqrT zv7Gk_L$A_tNM5Iu7P_fCAG1DK^0kPZ9fatdxyulhuZpc*Ppwq57QpOF3ulfZWRyT; z@<18tk&2gqg2Qg+i4Z0OUYMV}>_*wsV3!l|us*6zFgjOCsnPPv5&#`W? zoe%&Z-i8&P+Dg>e-1jD5p0H)p^Qo6WiAF z8c{oXwa*Intc<@GMm4vwMLr{bE)V#bNx+-?S*g74;DeQ+g_Us4S8N;oN*N54Nj$Pla6uV{Ib-cYY zA9Gq1668nIpz)J|T!m*_{B$s+Gjc1hS+9d_D`U3LEj@1^Vxd@dQ7uWq7Zb)>hi9f$ zyh#V6m-F!-e(+p7B9mSrJ~{K^K|Ja@ZO4hRO%p>i3C|3!qU;Jsb_RY-{mPhYbgPDe zZJhS`MWj8zj*bsC%9!K?8c951&xMV2{HzRn&sfvgn=p!|x=P=!Cq0jvanA9mL%1@` zcRC;Ktvv26qshl#k*u?LILR=a)7A;$A^=A;igJ83kcc>*Pq4GZ@?zdPyj&+{5A$we z=T&O0Jaop;85G^R4Y~;NQ119o=KEw%h>3n0&I~Qav4xvgMpc7OXMk0IsP8>E(ZRV{ zkvbNkeW0D_wTvr!M@q6q&}5CsqJNoT%}4k%2Bvea#ugjcmIfq69^*fvI7!6iim5E^ zRu!z^fz@?oDRry=zE=!XcIwSFNj4`ablKL!*dU4~RlKS=XuP`t2ho4n<)hSk) zYAYLdV=rMC*VBl)=~FYhBNGZdoU>bwX0c#rKN$ zl^(Hwhqd=`c;fl)-Fe&;nKetf+^P?W$gR{eZSO7KN+|j;;m_%+hSNYStrsBV5SSVm z+0*Kfmpw8C)(izC!550czN?k{Dw5Z_t(ATkh4Fg1pp+q^`Fl8Qh;QXtXY38fuPhzU ze<$lIdavNhF>vOX@l)BIFzBR(h_HbG$UjHcpN&6fvkXMcMjdkGMGP=leS*QT zQjp=fSA=0m(S_UwJm`*^@>Y=)+a5F4-pYQ76)nUx5XIHQpjQhB7P2ARS(INLdl2K8 z_DeZ{*2*zf3+y#C3Mk<46GO6QaLeXs9MLv|xp@R8d@42ep?RJNB)oT ztLUp$_}0q2maqC=7GtmI)}uP8;W>iOM*n1YTWhK%DqE(77u3-nzOVhZXszh1#>9H; zKk3VO)ZmtWy@AZGJOsyA&*F~6$ zV-pdj37MA|jLNpU^LdxRc-VqM$7G%rwyxuB9mi$} zZ4Jh!x=@|?KjukKj3;1t7Jh@OLFRG&tiHV7lu{QZt3_T?(-D2PJ}d1m1$T=iANTG# zT|D}j%fX;n(nZbCgCx3sE!Ym8IwSJm%-cHZI^r1P+FA^Ei@@%DOOLDL|C^WBXC8Zl z+Do6SosU|-7s*#NS1?2#eT?MY?+L7^4n01R9(zg+BSI%e)Hbwu{`Pk)Wom3w)8JysET)ef(_&w6xeeANcq z-u=-ZBl*QA2JM!g&>L!gryfcZ_RH%wR%M?&vijnE(yzXPXV# z4#(%S{POy2D4iiygXtD5-RixYC~UL0V5$pKJ8u1x@1a|7`bTAbfbyCA`8KYr!F5rS zWoVd*NZ$2sdg9N1CCSrII}aD``Ilu0KBPedrbgQxxOeDC+sFJ4^GjW7Gtba=^! z67B3X)ZK_qcb#mj_MHQ58Fiw=W|IPQ9X8^bp1q`K#r_I;2e2_fx#}>3(6jpT`n&)A zN9n1r|Jx)_-vTaEx9!C%SfR&1)6ysqdcN zHjeY3_(@+Q{L;(otxfUK@YU)>lv<~#ZJ7cT;7|bgz_uyRfYPLlB^ny${(1iubuxlM z!!z{h_#O^|4qvll=GkmOpwf6wQ`zw>W9I>b+|}Zl7Ceu#)2Jr!3L9un?_z-&+LI1K zKA4t?4xHL4TSAFdzv-gUEqiHJCj4?FNGjydx{AqzDufG*4)$G0HkKOfDWSrY0wE=b zQJcmAwh7+&#dAt@+-f-M#jpIU9q1seMUv_Jo<9y{b>wuiVH6vXLi5V-T%0HItiPNz zE^25m`_gVhnrCyC$XF@l3U@&$f=+@)4NxVe^om9xlsg-ByQp@7KFDBRWS}_lR9s#& zfZ~nk6j6vW7{(|T6FQB#ST{I%;2{|g!+0p(M2>T%^K9N+w%5Q(uO83ZE5X|_ApH8M zHPA4xp;!bAn+<^s%3fC-A)rg(@W6{9G-4iIrDZ`f;Bl)IOYbTtCLk&o3jf<)rQpZsGx4;!4_Q*+&!+FxV^~ixaw4U)h zvKfms`*nTWdh>`~B(onYkDwgUyhBGsmW?9|kjj%~%|S5kGh#cAK!ZM*Qgk2u+@LVH zxNhcoym~y_i8#-v&~{D%g%EmSsh($13J@a!le z<5>b%GAtq!mY#V=Gwyk43z z?^*VzgLZr(eHjg1$nhkF)`7FON0~#1EQ6?zAk%s1O+co6NcoSEtG25p2%UQFvGj5; zf*;zr3EUOk4WiqI;2OKk`?mMLUcF`pg=#FEyr?12M9SnIgAP z8b>v$v4M$1cM9H@FR!O?pWqF1LENM<2c9D&JFns3ME#54$2Hg#sOGBj%)m1zo=>S9 z6>c~UK<8jxR}kVBHu~M@w-ElKqw9ImT4= zCZ4BXPO`7p`z=p51@UM)-A0B!8qAXd>blfa>5(pUlW3dKqz!cAC3(3}3LWU-6n!Y2 zqgz=5gRxob1^d}#VSDjwmkD1v0nmsi9xR2yI2^p^p6l3+6?^A42R=TnK*A>%@RCVg2C|I;d(Y`x~&ciFoJsT=RAZ=5j7x|TbX+V z0d3fnz zjU7y(?lA!RI5>}(73(})NuEu&3_K4U5c|*;u2}8Iqm0d(b*?5allO*p1a%eK^1h}p z!qfn5vKOZxiA3NL>H_5Jn3TE7#3}z;;s&#+QNx-A2F=G-%wDyHD zL~|P>bYMJrP{vX+&vbpl0yPH4XHWdz+AzAJYayIabDGTiICElm*I?MH6cohh8mr#6<||3{m{6PtW(rQI9TUe2mDO7~(KaCp0%av5&+;JL zAWE4qXj=p#pnufM>tO*}2uI|CNd_6h#9|HPym~fWh9$E7tT8`;~5gF3p!$$=Dr)@P%aYPgQ>9HUU$+5zX#TDL3TE4+Q0Y>@~4B50XM#=<_~%5xmjT7^`;-uNKeMdB_8v-RQD^mw0)7 zz0;GA5!qw<2TdJ}Sv^h5Z53U%O9Vn?63=Y|cTh~x;i34=Yb%Syg_FcV#03C8%wZ@` zNt|%%BY5E@a91>X102B!V?9Fu{+EN^=nvTm+FQcU!A5{B&dv&aVrmzc@2c=jh39(Y zAh`4L`od^K7W?ABn3CpphJ87eO@xXt^T?>Z;;4YVcc|8NP!Hi=&C&+Y$K6OVV z7J20p+Cwt+D2hLV;twUkOXe+;4#Vyua$dyL@vX%%FRzzSztemFzX)FWP#uGYt^m(q zH;HG7_S)pgm)FlJg!w?=#(9^+IjK7z!$S*DUU9ojfM)(;7|jk9)=(DHe8_4&Jr|yfX2z%ZpTbAgaNob~Y&|aPlLd@d+>jMqo?-W;T-P*eJ1i+HX?y!;tP62o`CC1k5MlK3lp>BF zS!mF#@l~8I!Px#Y3_fRpEgQ+xtfbp5{M_aFGzOY?2GdknoOJUnSrc4sjr@X>AnQcr#Io*FF8xX9x?MXNZ+KuY`(b1p;CzUS46y?b8-BLQ& zF;Gv5516=V8!6_>VxEo8*gMi4(2jGS&QsnRG@pY!@4UPo{YuPX6Qqe80DoW&xVyt)39h!G z=dxcSx&ORb5IP--vn&Rg0cZ+%IYVD}Knj_ki#)#%US2Pyi;ze3xT65r)Bi+j0u8d# zLqi))ZC`p8!pRv)H6o9q$w89pM+u`M$=f6JHcV{a)h#4Iq^NW^b4E4GnA{RXVo{59 z=f#nmR}Gu$bOS2XU=VHR4M(KS%jJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..39c7958dc6ce747613182bf6d46bcdb352408033 100644 GIT binary patch literal 5152 zcmV+*6yNKKP)ho*O-W#h28v9ez%5opl6r2mnPAFs7(nXHtA%4rnN4i3lj^b^G^acxQRb|X zdKxs;TA%$~H{y+k!+12(exj zEAm7G=wT}*a~AVT^=jIgE|c*HO-1?8P{H7e^)RvW&WS0`susn%g$C5gtY&b5Efyo# z5Lsg*rNJoxC9>ZL=4d?}$8k_0QH5lM)hLE5>}2tFp@}vdMmvU!lMYhgraEz*@-B7xc#0E1^;R0eID5b3zkH{dRu13&&8e0K|&&Y(qBp*ptTCa0?P z%zCs;yRDc-s{`}2M3@K^ts|MGlB2;H&y=h$b7^%^k)Ya6uF$a75wI|ZJAV%C+t=ZK z=Q5_>{}KA_`v7K$^E^!(l4(j?Z6b!MLn?rzX+SH>pru8Sa}{|@2Px>Q8hX#*gF|3< z513Ak7uR;E;TVkrmX<)vOI}k-D&ut$IfKa8b1z*$d*dyP-njujI6(KohiU3paqT%! z0fAwFFqjg(N+UgJ2W>jJiqY@iK>Nn)z|tb1>(t|kN@8F#MR#Wlv;X`t`dgm@lZi6B zL}m^B1GK(|(Yt?$*@rjL-+u^nhlx^Emz{$XB7nj~0B}B!vkF-%Tn|M8h$#M7BFk!d5CM)r;}P7Yi*T1O z0^?DYdIo^DMRV>9nk%n*Q*_R2p6Zu$-+6vUk2r=Z<7#@Ms=GuLo4_viK?-zVFy$*E z`kodSK&z`jJ4$(mR`ObXVij)ngcVSwpZuA=H%mC$mr=Pwm##Q4*H>tvgH1|>1?)IR z#L|%tSD!yIb6DIHiXF%~kW0%zIy{M>+%#aWwD*fv$Q%} zfZ{T{NZr$(5DfKn4` zW>yoHW~MRIisn#pQBSQ6&M4x(C$j?ZHoC16`67%HSL0)3qXKDGmzmx3^kbQ3nP-Bw zBhaI@+9>N?CKOdqbzTXT$H5OFKIQ2Wp+(*89MK;K8}qWvWdN48>68~Gj*6puZV_3O zg%e=NBD-OXS_~}I`Ur_1?Hn?;R6zJeQ*M^YiVOv@7n!V>9Wx?0&L%+=g0Hj%Rfxk+ zS8A^MIV4^klp?J9AO`bVL(4vEf+@v_&BFDOtSv`0<0Vb0pV!{@w#{*VzL3ATp8_ z!ze3k8Q?uVgC`TrKKdAwZ~rrR{{VFUENIlK#wB(m(DE|e=~I4%p~+%oN#ilxl~>^| zUq-ieA9Qe-o)LhyfjfH|&9$qb)s^9}g&BN!i2mVY@Y82N*Qs_W3YDMjVD^&_G5x`N zeodeCZg|EiE}s|;vmr&!ypZ4b=MAJCAw!ue{hI?`yO~}+m}HyH$PHVE37tzvYpq{}>3F4r82KvsMtvC{vJ&4SN$$x08ObinU z)5|?(Iw2Y=+ieWYIsl#bu5s@&HO^0;q5I?(x}W_5eEls@#xNN)H4Sk36h><&eVc+o zfZyyGkG*zQoC^_w4-Y)9{_N-AhmX8KA%SPb^M{;x)-1+bxi`&WN^gQd*|LrA;?zVM zFWP1<>iPU0yt9k`&NleT6X4t#qa|i?>>PMJ28|VJ%n42ODh2Nypx@dCKYjwtW`5%q z$a8Meqgs!q+=n_U+pdSHIS=I=)Qt@b-aZ$lv`2yxA;(!KJ4RepuV^hw zf15Cw%~!=L*(j$%(a@aC=R~`7;F>WtkH+P*U_)gi!e^&7t)X<(Dyw)vm@a~bDn%+W zEImsj5lu;E9C;D$9hoMys;bhSd#Wa4!@6F=P_2y=cX@;X^EO4ypwx_Eu4$@1lICPU zY+H`=hgYSY8G#`iu3ZlFZ=Jxc%s(F2*5(SxuR4qfmd_^S)^Y<P>(jwf&^Pp3k;Cl~J(5i@*rD-#-=NvvL zF-r|3Z49wG?i2?@G2W_iFS6B@6)5lMMhY!JB5C0N{ z9vgg&*QqmMo}=Xmv_;GDBnDb$@~eyCz)9Q$r;=w;IO8$g`Ll4ZybQOo0g{t6y&|G% z{M6{H*U`TDyP)y7Fg0cddPaZyE)M_xA2Ip%zknY-2KRmN)C5{tM)&bALE{nV?XQ4F zBNVA|aId_Kg}?qwxb<~(zy1uEPNH?ibuVW0d;93`Zlk|*7uef}iqsPA(V;1{52J6% zxDqxz*C*_vIk^Vz{5g!j`4<@d@w;fwodMcb%?yH69f1}XL8~V~^A3(oCz##*1!n*L zBlNfLD(MGzvbTrX`yXKX+BG!Su7EZ-s?E5SWw;w(L38yB;GJDR{fUhPLG}#Z*}?R` zeu~LI{1dvL{v3RGP^YViH+*XI%ruv@e2>m?aRKe?U&8oL-bMS?8}Ss44O~?qcSN+# zhZFRl-9i8OahMWWAS5vO*)ICueg=NF3uFw7rcDHlM{uV$fX(&Pucn0=+;yPM4e*0U zes*wY%TC2AY|~rYE`JoG2t6>xO**lH=IX0xF1_S6$hkzY{7V>doDibxz)yF8$+U3e z(UEjBuQe5IDB9B@hI57%I0tH5xHG5FynYSt+!>F-!!j)%xfB7Avecp41S~CpPHp(Z zbjO(M<*B+4(09=@YDyy_hB7=)6OIU1%oy4hZety^x(aGsVRn%KiH6lsoCyb@)Vt_C zG|@Dm(a39-p~D8I&%Ys}0anpeTQ#ku=bAPJreQQfI#?>tj z9>W_P$K8=W#)!%Z7TJOQf9zOk-Oziy7LVfx0I1jhR4I;b)xPdxweiK$^9)R5r!Z`2 z*ZW0w+Z9!I9%`Q0WM2OxJA(~)Rx{7!_K&-zcI2*j5jRrlePK=iMN)k?3n}_Xx!9aFM~EQ(P|4N&X*J~_=% z1}7{FIqJ;>HBBu^AHuG|BS$&4nR_-zeo4-)m7BD+bgWI}$}A>kMopnOlLWj^Rl z=M7*!^T^O4uTIYs%Tf3_L|2SBl{QqNKF1`O1w{3(wjKmDtFqda<>RAH0#*kRB`QXr z48&;oQI6wz%+z4wK$sN2(`(kQ-bb)q$SmIyo1a0QM{EtlOzL{@tgEb|s(%Kk>x((x zu@4(p2~%GxjM8jM>#`}Sa9v!5YKat9=@~*Eg;$6r2?>q}V*9;4^iQAqogbaFkoq3H zvx9zT7u@#|yN;{PNs~o$Ge)NlRgPe%ZO`S+=RDP(mXSOum_6}*Z?E-z_(u5W>>r1R z=x=?B{@1?+4ksv0Bz$)rx_b}M-})51w`cm0>mpCzt8etZUk2ye81+i3}7-rcjqo-qsJQAE$wo-yNlTm-v{p>pt<}K zXmOl5DQVvhn?aFbkOT%p^N;$X<-pq7}rk%4S{|o&f?k3FHujY zG0uu_hg1wi7}m;-S;IHGDP%OB`ySZc2k-7DV$`Z;d?i|#C_BfIsR<9F#HEAi>NUlR zkv)U=_kg{9zcEoczZK=hB5EbT7yzf&lTG!?j!_yrR4rEPO8)((TXHm{U3#E6f-uJ&~Fe_#&{P7{<0WBq`O@ zIfWNVvxGoO!xO8UxgZ~{1GfRkbLrYX#k%)OQHv%2~Ycdqj|HIo&!+NNB(2ED<~5Tu>7ESXixawj*TwRqYqQVx*c9nq?nR z%SaqlycbO4__%D>Dvw0`E-_iu9EiTHI`fak6bn;*@5!jF!=@J~p4x$A70o^=o38?E z^%#^@C9Ml;FLUR3bTfQJ_6gIoOPnoaRAiZMWQHHlnavkq;jBAm{KR zV(x~IAjWiV@ihu5Hm`n$O1*%P2$PGPDHVxGG13C#;;{@V>0>S^;C})7lD4gnXCK}G O0000x~L`~4d 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 iW8 CLIENT_ID - 864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r.apps.googleusercontent.com + 815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt.apps.googleusercontent.com REVERSED_CLIENT_ID - com.googleusercontent.apps.864393916058-ekeb4s8tgfo58dutv0l54399t7ivr06r + com.googleusercontent.apps.815750722565-da8p56le8bd6apsbm9eft0jjl1rtpgkt + ANDROID_CLIENT_ID + 815750722565-m14h8mkosm7cnq6uh6rhqr54dn02d705.apps.googleusercontent.com API_KEY - AIzaSyA_6ayGCk4fly7o7eTVBrj9kuHBYHMAOfs + AIzaSyDiXnCO00li4V7Ioa2YZ_M4ECxRsu_P9tA GCM_SENDER_ID - 864393916058 + 815750722565 PLIST_VERSION 1 BUNDLE_ID - com.cloud.diplomaticquarterapp + com.HMG.HMG-Smartphone PROJECT_ID - diplomaticquarter-d2385 + api-project-815750722565 STORAGE_BUCKET - diplomaticquarter-d2385.appspot.com + api-project-815750722565.appspot.com IS_ADS_ENABLED IS_ANALYTICS_ENABLED @@ -29,8 +31,8 @@ IS_SIGNIN_ENABLED GOOGLE_APP_ID - 1:864393916058:ios:13f787bbfe6051f8b97923 + 1:815750722565:ios:328ec247a81a2ca23c186c DATABASE_URL - https://diplomaticquarter-d2385.firebaseio.com + https://api-project-815750722565.firebaseio.com \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index ae084167..72bd4ac9 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -11,7 +11,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - diplomaticquarterapp + Dr. Alhabib CFBundlePackageType APPL CFBundleShortVersionString diff --git a/speech_to_text/android/build.gradle b/speech_to_text/android/build.gradle index 6b23b300..cc06ea57 100644 --- a/speech_to_text/android/build.gradle +++ b/speech_to_text/android/build.gradle @@ -31,7 +31,7 @@ android { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { - minSdkVersion 21 + minSdkVersion 18 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } lintOptions { diff --git a/speech_to_text/android/gradle/local.properties b/speech_to_text/android/gradle/local.properties index 71a0a2e4..b85628e7 100644 --- a/speech_to_text/android/gradle/local.properties +++ b/speech_to_text/android/gradle/local.properties @@ -1,3 +1,2 @@ sdk.dir=/Users/stephen.owens/Library/Android/sdk -flutter.sdk=/Users/stephen.owens/Documents/dev/flutter/sdk/flutter -org.gradle.jvmargs=-Xmx1536m -Duser.country=US -Duser.language=en \ No newline at end of file +flutter.sdk=/Users/stephen.owens/Documents/dev/flutter/sdk/flutter \ No newline at end of file diff --git a/speech_to_text/example/android/app/build.gradle b/speech_to_text/example/android/app/build.gradle index 8b616f29..104069d3 100644 --- a/speech_to_text/example/android/app/build.gradle +++ b/speech_to_text/example/android/app/build.gradle @@ -39,7 +39,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.csdcorp.speech_to_text_example" - minSdkVersion 21 + minSdkVersion 18 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/speech_to_text_/.github/workflows/master.yml b/speech_to_text_/.github/workflows/master.yml new file mode 100644 index 00000000..4d4cff1c --- /dev/null +++ b/speech_to_text_/.github/workflows/master.yml @@ -0,0 +1,19 @@ +name: build + +on: + push: + branches: + - master + +jobs: + test: + name: Test on Ubuntu + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: subosito/flutter-action@v1.3.2 + with: + flutter-version: '1.17.1' + channel: 'stable' + - run: flutter pub get + - run: flutter test diff --git a/speech_to_text_/.gitignore b/speech_to_text_/.gitignore new file mode 100644 index 00000000..8969cbcd --- /dev/null +++ b/speech_to_text_/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ +coverage/ +example/.flutter-plugins-dependencies +**/ios/Flutter/flutter_export_environment.sh +android/.idea/ diff --git a/speech_to_text_/.metadata b/speech_to_text_/.metadata new file mode 100644 index 00000000..1940d996 --- /dev/null +++ b/speech_to_text_/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 2d2a1ffec95cc70a3218872a2cd3f8de4933c42f + channel: stable + +project_type: plugin diff --git a/speech_to_text_/CHANGELOG.md b/speech_to_text_/CHANGELOG.md new file mode 100644 index 00000000..477e110c --- /dev/null +++ b/speech_to_text_/CHANGELOG.md @@ -0,0 +1,166 @@ +# Changelog + +## 2.3.0 + +### New + * new parameter `onDevice` on the `listen` method enforces on device recognition for sensitive content + * onSoundLevelChange now supported on iOS + * added compile troubleshooting help to README.md + * `SpeechToTextProvider` is an alternate and simpler way to interact with the `SpeechToText` plugin. + * new `provider_example.dart` example for usage of `SpeechToTextProvider`. +### Fix + * on iOS handles some conflicts with other applications better to keep speech working after calls for example + + +## 2.2.0 + +### New + * improved error handling and logging in the iOS implementation + * added general guides for iOS to the README + * moved stress testing out of the main example + * iOS now defaults to using the speaker rather than the receiver for start /stop sounds when no headphones +### Fix + * iOS now properly deactivates the audio session when no longer listening + * start and stop sounds on iOS should be more reliable when available + +## 2.1.0 +### Breaking + * `listenFor` now calls `stop` rather than `cancel` as this seems like more useful behaviour + +### Fix + * Android no longer stops or cancels the speech recognizer if it has already been shutdown by a + timeout or other platform behaviour. + * Android no longer tries to restart the listener when it is already active + * Now properly notifies errors that happen after listening stops due to platform callback rather than + client request. See https://github.com/csdcorp/speech_to_text/issues/51 + +## 2.0.1 +### Fix + * Resolves an issue with the Android implementation not handling permission requests properly on apps + that didn't use the 1.12.x plugin APIs for registration. The permission dialog would not appear and + permission was denied. + + +## 2.0.0 + +### Breaking + + * Upgraded to New Swift 1.12 plugin structure, may work with older Flutter version but not guaranteed + +### New + + * the plugin now requests both speech and microphone permission on initialize on iOS + * added `debugLogging` parameter to the `initialize` method to control native logging + +### Fix + + * The Android implementation now blocks duplicate results notifications. It appears that at least on some + Android versions the final results notification onResults is notified twice when Android automatically + terminates the session due to a pause time. The de-duplication looks for successive notifications + with < 100 ms between them and blocks the second. If you miss any onResult notifications please post + an issue. + +## 1.1.0 + +### New + + * error_timeout has been separated into error_network_timeout and error_speech_timeout + +## 1.0.0 + +### New + * hasPermission to check for the current permission without bringing up the system dialog + * `listen` has a new optional `cancelOnError` parameter to support automatically canceling + a listening session on a permanent error. + * `listen` has a new optional `partialResults` parameter that controls whether the callback + receives partial or only final results. + +## 0.8.0 + +### New + + * speech recognizer now exposes multiple possible transcriptions for each recognized speech + * alternates list on SpeechRecognitionResult exposes alternate transcriptions of voice + * confidence on SpeechRecognitionResult gives an estimate of confidence in the transcription + * isConfident on SpeechRecognitionResult supports testing confidence + * hasConfidenceRating on SpeechRecognitionResult indicates if confidence was provided from the device + * new SpeechRecognitionWords class gives details on per transcription words and confidence + +### Fix + + * speechRecognizer availabilityDidChange was crashing if invoked due to an invalid parameter type + * Added iOS platform 10 to example Podfile to resolve compilation warnings + +## 0.7.2 + +### Breaking + + * Upgrade Swift to version 5 to match Flutter. Projects using this plugin must now switch to 5. + +## 0.7.1 + +### Fix + + * Upgrade Kotlin to 1.3.5 to match the Flutter 1.12 version + * Upgrade Gradle build to 3.5.0 to match the Flutter 1.12 version + * Android version of the plugin was repeating the system default locale in the `locales` list + +## 0.7.0 + +### New + + * locales method returns the list of available languages for speech + * new optional localeId parameter on listen method supports choosing the comprehension language separately from the current system locale. + +### Breaking + + * `cancel` and `stop` are now async + +## 0.6.3 + +### Fix + + * request permission fix on Android to ensure it doesn't conflict with other requests + +## 0.6.2 + +### Fix + + * channel invoke wasn't being done on the main thread in iOS + +## 0.6.1 + +### Fix + + * listening sound was failing due to timing, now uses play and record mode on iOS. + + ## 0.6.0 +### Breaking + + * The filenames for the optional sounds for iOS have changed. + +### New + + * Added an optional listenFor parameter to set a max duration to listen for speech and then automatically cancel. + +### Fix + + * Was failing to play sounds because of record mode. Now plays sounds before going into record mode and after coming out. + * Status listener was being ignored, now properly notifies on status changes. + +## 0.5.1 + * Fixes a problem where the recognizer left the AVAudioSession in record mode which meant that subsequent sounds couldn't be played. + +## 0.5.0 +Initial draft with limited functionality, supports: + * initializing speech recognition + * asking the user for permission if required + * listening for recognized speech + * canceling the current recognition session + * stopping the current recognition session +* Android and iOS 10+ support + +Missing: + * some error handling + * testing across multiple OS versions + * and more, to be discovered... diff --git a/speech_to_text_/LICENSE b/speech_to_text_/LICENSE new file mode 100644 index 00000000..7c3991c8 --- /dev/null +++ b/speech_to_text_/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2019, Corner Software Development Corp. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/speech_to_text_/README.md b/speech_to_text_/README.md new file mode 100644 index 00000000..af726f0e --- /dev/null +++ b/speech_to_text_/README.md @@ -0,0 +1,150 @@ +# speech_to_text + +[![pub package](https://img.shields.io/badge/pub-v2.3.0-blue)](https://pub.dartlang.org/packages/speech_to_text) [![build status](https://github.com/csdcorp/speech_to_text/workflows/build/badge.svg)](https://github.com/csdcorp/speech_to_text/actions?query=workflow%3Abuild) + +A library that exposes device specific speech recognition capability. + +This plugin contains a set of classes that make it easy to use the speech recognition +capabilities of the mobile device in Flutter. It supports both Android and iOS. The +target use cases for this library are commands and short phrases, not continuous spoken +conversion or always on listening. + +## Recent Updates + +The 2.3.0 version adds `SpeechToTextProvider` as a simpler way to interact with the plugin. Checkout +the new `provider_example.dart` for intended usage. + +The 2.2.0 version improves audio session handling and start / stop sound playback on iOS. + +*Note*: Feedback from any test devices is welcome. + +## Using + +To recognize text from the microphone import the package and call the plugin, like so: + +```dart +import 'package:speech_to_text/speech_to_text.dart' as stt; + + stt.SpeechToText speech = stt.SpeechToText(); + bool available = await speech.initialize( onStatus: statusListener, onError: errorListener ); + if ( available ) { + speech.listen( onResult: resultListener ); + } + else { + print("The user has denied the use of speech recognition."); + } + // some time later... + speech.stop() +``` + +### Initialize once +The `initialize` method only needs to be called once per application session. After that `listen`, +`start`, `stop`, and `cancel` can be used to interact with the plugin. Subsequent calls to `initialize` +are ignored which is safe but does mean that the `onStatus` and `onError` callbacks cannot be reset after +the first call to `initialize`. For that reason there should be only one instance of the plugin per +application. The `SpeechToTextProvider` is one way to create a single instance and easily reuse it in +multiple widgets. + +## Permissions + +Applications using this plugin require user permissions. +### iOS + +Add the following keys to your _Info.plist_ file, located in `/ios/Runner/Info.plist`: + +* `NSSpeechRecognitionUsageDescription` - describe why your app uses speech recognition. This is called _Privacy - Speech Recognition Usage Description_ in the visual editor. +* `NSMicrophoneUsageDescription` - describe why your app needs access to the microphone. This is called _Privacy - Microphone Usage Description_ in the visual editor. + +### Android + +Add the record audio permission to your _AndroidManifest.xml_ file, located in `/android/app/src/main/AndroidManifest.xml`. + +* `android.permission.RECORD_AUDIO` - this permission is required for microphone access. +* `android.permission.INTERNET` - this permission is required because speech recognition may use remote services. + +## Adding Sounds for iOS (optional) + +Android automatically plays system sounds when speech listening starts or stops but iOS does not. This plugin supports playing sounds to indicate listening status on iOS if sound files are available as assets in the application. To enable sounds in an application using this plugin add the sound files to the project and reference them in the assets section of the application `pubspec.yaml`. The location and filenames of the sound files must exactly match what +is shown below or they will not be found. The example application for the plugin shows the usage. *Note* These files should be very short as they delay +the start / end of the speech recognizer until the sound playback is complete. +```yaml + assets: + - assets/sounds/speech_to_text_listening.m4r + - assets/sounds/speech_to_text_cancel.m4r + - assets/sounds/speech_to_text_stop.m4r +``` +* `speech_to_text_listening.m4r` - played when the listen method is called. +* `speech_to_text_cancel.m4r` - played when the cancel method is called. +* `speech_to_text_stop.m4r` - played when the stop method is called. + +## Troubleshooting + +### SDK version error trying to compile for Android +``` +Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared in library [:speech_to_text] +``` +The speech_to_text plugin requires at least Android SDK 21 because some of the speech functions in Android +were only introduced in that version. To fix this error you need to change the `build.gradle` entry to reflect +this version. Here's what the relevant part of that file looked like as of this writing: +``` + defaultConfig { + applicationId "com.example.app" + minSdkVersion 21 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } +``` + +### Incorrect Swift version trying to compile for iOS +``` +/Users/markvandergon/flutter/.pub-cache/hosted/pub.dartlang.org/speech_to_text-1.1.0/ios/Classes/SwiftSpeechToTextPlugin.swift:224:44: error: value of type 'SwiftSpeechToTextPlugin' has no member 'AVAudioSession' + rememberedAudioCategory = self.AVAudioSession.Category + ~~~~ ^~~~~~~~~~~~~~ + /Users/markvandergon/flutter/.pub-cache/hosted/pub.dartlang.org/speech_to_text-1.1.0/ios/Classes/SwiftSpeechToTextPlugin.swift:227:63: error: type 'Int' has no member 'notifyOthersOnDeactivation' + try self.audioSession.setActive(true, withFlags: .notifyOthersOnDeactivation) +``` +This happens when the Swift language version is not set correctly. See this thread for help https://github.com/csdcorp/speech_to_text/issues/45. + +### Swift not supported trying to compile for iOS +``` +`speech_to_text` does not specify a Swift version and none of the targets (`Runner`) integrating it have the `SWIFT_VERSION` attribute set. +``` +This usually happens for older projects that only support Objective-C. See this thread for help https://github.com/csdcorp/speech_to_text/issues/88. + +### Not working on a particular Android device +The symptom for this issue is that the `initialize` method will always fail. If you turn on debug logging +using the `debugLogging: true` flag on the `initialize` method you'll see `'Speech recognition unavailable'` +in the Android log. There's a lengthy issue discussion here https://github.com/csdcorp/speech_to_text/issues/36 +about this. The issue seems to be that the recognizer is not always automatically enabled on the device. Two +key things helped resolve the issue in this case at least. + +#### First +1. Go to Google Play +2. Search for 'Google' +3. You should find this app: https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox +If 'Disabled' enable it + +This is the SO post that helped: https://stackoverflow.com/questions/28769320/how-to-check-wether-speech-recognition-is-available-or-not + +#### Second +Ensure the app has the required permissions. The symptom for this that you get a permanent error notification + 'error_audio_error` when starting a listen session. Here's a Stack Overflow post that addresses that + https://stackoverflow.com/questions/46376193/android-speechrecognizer-audio-recording-error + Here's the important excerpt: + >You should go to system setting, Apps, Google app, then enable its permission of microphone. + +### iOS recognition guidelines +Apple has quite a good guide on the user experience for using speech, the original is here +https://developer.apple.com/documentation/speech/sfspeechrecognizer This is the section that I think is particularly relevant: + +>#### Create a Great User Experience for Speech Recognition +>Here are some tips to consider when adding speech recognition support to your app. + +>**Be prepared to handle failures caused by speech recognition limits.** Because speech recognition is a network-based service, limits are enforced so that the service can remain freely available to all apps. Individual devices may be limited in the number of recognitions that can be performed per day, and each app may be throttled globally based on the number of requests it makes per day. If a recognition request fails quickly (within a second or two of starting), check to see if the recognition service became unavailable. If it is, you may want to ask users to try again later. + +>**Plan for a one-minute limit on audio duration.** Speech recognition places a relatively high burden on battery life and network usage. To minimize this burden, the framework stops speech recognition tasks that last longer than one minute. This limit is similar to the one for keyboard-related dictation. +Remind the user when your app is recording. For example, display a visual indicator and play sounds at the beginning and end of speech recognition to help users understand that they're being actively recorded. You can also display speech as it is being recognized so that users understand what your app is doing and see any mistakes made during the recognition process. + +>**Do not perform speech recognition on private or sensitive information.** Some speech is not appropriate for recognition. Don't send passwords, health or financial data, and other sensitive speech for recognition. diff --git a/speech_to_text_/android/.classpath b/speech_to_text_/android/.classpath new file mode 100644 index 00000000..eb19361b --- /dev/null +++ b/speech_to_text_/android/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/speech_to_text_/android/.gitignore b/speech_to_text_/android/.gitignore new file mode 100644 index 00000000..c6cbe562 --- /dev/null +++ b/speech_to_text_/android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/speech_to_text_/android/.project b/speech_to_text_/android/.project new file mode 100644 index 00000000..3050653c --- /dev/null +++ b/speech_to_text_/android/.project @@ -0,0 +1,23 @@ + + + speech_to_text + Project android_____ created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/speech_to_text_/android/.settings/org.eclipse.buildship.core.prefs b/speech_to_text_/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 00000000..7a23d112 --- /dev/null +++ b/speech_to_text_/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(5.6.1)) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home= +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/speech_to_text_/android/build.gradle b/speech_to_text_/android/build.gradle new file mode 100644 index 00000000..6b23b300 --- /dev/null +++ b/speech_to_text_/android/build.gradle @@ -0,0 +1,44 @@ +group 'com.csdcorp.speech_to_text' +version '1.0-SNAPSHOT' + +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +rootProject.allprojects { + repositories { + google() + jcenter() + } +} + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion 28 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + defaultConfig { + minSdkVersion 21 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/speech_to_text_/android/gradle/gradle.properties b/speech_to_text_/android/gradle/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/speech_to_text_/android/gradle/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/speech_to_text_/android/gradle/local.properties b/speech_to_text_/android/gradle/local.properties new file mode 100644 index 00000000..71a0a2e4 --- /dev/null +++ b/speech_to_text_/android/gradle/local.properties @@ -0,0 +1,3 @@ +sdk.dir=/Users/stephen.owens/Library/Android/sdk +flutter.sdk=/Users/stephen.owens/Documents/dev/flutter/sdk/flutter +org.gradle.jvmargs=-Xmx1536m -Duser.country=US -Duser.language=en \ No newline at end of file diff --git a/speech_to_text_/android/gradle/settings.gradle b/speech_to_text_/android/gradle/settings.gradle new file mode 100644 index 00000000..cdfc1c4b --- /dev/null +++ b/speech_to_text_/android/gradle/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'speech_to_text' diff --git a/speech_to_text_/android/gradle/wrapper/gradle-wrapper.properties b/speech_to_text_/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..674bdda0 --- /dev/null +++ b/speech_to_text_/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/speech_to_text_/android/src/main/AndroidManifest.xml b/speech_to_text_/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..61a73f32 --- /dev/null +++ b/speech_to_text_/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/speech_to_text_/android/src/main/kotlin/com/csdcorp/speech_to_text/SpeechToTextPlugin.kt b/speech_to_text_/android/src/main/kotlin/com/csdcorp/speech_to_text/SpeechToTextPlugin.kt new file mode 100644 index 00000000..7954add3 --- /dev/null +++ b/speech_to_text_/android/src/main/kotlin/com/csdcorp/speech_to_text/SpeechToTextPlugin.kt @@ -0,0 +1,595 @@ +package com.csdcorp.speech_to_text + +import androidx.annotation.NonNull; +import io.flutter.embedding.engine.plugins.FlutterPlugin +import android.Manifest +import android.annotation.TargetApi +import android.app.Activity +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import android.os.Bundle +import android.speech.RecognitionListener +import android.speech.SpeechRecognizer.createSpeechRecognizer +import android.speech.RecognizerIntent +import android.speech.SpeechRecognizer +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.plugin.common.MethodChannel.Result +import io.flutter.plugin.common.PluginRegistry +import io.flutter.plugin.common.PluginRegistry.Registrar +import org.json.JSONObject +import android.content.Context +import android.content.BroadcastReceiver +import android.os.Handler +import android.os.Looper +import android.util.Log +import io.flutter.embedding.engine.plugins.activity.ActivityAware +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding +import io.flutter.plugin.common.BinaryMessenger +import org.json.JSONArray +import java.util.* + + +enum class SpeechToTextErrors { + multipleRequests, + unimplemented, + noLanguageIntent, + recognizerNotAvailable, + missingOrInvalidArg, + unknown +} + +enum class SpeechToTextCallbackMethods { + textRecognition, + notifyStatus, + notifyError, + soundLevelChange, +} + +enum class SpeechToTextStatus { + listening, + notListening, + unavailable, + available, +} + +enum class ListenMode { + deviceDefault, + dictation, + search, + confirmation, +} + +const val pluginChannelName = "plugin.csdcorp.com/speech_to_text" + +@TargetApi(8) +/** SpeechToTextPlugin */ +public class SpeechToTextPlugin : + MethodCallHandler, RecognitionListener, + PluginRegistry.RequestPermissionsResultListener, FlutterPlugin, + ActivityAware { + private var pluginContext: Context? = null + private var channel: MethodChannel? = null + private val minSdkForSpeechSupport = 21 + private val speechToTextPermissionCode = 28521 + private val missingConfidence: Double = -1.0 + private val logTag = "SpeechToTextPlugin" + private var currentActivity: Activity? = null + private var activeResult: Result? = null + private var initializedSuccessfully: Boolean = false + private var permissionToRecordAudio: Boolean = false + private var listening = false + private var debugLogging: Boolean = false + private var speechRecognizer: SpeechRecognizer? = null + private var recognizerIntent: Intent? = null + private var previousRecognizerLang: String? = null + private var previousPartialResults: Boolean = true + private var previousListenMode: ListenMode = ListenMode.deviceDefault + private var lastFinalTime: Long = 0 + private val handler: Handler = Handler(Looper.getMainLooper()) + private val defaultLanguageTag: String = Locale.getDefault().toLanguageTag() + + override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + + onAttachedToEngine(flutterPluginBinding.getApplicationContext(), flutterPluginBinding.getBinaryMessenger()); + } + + // This static function is optional and equivalent to onAttachedToEngine. It supports the old + // pre-Flutter-1.12 Android projects. You are encouraged to continue supporting + // plugin registration via this function while apps migrate to use the new Android APIs + // post-flutter-1.12 via https://flutter.dev/go/android-project-migration. + // + // It is encouraged to share logic between onAttachedToEngine and registerWith to keep + // them functionally equivalent. Only one of onAttachedToEngine or registerWith will be called + // depending on the user's project. onAttachedToEngine or registerWith must both be defined + // in the same class. + companion object { + @JvmStatic + fun registerWith(registrar: Registrar) { + val speechPlugin = SpeechToTextPlugin() + speechPlugin.currentActivity = registrar.activity() + registrar.addRequestPermissionsResultListener(speechPlugin) + speechPlugin.onAttachedToEngine(registrar.context(), registrar.messenger()) + } + } + + private fun onAttachedToEngine(applicationContext: Context, messenger: BinaryMessenger) { + this.pluginContext = applicationContext; + channel = MethodChannel(messenger, pluginChannelName) + channel?.setMethodCallHandler(this) + } + + override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { + this.pluginContext = null; + channel?.setMethodCallHandler(null) + channel = null + } + + override fun onDetachedFromActivity() { + currentActivity = null + } + + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + currentActivity = binding.activity + binding.addRequestPermissionsResultListener(this) + } + + override fun onAttachedToActivity(binding: ActivityPluginBinding) { + currentActivity = binding.activity + binding.addRequestPermissionsResultListener(this) + } + + override fun onDetachedFromActivityForConfigChanges() { + currentActivity = null + } + + override fun onMethodCall(@NonNull call: MethodCall, @NonNull rawrResult: Result) { + val result = ChannelResultWrapper(rawrResult) + try { + when (call.method) { + "has_permission" -> hasPermission(result) + "initialize" -> { + var dlog = call.argument("debugLogging") + if (null != dlog) { + debugLogging = dlog + } + initialize(result) + } + "listen" -> { + var localeId = call.argument("localeId") + if (null == localeId) { + localeId = defaultLanguageTag + } + var partialResults = call.argument("partialResults") + if (null == partialResults) { + partialResults = true + } + val listenModeIndex = call.argument("listenMode") + if ( null == listenModeIndex ) { + result.error(SpeechToTextErrors.missingOrInvalidArg.name, + "listenMode is required", null) + return + } + startListening(result, localeId, partialResults, listenModeIndex ) + } + "stop" -> stopListening(result) + "cancel" -> cancelListening(result) + "locales" -> locales(result) + else -> result.notImplemented() + } + } catch (exc: Exception) { + Log.e(logTag, "Unexpected exception", exc) + result.error(SpeechToTextErrors.unknown.name, + "Unexpected exception", exc.localizedMessage) + } + } + + private fun hasPermission(result: Result) { + if (sdkVersionTooLow(result)) { + return + } + debugLog("Start has_permission") + val localContext = pluginContext + if (localContext != null) { + val hasPerm = ContextCompat.checkSelfPermission(localContext, + Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED + result.success(hasPerm) + } + } + + private fun initialize(result: Result) { + if (sdkVersionTooLow(result)) { + return + } + debugLog("Start initialize") + if (null != activeResult) { + result.error(SpeechToTextErrors.multipleRequests.name, + "Only one initialize at a time", null) + return + } + activeResult = result + val localContext = pluginContext + initializeIfPermitted(pluginContext) + } + + private fun sdkVersionTooLow(result: Result): Boolean { + if (Build.VERSION.SDK_INT < minSdkForSpeechSupport) { + result.success(false) + return true; + } + return false; + } + + private fun isNotInitialized(result: Result): Boolean { + if (!initializedSuccessfully || null == pluginContext) { + result.success(false) + } + return !initializedSuccessfully + } + + private fun isListening(): Boolean { + return listening + } + + private fun isNotListening(): Boolean { + return !listening + } + + private fun startListening(result: Result, languageTag: String, partialResults: Boolean, + listenModeIndex: Int) { + if (sdkVersionTooLow(result) || isNotInitialized(result) || isListening()) { + return + } + debugLog("Start listening") + var listenMode = ListenMode.deviceDefault + if ( listenModeIndex == ListenMode.dictation.ordinal) { + listenMode = ListenMode.dictation + } + setupRecognizerIntent(languageTag, partialResults, listenMode) + handler.post { + run { + speechRecognizer?.startListening(recognizerIntent) + } + } + notifyListening(isRecording = true) + result.success(true) + debugLog("Start listening done") + } + + private fun stopListening(result: Result) { + if (sdkVersionTooLow(result) || isNotInitialized(result) || isNotListening()) { + return + } + debugLog("Stop listening") + handler.post { + run { + speechRecognizer?.stopListening() + } + } + notifyListening(isRecording = false) + result.success(true) + debugLog("Stop listening done") + } + + private fun cancelListening(result: Result) { + if (sdkVersionTooLow(result) || isNotInitialized(result) || isNotListening()) { + return + } + debugLog("Cancel listening") + handler.post { + run { + speechRecognizer?.cancel() + } + } + notifyListening(isRecording = false) + result.success(true) + debugLog("Cancel listening done") + } + + private fun locales(result: Result) { + if (sdkVersionTooLow(result) || isNotInitialized(result)) { + return + } + var detailsIntent = RecognizerIntent.getVoiceDetailsIntent(pluginContext) + if (null == detailsIntent) { + detailsIntent = Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS) + } + if (null == detailsIntent) { + result.error(SpeechToTextErrors.noLanguageIntent.name, + "Could not get voice details", null) + return + } + pluginContext?.sendOrderedBroadcast( + detailsIntent, null, LanguageDetailsChecker(result), + null, Activity.RESULT_OK, null, null) + } + + private fun notifyListening(isRecording: Boolean) { + debugLog("Notify listening") + listening = isRecording + val status = when (isRecording) { + true -> SpeechToTextStatus.listening.name + false -> SpeechToTextStatus.notListening.name + } + channel?.invokeMethod(SpeechToTextCallbackMethods.notifyStatus.name, status) + debugLog("Notify listening done") + } + + private fun updateResults(speechBundle: Bundle?, isFinal: Boolean) { + if (isDuplicateFinal( isFinal )) { + debugLog("Discarding duplicate final") + return + } + val userSaid = speechBundle?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) + if (null != userSaid && userSaid.isNotEmpty()) { + val speechResult = JSONObject() + speechResult.put("finalResult", isFinal) + val confidence = speechBundle?.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES) + val alternates = JSONArray() + for (resultIndex in 0..userSaid.size - 1) { + val speechWords = JSONObject() + speechWords.put("recognizedWords", userSaid[resultIndex]) + if (null != confidence && confidence.size >= userSaid.size) { + speechWords.put("confidence", confidence[resultIndex]) + } else { + speechWords.put("confidence", missingConfidence) + } + alternates.put(speechWords) + } + speechResult.put("alternates", alternates) + val jsonResult = speechResult.toString() + debugLog("Calling results callback") + channel?.invokeMethod(SpeechToTextCallbackMethods.textRecognition.name, + jsonResult) + } + } + + private fun isDuplicateFinal( isFinal: Boolean ) : Boolean { + if ( !isFinal ) { + return false + } + val delta = System.currentTimeMillis() - lastFinalTime + lastFinalTime = System.currentTimeMillis() + return delta >= 0 && delta < 100 + } + + private fun initializeIfPermitted(context: Context?) { + val localContext = context + if (null == localContext) { + completeInitialize() + return + } + permissionToRecordAudio = ContextCompat.checkSelfPermission(localContext, + Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED + debugLog("Checked permission") + if (!permissionToRecordAudio) { + val localActivity = currentActivity + if (null != localActivity) { + debugLog("Requesting permission") + ActivityCompat.requestPermissions(localActivity, + arrayOf(Manifest.permission.RECORD_AUDIO), speechToTextPermissionCode) + } else { + debugLog("no permission, no activity, completing") + completeInitialize() + } + } else { + debugLog("has permission, completing") + completeInitialize() + } + debugLog("leaving initializeIfPermitted") + } + + private fun completeInitialize() { + + debugLog("completeInitialize") + if (permissionToRecordAudio) { + debugLog("Testing recognition availability") + if (!SpeechRecognizer.isRecognitionAvailable(pluginContext)) { + Log.e(logTag, "Speech recognition not available on this device") + activeResult?.error(SpeechToTextErrors.recognizerNotAvailable.name, + "Speech recognition not available on this device", "") + activeResult = null + return + } + + debugLog("Creating recognizer") + speechRecognizer = createSpeechRecognizer(pluginContext).apply { + debugLog("Setting listener") + setRecognitionListener(this@SpeechToTextPlugin) + } + if (null == speechRecognizer) { + Log.e(logTag, "Speech recognizer null") + activeResult?.error( + SpeechToTextErrors.recognizerNotAvailable.name, + "Speech recognizer null", "") + activeResult = null + } + + debugLog("before setup intent") + setupRecognizerIntent(defaultLanguageTag, true, ListenMode.deviceDefault) + debugLog("after setup intent") + } + + initializedSuccessfully = permissionToRecordAudio + debugLog("sending result") + activeResult?.success(permissionToRecordAudio) + debugLog("leaving complete") + activeResult = null + } + + private fun setupRecognizerIntent(languageTag: String, partialResults: Boolean, listenMode: ListenMode) { + debugLog("setupRecognizerIntent") + if (previousRecognizerLang == null || + previousRecognizerLang != languageTag || + partialResults != previousPartialResults || previousListenMode != listenMode ) { + previousRecognizerLang = languageTag; + previousPartialResults = partialResults + previousListenMode = listenMode + handler.post { + run { + recognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply { + debugLog("In RecognizerIntent apply") + putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM) + debugLog("put model") + val localContext = pluginContext + if (null != localContext) { + putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, + localContext.applicationInfo.packageName) + } + debugLog("put package") + putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, partialResults) + debugLog("put partial") + if (languageTag != Locale.getDefault().toLanguageTag()) { + putExtra(RecognizerIntent.EXTRA_LANGUAGE, languageTag); + debugLog("put languageTag") + } + } + } + } + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array?, + grantResults: IntArray?): Boolean { + when (requestCode) { + speechToTextPermissionCode -> { + if (null != grantResults) { + permissionToRecordAudio = grantResults.isNotEmpty() && + grantResults.get(0) == PackageManager.PERMISSION_GRANTED + } + completeInitialize() + return true + } + } + return false + } + + + override fun onPartialResults(results: Bundle?) = updateResults(results, false) + override fun onResults(results: Bundle?) = updateResults(results, true) + override fun onEndOfSpeech() = notifyListening(isRecording = false) + + override fun onError(errorCode: Int) { + val errorMsg = when (errorCode) { + SpeechRecognizer.ERROR_AUDIO -> "error_audio_error" + SpeechRecognizer.ERROR_CLIENT -> "error_client" + SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS -> "error_permission" + SpeechRecognizer.ERROR_NETWORK -> "error_network" + SpeechRecognizer.ERROR_NETWORK_TIMEOUT -> "error_network_timeout" + SpeechRecognizer.ERROR_NO_MATCH -> "error_no_match" + SpeechRecognizer.ERROR_RECOGNIZER_BUSY -> "error_busy" + SpeechRecognizer.ERROR_SERVER -> "error_server" + SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> "error_speech_timeout" + else -> "error_unknown" + } + sendError(errorMsg) + } + + private fun debugLog( msg: String ) { + if ( debugLogging ) { + Log.d( logTag, msg ) + } + } + + private fun sendError(errorMsg: String) { + val speechError = JSONObject() + speechError.put("errorMsg", errorMsg) + speechError.put("permanent", true) + handler.post { + run { + channel?.invokeMethod(SpeechToTextCallbackMethods.notifyError.name, speechError.toString()) + } + } + } + + override fun onRmsChanged(rmsdB: Float) { + handler.post { + run { + channel?.invokeMethod(SpeechToTextCallbackMethods.soundLevelChange.name, rmsdB) + } + } + } + + override fun onReadyForSpeech(p0: Bundle?) {} + override fun onBufferReceived(p0: ByteArray?) {} + override fun onEvent(p0: Int, p1: Bundle?) {} + override fun onBeginningOfSpeech() {} +} + +// See https://stackoverflow.com/questions/10538791/how-to-set-the-language-in-speech-recognition-on-android/10548680#10548680 +class LanguageDetailsChecker(flutterResult: Result) : BroadcastReceiver() { + private val result: Result = flutterResult + private var supportedLanguages: List? = null + + private var languagePreference: String? = null + + override fun onReceive(context: Context, intent: Intent) { + val results = getResultExtras(true) + if (results.containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)) { + languagePreference = results.getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE) + } + if (results.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) { + supportedLanguages = results.getStringArrayList( + RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES) + createResponse(supportedLanguages) + } + } + + private fun createResponse(supportedLanguages: List?) { + val currentLocale = Locale.getDefault() + val localeNames = ArrayList() + localeNames.add(buildIdNameForLocale(currentLocale)) + if (null != supportedLanguages) { + for (lang in supportedLanguages) { + if (currentLocale.toLanguageTag() == lang) { + continue + } + val locale = Locale.forLanguageTag(lang) + localeNames.add(buildIdNameForLocale(locale)) + } + } + result.success(localeNames) + + } + + private fun buildIdNameForLocale(locale: Locale): String { + val name = locale.displayName.replace(':', ' ') + return "${locale.language}_${locale.country}:$name" + } +} + +private class ChannelResultWrapper(result: Result) : Result { + // Caller handler + val handler: Handler = Handler(Looper.getMainLooper()) + val result: Result = result + + // make sure to respond in the caller thread + override fun success(results: Any?) { + + handler.post { + run { + result.success(results); + } + } + } + + override fun error(errorCode: String?, errorMessage: String?, data: Any?) { + handler.post { + run { + result.error(errorCode, errorMessage, data); + } + } + } + + override fun notImplemented() { + handler.post { + run { + result.notImplemented(); + } + } + } +} diff --git a/speech_to_text_/example/.gitignore b/speech_to_text_/example/.gitignore new file mode 100644 index 00000000..2ddde2a5 --- /dev/null +++ b/speech_to_text_/example/.gitignore @@ -0,0 +1,73 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/speech_to_text_/example/.metadata b/speech_to_text_/example/.metadata new file mode 100644 index 00000000..aeb01ee2 --- /dev/null +++ b/speech_to_text_/example/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 2d2a1ffec95cc70a3218872a2cd3f8de4933c42f + channel: stable + +project_type: app diff --git a/speech_to_text_/example/README.md b/speech_to_text_/example/README.md new file mode 100644 index 00000000..92252821 --- /dev/null +++ b/speech_to_text_/example/README.md @@ -0,0 +1,155 @@ +# speech_to_text_example + +Demonstrates how to use the speech_to_text plugin. This example requires +that the plugin has been installed. It initializes speech recognition, +listens for words and prints them. + + +## Source + +```dart +import 'package:flutter/material.dart'; +import 'dart:async'; + +import 'package:speech_to_text/speech_to_text.dart'; +import 'package:speech_to_text/speech_recognition_result.dart'; +import 'package:speech_to_text/speech_recognition_error.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + bool _hasSpeech = false; + String lastWords = ""; + String lastError = ""; + String lastStatus = ""; + final SpeechToText speech = SpeechToText(); + + @override + void initState() { + super.initState(); + initSpeechState(); + } + + Future initSpeechState() async { + bool hasSpeech = await speech.initialize(onError: errorListener, onStatus: statusListener ); + + if (!mounted) return; + setState(() { + _hasSpeech = hasSpeech; + }); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Speech to Text Example'), + ), + body: _hasSpeech + ? Column(children: [ + Expanded( + child: Center( + child: Text('Speech recognition available'), + ), + ), + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FlatButton( + child: Text('Start'), + onPressed: startListening, + ), + FlatButton( + child: Text('Stop'), + onPressed: stopListening, + ), + FlatButton( + child: Text('Cancel'), + onPressed:cancelListening, + ), + ], + ), + ), + Expanded( + child: Column( + children: [ + Center( + child: Text('Recognized Words'), + ), + Center( + child: Text(lastWords), + ), + ], + ), + ), + Expanded( + child: Column( + children: [ + Center( + child: Text('Error'), + ), + Center( + child: Text(lastError), + ), + ], + ), + ), + Expanded( + child: Center( + child: speech.isListening ? Text("I'm listening...") : Text( 'Not listening' ), + ), + ), + ]) + : Center( child: Text('Speech recognition unavailable', style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold))), + ), + ); + } + + void startListening() { + lastWords = ""; + lastError = ""; + speech.listen(onResult: resultListener ); + setState(() { + + }); + } + + void stopListening() { + speech.stop( ); + setState(() { + + }); + } + + void cancelListening() { + speech.cancel( ); + setState(() { + + }); + } + + void resultListener(SpeechRecognitionResult result) { + setState(() { + lastWords = "${result.recognizedWords} - ${result.finalResult}"; + }); + } + + void errorListener(SpeechRecognitionError error ) { + setState(() { + lastError = "${error.errorMsg} - ${error.permanent}"; + }); + } + void statusListener(String status ) { + setState(() { + lastStatus = "$status"; + }); + } +} +``` \ No newline at end of file diff --git a/speech_to_text_/example/android/.project b/speech_to_text_/example/android/.project new file mode 100644 index 00000000..d7d48141 --- /dev/null +++ b/speech_to_text_/example/android/.project @@ -0,0 +1,17 @@ + + + android___ + Project android___ created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/speech_to_text_/example/android/.settings/org.eclipse.buildship.core.prefs b/speech_to_text_/example/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 00000000..e8895216 --- /dev/null +++ b/speech_to_text_/example/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir= +eclipse.preferences.version=1 diff --git a/speech_to_text_/example/android/app/build.gradle b/speech_to_text_/example/android/app/build.gradle new file mode 100644 index 00000000..8b616f29 --- /dev/null +++ b/speech_to_text_/example/android/app/build.gradle @@ -0,0 +1,67 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.csdcorp.speech_to_text_example" + minSdkVersion 21 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' +} diff --git a/speech_to_text_/example/android/app/src/debug/AndroidManifest.xml b/speech_to_text_/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..36edf838 --- /dev/null +++ b/speech_to_text_/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/speech_to_text_/example/android/app/src/main/AndroidManifest.xml b/speech_to_text_/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..b0912061 --- /dev/null +++ b/speech_to_text_/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + diff --git a/speech_to_text_/example/android/app/src/main/kotlin/com/csdcorp/speech_to_text_example/MainActivity.kt b/speech_to_text_/example/android/app/src/main/kotlin/com/csdcorp/speech_to_text_example/MainActivity.kt new file mode 100644 index 00000000..f44e470e --- /dev/null +++ b/speech_to_text_/example/android/app/src/main/kotlin/com/csdcorp/speech_to_text_example/MainActivity.kt @@ -0,0 +1,12 @@ +package com.csdcorp.speech_to_text_example + +import androidx.annotation.NonNull; +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugins.GeneratedPluginRegistrant + +class MainActivity: FlutterActivity() { + override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine); + } +} diff --git a/speech_to_text_/example/android/app/src/main/res/drawable/launch_background.xml b/speech_to_text_/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/speech_to_text_/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/speech_to_text_/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/speech_to_text_/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/speech_to_text_/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/speech_to_text_/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/speech_to_text_/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/android/app/src/main/res/values/styles.xml b/speech_to_text_/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..00fa4417 --- /dev/null +++ b/speech_to_text_/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/speech_to_text_/example/android/app/src/profile/AndroidManifest.xml b/speech_to_text_/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..36edf838 --- /dev/null +++ b/speech_to_text_/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/speech_to_text_/example/android/build.gradle b/speech_to_text_/example/android/build.gradle new file mode 100644 index 00000000..13546311 --- /dev/null +++ b/speech_to_text_/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.6.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/speech_to_text_/example/android/gradle.properties b/speech_to_text_/example/android/gradle.properties new file mode 100644 index 00000000..a6738207 --- /dev/null +++ b/speech_to_text_/example/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true +android.enableR8=true diff --git a/speech_to_text_/example/android/gradle/wrapper/gradle-wrapper.properties b/speech_to_text_/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..052e7951 --- /dev/null +++ b/speech_to_text_/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Mar 16 08:57:32 EDT 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/speech_to_text_/example/android/settings.gradle b/speech_to_text_/example/android/settings.gradle new file mode 100644 index 00000000..5a2f14fb --- /dev/null +++ b/speech_to_text_/example/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/speech_to_text_/example/ios/Flutter/AppFrameworkInfo.plist b/speech_to_text_/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..6b4c0f78 --- /dev/null +++ b/speech_to_text_/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/speech_to_text_/example/ios/Flutter/Debug.xcconfig b/speech_to_text_/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..e8efba11 --- /dev/null +++ b/speech_to_text_/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/speech_to_text_/example/ios/Flutter/Flutter.podspec b/speech_to_text_/example/ios/Flutter/Flutter.podspec new file mode 100644 index 00000000..5ca30416 --- /dev/null +++ b/speech_to_text_/example/ios/Flutter/Flutter.podspec @@ -0,0 +1,18 @@ +# +# NOTE: This podspec is NOT to be published. It is only used as a local source! +# + +Pod::Spec.new do |s| + s.name = 'Flutter' + s.version = '1.0.0' + s.summary = 'High-performance, high-fidelity mobile apps.' + s.description = <<-DESC +Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS. + DESC + s.homepage = 'https://flutter.io' + s.license = { :type => 'MIT' } + s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } + s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } + s.ios.deployment_target = '8.0' + s.vendored_frameworks = 'Flutter.framework' +end diff --git a/speech_to_text_/example/ios/Flutter/Release.xcconfig b/speech_to_text_/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..399e9340 --- /dev/null +++ b/speech_to_text_/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/speech_to_text_/example/ios/Podfile b/speech_to_text_/example/ios/Podfile new file mode 100644 index 00000000..ab7d5b46 --- /dev/null +++ b/speech_to_text_/example/ios/Podfile @@ -0,0 +1,90 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '10.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def parse_KV_file(file, separator='=') + file_abs_path = File.expand_path(file) + if !File.exists? file_abs_path + return []; + end + generated_key_values = {} + skip_line_start_symbols = ["#", "/"] + File.foreach(file_abs_path) do |line| + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } + plugin = line.split(pattern=separator) + if plugin.length == 2 + podname = plugin[0].strip() + path = plugin[1].strip() + podpath = File.expand_path("#{path}", file_abs_path) + generated_key_values[podname] = podpath + else + puts "Invalid plugin specification: #{line}" + end + end + generated_key_values +end + +target 'Runner' do + use_frameworks! + use_modular_headers! + + # Flutter Pod + + copied_flutter_dir = File.join(__dir__, 'Flutter') + copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') + copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') + unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) + # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. + # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. + # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. + + generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') + unless File.exist?(generated_xcode_build_settings_path) + raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) + cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; + + unless File.exist?(copied_framework_path) + FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) + end + unless File.exist?(copied_podspec_path) + FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) + end + end + + # Keep pod path relative so it can be checked into Podfile.lock. + pod 'Flutter', :path => 'Flutter' + + # Plugin Pods + + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock + # referring to absolute paths on developers' machines. + system('rm -rf .symlinks') + system('mkdir -p .symlinks/plugins') + plugin_pods = parse_KV_file('../.flutter-plugins') + plugin_pods.each do |name, path| + symlink = File.join('.symlinks', 'plugins', name) + File.symlink(path, symlink) + pod name, :path => File.join(symlink, 'ios') + end +end + +# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. +install! 'cocoapods', :disable_input_output_paths => true + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + end + end +end diff --git a/speech_to_text_/example/ios/Podfile.lock b/speech_to_text_/example/ios/Podfile.lock new file mode 100644 index 00000000..60c8b57d --- /dev/null +++ b/speech_to_text_/example/ios/Podfile.lock @@ -0,0 +1,29 @@ +PODS: + - Flutter (1.0.0) + - speech_to_text (0.0.1): + - Flutter + - Try + - Try (2.1.1) + +DEPENDENCIES: + - Flutter (from `Flutter`) + - speech_to_text (from `.symlinks/plugins/speech_to_text/ios`) + +SPEC REPOS: + trunk: + - Try + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + speech_to_text: + :path: ".symlinks/plugins/speech_to_text/ios" + +SPEC CHECKSUMS: + Flutter: 0e3d915762c693b495b44d77113d4970485de6ec + speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe + Try: 5ef669ae832617b3cee58cb2c6f99fb767a4ff96 + +PODFILE CHECKSUM: 0ba44ad07df4ab62269dc769727cf0f12b1e453d + +COCOAPODS: 1.9.3 diff --git a/speech_to_text_/example/ios/Runner.xcodeproj/project.pbxproj b/speech_to_text_/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c40af650 --- /dev/null +++ b/speech_to_text_/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,578 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + C446300A034BF27D9F1ACEF9 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E76E9615C6B4FABD88067D55 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 59AFE6BB0B596A0E0811BDFF /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6280E2A777726D2043BF80B7 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C3909A4B7EC98A20255210E3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + E76E9615C6B4FABD88067D55 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C446300A034BF27D9F1ACEF9 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7937AF765430D66F28F7FEEF /* Frameworks */ = { + isa = PBXGroup; + children = ( + E76E9615C6B4FABD88067D55 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + A68CCF1640763A551D35BD31 /* Pods */, + 7937AF765430D66F28F7FEEF /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = ""; + }; + A68CCF1640763A551D35BD31 /* Pods */ = { + isa = PBXGroup; + children = ( + 59AFE6BB0B596A0E0811BDFF /* Pods-Runner.debug.xcconfig */, + 6280E2A777726D2043BF80B7 /* Pods-Runner.release.xcconfig */, + C3909A4B7EC98A20255210E3 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 949FCB95217187F2C022D6A9 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 8B0988F04B6AE44AA0304FEF /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 3X949YE9K2; + LastSwiftMigration = 0910; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 8B0988F04B6AE44AA0304FEF /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 949FCB95217187F2C022D6A9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3X949YE9K2; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.csdcorp.speechToTextExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3X949YE9K2; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.csdcorp.speechToTextExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 3X949YE9K2; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.csdcorp.speechToTextExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/speech_to_text_/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/speech_to_text_/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/speech_to_text_/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/speech_to_text_/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/speech_to_text_/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..a28140cf --- /dev/null +++ b/speech_to_text_/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/speech_to_text_/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/speech_to_text_/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/speech_to_text_/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/speech_to_text_/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/speech_to_text_/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/speech_to_text_/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/speech_to_text_/example/ios/Runner/AppDelegate.swift b/speech_to_text_/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/speech_to_text_/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/speech_to_text_/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/speech_to_text_/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/speech_to_text_/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/speech_to_text_/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/speech_to_text_/example/ios/Runner/Base.lproj/Main.storyboard b/speech_to_text_/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/speech_to_text_/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/speech_to_text_/example/ios/Runner/Info.plist b/speech_to_text_/example/ios/Runner/Info.plist new file mode 100644 index 00000000..a69c0fce --- /dev/null +++ b/speech_to_text_/example/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + NSMicrophoneUsageDescription + This example listens for speech on the device microphone on your request. + NSSpeechRecognitionUsageDescription + This example recognizes words as you speak them and displays them. + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + speech_to_text_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/speech_to_text_/example/ios/Runner/Runner-Bridging-Header.h b/speech_to_text_/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..7335fdf9 --- /dev/null +++ b/speech_to_text_/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/speech_to_text_/example/lib/main.dart b/speech_to_text_/example/lib/main.dart new file mode 100644 index 00000000..0115b828 --- /dev/null +++ b/speech_to_text_/example/lib/main.dart @@ -0,0 +1,275 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:speech_to_text/speech_recognition_error.dart'; +import 'package:speech_to_text/speech_recognition_result.dart'; +import 'package:speech_to_text/speech_to_text.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + bool _hasSpeech = false; + double level = 0.0; + double minSoundLevel = 50000; + double maxSoundLevel = -50000; + String lastWords = ""; + String lastError = ""; + String lastStatus = ""; + String _currentLocaleId = ""; + List _localeNames = []; + final SpeechToText speech = SpeechToText(); + + @override + void initState() { + requestPermissions(); + super.initState(); + } + + Future initSpeechState() async { + bool hasSpeech = await speech.initialize( + onError: errorListener, onStatus: statusListener); + if (hasSpeech) { + _localeNames = await speech.locales(); + + var systemLocale = await speech.systemLocale(); + _currentLocaleId = systemLocale.localeId; + } + + if (!mounted) return; + + setState(() { + _hasSpeech = hasSpeech; + }); + } + + void requestPermissions() async{ + Map statuses = await [ + Permission.microphone, + ].request(); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Speech to Text CloudSolution'), + ), + body: Column(children: [ + Center( + child: Text( + 'Speech recognition available', + style: TextStyle(fontSize: 22.0), + ), + ), + Container( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + FlatButton( + child: Text('Initialize'), + onPressed: _hasSpeech ? null : initSpeechState, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + FlatButton( + child: Text('Start'), + onPressed: !_hasSpeech || speech.isListening + ? null + : startListening, + ), + FlatButton( + child: Text('Stop'), + onPressed: speech.isListening ? stopListening : null, + ), + FlatButton( + child: Text('Cancel'), + onPressed: speech.isListening ? cancelListening : null, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + DropdownButton( + onChanged: (selectedVal) => _switchLang(selectedVal), + value: _currentLocaleId, + items: _localeNames + .map( + (localeName) => DropdownMenuItem( + value: localeName.localeId, + child: Text(localeName.name), + ), + ) + .toList(), + ), + ], + ) + ], + ), + ), + Expanded( + flex: 4, + child: Column( + children: [ + Center( + child: Text( + 'Recognized Words', + style: TextStyle(fontSize: 22.0), + ), + ), + Expanded( + child: Stack( + children: [ + Container( + color: Theme.of(context).selectedRowColor, + child: Center( + child: Text( + lastWords, + textAlign: TextAlign.center, + ), + ), + ), + Positioned.fill( + bottom: 10, + child: Align( + alignment: Alignment.bottomCenter, + child: Container( + width: 40, + height: 40, + alignment: Alignment.center, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + blurRadius: .26, + spreadRadius: level * 1.5, + color: Colors.black.withOpacity(.05)) + ], + color: Colors.white, + borderRadius: + BorderRadius.all(Radius.circular(50)), + ), + child: IconButton(icon: Icon(Icons.mic)), + ), + ), + ), + ], + ), + ), + ], + ), + ), + Expanded( + flex: 1, + child: Column( + children: [ + Center( + child: Text( + 'Error Status', + style: TextStyle(fontSize: 22.0), + ), + ), + Center( + child: Text(lastError), + ), + ], + ), + ), + Container( + padding: EdgeInsets.symmetric(vertical: 20), + color: Theme.of(context).backgroundColor, + child: Center( + child: speech.isListening + ? Text( + "I'm listening...", + style: TextStyle(fontWeight: FontWeight.bold), + ) + : Text( + 'Not listening', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ), + ]), + ), + ); + } + + void startListening() { + lastWords = ""; + lastError = ""; + speech.listen( + onResult: resultListener, + listenFor: Duration(seconds: 10), + localeId: _currentLocaleId, + onSoundLevelChange: soundLevelListener, + cancelOnError: true, + partialResults: true, + onDevice: true, + listenMode: ListenMode.confirmation); + setState(() {}); + } + + void stopListening() { + speech.stop(); + setState(() { + level = 0.0; + }); + } + + void cancelListening() { + speech.cancel(); + setState(() { + level = 0.0; + }); + } + + void resultListener(SpeechRecognitionResult result) { + setState(() { + lastWords = "${result.recognizedWords} - ${result.finalResult}"; + }); + } + + void soundLevelListener(double level) { + minSoundLevel = min(minSoundLevel, level); + maxSoundLevel = max(maxSoundLevel, level); + // print("sound level $level: $minSoundLevel - $maxSoundLevel "); + setState(() { + this.level = level; + }); + } + + void errorListener(SpeechRecognitionError error) { + // print("Received error status: $error, listening: ${speech.isListening}"); + setState(() { + lastError = "${error.errorMsg} - ${error.permanent}"; + }); + } + + void statusListener(String status) { + // print( + // "Received listener status: $status, listening: ${speech.isListening}"); + setState(() { + lastStatus = "$status"; + }); + } + + _switchLang(selectedVal) { + setState(() { + _currentLocaleId = selectedVal; + }); + print(selectedVal); + } +} diff --git a/speech_to_text_/ios/.gitignore b/speech_to_text_/ios/.gitignore new file mode 100644 index 00000000..aa479fd3 --- /dev/null +++ b/speech_to_text_/ios/.gitignore @@ -0,0 +1,37 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/Generated.xcconfig +/Flutter/flutter_export_environment.sh \ No newline at end of file diff --git a/speech_to_text_/ios/Assets/.gitkeep b/speech_to_text_/ios/Assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/speech_to_text_/ios/Classes/SpeechToTextPlugin.h b/speech_to_text_/ios/Classes/SpeechToTextPlugin.h new file mode 100644 index 00000000..1785eb8f --- /dev/null +++ b/speech_to_text_/ios/Classes/SpeechToTextPlugin.h @@ -0,0 +1,4 @@ +#import + +@interface SpeechToTextPlugin : NSObject +@end diff --git a/speech_to_text_/ios/Classes/SpeechToTextPlugin.m b/speech_to_text_/ios/Classes/SpeechToTextPlugin.m new file mode 100644 index 00000000..20d0327d --- /dev/null +++ b/speech_to_text_/ios/Classes/SpeechToTextPlugin.m @@ -0,0 +1,8 @@ +#import "SpeechToTextPlugin.h" +#import + +@implementation SpeechToTextPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + [SwiftSpeechToTextPlugin registerWithRegistrar:registrar]; +} +@end diff --git a/speech_to_text_/ios/Classes/SwiftSpeechToTextPlugin.swift b/speech_to_text_/ios/Classes/SwiftSpeechToTextPlugin.swift new file mode 100644 index 00000000..68687967 --- /dev/null +++ b/speech_to_text_/ios/Classes/SwiftSpeechToTextPlugin.swift @@ -0,0 +1,580 @@ +import Flutter +import UIKit +import Speech +import os.log +import Try + +public enum SwiftSpeechToTextMethods: String { + case has_permission + case initialize + case listen + case stop + case cancel + case locales + case unknown // just for testing +} + +public enum SwiftSpeechToTextCallbackMethods: String { + case textRecognition + case notifyStatus + case notifyError + case soundLevelChange +} + +public enum SpeechToTextStatus: String { + case listening + case notListening + case unavailable + case available +} + +public enum SpeechToTextErrors: String { + case onDeviceError + case noRecognizerError + case listenFailedError + case missingOrInvalidArg +} + +public enum ListenMode: Int { + case deviceDefault = 0 + case dictation = 1 + case search = 2 + case confirmation = 3 +} + +struct SpeechRecognitionWords : Codable { + let recognizedWords: String + let confidence: Decimal +} + +struct SpeechRecognitionResult : Codable { + let alternates: [SpeechRecognitionWords] + let finalResult: Bool +} + +struct SpeechRecognitionError : Codable { + let errorMsg: String + let permanent: Bool +} + +enum SpeechToTextError: Error { + case runtimeError(String) +} + + +@available(iOS 10.0, *) +public class SwiftSpeechToTextPlugin: NSObject, FlutterPlugin { + private var channel: FlutterMethodChannel + private var registrar: FlutterPluginRegistrar + private var recognizer: SFSpeechRecognizer? + private var currentRequest: SFSpeechAudioBufferRecognitionRequest? + private var currentTask: SFSpeechRecognitionTask? + private var listeningSound: AVAudioPlayer? + private var successSound: AVAudioPlayer? + private var cancelSound: AVAudioPlayer? + private var rememberedAudioCategory: AVAudioSession.Category? + private var previousLocale: Locale? + private var onPlayEnd: (() -> Void)? + private var returnPartialResults: Bool = true + private var failedListen: Bool = false + private var listening = false + private let audioSession = AVAudioSession.sharedInstance() + private let audioEngine = AVAudioEngine() + private let jsonEncoder = JSONEncoder() + private let busForNodeTap = 0 + private let speechBufferSize: AVAudioFrameCount = 1024 + private static var subsystem = Bundle.main.bundleIdentifier! + private let pluginLog = OSLog(subsystem: "com.csdcorp.speechToText", category: "plugin") + + public static func register(with registrar: FlutterPluginRegistrar) { + let channel = FlutterMethodChannel(name: "plugin.csdcorp.com/speech_to_text", binaryMessenger: registrar.messenger()) + let instance = SwiftSpeechToTextPlugin( channel, registrar: registrar ) + registrar.addMethodCallDelegate(instance, channel: channel ) + } + + init( _ channel: FlutterMethodChannel, registrar: FlutterPluginRegistrar ) { + self.channel = channel + self.registrar = registrar + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case SwiftSpeechToTextMethods.has_permission.rawValue: + hasPermission( result ) + case SwiftSpeechToTextMethods.initialize.rawValue: + initialize( result ) + case SwiftSpeechToTextMethods.listen.rawValue: + guard let argsArr = call.arguments as? Dictionary, + let partialResults = argsArr["partialResults"] as? Bool, let onDevice = argsArr["onDevice"] as? Bool, let listenModeIndex = argsArr["listenMode"] as? Int + else { + DispatchQueue.main.async { + result(FlutterError( code: SpeechToTextErrors.missingOrInvalidArg.rawValue, + message:"Missing arg partialResults, onDevice, and listenMode are required", + details: nil )) + } + return + } + var localeStr: String? = nil + if let localeParam = argsArr["localeId"] as? String { + localeStr = localeParam + } + guard let listenMode = ListenMode(rawValue: listenModeIndex) else { + DispatchQueue.main.async { + result(FlutterError( code: SpeechToTextErrors.missingOrInvalidArg.rawValue, + message:"invalid value for listenMode, must be 0-2, was \(listenModeIndex)", + details: nil )) + } + return + } + + listenForSpeech( result, localeStr: localeStr, partialResults: partialResults, onDevice: onDevice, listenMode: listenMode ) + case SwiftSpeechToTextMethods.stop.rawValue: + stopSpeech( result ) + case SwiftSpeechToTextMethods.cancel.rawValue: + cancelSpeech( result ) + case SwiftSpeechToTextMethods.locales.rawValue: + locales( result ) + default: + os_log("Unrecognized method: %{PUBLIC}@", log: pluginLog, type: .error, call.method) + DispatchQueue.main.async { + result( FlutterMethodNotImplemented) + } + } + } + + private func hasPermission( _ result: @escaping FlutterResult) { + let has = SFSpeechRecognizer.authorizationStatus() == SFSpeechRecognizerAuthorizationStatus.authorized && + AVAudioSession.sharedInstance().recordPermission == AVAudioSession.RecordPermission.granted + DispatchQueue.main.async { + result( has ) + } + } + + private func initialize( _ result: @escaping FlutterResult) { + var success = false + let status = SFSpeechRecognizer.authorizationStatus() + switch status { + case SFSpeechRecognizerAuthorizationStatus.notDetermined: + SFSpeechRecognizer.requestAuthorization({(status)->Void in + success = status == SFSpeechRecognizerAuthorizationStatus.authorized + if ( success ) { + AVAudioSession.sharedInstance().requestRecordPermission({(granted: Bool)-> Void in + if granted { + self.setupSpeechRecognition(result) + } else{ + self.sendBoolResult( false, result ); + os_log("User denied permission", log: self.pluginLog, type: .info) + } + }) + } + else { + self.sendBoolResult( false, result ); + } + }); + case SFSpeechRecognizerAuthorizationStatus.denied: + os_log("Permission permanently denied", log: self.pluginLog, type: .info) + sendBoolResult( false, result ); + case SFSpeechRecognizerAuthorizationStatus.restricted: + os_log("Device restriction prevented initialize", log: self.pluginLog, type: .info) + sendBoolResult( false, result ); + default: + os_log("Has permissions continuing with setup", log: self.pluginLog, type: .debug) + setupSpeechRecognition(result) + } + } + + fileprivate func sendBoolResult( _ value: Bool, _ result: @escaping FlutterResult) { + DispatchQueue.main.async { + result( value ) + } + } + + fileprivate func setupListeningSound() { + listeningSound = loadSound("assets/sounds/speech_to_text_listening.m4r") + successSound = loadSound("assets/sounds/speech_to_text_stop.m4r") + cancelSound = loadSound("assets/sounds/speech_to_text_cancel.m4r") + } + + fileprivate func loadSound( _ assetPath: String ) -> AVAudioPlayer? { + var player: AVAudioPlayer? = nil + let soundKey = registrar.lookupKey(forAsset: assetPath ) + guard !soundKey.isEmpty else { + return player + } + if let soundPath = Bundle.main.path(forResource: soundKey, ofType:nil) { + let soundUrl = URL(fileURLWithPath: soundPath ) + do { + player = try AVAudioPlayer(contentsOf: soundUrl ) + player?.delegate = self + } catch { + // no audio + } + } + return player + } + + private func setupSpeechRecognition( _ result: @escaping FlutterResult) { + setupRecognizerForLocale( locale: Locale.current ) + guard recognizer != nil else { + sendBoolResult( false, result ); + return + } + recognizer?.delegate = self + setupListeningSound() + + sendBoolResult( true, result ); + } + + private func setupRecognizerForLocale( locale: Locale ) { + if ( previousLocale == locale ) { + return + } + previousLocale = locale + recognizer = SFSpeechRecognizer( locale: locale ) + } + + private func getLocale( _ localeStr: String? ) -> Locale { + guard let aLocaleStr = localeStr else { + return Locale.current + } + let locale = Locale(identifier: aLocaleStr) + return locale + } + + private func stopSpeech( _ result: @escaping FlutterResult) { + if ( !listening ) { + sendBoolResult( false, result ); + return + } + stopAllPlayers() + if let sound = successSound { + onPlayEnd = {() -> Void in + self.currentTask?.finish() + self.stopCurrentListen( ) + self.sendBoolResult( true, result ) + return + } + sound.play() + } + else { + stopCurrentListen( ) + sendBoolResult( true, result ); + } + } + + private func cancelSpeech( _ result: @escaping FlutterResult) { + if ( !listening ) { + sendBoolResult( false, result ); + return + } + stopAllPlayers() + if let sound = cancelSound { + onPlayEnd = {() -> Void in + self.currentTask?.cancel() + self.stopCurrentListen( ) + self.sendBoolResult( true, result ) + return + } + sound.play() + } + else { + self.currentTask?.cancel() + stopCurrentListen( ) + sendBoolResult( true, result ); + } + } + + private func stopAllPlayers() { + cancelSound?.stop() + successSound?.stop() + listeningSound?.stop() + } + + private func stopCurrentListen( ) { + stopAllPlayers() + currentRequest?.endAudio() + + do { + try trap { + self.audioEngine.stop() + } + } + catch { + os_log("Error stopping engine: %{PUBLIC}@", log: pluginLog, type: .error, error.localizedDescription) + } + do { + try trap { + let inputNode = self.audioEngine.inputNode + inputNode.removeTap(onBus: self.busForNodeTap); + } + } + catch { + os_log("Error removing trap: %{PUBLIC}@", log: pluginLog, type: .error, error.localizedDescription) + } + do { + if let rememberedAudioCategory = rememberedAudioCategory { + try self.audioSession.setCategory(rememberedAudioCategory) + } + } + catch { + os_log("Error stopping listen: %{PUBLIC}@", log: pluginLog, type: .error, error.localizedDescription) + } + do { + try self.audioSession.setActive(false, options: .notifyOthersOnDeactivation) + } + catch { + os_log("Error deactivation: %{PUBLIC}@", log: pluginLog, type: .info, error.localizedDescription) + } + currentRequest = nil + currentTask = nil + onPlayEnd = nil + listening = false + } + + private func listenForSpeech( _ result: @escaping FlutterResult, localeStr: String?, partialResults: Bool, onDevice: Bool, listenMode: ListenMode ) { + if ( nil != currentTask || listening ) { + sendBoolResult( false, result ); + return + } + do { + // let inErrorTest = true + failedListen = false + returnPartialResults = partialResults + setupRecognizerForLocale(locale: getLocale(localeStr)) + guard let localRecognizer = recognizer else { + result(FlutterError( code: SpeechToTextErrors.noRecognizerError.rawValue, + message:"Failed to create speech recognizer", + details: nil )) + return + } + if ( onDevice ) { + if #available(iOS 13.0, *), !localRecognizer.supportsOnDeviceRecognition { + result(FlutterError( code: SpeechToTextErrors.onDeviceError.rawValue, + message:"on device recognition is not supported on this device", + details: nil )) + } + } + rememberedAudioCategory = self.audioSession.category + try self.audioSession.setCategory(AVAudioSession.Category.playAndRecord, options: .defaultToSpeaker) + // try self.audioSession.setMode(AVAudioSession.Mode.measurement) + try self.audioSession.setMode(AVAudioSession.Mode.default) + try self.audioSession.setActive(true, options: .notifyOthersOnDeactivation) + if let sound = listeningSound { + self.onPlayEnd = {()->Void in + if ( !self.failedListen ) { + self.listening = true + self.invokeFlutter( SwiftSpeechToTextCallbackMethods.notifyStatus, arguments: SpeechToTextStatus.listening.rawValue ) + + } + } + sound.play() + } + self.audioEngine.reset(); + let inputNode = self.audioEngine.inputNode + if(inputNode.inputFormat(forBus: 0).channelCount == 0){ + throw SpeechToTextError.runtimeError("Not enough available inputs.") + } + self.currentRequest = SFSpeechAudioBufferRecognitionRequest() + guard let currentRequest = self.currentRequest else { + sendBoolResult( false, result ); + return + } + currentRequest.shouldReportPartialResults = true + if #available(iOS 13.0, *), onDevice { + currentRequest.requiresOnDeviceRecognition = true + } + switch listenMode { + case ListenMode.dictation: + currentRequest.taskHint = SFSpeechRecognitionTaskHint.dictation + break + case ListenMode.search: + currentRequest.taskHint = SFSpeechRecognitionTaskHint.search + break + case ListenMode.confirmation: + currentRequest.taskHint = SFSpeechRecognitionTaskHint.confirmation + break + default: + break + } + self.currentTask = self.recognizer?.recognitionTask(with: currentRequest, delegate: self ) + let recordingFormat = inputNode.outputFormat(forBus: self.busForNodeTap) + try trap { + inputNode.installTap(onBus: self.busForNodeTap, bufferSize: self.speechBufferSize, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in + currentRequest.append(buffer) + self.updateSoundLevel( buffer: buffer ) + } + } + // if ( inErrorTest ){ + // throw SpeechToTextError.runtimeError("for testing only") + // } + self.audioEngine.prepare() + try self.audioEngine.start() + if nil == listeningSound { + listening = true + self.invokeFlutter( SwiftSpeechToTextCallbackMethods.notifyStatus, arguments: SpeechToTextStatus.listening.rawValue ) + } + sendBoolResult( true, result ); + } + catch { + failedListen = true + os_log("Error starting listen: %{PUBLIC}@", log: pluginLog, type: .error, error.localizedDescription) + stopCurrentListen() + sendBoolResult( false, result ); + invokeFlutter( SwiftSpeechToTextCallbackMethods.notifyStatus, arguments: SpeechToTextStatus.notListening.rawValue ) + let speechError = SpeechRecognitionError(errorMsg: "error_listen_failed", permanent: true ) + do { + let errorResult = try jsonEncoder.encode(speechError) + invokeFlutter( SwiftSpeechToTextCallbackMethods.notifyError, arguments: String( data:errorResult, encoding: .utf8) ) + } catch { + os_log("Could not encode JSON", log: pluginLog, type: .error) + } + } + } + + private func updateSoundLevel( buffer: AVAudioPCMBuffer) { + guard + let channelData = buffer.floatChannelData + else { + return + } + + let channelDataValue = channelData.pointee + let channelDataValueArray = stride(from: 0, + to: Int(buffer.frameLength), + by: buffer.stride).map{ channelDataValue[$0] } + let frameLength = Float(buffer.frameLength) + let rms = sqrt(channelDataValueArray.map{ $0 * $0 }.reduce(0, +) / frameLength ) + let avgPower = 20 * log10(rms) + self.invokeFlutter( SwiftSpeechToTextCallbackMethods.soundLevelChange, arguments: avgPower ) + } + + /// Build a list of localId:name with the current locale first + private func locales( _ result: @escaping FlutterResult ) { + var localeNames = [String](); + let locales = SFSpeechRecognizer.supportedLocales(); + let currentLocale = Locale.current + if let idName = buildIdNameForLocale(forIdentifier: currentLocale.identifier ) { + localeNames.append(idName) + } + for locale in locales { + if ( locale.identifier == currentLocale.identifier) { + continue + } + if let idName = buildIdNameForLocale(forIdentifier: locale.identifier ) { + localeNames.append(idName) + } + } + DispatchQueue.main.async { + result(localeNames) + } + } + + private func buildIdNameForLocale( forIdentifier: String ) -> String? { + var idName: String? + if let name = Locale.current.localizedString(forIdentifier: forIdentifier ) { + let sanitizedName = name.replacingOccurrences(of: ":", with: " ") + idName = "\(forIdentifier):\(sanitizedName)" + } + return idName + } + + private func handleResult( _ transcriptions: [SFTranscription], isFinal: Bool ) { + if ( !isFinal && !returnPartialResults ) { + return + } + var speechWords: [SpeechRecognitionWords] = [] + for transcription in transcriptions { + let words: SpeechRecognitionWords = SpeechRecognitionWords(recognizedWords: transcription.formattedString, confidence: confidenceIn( transcription)) + speechWords.append( words ) + } + let speechInfo = SpeechRecognitionResult(alternates: speechWords, finalResult: isFinal ) + do { + let speechMsg = try jsonEncoder.encode(speechInfo) + if let speechStr = String( data:speechMsg, encoding: .utf8) { + os_log("Encoded JSON result: %{PUBLIC}@", log: pluginLog, type: .debug, speechStr ) + invokeFlutter( SwiftSpeechToTextCallbackMethods.textRecognition, arguments: speechStr ) + } + } catch { + os_log("Could not encode JSON", log: pluginLog, type: .error) + } + } + + private func confidenceIn( _ transcription: SFTranscription ) -> Decimal { + guard ( transcription.segments.count > 0 ) else { + return 0; + } + var totalConfidence: Float = 0.0; + for segment in transcription.segments { + totalConfidence += segment.confidence + } + let avgConfidence: Float = totalConfidence / Float(transcription.segments.count ) + let confidence: Float = (avgConfidence * 1000).rounded() / 1000 + return Decimal( string: String( describing: confidence ) )! + } + + private func invokeFlutter( _ method: SwiftSpeechToTextCallbackMethods, arguments: Any? ) { + DispatchQueue.main.async { + self.channel.invokeMethod( method.rawValue, arguments: arguments ) + } + } + +} + +@available(iOS 10.0, *) +extension SwiftSpeechToTextPlugin : SFSpeechRecognizerDelegate { + public func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) { + let availability = available ? SpeechToTextStatus.available.rawValue : SpeechToTextStatus.unavailable.rawValue + os_log("Availability changed: %{PUBLIC}@", log: pluginLog, type: .debug, availability) + invokeFlutter( SwiftSpeechToTextCallbackMethods.notifyStatus, arguments: availability ) + } +} + +@available(iOS 10.0, *) +extension SwiftSpeechToTextPlugin : SFSpeechRecognitionTaskDelegate { + public func speechRecognitionDidDetectSpeech(_ task: SFSpeechRecognitionTask) { + // Do nothing for now + } + + public func speechRecognitionTaskFinishedReadingAudio(_ task: SFSpeechRecognitionTask) { + reportError(source: "FinishedReadingAudio", error: task.error) + invokeFlutter( SwiftSpeechToTextCallbackMethods.notifyStatus, arguments: SpeechToTextStatus.notListening.rawValue ) + } + + public func speechRecognitionTaskWasCancelled(_ task: SFSpeechRecognitionTask) { + reportError(source: "TaskWasCancelled", error: task.error) + invokeFlutter( SwiftSpeechToTextCallbackMethods.notifyStatus, arguments: SpeechToTextStatus.notListening.rawValue ) + } + + public func speechRecognitionTask(_ task: SFSpeechRecognitionTask, didFinishSuccessfully successfully: Bool) { + reportError(source: "FinishSuccessfully", error: task.error) + stopCurrentListen( ) + } + + public func speechRecognitionTask(_ task: SFSpeechRecognitionTask, didHypothesizeTranscription transcription: SFTranscription) { + reportError(source: "HypothesizeTranscription", error: task.error) + handleResult( [transcription], isFinal: false ) + } + + public func speechRecognitionTask(_ task: SFSpeechRecognitionTask, didFinishRecognition recognitionResult: SFSpeechRecognitionResult) { + reportError(source: "FinishRecognition", error: task.error) + let isFinal = recognitionResult.isFinal + handleResult( recognitionResult.transcriptions, isFinal: isFinal ) + } + + private func reportError( source: String, error: Error?) { + if ( nil != error) { + os_log("%{PUBLIC}@ with error: %{PUBLIC}@", log: pluginLog, type: .debug, source, error.debugDescription) + } + } +} + +@available(iOS 10.0, *) +extension SwiftSpeechToTextPlugin : AVAudioPlayerDelegate { + + public func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, + successfully flag: Bool) { + if let playEnd = self.onPlayEnd { + playEnd() + } + } +} diff --git a/speech_to_text_/ios/speech_to_text.podspec b/speech_to_text_/ios/speech_to_text.podspec new file mode 100644 index 00000000..1db79aa0 --- /dev/null +++ b/speech_to_text_/ios/speech_to_text.podspec @@ -0,0 +1,22 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'speech_to_text' + s.version = '0.0.1' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + s.dependency 'Try' + + s.ios.deployment_target = '8.0' +end +