diff --git a/.env b/.env new file mode 100644 index 0000000..fb993eb --- /dev/null +++ b/.env @@ -0,0 +1,118 @@ +basicAuthCredentials=wqnmqqsjyvwjv:nqrYJP@1737XrXlBl +basicCompareFaces=zjujluqfpj:nqrYjp@1737XrXlBl +basicCompareFacesURL='https://face-detect-f6924392c4c7.herokuapp.com/compare_faces' +accountSIDTwillo=QFx0qy456juj383n9xuy2194q629q1fj0y7XrXlBl +serverAPI=QQQQobSrrFi:QVQ87xU7zwCvmZzZdaxuS2f23Y4mz7MzyOzr8od2br6KYyeFaTVLG3K3hx5ZaUyx7eYvAYpAVdKk-286NTRi3zs9iSOnXtXRIxswg3KecBmsl3VxJ9wO-vIpwu4Pv7dkHkXniuxMSDgWXrXlBl +mapAPIKEY=AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64 +email=@intaleqapp.com +mapAPIKEYIOS=AIzaSyDzGO9a-1IDMLD2FxhmOO9ONL1gMssFa9g +twilloRecoveryCode=CAU79DHPH1BjE9PUH4ETXTSXZXrXlBl +apiKeyHere=g_WNUb5L-tripz7-F8omHpUmgIzH7ETeH9xZ8RwGG9_G8zX9A +authTokenTwillo=70u98ju0214oxx4q0u74028u021u4qu65XrXlBl +chatGPTkey=zg-4C26q4SYgBKQeHZDqkWowC9XrxgUEfUy9JRw2rm6Q2adb3kjwXrXlBl +transactionCloude=Qhcwuilomqcoib:QVO_JNYED2XWA26YXKC2TP:YK1DVH6SJB31N3PE1UXrXlBl +visionApi=3pALsqSSYTvzp69Q5FMIgbzjG6Z1zktJXrXlBl +chatGPTkeySefer=zg-IiR3i4ooza3Yvhvb9rZk1C9XrxgUE0l8jRRZrHj3Qe5QXPlqVXrXlBl +chatGPTkeySeferNew=zg-Z4oAJcAROgNXjgrEIU8fKC9XrxgUE4Qtrrlq1yiux0jL3dITSXrXlBl +secretKey=zg_ropj_57Iiv6pMFCBFq3C2n6IXlmjykpxDmW93SW3vvXh68UA9T5FORTWgWsT37StKsOPdwDdsy8qR9srMUluahs3nPHvgBa33tGk90vV5XrXlBl +stripe_publishableKe=vg_propj_57Iiv6MFCBFq3C2n6kNJnZByV6nuDtXe9IjEPOfhmpDtWmt3MLR0gQpiHcQmAFMUPrZc3QiCDjxBZLbxDC3efxWxz33bWH1ZgrsXrXlBl +llamaKey=RR-EuyoFDUvfRDBoj46fZKAtKJ3voM8Mt768cPeJV7GNdAkPTKdY8Odm9n4ggGqI5GyoXrXlBl +serverPHP=https://api.sefer.live/sefer +seferAlexandriaServer=https://seferalexandria.site/sefer +seferPaymentServer=https://seferpw.shop/sefer +# seferCairoServer=https://sefer.click/sefer +seferCairoServer=https://server.sefer.live/sefer.click/sefer +seferGizaServer=https://gizasefer.online/sefer +whatappID=3699397362811879 +whatsapp=EAAOtbZBSUK74BOzW9yb74EgApQYtI88nYtE9jQi9QnLGpw3FQpc5dxIlDgVJzcMywEBqNYf3s8pkk6cZB5Q0tkKuSOZBsOvMZA3Tcth0IlBHSaMVtcRZCsaTKNSUpfLRGRb0rhLezNFllpYBgmnfbhUazSZBYXdr40nmN4QEgweK2eqYQnTTNuryTOyBkKZB1MXMw6U7QnTRQDxHbUVlqgIRTrhaooZD +cohere=Aulwd8y5SPWos0hJhlG0toUf8gOhUUrpf5Q2TPmVGXrXlBl +claudeAiAPI=zg-qbc-qvo39l-xWOxIGwWTOzCFBnIYSKKhfyz_KVAvrH-6_4ZEJL68G_QBH26oeTOMMoQug9KuOjjKSP_A4S3SUDlbxR9duVzoQ-MkX_UQQQXrXlBl +payPalClientId=QALymlfNI5Tzt4s-ysoz6vD4_nqX0SUtkC_qYV-Ugk5gaM_8Z-kg4L53k8Uux_4jEWXDkNpXGSWPpIzDFXrXlBl +payPalClientIdLive=QZFkjAoZfGtngNserll6r3cC56Xl1sVLQkn5dMbyebhzJY59EQ3hz7YxaEqEDYPTUFcQWqvePaQ5UJJVRXrXlBl +payPalSecret=JBAAvqJQGUsKD0Zjh4KjeczxfBFx-38SdlbIS56VRM8NDfe6mjMeZJhNLJek5XgQCqKCHtRf6MjRy-f8XrXlBl +payPalSecretLive=JQDATqkknDfiFpEAN60KB4pGpDaJjyqBAd9jxMBPpzWU1P1k3H1jZhQjn73EHsKQna74P8p98hgOnMaWPWXrXlBl +geminiApi=QOmqZsQYm08vlOqjI7klVJfvP4WBFEoemjgy396iXrXlBl +geminiApiMasa=QOmqZsQIpdM4BRsKmaDJOP7dZp5-c6NWfch7PAlQXrXlBl +agoraAppId=71880f2j636o509j24y5294480y30u848XrXlBl +agoraAppCertificate=j17q944u49390jhq758u1649448q2y6xfuXrXlBl +usernamePayMob=37319104052XrXlBl +passwordPayMob='g@nkD2#99k!hD_.wXrXlBl' +integrationIdPayMob=0237630XrXlBl +payMobApikey='MDrGqKEWS1rVqhjggHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=cvcXrXlBlbbbbb' +integrationIdPayMobWallet=0277739XrXlBl +ocpApimSubscriptionKey=0f5dacccdbce4131b1a5f952996302e3 +smsPasswordEgypt="J)Vh=qb/@MXrXlBl" +chatGPTkeySeferNew4=zg-vlie-2l1ZlpximLJ6wQOvbb4TnC9XrxgUEyVQIu6TID4qP4FUUqoS5XrXlBl +anthropicAIkeySeferNew=zg-qbc-qvo39-mn4VdMQ5nuJeIYhMN4PDYr7qox3-t2i1Lh7aNTDfYF-Gf8whUJZCs47EeelKn8_UcmUMmiSLaf0UJg0DvUlQrDt-76CRrkQQXrXlBl +llama3Key=kzg_uTXy3e9DBbCQ1FnMGmxYwTKysx9US1burxJj4fFwOje4LZBUFKJS1XrXlBl +payMobOutClientSecrret='xyjjRlkahJM0Xc38WjApCOh8bvgL9slFpNdM9YeCu9AhLqboKMPtmSvc2N9O4tXxFLV2JAV6stBSTAGFGCVubGe6MNpc7MzJnZ3SiT6GpavBoCLWkUvVbdSDaM0zHvuBOXrXlBl' +payMobOutClient_id='Z05ut48dVkkS2gI2zenFFcKsfDKfHAU0WELqKyJ0LXrXlBl' +payMobOutPassword='D2zJFxkE#LNk3vz38z2dYxpNfWXrXlBl' +payMobOutUserName='zjujl_qvo_fwkjfgjlXrXlBl' +keyOfApp=balsev@7696tabnaazesmeheregzpfjoXrXrBr +initializationVector=qxfyjukwoegrnbivXrXrBr +privateKeyFCM=WZSHwLUNI/wlyLUyIZHYf/pgOo6JZplTQqKK2HJmuSJ+r4Iygz/W+03uFPFS4iLv4AIuZ5+wFBDU9gf240fgjhjJgq1bwiW4TrlTh4YhEtHjiPTBCielwIcYFrhrlD4xLTHQC8feSZuZ4t3wZISRfqjuIyu58yhG5H64RifbD5efjzE6KJCivhIpXcK5k1t32lMnlLKzPkSqW2znCXYhRNOQEL+sAllmQNpHVy7LAgr829Jl5AoEuHmYeeCLOIzV5oMdHpQGDDAaG+bo9Yda4n3S1NXNAwU3h8uWsXaAHS1mkgb49+gTJQLfhrxdj2jOHB2HaUA7IyypVXTDuEZzYrYs/+yK2HvmFld/Fqt7ndWqenfl4Qu6+r/JUEHhaGMFNkiChvtVHjLHDOBw7Zrtm5kDzwrvybCVZSrZAwJvudT7eZjRlYrdm2s+v5Q4wVayBslBW02KT/VrXJsuPJKtI7l2jHzIV6M0vmMXU8rlah2gSVl9ZX8mLxcQm7iWbLyWX0S4hixngw3N+j7wltAxYodfkCdJj0BdeH0ZCCKlbANs+lQf5hIzjkC7RcSc2xRnMn1mcyqUlK0BiniSgBSixD3JdpG8UTEYU5nfTVdgsx+fcvje5Dloo6zblKbIVje8vh5MSFjM2yr4nOpbQu95vOW/jSYUjm2WGppCmpBVyWYglp4AlnwDNFL01p3jq+1YixPTZjnp4Bm4XGiGIUnmjBeC18CQ53rg+aWvE7UlOMsoirgU1Y+tAxzbx74xtYfgNjavyD+GtUWkOZPtKSTeR+0uBrfTehFK24QypP5OT3dRbAwRVneySDJOpcQA9xReYpJgoW29GzNLNNoEW+65HIqYQ7WkVj0Z16YOma/WhR4MSHWpOmqxVAYOsGpZw9QnSrY/CFN8uKhYPC4RGONHmk5CP0rTNA0syrBS0XPFsJ8vhgJmB2wjUs46IDX5tFreS7q4axsOSxZMWSQlRHcxSdwFVAepBIfoGWHSUmE0sxpsz+ewCdYtZrWYE0jwEqiTiKR1M4hpn9P1mI0CHri6uRUY2Im86kuEGA5GE9U287rOubVCfC+IxU4vOnNi05fN4lJutdXjweHN7L1ZJ4H0AsFfs8Q3HSHKbn5MTJUlF2rlhNomMlLJnRrDzYiSJ6wIbBXzT8h23WXPMNrTkbh8WkPugEPrp0LTyJI2wurEhhPIlqJwFcpjVVsDmFKmTqMegJsj9C8kHixQ/kyT0AtQ3qTVxgHP/9nxyuglVzdezqlB09yOjVnq/xU+nnTx2RX90Lpf192D23rSvtvfG4LAs2vloKljKG0yIGntFJbikCsv1bQfXwa4cXb6niks4v7irCjLzEtyIDzjYaaSJc0gs69tyumG0bc7AjJa4AvrDtFchN2m9PXGFoOHC0eDMqfANc2VztcYlFEMH0Fp/VsIuiTOSI9Tsb8wjRlrew13EqWUXN48srVHaFfyXUCbSpeelnqCe21EwGOpfgqgUcu/5WdtYH+e7F0Z3xtV6lZNqV7mWYuyyf9C9PviFh0ZECKXivg6vrP4pqDSvuu79ZkR0aTf43NPvGRIIR6Hbjt+Msi3CKsRlLrN8sslxFfB4ZYpQcGmDxTd0vvnarfu0ezz5GU4AXA3Eb4rYdaoB3MRxvbRF/2NMdqb+M5iPTVgRZ7vmDsIogu4O4kgpYNjPE2B66Qz/CbRI6CYFAnF3usKjnNl9k5bFL8d6x+EOZaXm2bZhML5K//tB2TsGl5Bw7sNggC56KqOEOg6WnDIoy4NzzImd8IEamuZdkiaaRl8+/P3Mz+b325kZzAj2e/5feXoup8V/H4edIsIGeIjHNuU+otJ8LQ9EnMFGaZfkiboH7feG1W/n8sZAlusmwcpeISNbskCmQKO44oI8G0WWBpLNo4/5NN1V4XuPGVoIhxQSObLDBHoRttmMNHp3dWv+R9SMxOuswXZYsLUJD5vLD3i9ZzBuLrBdiKgFk7rVFvTrz1CIiBDKeFtvMiEfEtSSQkI5nnh1dHSxRRBrmGa/UME/dCdRGlvTZuHGnq+PgJFlhC3oYLBhOJcw65asHKm94tgLeGeWZ9UytEfuvuL2gIAUUql0sLjgnWBoz84XCkNVMP2fB0Ci6NAbRfE1zJh8PVHezFvvEOl8KvVkLqFtzRqgTvkLV/cjG8bvJsTaHklejY14iv+pG0gYZ4Gkia5jvSzGa3IZEqhOG5hXmEBLcBcfp7ApQ5Ezopt9EJVm4+kRW5nWB6YPiqbzfz8Ab7/uV6GIWSJoG7f0kW1keUtL9SS2n2OxG3S0XWJrYoN9udVviFdl5GqDqTfc4odY9v4fdV3bMgU009S9y6dNRhi3RUTaNIcZHAVbEL0VXzXOi/r4ICjMFXvWVF8xY8RdJPedu9HIbCTq+TPzOgpHoANzm8Rjm2i6J5TLUfqdS7NIHig8M5lni80PlOlnmgvjf5s6PwatrbN6QKMxk8bg6LoI2yGy5ICJ5dncvcR/GgTxHEpz3aknTdMqJMfyST7CmIpTOULEO4zmiKrWYvvlEmaax7j1fJoz4Y1Z29Zm7+mG9lGrCUnsU9CZoAr/d+flJnSWwdwhL/RXhu+pbkdu2gTmg9ar4mwoGYp9GoaefgCIupiL4T3JekNS/MvmZFbiGxl4TVVobj5MsYHawLs5C9AdzjEuK6ktqAr0o1ycBwfj66kuqSnU7KQedmlDs3XmlAqdGk6V2BEs7/b+bfuUJw1FcYf9MVXMQnN1pbDKJVtb+Zrf+AYQ9etUPpsoDxom2NJRgjjdsLkLIPxEZ6HJRAEcnHx49ER+zbdL+7MKolBRzlW4mZHLYkscfx7bqWZsH5PtjDp9Ed1xbHpmwFbv7XV2mYfST6Nu8dLYk/6wkyZybv8hNe1Wj/4o+iMRnOsCUasT9GKF2ezoej1RPzN3GjqR0gfrndn40fXFn4E2n8HP8SKeChiNf++HEzbzd9a7djXE3Xon8/baEaTUBKZUoIZ9OFypU+Ueo0CJpI9CzEipfXp3lGImVhsdQJ2AwRnY6HkXS74sd840HyYzDGL0B8mVvgQwYJQyC+xHRmNUFO9ugmhOmXQjVnkST9XqJpm/vwTAY28C/Al1iKmMjFqWBBNkyRJd6lTus87niZr+tpzBPLW6PZDaAcS5aTPS/dv01W5gLeEhA== +sss_pass=wqnmqqsjyvwv:nqrmYJP@17378XrXlBl +sss_encryptionSalt=zg-vklie-2l1ZlpxiLJ6wQOvbb4TnC9XrxgUEyVQIu6TID4qP4FUUqoS5XrXlBl +addd=BlBlNl +getLocationAreaLinks =https://api.tripz-egypt.com/tripz/ride/location/get_location_area_links.php +anthropicAIkeySeferNewHamzaayedpython=zg-qbc-qvo39-vCB-WnzEwFNArO0YlTapvfhtmguKWsXJSKqg_NZSjHBYVXMZK1yUK88SobdckV0KuPaBh0c_WHtGsRO_439PBk-e2QqgkQQXrXlBl +emailService=seferservice@gmail.com +allowed=TripzDriver: +allowedWallet=TripzWallet: +passnpassenger=hbgbitbXrXrBr +ALLOWED_ADMIN_PHONES=962798583052,962790849027,962787021927 +newId=new +a=q +b=x +c=f +d=y +e=j +f=u +g=k +h=w +i=o +j=e +k=g +l=r +m=n +n=b +o=i +p=v +q=a +r=l +s=z +t=c +u=h +v=p +w=t +x=d +y=s +z=m + +A=Q +B=X +C=F +D=Y +E=J +F=U +G=K +H=W +I=O +J=E +K=G +L=R +M=N +N=B +O=I +P=V +Q=A +R=L +S=Z +T=C +U=H +V=P +W=T +X=D +Y=S +Z=M \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# 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/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..22d7cf5 --- /dev/null +++ b/.metadata @@ -0,0 +1,42 @@ +# 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: "d8a9f9a52e5af486f80d932e838ee93861ffd863" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + - platform: android + create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + - platform: ios + create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + - platform: macos + create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + - platform: web + create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + - platform: windows + create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..55afd91 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..fd75a9c --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,82 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + id 'com.google.firebase.crashlytics' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} +android { + namespace = "com.intaleq.intaleq_admin" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + externalNativeBuild { + cmake { + path "src/main/cpp/CMakeLists.txt" + version "3.31.5" // Match cmake_minimum_required in CMakeLists.txt + } + } + defaultConfig { + ndk { + abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" // Keep these! + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.intaleq.intaleq_admin" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 23 + targetSdk = flutter.targetSdkVersion + versionCode = 1 + versionName = '1.0.0' + multiDexEnabled =true + } + + signingConfigs { + release { + // Check if properties are defined before using them + storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword = keystoreProperties['storePassword'] + keyAlias = keystoreProperties['keyAlias'] + keyPassword = keystoreProperties['keyPassword'] + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +flutter { + source = "../.." +} + +dependencies { + implementation 'com.scottyab:rootbeer-lib:0.1.0' + implementation 'com.google.android.gms:play-services-safetynet:18.0.1' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4' + +} \ No newline at end of file diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..a2b402e --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,160 @@ +{ + "project_info": { + "project_number": "1086900987150", + "project_id": "intaleq-d48a7", + "storage_bucket": "intaleq-d48a7.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1086900987150:android:b7231956aa6d3b3377a35f", + "android_client_info": { + "package_name": "com.Intaleq.intaleq" + } + }, + "oauth_client": [ + { + "client_id": "1086900987150-060srlmdjocdcav377rbur4ka14m90b7.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.Intaleq.intaleq", + "certificate_hash": "765bbb7c5d30bc58a7ba44372db614d6bbe6e34d" + } + }, + { + "client_id": "1086900987150-aomdf61hg1g6a76pak4k6lfkdgvfj3vn.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.Intaleq.intaleq", + "certificate_hash": "3997f1e87f9fc7190d55c049c0de02c825085267" + } + }, + { + "client_id": "1086900987150-44lu3vt9fpbfiif37e8iji7besrfuha9.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64" + }, + { + "current_key": "AIzaSyCwWsOw7WSMohXhBTTn0mY_Jyc90d5a0t4" + }, + { + "current_key": "AIzaSyBTNkIyhQf4oCKdg2SthaLAOUSctS1WiMU" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1086900987150-44lu3vt9fpbfiif37e8iji7besrfuha9.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1086900987150-9jv4oa8l3t23d54lrf27c1d22tbt9i6d.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.Intaleq.intaleq" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1086900987150:android:7f0b54792b737a3d77a35f", + "android_client_info": { + "package_name": "com.intaleq.intaleq_admin" + } + }, + "oauth_client": [ + { + "client_id": "1086900987150-44lu3vt9fpbfiif37e8iji7besrfuha9.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64" + }, + { + "current_key": "AIzaSyCwWsOw7WSMohXhBTTn0mY_Jyc90d5a0t4" + }, + { + "current_key": "AIzaSyBTNkIyhQf4oCKdg2SthaLAOUSctS1WiMU" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1086900987150-44lu3vt9fpbfiif37e8iji7besrfuha9.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1086900987150-9jv4oa8l3t23d54lrf27c1d22tbt9i6d.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.Intaleq.intaleq" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1086900987150:android:e3daebe53bf691de77a35f", + "android_client_info": { + "package_name": "com.intaleq_driver" + } + }, + "oauth_client": [ + { + "client_id": "1086900987150-to2jdiukfmr30qsfvov71ra4tp1koluk.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.intaleq_driver", + "certificate_hash": "765bbb7c5d30bc58a7ba44372db614d6bbe6e34d" + } + }, + { + "client_id": "1086900987150-44lu3vt9fpbfiif37e8iji7besrfuha9.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64" + }, + { + "current_key": "AIzaSyCwWsOw7WSMohXhBTTn0mY_Jyc90d5a0t4" + }, + { + "current_key": "AIzaSyBTNkIyhQf4oCKdg2SthaLAOUSctS1WiMU" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1086900987150-44lu3vt9fpbfiif37e8iji7besrfuha9.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1086900987150-9jv4oa8l3t23d54lrf27c1d22tbt9i6d.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.Intaleq.intaleq" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..e134009 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,50 @@ +# Suppress warnings for specific Google ML Kit and Stripe classes +-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivity$g +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider + +# NEW: Add the -dontwarn rules from missing_rules.txt +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Args$Builder +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Args +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Canceled +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Companion +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Failure +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Success +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter + +# Keep rules for Google ML Kit +-keep class com.google.mlkit.vision.** { *; } +-keep class com.google.mlkit.vision.text.** { *; } +-keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder { *; } + +# Keep rules for Stripe (Use the broad rule - most reliable) +-keep class com.stripe.android.** { *; } + +# Keep rule for RootDetection +-keep class com.mobileapp.store.ride.RootDetection { + native ; +} + +-assumenosideeffects class android.util.Log { + public static *** v(...); + public static *** d(...); + public static *** i(...); +} \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b706704 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/cpp/CMakeLists.txt b/android/app/src/main/cpp/CMakeLists.txt new file mode 100755 index 0000000..a90b803 --- /dev/null +++ b/android/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.10.2) # 3.10.2 is fine, but no need to go as high as 3.31.5 +project(intaleq_admin) # Good + +# Add your C++ source file(s) to create a SHARED library. +add_library(native-lib SHARED native-lib.cpp) + +# Find the Android log library. +find_library(log-lib log) + +# Link your library against the log library. This is essential for debugging. +target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/android/app/src/main/cpp/native-lib.cpp b/android/app/src/main/cpp/native-lib.cpp new file mode 100755 index 0000000..169847f --- /dev/null +++ b/android/app/src/main/cpp/native-lib.cpp @@ -0,0 +1,187 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Add this line + +#define LOG_TAG "NativeLib" +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) + +// Function to check for common root binaries +bool isRooted() +{ + std::string paths[] = { + "/system/app/Superuser.apk", + "/system/xbin/su", + "/system/bin/su", + "/system/bin/magisk", + "/system/xbin/magisk", + "/sbin/magisk"}; + + for (const auto &path : paths) + { + std::ifstream file(path); + if (file.good()) + { + return true; + } + } + return false; +} + +// Function to check for the presence of files or directories commonly associated with Frida. +bool checkFridaFiles() +{ + std::string fridaFiles[] = { + "/data/local/tmp/re.frida.server", // Common Frida server path + "/data/local/tmp/frida-server", + "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) + "/usr/lib64/libfrida-gadget.so", + "/data/local/re.frida.server", + + }; + + for (const auto &path : fridaFiles) + { + if (access(path.c_str(), F_OK) != -1) + { + LOGE("Frida file detected: %s", path.c_str()); + return true; + } + } + return false; +} + +// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. +bool checkFridaPorts() +{ + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) + { + return false; // Couldn't create socket, not a strong indicator. + } + + sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(27042); // Default Frida port + inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); + + if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) + { + LOGE("Frida default port (27042) is open."); + close(sock); + return true; + } + + close(sock); + return false; +} + +// Check the maps file of the current process for any suspicious entries. +bool checkMaps() +{ + std::ifstream mapsFile("/proc/self/maps"); + std::string line; + + if (mapsFile.is_open()) + { + while (std::getline(mapsFile, line)) + { + // Look for lines that indicate injected libraries, especially Frida. + if (line.find("frida") != std::string::npos || + line.find("gum-js-") != std::string::npos) + { // Gum is Frida's JavaScript engine + LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); + return true; + } + } + mapsFile.close(); + } + else + { + LOGE("Could not open /proc/self/maps"); + return false; + } + return false; +} + +// Check loaded modules. +bool checkLoadedModules() +{ + bool found = false; + dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) + { + bool *found_ptr = static_cast(data); + if (std::string(info->dlpi_name).find("frida") != std::string::npos) + { + LOGE("Frida module detected: %s", info->dlpi_name); + *found_ptr = true; + return 1; // Stop iterating + } + return 0; // Continue iterating + }, + &found); + + return found; +} + +// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). +// bool checkPtrace() { +// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. +// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { +// LOGE("ptrace failed. Debugger or tracer detected."); +// return true; // Likely being traced +// } +// // Detach. If attached, need to detach to not interfere. +// ptrace(PTRACE_DETACH, 0, 0, 0); +// return false; +//} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_intaleq_intaleq_admin_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) +{ + + if (isRooted()) + { + return JNI_TRUE; + } + + if (checkFridaFiles()) + { + return JNI_TRUE; + } + + if (checkFridaPorts()) + { + return JNI_TRUE; + } + if (checkMaps()) + { + return JNI_TRUE; + } + + if (checkLoadedModules()) + { + return JNI_TRUE; + } + + // if (checkPtrace()) { + // return JNI_TRUE; + // } + + return JNI_FALSE; +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/intaleq/intaleq_admin/MainActivity.kt b/android/app/src/main/kotlin/com/intaleq/intaleq_admin/MainActivity.kt new file mode 100644 index 0000000..02a8bf3 --- /dev/null +++ b/android/app/src/main/kotlin/com/intaleq/intaleq_admin/MainActivity.kt @@ -0,0 +1,174 @@ +package com.intaleq.intaleq_admin + +import android.app.AlertDialog +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.widget.LinearLayout +import android.widget.ProgressBar +import android.widget.TextView +import androidx.core.view.setPadding +import com.scottyab.rootbeer.RootBeer +import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import java.io.File +import java.util.Timer +import kotlin.concurrent.schedule + +class MainActivity : FlutterFragmentActivity() { + private val SECURITY_CHANNEL = "com.intaleq.intaleq_admin/security" + private val APP_CONTROL_CHANNEL = "com.intaleq.intaleq_admin/app_control" + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + // Channel for security checks (isRooted) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, SECURITY_CHANNEL) + .setMethodCallHandler { call, result -> + when (call.method) { + "isNativeRooted" -> result.success(isDeviceCompromised()) + else -> result.notImplemented() + } + } + + // Channel for app control (bringing to foreground) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, APP_CONTROL_CHANNEL) + .setMethodCallHandler { call, result -> + when (call.method) { + "bringToForeground" -> { + Log.d("MainActivity", "Received bringToForeground request") + val intent = + Intent(this, MainActivity::class.java).apply { + action = Intent.ACTION_MAIN + addCategory(Intent.CATEGORY_LAUNCHER) + addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP or + Intent.FLAG_ACTIVITY_SINGLE_TOP + ) + } + try { + startActivity(intent) + Log.d( + "MainActivity", + "App brought to foreground successfully with flags: ${intent.flags}" + ) + result.success(true) + } catch (e: Exception) { + Log.e( + "MainActivity", + "Error bringing app to foreground: ${e.message}", + e + ) + result.error( + "ACTIVITY_START_FAILED", + e.message, + e.stackTraceToString() + ) + } + } + else -> result.notImplemented() + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Log.d("MainActivity", "MainActivity onCreate") + if (isDeviceCompromised()) { + showSecurityWarningDialog() + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + Log.d("MainActivity", "Received new intent: ${intent.action}, flags: ${intent.flags}") + } + + private fun isDeviceCompromised(): Boolean { + return try { + val isRootedByRootBeer = RootBeer(this).isRooted + Log.d("MainActivity", "Root check result: $isRootedByRootBeer") + isRootedByRootBeer + } catch (e: Exception) { + Log.e("MainActivity", "Security check error: ${e.message}", e) + true // Fail-safe: assume compromised if check fails + } + } + + private fun showSecurityWarningDialog() { + var secondsRemaining = 10 + val progressBar = + ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal).apply { + max = 10 + progress = 10 + } + val textView = + TextView(this).apply { + text = getString(R.string.security_warning_message) + textAlignment = TextView.TEXT_ALIGNMENT_CENTER + } + val layout = + LinearLayout(this).apply { + orientation = LinearLayout.VERTICAL + setPadding(48) + addView(textView) + addView(progressBar) + } + val dialog = + AlertDialog.Builder(this) + .setTitle(getString(R.string.security_warning_title)) + .setView(layout) + .setCancelable(false) + .create() + dialog.show() + val timer = Timer() + timer.schedule(0, 1000) { + secondsRemaining-- + runOnUiThread { + progressBar.progress = secondsRemaining + if (secondsRemaining <= 0) { + timer.cancel() + dialog.dismiss() + clearAppDataAndExit() + } + } + } + } + + private fun clearAppDataAndExit() { + try { + Runtime.getRuntime().exec("pm clear $packageName") + Log.d("MainActivity", "Cleared app data via package manager") + } catch (e: Exception) { + Log.e("MainActivity", "Error clearing app data: ${e.message}", e) + clearCache() + clearAppData() + } + finishAffinity() + System.exit(0) + } + + private fun clearCache() { + deleteDir(cacheDir) + deleteDir(externalCacheDir) + Log.d("MainActivity", "Cleared cache directories") + } + + private fun clearAppData() { + // Be careful with this, it deletes all app data. + // deleteDir(applicationContext.dataDir) + Log.d("MainActivity", "App data clearing skipped (commented out)") + } + + private fun deleteDir(dir: File?): Boolean { + if (dir != null && dir.isDirectory) { + dir.list()?.forEach { deleteDir(File(dir, it)) } + } + val deleted = dir?.delete() ?: false + Log.d("MainActivity", "Deleted directory ${dir?.path}: $deleted") + return deleted + } +} diff --git a/android/app/src/main/kotlin/com/intaleq/intaleq_admin/MyApplication.kt b/android/app/src/main/kotlin/com/intaleq/intaleq_admin/MyApplication.kt new file mode 100755 index 0000000..895efde --- /dev/null +++ b/android/app/src/main/kotlin/com/intaleq/intaleq_admin/MyApplication.kt @@ -0,0 +1,44 @@ +package com.intaleq.intaleq_admin + +import android.app.Application +import android.content.Intent +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.plugin.common.MethodChannel + +class MyApplication : Application() { + companion object { + lateinit var instance: MyApplication + private set + + val flutterEngine: FlutterEngine by lazy { + FlutterEngine(instance).apply { + dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) + } + } + } + + override fun onCreate() { + super.onCreate() + instance = this + + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + "com.intaleq.intaleq_admin/app_lifecycle" + ) + .setMethodCallHandler { call, result -> + if (call.method == "bringAppToForeground") { + bringAppToForeground() + result.success(null) + } else { + result.notImplemented() + } + } + } + + private fun bringAppToForeground() { + val intent = Intent(applicationContext, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) + startActivity(intent) + } +} diff --git a/android/app/src/main/kotlin/com/intaleq/intaleq_admin/RootDetection.kt b/android/app/src/main/kotlin/com/intaleq/intaleq_admin/RootDetection.kt new file mode 100755 index 0000000..30f5fed --- /dev/null +++ b/android/app/src/main/kotlin/com/intaleq/intaleq_admin/RootDetection.kt @@ -0,0 +1,9 @@ +package com.intaleq.intaleq_admin + +object RootDetection { + init { + System.loadLibrary("native-lib") // Load the native library + } + + external fun isNativeRooted(): Boolean // Declare the external function +} diff --git a/android/app/src/main/kotlin/com/intaleq/intaleq_admin/SafetyNetCheck.kt b/android/app/src/main/kotlin/com/intaleq/intaleq_admin/SafetyNetCheck.kt new file mode 100755 index 0000000..2e4a1d4 --- /dev/null +++ b/android/app/src/main/kotlin/com/intaleq/intaleq_admin/SafetyNetCheck.kt @@ -0,0 +1,104 @@ +import android.content.Context +import android.util.Base64 +import android.util.Log +import com.google.android.gms.safetynet.SafetyNet +import java.io.IOException +import java.security.GeneralSecurityException +import java.security.SecureRandom +import org.json.JSONObject + +object SafetyNetCheck { + + private const val TAG = "SafetyNetCheck" + + fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { + // Generate a nonce. A good nonce is large, random, and used only once. + val nonce = generateNonce() + + SafetyNet.getClient(context) + .attest(nonce, apiKey) + .addOnSuccessListener { response -> + // Success! Now, *verify* the response. + val jwsResult = response.jwsResult + if (jwsResult != null) { + try { + val isSafe = SafetyNetResponseVerifier.verify(jwsResult) + Log.d(TAG, "SafetyNet verification result: $isSafe") + callback(isSafe) // Now passing a *verified* result. + } catch (e: Exception) { + Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) + callback(false) // Treat verification errors as failures. + } + } else { + Log.e(TAG, "SafetyNet jwsResult is null") + callback(false) // Null result is a failure. + } + } + .addOnFailureListener { e -> + Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) + callback(false) // API call failure. + } + } + + // Helper function to generate a nonce. + private fun generateNonce(): ByteArray { + val byteGenerator = SecureRandom() + val nonce = ByteArray(32) + byteGenerator.nextBytes(nonce) + return nonce + } +} + +// Helper class to verify the SafetyNet response. +object SafetyNetResponseVerifier { + + private const val TAG = "SafetyNetVerifier" + + // This method *must* be implemented on a *backend server* for real security. + // This is just a *simplified example* for demonstration purposes and is + // *not* suitable for production without a backend check. + @Throws(GeneralSecurityException::class, IOException::class) + fun verify(jwsResult: String): Boolean { + // 1. Parse the JWS: Split into header, payload, and signature. + val parts = jwsResult.split(".") + if (parts.size != 3) { + Log.e(TAG, "Invalid JWS format") + return false // Invalid JWS format + } + + val header = parts[0] + val payload = parts[1] + val signature = parts[2] + + // 2. Decode the payload (it's Base64 encoded). + val decodedPayload = Base64.decode(payload, Base64.DEFAULT) + val payloadJson = JSONObject(String(decodedPayload)) + + // 3. Check the ctsProfileMatch and basicIntegrity. + val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) + val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) + + Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") + + // 4. **CRITICAL: In a real application, you *must* send the JWS to your + // backend server for verification. The server should use the + // Google SafetyNet API (or a library that wraps it) to verify + // the signature and check the fields. This prevents attackers + // from tampering with the response on the device.** + // + // // Example (pseudo-code) of what the backend check would do: + // // GoogleCredential credential = ...; + // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) + // // .setApplicationName("YourAppName") + // // .setHttpRequestInitializer(credential) + // // .build(); + // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); + // // SafetyNetApi.VerifyJwsResponse response = request.execute(); + // // return response.isValidSignature() && response.getCtsProfileMatch() && + // response.getBasicIntegrity(); + + // 5. For this *example* (without a backend), we'll just check the fields. + // This is *NOT SECURE* for production! + return ctsProfileMatch && basicIntegrity + } +} diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..3b80872 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..854ca42 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d9cf042 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..996b732 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..6e72033 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable/app_icon.png b/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/android/app/src/main/res/drawable/app_icon.png differ diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..c79c58a --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..058ff77 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000..058ff77 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..1f057e6 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000..1f057e6 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..a630f85 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000..a630f85 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..623ed7d Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000..623ed7d Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/values-ar/strings.xml b/android/app/src/main/res/values-ar/strings.xml new file mode 100755 index 0000000..6b7cb35 --- /dev/null +++ b/android/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,6 @@ + + تحذير أمني + تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن تشغيل التطبيق على هذا الجهاز. + إغلاق التطبيق + الجهاز آمن. الاستمرار بشكل طبيعي. + \ No newline at end of file diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..ab98328 --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #ffffff + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100755 index 0000000..cf5127a --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,15 @@ + + My App + + + high_importance_channel + AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64 + Security Warning + AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18-KUoovzw + + A security issue or modification has been detected on + this device. The app cannot run on this device. + Exit App + Device is secure. Proceeding normally. + + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..d2ffbff --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html new file mode 100644 index 0000000..a1f01a3 --- /dev/null +++ b/android/build/reports/problems/problems-report.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Gradle Configuration Cache + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..2597170 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..37f853b --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..df5c366 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version '8.11.1' apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.10" apply false + id "com.google.firebase.crashlytics" version "2.8.1" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "1.8.22" apply false +} + +include ":app" diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000..f2c92db Binary files /dev/null and b/assets/images/logo.png differ diff --git a/assets/notify.mp3 b/assets/notify.mp3 new file mode 100644 index 0000000..d10bc28 Binary files /dev/null and b/assets/notify.mp3 differ diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..878b7fc --- /dev/null +++ b/firebase.json @@ -0,0 +1 @@ +{"flutter":{"platforms":{"android":{"default":{"projectId":"intaleq-d48a7","appId":"1:1086900987150:android:7f0b54792b737a3d77a35f","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"intaleq-d48a7","appId":"1:1086900987150:ios:db95474c7ff8899a77a35f","uploadDebugSymbols":true,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"intaleq-d48a7","configurations":{"android":"1:1086900987150:android:7f0b54792b737a3d77a35f","ios":"1:1086900987150:ios:db95474c7ff8899a77a35f"}}}}}} \ No newline at end of file diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/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/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/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/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..6649374 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '15.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 flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..7978168 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,290 @@ +PODS: + - AppAuth (1.7.6): + - AppAuth/Core (= 1.7.6) + - AppAuth/ExternalUserAgent (= 1.7.6) + - AppAuth/Core (1.7.6) + - AppAuth/ExternalUserAgent (1.7.6): + - AppAuth/Core + - AppCheckCore (11.2.0): + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - device_info_plus (0.0.1): + - Flutter + - Firebase/CoreOnly (11.15.0): + - FirebaseCore (~> 11.15.0) + - Firebase/Crashlytics (11.15.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 11.15.0) + - Firebase/Messaging (11.15.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 11.15.0) + - firebase_core (3.15.2): + - Firebase/CoreOnly (= 11.15.0) + - Flutter + - firebase_crashlytics (4.3.10): + - Firebase/Crashlytics (= 11.15.0) + - firebase_core + - Flutter + - firebase_messaging (15.2.10): + - Firebase/Messaging (= 11.15.0) + - firebase_core + - Flutter + - FirebaseCore (11.15.0): + - FirebaseCoreInternal (~> 11.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseCoreInternal (11.15.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseCrashlytics (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - FirebaseRemoteConfigInterop (~> 11.0) + - FirebaseSessions (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - FirebaseInstallations (11.15.0): + - FirebaseCore (~> 11.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - FirebaseRemoteConfigInterop (11.15.0) + - FirebaseSessions (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseCoreExtension (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesSwift (~> 2.1) + - Flutter (1.0.0) + - flutter_image_compress_common (1.0.0): + - Flutter + - Mantle + - SDWebImage + - SDWebImageWebPCoder + - flutter_secure_storage (6.0.0): + - Flutter + - google_sign_in_ios (0.0.1): + - AppAuth (>= 1.7.4) + - Flutter + - FlutterMacOS + - GoogleSignIn (~> 8.0) + - GTMSessionFetcher (>= 3.4.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleSignIn (8.0.0): + - AppAuth (< 2.0, >= 1.7.3) + - AppCheckCore (~> 11.0) + - GTMAppAuth (< 5.0, >= 4.1.1) + - GTMSessionFetcher/Core (~> 3.3) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GTMAppAuth (4.1.1): + - AppAuth/Core (~> 1.7) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.5.0): + - GTMSessionFetcher/Full (= 3.5.0) + - GTMSessionFetcher/Core (3.5.0) + - GTMSessionFetcher/Full (3.5.0): + - GTMSessionFetcher/Core + - image_cropper (0.0.4): + - Flutter + - TOCropViewController (~> 2.7.4) + - image_picker_ios (0.0.1): + - Flutter + - libwebp (1.5.0): + - libwebp/demux (= 1.5.0) + - libwebp/mux (= 1.5.0) + - libwebp/sharpyuv (= 1.5.0) + - libwebp/webp (= 1.5.0) + - libwebp/demux (1.5.0): + - libwebp/webp + - libwebp/mux (1.5.0): + - libwebp/demux + - libwebp/sharpyuv (1.5.0) + - libwebp/webp (1.5.0): + - libwebp/sharpyuv + - local_auth_darwin (0.0.1): + - Flutter + - FlutterMacOS + - Mantle (2.2.0): + - Mantle/extobjc (= 2.2.0) + - Mantle/extobjc (2.2.0) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.4.0) + - PromisesSwift (2.4.0): + - PromisesObjC (= 2.4.0) + - SDWebImage (5.21.1): + - SDWebImage/Core (= 5.21.1) + - SDWebImage/Core (5.21.1) + - SDWebImageWebPCoder (0.14.6): + - libwebp (~> 1.0) + - SDWebImage/Core (~> 5.17) + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - TOCropViewController (2.7.4) + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - Flutter (from `Flutter`) + - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) + - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) + - image_cropper (from `.symlinks/plugins/image_cropper/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - AppAuth + - AppCheckCore + - Firebase + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseInstallations + - FirebaseMessaging + - FirebaseRemoteConfigInterop + - FirebaseSessions + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - libwebp + - Mantle + - nanopb + - PromisesObjC + - PromisesSwift + - SDWebImage + - SDWebImageWebPCoder + - TOCropViewController + +EXTERNAL SOURCES: + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_crashlytics: + :path: ".symlinks/plugins/firebase_crashlytics/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" + Flutter: + :path: Flutter + flutter_image_compress_common: + :path: ".symlinks/plugins/flutter_image_compress_common/ios" + flutter_secure_storage: + :path: ".symlinks/plugins/flutter_secure_storage/ios" + google_sign_in_ios: + :path: ".symlinks/plugins/google_sign_in_ios/darwin" + image_cropper: + :path: ".symlinks/plugins/image_cropper/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + local_auth_darwin: + :path: ".symlinks/plugins/local_auth_darwin/darwin" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 + AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f + device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe + Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e + firebase_core: 995454a784ff288be5689b796deb9e9fa3601818 + firebase_crashlytics: 30dcd6dfd2fe895c0848af46722a4227346c19aa + firebase_messaging: f4a41dd102ac18b840eba3f39d67e77922d3f707 + FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e + FirebaseCoreExtension: edbd30474b5ccf04e5f001470bdf6ea616af2435 + FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4 + FirebaseCrashlytics: e09d0bc19aa54a51e45b8039c836ef73f32c039a + FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843 + FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09 + FirebaseRemoteConfigInterop: 1c6135e8a094cc6368949f5faeeca7ee8948b8aa + FirebaseSessions: b9a92c1c51bbb81e78fc3142cda6d925d700f8e7 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1 + flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + google_sign_in_ios: b48bb9af78576358a168361173155596c845f0b9 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleSignIn: ce8c89bb9b37fb624b92e7514cc67335d1e277e4 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de + GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 + image_cropper: 5f162dcf988100dc1513f9c6b7eb42cd6fbf9156 + image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a + libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 + local_auth_darwin: d2e8c53ef0c4f43c646462e3415432c4dab3ae19 + Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 + SDWebImage: f29024626962457f3470184232766516dee8dfea + SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 + TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654 + url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + +PODFILE CHECKSUM: 53a6aebc29ccee84c41f92f409fc20cd4ca011f1 + +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..0046868 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,776 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 527039E40D4EAB0135E096EE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 73E8F958F8E11E492CC8347B /* GoogleService-Info.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 9342A9FA2AD106E221F7DAB6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8B49500E734316D637FD8 /* Pods_Runner.framework */; }; + 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 */; }; + E670378D1405439DD7AF5EBB /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EC640B461F2104E309FF1F7 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy 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 = ""; }; + 1EBC229DC8263C3B52AAC963 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 5EC640B461F2104E309FF1F7 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5ED5B8D836D2189400270241 /* 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 = ""; }; + 6F23561F6DB92199934A4B98 /* 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 = ""; }; + 73E8F958F8E11E492CC8347B /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; 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 = ""; }; + AB8C1C5C4306313B88607414 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + B60707A34F0B9DB0B6A88479 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C6CDDBA12E380830001DF322 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + C8469308CFD0D8E16300A226 /* 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 = ""; }; + FDA8B49500E734316D637FD8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5F9BD6057132BB85E61AA1F1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E670378D1405439DD7AF5EBB /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9342A9FA2AD106E221F7DAB6 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 4B1ED6B74EA743B7B0569FC5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + FDA8B49500E734316D637FD8 /* Pods_Runner.framework */, + 5EC640B461F2104E309FF1F7 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 717BF44F479371B4C56CAA15 /* Pods */ = { + isa = PBXGroup; + children = ( + 5ED5B8D836D2189400270241 /* Pods-Runner.debug.xcconfig */, + 6F23561F6DB92199934A4B98 /* Pods-Runner.release.xcconfig */, + C8469308CFD0D8E16300A226 /* Pods-Runner.profile.xcconfig */, + 1EBC229DC8263C3B52AAC963 /* Pods-RunnerTests.debug.xcconfig */, + B60707A34F0B9DB0B6A88479 /* Pods-RunnerTests.release.xcconfig */, + AB8C1C5C4306313B88607414 /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + 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 */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 73E8F958F8E11E492CC8347B /* GoogleService-Info.plist */, + 717BF44F479371B4C56CAA15 /* Pods */, + 4B1ED6B74EA743B7B0569FC5 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + C6CDDBA12E380830001DF322 /* Runner.entitlements */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + D7A9EB0ED521886A34C0092C /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + 5F9BD6057132BB85E61AA1F1 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + E0923FD989819DEF47CB5EBB /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 4E66E99C9DBB1AE194E3C927 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, + 2347D6BF62C946F821E9020F /* [CP] Embed Pods Frameworks */, + 0700B6EB69B780AEF179FACB /* [CP] Copy Pods Resources */, + ); + 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 = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + 527039E40D4EAB0135E096EE /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0700B6EB69B780AEF179FACB /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 2347D6BF62C946F821E9020F /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 4E66E99C9DBB1AE194E3C927 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\""; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:${PUB_CACHE}/bin:$HOME/.pub-cache/bin\"\n\nif [ -z \"$PODS_ROOT\" ] || [ ! -d \"$PODS_ROOT/FirebaseCrashlytics\" ]; then\n # Cannot use \"BUILD_DIR%/Build/*\" as per Firebase documentation, it points to \"flutter-project/build/ios/*\" path which doesn't have run script\n DERIVED_DATA_PATH=$(echo \"$BUILD_ROOT\" | sed -E 's|(.*DerivedData/[^/]+).*|\\1|')\n PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"${DERIVED_DATA_PATH}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\nelse\n PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"$PODS_ROOT/FirebaseCrashlytics/run\"\nfi\n\n# Command to upload symbols script used to upload symbols to Firebase server\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + 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"; + }; + D7A9EB0ED521886A34C0092C /* [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-RunnerTests-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; + }; + E0923FD989819DEF47CB5EBB /* [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; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency 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; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + 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 = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = 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; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1EBC229DC8263C3B52AAC963 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B60707A34F0B9DB0B6A88479 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AB8C1C5C4306313B88607414 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + 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 = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + 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 = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + 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; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin; + 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; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin; + 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 */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 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/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..6266644 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@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/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d0d98aa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1 @@ +{"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":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"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":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@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"}} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..c424645 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ 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 new file mode 100644 index 0000000..cdc178c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ 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 new file mode 100644 index 0000000..07b7120 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..538ed9b Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..c880782 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..9996efe Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..7e23720 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ 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 new file mode 100644 index 0000000..07b7120 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..90534ed Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..d529f18 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000..c9fd50b Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000..6ee10e4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000..ae13bae Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000..314886e Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ 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 new file mode 100644 index 0000000..d529f18 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ 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 new file mode 100644 index 0000000..95e83cd Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000..058ff77 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000..623ed7d Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ 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 new file mode 100644 index 0000000..ee6b90a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..30195ba Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..206dd46 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/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/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..46f86ce --- /dev/null +++ b/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,36 @@ + + + + + CLIENT_ID + 1086900987150-n48ncfe3ud1khvncsgcmdbtpkhg2jfce.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.1086900987150-n48ncfe3ud1khvncsgcmdbtpkhg2jfce + ANDROID_CLIENT_ID + 1086900987150-060srlmdjocdcav377rbur4ka14m90b7.apps.googleusercontent.com + API_KEY + AIzaSyAwG09AeehwBfktpKKJwCKQOtEUpHtr-p0 + GCM_SENDER_ID + 1086900987150 + PLIST_VERSION + 1 + BUNDLE_ID + com.intaleq.intaleqAdmin + PROJECT_ID + intaleq-d48a7 + STORAGE_BUCKET + intaleq-d48a7.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:1086900987150:ios:db95474c7ff8899a77a35f + + \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..7c48750 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Intaleq Admin + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + intaleq_admin + 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 + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/constant/api_key.dart b/lib/constant/api_key.dart new file mode 100644 index 0000000..6422d14 --- /dev/null +++ b/lib/constant/api_key.dart @@ -0,0 +1,79 @@ +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../env/env.dart'; +import 'char_map.dart'; + +class AK { + static final String allowed = Env.allowed; + static final String passnpassenger = X + .r(X.r(X.r(Env.passnpassenger, cn), cC), cs) + .toString() + .split(Env.addd)[0]; + static final String newId = Env.newId; + static final String publishableKey = + X.r(X.r(X.r(Env.stripePublishableKe, cn), cC), cs); + static final String secretKey = X.r(X.r(X.r(Env.secretKey, cn), cC), cs); + static final String basicAuthCredentials = + X.r(X.r(X.r(Env.basicAuthCredentials, cn), cC), cs); + static final String accountSIDTwillo = + X.r(X.r(X.r(Env.accountSIDTwillo, cn), cC), cs); + static final String serverAPI = X.r(X.r(X.r(Env.serverAPI, cn), cC), cs); + static final String mapAPIKEY = X.r(X.r(X.r(Env.mapAPIKEY, cn), cC), cs); + static final String twilloRecoveryCode = + X.r(X.r(X.r(Env.twilloRecoveryCode, cn), cC), cs); + static final String authTokenTwillo = + X.r(X.r(X.r(Env.authTokenTwillo, cn), cC), cs); + static final String chatGPTkey = X.r(X.r(X.r(Env.chatGPTkey, cn), cC), cs); + static final String transactionCloude = + X.r(X.r(X.r(Env.transactionCloude, cn), cC), cs); + static final String visionApi = X.r(X.r(X.r(Env.visionApi, cn), cC), cs); + static final String chatGPTkeySefer = + X.r(X.r(X.r(Env.chatGPTkeySefer, cn), cC), cs); + static final String chatGPTkeySeferNew = + X.r(X.r(X.r(Env.chatGPTkeySeferNew, cn), cC), cs); + static final String serverPHP = Env.serverPHP; + static final String llamaKey = X.r(X.r(X.r(Env.llamaKey, cn), cC), cs); + static final String cohere = X.r(X.r(X.r(Env.cohere, cn), cC), cs); + static final String claudeAiAPI = X.r(X.r(X.r(Env.claudeAiAPI, cn), cC), cs); + static final String payPalClientId = + X.r(X.r(X.r(Env.payPalClientId, cn), cC), cs); + static final String payPalSecret = + X.r(X.r(X.r(Env.payPalSecret, cn), cC), cs); + static final String geminiApi = X.r(X.r(X.r(Env.geminiApi, cn), cC), cs); + static final String agoraAppId = X.r(X.r(X.r(Env.agoraAppId, cn), cC), cs); + static final String agoraAppCertificate = + X.r(X.r(X.r(Env.agoraAppCertificate, cn), cC), cs); + static final String payPalClientIdLive = + X.r(X.r(X.r(Env.payPalClientIdLive, cn), cC), cs); + static final String payPalSecretLive = + X.r(X.r(X.r(Env.payPalSecretLive, cn), cC), cs); + static final String integrationIdPayMob = + X.r(X.r(X.r(Env.integrationIdPayMob, cn), cC), cs); + static final String passwordPayMob = + X.r(X.r(X.r(Env.passwordPayMob, cn), cC), cs); + static final String usernamePayMob = + X.r(X.r(X.r(Env.usernamePayMob, cn), cC), cs); + static final String payMobApikey = + X.r(X.r(X.r(Env.payMobApikey, cn), cC), cs); + static final String integrationIdPayMobWallet = + X.r(X.r(X.r(Env.integrationIdPayMobWallet, cn), cC), cs); + static final String smsPasswordEgypt = + X.r(X.r(X.r(Env.smsPasswordEgypt, cn), cC), cs); + static final String ocpApimSubscriptionKey = Env.ocpApimSubscriptionKey; + static final String chatGPTkeySeferNew4 = + X.r(X.r(X.r(Env.chatGPTkeySeferNew4, cn), cC), cs); + static final String anthropicAIkeySeferNew = + X.r(X.r(X.r(Env.anthropicAIkeySeferNew, cn), cC), cs); + static final String llama3Key = X.r(X.r(X.r(Env.llama3Key, cn), cC), cs); + static final String payMobOutClientSecrret = + X.r(X.r(X.r(Env.payMobOutClientSecrret, cn), cC), cs); + static final String payMobOutClient_id = + X.r(X.r(X.r(Env.payMobOutClient_id, cn), cC), cs); + static final String payMobOutPassword = + X.r(X.r(X.r(Env.payMobOutPassword, cn), cC), cs); + static final String payMobOutUserName = + X.r(X.r(X.r(Env.payMobOutUserName, cn), cC), cs); + +/////////// + static final String keyOfApp = X.r(X.r(X.r(Env.keyOfApp, cn), cC), cs); +} diff --git a/lib/constant/box_name.dart b/lib/constant/box_name.dart new file mode 100644 index 0000000..787c892 --- /dev/null +++ b/lib/constant/box_name.dart @@ -0,0 +1,84 @@ +class BoxName { + static const String driverID = "driverID"; + static const String countryCode = "countryCode"; + static const String googlaMapApp = "googlaMapApp"; + + static const String lang = "lang"; + static const String carType = "carType"; + static const String carPlate = "carPlate"; + static const String statusDriverLocation = "statusDriverLocation"; + static const String password = "password"; + static const String keyOfApp = 'keyOfApp'; + static const String initializationVector = 'initializationVector'; + static const String firstTimeLoadKey = 'firstTimeLoadKey'; + static const String jwt = "jwt"; + static const String phoneVerified = "phoneVerified"; + static const String adminPhone = "adminPhone"; + static const String hmac = "hmac"; + static const String fingerPrint = "fingerPrint"; + static const String payMobApikey = "payMobApikey"; + static const String refreshToken = "refreshToken"; + static const String arrivalTime = "arrivalTime"; + static const String passwordDriver = "passwordDriver"; + static const String agreeTerms = "agreeTerms"; + static const String serverChosen = "serverChosen"; + static const String addWork = 'addWork'; + static const String addHome = 'addHome'; + static const String tipPercentage = 'tipPercentage'; + static const String accountIdStripeConnect = "accountIdStripeConnect"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String sosPhonePassenger = "sosPhonePassenger"; + static const String sosPhoneDriver = "sosPhoneDriver"; + static const String passengerID = "pasengerID"; + static const String phone = "phone"; + static const String phoneDriver = "phoneDriver"; + static const String dobDriver = "dobDriver"; + static const String sexDriver = "sexDriver"; + static const String lastNameDriver = "lastNameDriver"; + static const String name = "name"; + static const String nameDriver = "nameDriver"; + static const String driverPhotoUrl = "driverPhotoUrl"; + static const String email = "email"; + static const String emailDriver = "emailDriver"; + static const String tokens = "tokens"; + static const String tokensDrivers = "tokensDrivers"; + static const String tokensPassengers = "tokensPassengers"; + static const String tokenFCM = "tokenFCM"; + static const String tokenDriver = "tokenDriver"; + static const String cardNumber = "cardNumber"; + static const String cardNumberDriver = "cardNumberDriver"; + static const String cardHolderName = "cardHolderName"; + static const String cardHolderNameDriver = "cardHolderNameDriver"; + static const String expiryDate = "expiryDate"; + static const String expiryDateDriver = "expiryDateDriver"; + static const String cvvCode = "cvvCode"; + static const String cvvCodeDriver = "cvvCodeDriver"; + static const String passengerWalletDetails = "passengerWalletDetails"; + static const String passengerWalletTotal = "passengerWalletTotal"; + static const String passengerWalletFound = "passengerWalletFound"; + static const String periods = 'periods'; + static const String onBoarding = 'onBoarding'; + static const String stripePublishableKey = 'stripe_publishableKe'; + static const String apiKeyRun = 'apiKeyRun'; + static const String serverAPI = 'serverAPI'; + static const String secretKey = 'secretKey'; + static const String basicAuthCredentials = 'basicAuthCredentials'; + static const String mapAPIKEY = 'mapAPIKEY'; + static const String twilloRecoveryCode = 'twilloRecoveryCode'; + static const String accountSIDTwillo = 'accountSIDTwillo'; + static const String authTokenTwillo = 'authTokenTwillo'; + static const String chatGPTkey = 'chatGPTkey'; + static const String chatGPTkeySefer = 'chatGPTkeySefer'; + static const String transactionCloude = 'transactionCloude'; + static const String visionApi = 'visionApi'; + static const String vin = "vin"; + static const String make = "make"; + static const String model = "model"; + static const String year = "year"; + static const String expirationDate = "expirationDate"; + static const String color = "color"; + static const String owner = "owner"; + static const String registrationDate = "registrationDate"; + static const String recentLocations = 'recentLocations'; + static const String tripData = 'tripData'; +} diff --git a/lib/constant/char_map.dart b/lib/constant/char_map.dart new file mode 100644 index 0000000..d6a6ee7 --- /dev/null +++ b/lib/constant/char_map.dart @@ -0,0 +1,68 @@ +Map cn = { + "0": "3", + "1": "7", + "2": "1", + "3": "9", + "4": "0", + "5": "5", + "6": "2", + "7": "6", + "8": "4", + "9": "8" +}; +Map cs = { + "a": "q", + "b": "x", + "c": "f", + "d": "y", + "e": "j", + "f": "u", + "g": "k", + "h": "w", + "i": "o", + "j": "e", + "k": "g", + "l": "r", + "m": "n", + "n": "b", + "o": "i", + "p": "v", + "q": "a", + "r": "l", + "s": "z", + "t": "c", + "u": "h", + "v": "p", + "w": "t", + "x": "d", + "y": "s", + "z": "m" +}; +Map cC = { + "A": "Q", + "B": "X", + "C": "F", + "D": "Y", + "E": "J", + "F": "U", + "G": "K", + "H": "W", + "I": "O", + "J": "E", + "K": "G", + "L": "R", + "M": "N", + "N": "B", + "O": "I", + "P": "V", + "Q": "A", + "R": "L", + "S": "Z", + "T": "C", + "U": "H", + "V": "P", + "W": "T", + "X": "D", + "Y": "S", + "Z": "M" +}; diff --git a/lib/constant/colors.dart b/lib/constant/colors.dart new file mode 100644 index 0000000..18c087a --- /dev/null +++ b/lib/constant/colors.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +class AppColor { + static const Color primaryColor = Colors.black; + static const Color secondaryColor = Colors.white; + static const Color accentColor = Colors.grey; + static const Color redColor = Color(0xFFEA4335); // Google Red + static const Color greenColor = Color(0xFF34A853); // Google Green + static const Color blueColor = + Color.fromARGB(255, 66, 135, 246); // Google Blue + static const Color yellowColor = Color(0xFFFBBC05); // Google Yellow + static Color deepPurpleAccent = + const Color.fromARGB(255, 123, 76, 254).withOpacity(0.3); +} diff --git a/lib/constant/credential.dart b/lib/constant/credential.dart new file mode 100644 index 0000000..0054b50 --- /dev/null +++ b/lib/constant/credential.dart @@ -0,0 +1,144 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; + +import '../controller/functions/crud.dart'; +import '../main.dart'; +import 'box_name.dart'; +import 'char_map.dart'; +import 'links.dart'; + +class AC { + gAK() async { + if (box.read(BoxName.apiKeyRun).toString() != 'run') { + var res = await CRUD().get(link: AppLink.getApiKey, payload: {}); + var decod = jsonDecode(res); + print(decod); + Map jsonData = {}; + for (var i = 0; i < decod['message'].length; i++) { + String h = decod['message'][i]['hashed_key'].toString(); + String retrievedString = r(r(r(h, cn), cC), cs); + + await storage.write( + key: decod['message'][i]['name'].toString(), + value: retrievedString.toString(), + ); + // + String name = decod['message'][i]['name'].toString(); + String value = decod['message'][i]['hashed_key'].toString(); + + jsonData[name] = value; + } + String jsonString = json.encode(jsonData); + print(jsonString); + box.write(BoxName.apiKeyRun, 'run'); + } + } + + String q(String b, String c) { + final d = utf8.encode(c); + final e = utf8.encode(b); + + final f = Hmac(sha256, d); + final g = f.convert(e); + + final h = g.bytes; + final i = base64Url.encode(h); + return i; + } + + String j(String k, String l) { + final m = utf8.encode(l); + final n = base64Url.decode(k); + + final o = Hmac(sha256, m); + final p = o.convert(n); + + final q = utf8.decode(p.bytes); + return q; + } + + String a(String b, String c) { + int d = b.length; + int e = d ~/ 4; + + List f = []; + for (int g = 0; g < d; g += e) { + int h = g + e; + if (h > d) { + h = d; + } + String i = b.substring(g, h); + f.add(i); + } + + print(f); + Map j = {}; + j['birinci'] = f[4]; + j['ikinci'] = f[2]; + j['üçüncü'] = c + f[1]; + j['dördüncü'] = f[0]; + j['beş'] = f[3]; + + String k = ''; + j.forEach((l, m) { + k += m; + }); + + return k; + } + + Map n(String o, String c) { + String p = o.replaceAll(c, ''); + + Map q = {}; + q['birinci'] = p[p.length - 5] + p[p.length - 3]; + q['ikinci'] = p[p.length - 1] + p[p.length - 15]; + q['üçüncü'] = p[p.length - 9] + p[p.length - 12]; + q['dördüncü'] = p[p.length - 11] + p[p.length - 6]; + q['beş'] = p[p.length - 2] + p[p.length - 8]; + + return q; + } + + String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/lib/constant/info.dart b/lib/constant/info.dart new file mode 100644 index 0000000..b1d2f97 --- /dev/null +++ b/lib/constant/info.dart @@ -0,0 +1,4471 @@ +class AppInformation { + static const String companyName = 'Mobile-App'; + static const String appName = 'SEFER'; + static const String phoneNumber = '962798583052'; + static const String linkedInProfile = + 'https://www.linkedin.com/in/hamza-ayed/'; + static const String website = 'https://mobile-app.store'; + static const String email = 'hamzaayed@mobile-app.store'; + static const String complaintPrompt = + 'for this data for complaint from driver or passenger i collect all data i want you analyze this complaint and show what is reason and what is solution .this data collected from many table to find solution if payment in visa not complete and if ride status is finished it will be paymnet in payment table if ride status is not finished there is no need to pay and payment table is null for this ride and if paymentFromPaymentTable not null and visa type not cash the payment sucssessed . if ratingpassenger is low or passengr rating drivers low grade then dont mine of this passenger ,look at driver too like passengerratingdriver with rating or ratingtopassenger .in json add status of complaint and message to passenger and message to driver and message to call center write in arabic in json output with key in english .for output please just json i want'; + static const String addd = 'BlBlNl'; + + static const String privacyPolicy = ''' + + + + + + + + + + + + +
+
+
+
+
+
+

Terms and Conditions

+

1 TERMS OF USE

+

By downloading, browsing, accessing or using the Mobile Application; “Sefer”, Users agree to be bound by these Terms and Conditions of Use. We reserve the right to amend these terms and conditions at any time. If the User disagrees with any of these Terms and Conditions of Use, the User must immediately discontinue their access to the Mobile Application and their use of the services offered on the Mobile Application. Continued use of the Mobile Application will constitute acceptance of these Terms and Conditions of Use, as may be amended from time to time.

+

2.1. DEFINITIONS

+

In these Terms and Conditions of Use, the following capitalized terms shall have the following meanings, except where the context otherwise requires:

+

“Mobile Application” or “Sefer” refers to the smartphone software through which the company mediates services between Users and Service Providers.

+

"Account" means an account created by a User or a Service Provider on the Mobile Application as part of Registration.

+

“Service Providers” refers to the individuals or companies registered within the Company to provide products or services approved and mediated by the Company/Mobile Application and that are requested/purchased by “Users”. “Service Provider” means any one of them.

+

"Users" means users of the Mobile Application, including you and "User" means any one of them. “Users” also includes Service Providers using the Mobile Application version dedicated to the use of Service Providers.

+

"Privacy Policy" means the privacy policy set out in Clause 14 of these Terms and Conditions of Use.

+

"Redeem" means to redeem a company’s products or services on these Terms and Conditions of Use and

+

"Redemption" means the act of redeeming such products or services.

+

"Register" means to create an Account on the Mobile Application and "Registration" means the act of creating such an Account.

+

"Services" means all the services provided by Service Providers via the Mobile Application and mediated by the Company to Users, and "Service" means any one of them.

+

2.2. WHAT IS THE MOBILE APPLICATION, “Sefer”?

+

The “Sefer” Mobile Application consists in a specialize service with the purpose to schedule/match the Service Provider with the User, however without creating any employee relationship with the Service Provider, meaning that the Mobile Application should be considered only as a service mediator with the purpose of scheduling/matching between Users and Service Providers for the latter to fulfill the service requested by Users. Through the system, the Company allows, totally free of charge, the Users to sign up and request the desired available services from Service Providers in a more efficient way than the conventional existing methods. The Service Providers, by their means, can register on the Mobile Application dedicated for Service Providers through the methods indicated by the Company, pending an evaluation from the Company and the necessary documentation when signing up in accordance with guidelines set by the Transportation General Authority (TGA) to provide services through the Mobile Application. The Service Provider will pay a profit margin fee determined by the Company -in knowledge of the Service Provider- per completed service. Users can pay their ride fare using Apple Pay as an additional payment method in Saudi Arabia on iPhones

+

+

3. GENERAL ISSUES ABOUT THE MOBILE APPLICATION AND THE SERVICES

+

3.1 Applicability of terms and conditions: The use of any Services and/or the Mobile Application and the making of any Redemptions are subject to these Terms and Conditions of Use.

+

3.2 Location: The Mobile Application, the Services and any Redemptions are intended solely for use by Users who access the Mobile Application where it operates and provides its services regionally. We make no representation that the Services (or any goods or services) are available or otherwise suitable for use outside of the regions indicated by the Company. Notwithstanding the above, if the User accesses the Mobile Application, use the Services or make any Redemptions from locations outside the regions indicated by the Service Provider, the User does so on their own initiative and are responsible for the consequences and for compliance with all applicable laws.

+

3.3 Scope: The Mobile Application, the Services and any Redemptions are for Users’ non-commercial, personal use only and must not be used for business purposes unless an official written permission is granted by the Company.

+

3.4 Prevention on use: We reserve the right to prevent the User using the Mobile Application and the Service (or any part of them) and to prevent the User from making any Redemptions.

+

3.5 Equipment and Networks: The provision of the Services and the Mobile Application does not include the provision of a mobile telephone or handheld device or other necessary equipment to access the Mobile Application or the Services or make any Redemptions. To use the Mobile Application or Services or to make Redemptions, the User will require Internet connectivity and appropriate telecommunication links. The User acknowledges that the terms of agreement with their respective mobile network provider will continue to apply when using the Mobile Application. As a result, the User may be charged by the Mobile Provider for access to network connection services for the duration of the connection while accessing the Mobile Application or any such third party charges as may arise. The User accepts responsibility for any such charges that arise.

+

3.6 Permission to use Mobile Application: If the User is not the bill payer for the mobile telephone or handheld device being used to access the Mobile Application, the User will be assumed to have received permission from the bill payer for using the Mobile Application.

+

3.7 License to Use Material: By submitting any text or images (including photographs) via the Application, the User represents that they are the owner of the Material, or have proper authorization from the owner of the Material to use, reproduce and distribute it. The User hereby grants us a worldwide, royalty-free, non-exclusive license to use the Material to promote any products or services.

+

4. REDEMPTIONS

+

4.1 Need for registration: a) Users must Register to make a Redemption from the Mobile Application. b) The Service Provider agrees that by registering they will be scrutinized to be accepted by the Company who may refuse or cancel the Service Provider account at any time, whether by complaints or by internal policy.

+

4.2 Application of these Terms and Conditions of Use: By making any Redemption, the User acknowledges that the Redemption is subject to these Terms and Conditions of Use.

+

4.3 Redemption: Any attempted Redemption not consistent with these Terms and Conditions of Use may be disallowed or rendered void at our or the relevant Service Provider’s discretion.

+

4.4 Responsibility for Redemptions of perishable products of services: Each Service Provider shall be responsible to ensure that any of its products or services for Redemption that are perishable has not expired.

+

4.5 Restrictions: (a) Reproduction, sale, resale or trading of any products or services or Redeemed products is prohibited. (b) If any product or service is Redeemed for less than its face value, there is no entitlement to a credit, cash or Sample equal to the difference between the face value and the amount Redeemed. (c) Redemption of products or services is subject to availability of the relevant Service Providers’ stocks.

+

4.6 Company Not Liable: For the avoidance of doubt, the Company shall not be liable for any losses or damages suffered by Users resulting from a failure by the relevant Service Provider to fulfil any Redemptions in accordance with Clause 4.4 or for a failure by us to deliver any products or services to Users due to the unavailability of such products or services pursuant to Clause 4.5(c). Users accept that the Mobile Application acts solely as a scheduling/matching service between its Users and Service Providers, and that it is not responsible for any issues that arise, including but not limited to accidents, delays, car discomfort, and unavailability of products or services.

+

4.7 Lost/stolen services: Neither we nor any Service Provider shall be responsible for lost or stolen Samples or products that have been Redeemed.

+

+

5. LOCATION ALERTS AND NOTIFICATIONS

+

5.1 The USer agrees to receive pre-programmed notifications (“Location Alerts”) on the Mobile Application from Service Providers if the User has turned on locational services on their mobile telephone or other handheld devices (as the case may be).

+

+

6. USERS’ OBLIGATIONS

+

6.1 Service Provider terms: Users agree to (and shall) abide by the terms and conditions of the relevant Service Provider for which their Redemption relates to, as may be amended from time to time.

+

6.2 Accurate information: The User warrants that all information provided on Registration and contained as part of their Account is true, complete and accurate and that the User will promptly inform us of any changes to such information by updating the information in their Account.

+

6.3 Content on the Mobile Application and Service: It is the User’s responsibility to ensure that any products, services or information available through the Mobile Application or the Services meet their specific requirements before making any Redemption.

+

6.4 Prohibitions in relation to usage of Services or Mobile Application: Without limitation, the User undertakes not to use or permit anyone else to use the Services or Mobile Application:-

+

6.4.1 to send or receive any material which is not civil or tasteful

+

6.4.2 to send or receive any material which is threatening, grossly offensive, of an indecent, obscene or menacing character, blasphemous or defamatory of any person, in contempt of court or in breach of confidence, copyright, rights of personality, publicity or privacy or any other third party rights;

+

6.4.3 to send or receive any material for which the User has not obtained all necessary licenses and/or approvals (from us or third parties); or which constitutes or encourages conduct that would be considered a criminal offence, give rise to civil liability, or otherwise be contrary to the law of or infringe the rights of any third party in any country in the world;

+

6.4.4 to send or receive any material which is technically harmful (including computer viruses, logic bombs, Trojan horses, worms, harmful components, corrupted data or other malicious software or harmful data);

+

6.4.5 to cause annoyance, inconvenience or needless anxiety;

+

6.4.6 to intercept or attempt to intercept any communications transmitted by way of a telecommunications system;

+

6.4.7 for a purpose other than which we have designed them or intended them to be used;

+

6.4.8 for any fraudulent purpose;

+

6.4.9 other than in conformance with accepted Internet practices and practices of any connected networks;

+

6.4.10 in any way which is calculated to incite hatred against any ethnic, religious or any other minority or is otherwise calculated to adversely affect any individual, group or entity; or

+

6.4.11 in such a way as to, or commit any act that would or does, impose an unreasonable or disproportionately large load on our infrastructure.

+

6.5 Prohibitions in relation to usage of Services, Mobile Application: Without limitation, the User further undertakes not to or permit anyone else to:-

+

6.5.1 resell any products or services;

+

6.5.2 furnish false data including false names, addresses and contact details and fraudulently use credit/debit card numbers;

+

6.5.3 attempt to circumvent our security or network including to access data not intended for the User, log into a server or account the User is not expressly authorized to access, or probe the security of other networks (such as running a port scan);

+

6.5.4 execute any form of network monitoring which will intercept data not intended for the User;

+

6.5.5 enter into fraudulent interactions or transactions with us or a Service Provider (including interacting or transacting purportedly on behalf of a third party where the User has no authority to bind that third party or the User is pretending to be a third party);

+

6.5.6 extract data from or hack into the Mobile Application;

+

6.5.7 use the Services or Mobile Application in breach of these Terms and Conditions of Use;

+

6.5.8 engage in any unlawful activity in connection with the use of the Mobile Application or the Services; or

+

6.5.9 engage in any conduct which, in our exclusive reasonable opinion, restricts or inhibits any other customer from properly using or enjoying the Mobile Application or Services.

+

+

7. RULES ABOUT USE OF THE SERVICE AND THE MOBILE APPLICATION

+

7.1 We will use reasonable endeavors to correct any errors or omissions as soon as practicable after being notified of them. However, we do not guarantee that the Services or the Mobile Application will be free of faults, and we do not accept liability for any such faults, errors or omissions. In the event of any such error, fault or omission, Users should report it by contacting us at JORDAN: 962798583052 .

+

7.2 We do not warrant that Users’ use of the Services or the Mobile Application will be uninterrupted and we do not warrant that any information (or messages) transmitted via the Services or the Mobile Application will be transmitted accurately, reliably, in a timely manner or at all. Notwithstanding that we will try to allow uninterrupted access to the Services and the Mobile Application, access to the Services and the Mobile Application may be suspended, restricted or terminated at any time.

+

7.3 We do not give any warranty that the Services and the Mobile Application are free from viruses or anything else which may have a harmful effect on any technology.

+

7.4 We reserve the right to change, modify, substitute, suspend or remove without notice any information or Services on the Mobile Application from time to time. Users’ access to the Mobile Application and/or the Services may also be occasionally restricted to allow for repairs, maintenance or the introduction of new facilities or services. We will attempt to restore such access as soon as we reasonably can. For the avoidance of doubt, we reserve the right to withdraw any information or Services from the Mobile Application at any time.

+

7.5 We reserve the right to block access to and/or to edit or remove any material which in our reasonable opinion may give rise to a breach of these Terms and Conditions of Use.

+

7.6 The acceptance and denial of the service request may occur at first by the Service Provider, who can accept or deny the service when receiving a notification for a request. The User may cancel the contract for any reason which may or may not apply cancellation fees for which the conditions and amount is determined and communicated by the Company. Both recognize that “Sefer” is not liable for any delays, cancellations, failure to cancel the contract and miscommunication between the User and the Service Provider, nor for any delay or failure in the delivery of services from the Service Provider.

+

+

8. SUSPENSION AND TERMINATION

+

8.1 If the User uses (or others, with the User’s permission use) the Mobile Application, any Services in contravention of these Terms and Conditions of Use, we may suspend their use of the Services and/or Mobile Application.

+

8.2 If we suspend the Services or Mobile Application, we may refuse to restore the Services or Mobile Application for the User’s use until we receive an assurance from them, in a form we deem acceptable, that there will be no further breach of the provisions of these Terms and Conditions of Use.

+

8.3 The Company shall fully co-operate with any law enforcement authorities or court order requesting or directing the Company to disclose the identity or locate anyone in breach of these Terms and Conditions of Use.

+

8.4 Without limitation to anything else in this Clause 8, we shall be entitled immediately or at any time (in whole or in part) to: (a) suspend the Services and/or Mobile Application; (b) suspend Users’ use of the Services and/or Mobile Application; and/or (c) suspend the use of the Services and/or Mobile Application for persons we believe to be connected (in whatever manner) to the concerned User, if:

+

8.4.1 the User commits any breach of these Terms and Conditions of Use;

+

8.4.2 we suspect, on reasonable grounds, that the User has, might or will commit a breach of these Terms and Conditions of Use; or

+

8.4.3 we suspect, on reasonable grounds, that the User may have committed or will be committing any fraud against us or any person.

+

8.5 Our rights under this Clause 8 shall not prejudice any other right or remedy we may have in respect of any breach or any rights, obligations or liabilities accrued prior to termination.

+

+

9. DISCLAIMER AND EXCLUSION OF LIABILITY

+

9.1 The Mobile Application, the Services, the information on the Mobile Application and use of all related facilities are provided on an "as is, as available" basis without any warranties whether express or implied.

+

9.2 The credit balance shall remain valid for the specific period. The credit in the wallet will be expired after 6 months of inactivity.

+

9.3 To the fullest extent permitted by applicable law, we disclaim all representations and warranties relating to the Mobile Application and its contents, including in relation to any inaccuracies or omissions in the Mobile Application, warranties of merchantability, quality, fitness for a particular purpose, accuracy, availability, non-infringement or implied warranties from course of dealing or usage of trade.

+

9.4 We do not warrant that the Mobile Application will always be accessible, uninterrupted, timely, secure, error free or free from computer virus or other invasive or damaging code or that the Mobile Application will not be affected by any acts of nature or other force majeure events, including inability to obtain or shortage of necessary materials, equipment facilities, power or telecommunications, lack of telecommunications equipment or facilities and failure of information technology or telecommunications equipment or facilities.

+

9.5 While we may use reasonable efforts to include accurate and up-to-date information on the Mobile Application, we make no warranties or representations as to its accuracy, timeliness or completeness.

+

9.6 We shall not be liable for any acts or omissions of any third parties howsoever caused, and for any direct, indirect, incidental, special, consequential or punitive damages, howsoever caused, resulting from or in connection with the Mobile Application and the services offered in the mobile application, Users’ access to, use of or inability to use the mobile application or the services offered in the mobile application, reliance on or downloading from the mobile application and/or services, or any delays, inaccuracies in the information or in its transmission including but not limited to damages for loss of business or profits, use, data or other intangible, even if we have been advised of the possibility of such damages.

+

9.7 We shall not be liable in contract, tort (including negligence or breach of statutory duty) or otherwise howsoever and whatever the cause thereof, for any indirect, consequential, collateral, special or incidental loss or damage suffered or incurred by the User in connection with the Mobile Application and these Terms and Conditions of Use. For the purposes of these Terms and Conditions of Use, indirect or consequential loss or damage includes, without limitation, loss of revenue, profits, anticipated savings or business, loss of data or goodwill, loss of use or value of any equipment including software, claims of third parties, and all associated and incidental costs and expenses.

+

9.8 The above exclusions and limitations apply only to the extent permitted by law. None of the User’s statutory rights as a consumer that cannot be excluded or limited are affected.

+

9.9 Notwithstanding our efforts to ensure that our system is secure, the User acknowledges that all electronic data transfers are potentially susceptible to interception by others. We cannot, and do not, warrant that data transfers pursuant to the Mobile Application, or electronic mail transmitted to and from us, will not be monitored or read by others.

+

+

10. INDEMNITY

+

The User agrees to indemnify and keep us indemnified against any claim, action, suit or proceeding brought or threatened to be brought against us which is caused by or arising out of (a) the User’s use of the Services, (b) any other party’s use of the Services using the User’s user ID, verification PIN and/or any identifier number allocated by the Company, and/or (c) the User’s breach of any of these Terms and Conditions of Use, and to pay us damages, costs and interest in connection with such claim, action, suit or proceeding.

+

+

11. INTELLECTUAL PROPERTY RIGHTS

+

11.1 All editorial content, information, photographs, illustrations, artwork and other graphic materials, and names, logos and trade marks on the Mobile Application are protected by copyright laws and/or other laws and/or international treaties, and belong to us and/or our suppliers, as the case may be. These works, logos, graphics, sounds or images may not be copied, reproduced, retransmitted, distributed, disseminated, sold, published, broadcasted or circulated whether in whole or in part, unless expressly permitted by us and/or our suppliers, as the case may be.

+

11.2 Nothing contained on the Mobile Application should be construed as granting by implication, estoppel, or otherwise, any license or right to use any trademark displayed on the Mobile Application without our written permission. Misuse of any trademarks or any other content displayed on the Mobile Application is prohibited.

+

11.3 We will not hesitate to take legal action against any unauthorized usage of our trade marks, name or symbols to preserve and protect its rights in the matter. All rights not expressly granted herein are reserved. Other product and company names mentioned herein may also be the trademarks of their respective owners.

+

+

12. AMENDMENTS

+

12.1 We may periodically make changes to the contents of the Mobile Application, including to the descriptions and prices of goods and services advertised, at any time and without notice. We assume no liability or responsibility for any errors or omissions in the content of the Mobile Application.

+

12.2 We reserve the right to amend these Terms and Conditions of Use from time to time without notice. The revised Terms and Conditions of Use will be posted on the Mobile Application and shall take effect from the date of such posting. The User is advised to review these terms and conditions periodically as they are binding upon the User.

+

+

13. APPLICABLE LAW AND JURISDICTION

+

13.1 These Terms and Conditions of Use shall be governed by and construed in accordance with the applicable Federal laws of Kingdom of Saudi Arabia.

+

13.2 The Mobile Application can be accessed from all countries around the world where the local technology permits. As each of these places have differing laws, by accessing the Mobile Application both the User and we agree that the laws of the country where accessed, without regard to the conflicts of laws principles thereof, will apply to all matters relating to the use of the Mobile Application.

+

13.3 the User accepts and agrees that both the User and we shall submit to the exclusive jurisdiction of the courts of the country where accessed in respect of any dispute arising out of and/or in connection with these Terms and Conditions of Use.

+

+

14. PRIVACY POLICY

+

14.1 Access to the Mobile Application and use of the Services offered on the Mobile Application by the Company and/or its group of companies & partners is subject to this Privacy Policy. By accessing the Mobile Application and by continuing to use the Services offered, Users are deemed to have accepted this Privacy Policy, and in particular, they are deemed to have consented to our use and disclosure of their personal information in the manner prescribed in this Privacy Policy and for the purposes set out in Clauses 3.7 and/or 4.1.1 We reserve the right to amend this Privacy Policy from time to time. If the User disagrees with any part of this Privacy Policy, the User must immediately discontinue their access to the Mobile Application and their use of the Services.

+

14.2 As part of the normal operation of our Services, we collect, use and, in some cases, disclose information about the User to third parties. Accordingly, we have developed this Privacy Policy in order for Users to understand how we collect, use, communicate and disclose and make use of their personal information when they use the Services on the Mobile Application:-

+

(a) Before or at the time of collecting personal information, we will identify the purposes for which information is being collected.

+

(b) We will collect and use of personal information solely with the objective of fulfilling those purposes specified by us and for other compatible purposes, unless we obtain the consent of the individual concerned or as required by law.

+

(c) We will only retain personal information as long as necessary for the fulfillment of those purposes.

+

(d) We will collect personal information by lawful and fair means and, where appropriate, with the knowledge or consent of the individual concerned.

+

(e) Personal information should be relevant to the purposes for which it is to be used, and, to the extent necessary for those purposes, should be accurate, complete, and up-to-date.

+

(f) We will protect personal information by reasonable security safeguards against loss or theft, as well as unauthorized access, disclosure, copying, use or modification.

+

(g) The Company further reserves the right to use all legal means possible and to identify the Users, as well as to request, at any time, additional data and documents it considers appropriate in order to verify personal data informed by the user.

+

We are committed to conducting our business in accordance with these principles in order to ensure that the confidentiality of personal information is protected and maintained.

+

14.3 Social logins policy
Our Services offers you the ability to register and login using Facebook. Where you choose to do this, we will receive certain profile information about you from your social media provider. The profile Information may include your name and social token.
We will use the information we receive only to associate your social token with your Sefer account or for the purposes that are described in this privacy policy.

14.4 Account and data deletion
Based on the applicable laws of your country, you may have the right to request the deletion of your personal data in some circumstances. If you want to delete your account or personal data in the application, please contact us via e-mail: support@mobile-app.store. We will respond to your request within 30 days.

+

15. In-Ride Policy

+

15.1 Smoking Policy:

+

No smoking or other use of tobacco products (including, but not limited to, cigarettes, pipes, cigars, snuff, or chewing tobacco) is permitted during rides. No cigarette butts or other traces of smell, litter, or tobacco use should be present in the vehicle. image

+

15.2 COVID-19 Policy: Face masks must be always worn during rides.

+
+
+
+
+
+
+ + + + + +
+
+ + + + +
+

+ All rights reserved. Fast Global Technology Holding Limited. © 2022 +

+
+
+ +
+ + + + +
+ + + + + + +
+ +'''; +} diff --git a/lib/constant/links.dart b/lib/constant/links.dart new file mode 100644 index 0000000..7f77fa3 --- /dev/null +++ b/lib/constant/links.dart @@ -0,0 +1,299 @@ +import '../env/env.dart'; + +class AppLink { + static String seferPaymentServer = + 'https://walletintaleq.intaleq.xyz/v1/main'; + static final String tripzPaymentServer0 = seferPaymentServer; + static final String tripzPaymentServer = '$seferPaymentServer/ride'; + static final String tripzAlexandriaServer = Env.seferAlexandriaServer; + static final String tripzCairoServer = Env.seferCairoServer; + static final String tripzGizaServer = Env.seferGizaServer; + // static final String endPoint = box.read(BoxName.serverChosen); + // static final String server = Env.seferCairoServer; + + static final String server = 'https://intaleq.xyz/intaleq'; + static String loginJwtDriver = "https://intaleq.xyz/intaleq/loginAdmin.php"; + + static String googleMapsLink = 'https://maps.googleapis.com/maps/api/'; + static String llama = 'https://api.llama-api.com/chat/completions'; + static String gemini = + 'https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText'; + + static String test = "$server/test.php"; + static String loginWalletAdmin = "$seferPaymentServer/loginWalletAdmin.php"; + //===============firebase========================== + static String getTokens = "$server/ride/firebase/get.php"; + static String getInvoices = "$server/Admin/adminUser/invoice_total.php"; + static String addInvoice = "$server/Admin/adminUser/add_invoice.php"; + static String getAllTokenDrivers = + "$server/ride/firebase/getALlTokenDrivers.php"; + + static String getAllTokenPassengers = + "$server/ride/firebase/getAllTokenPassengers.php"; + static String addTokens = "$server/ride/firebase/add.php"; + static String addTokensDriver = "$server/ride/firebase/addDriver.php"; + + //=======================Wallet=================== + static String addPaymentTokenDriver = + "$tripzPaymentServer/driverWallet/addPaymentToken.php"; + static String addSeferWallet = "$tripzPaymentServer/seferWallet/add.php"; + static String getPaymentsDashboard = + "$seferPaymentServer/Admin/getPaymentsDashboard.php"; + static String getSeferWallet = "$tripzPaymentServer/seferWallet/get.php"; + static String addDrivePayment = "$tripzPaymentServer/payment/add.php"; + static String updatePaymetToPaid = + "$tripzPaymentServer/payment/updatePaymetToPaid.php"; + static String wallet = '$tripzPaymentServer/passengerWallet'; + static String walletDriver = '$tripzPaymentServer/driverWallet'; + static String getAllPassengerTransaction = + "$wallet/getAllPassengerTransaction.php"; + static String getWalletByPassenger = "$wallet/getWalletByPassenger.php"; + static String getPassengersWallet = "$wallet/get.php"; + static String getPassengerWalletArchive = + "$wallet/getPassengerWalletArchive.php"; + static String addPassengersWallet = "$wallet/add.php"; + static String deletePassengersWallet = "$wallet/delete.php"; + static String updatePassengersWallet = "$wallet/update.php"; + + static String getWalletByDriver = "$walletDriver/getWalletByDriver.php"; + static String getDriversWallet = "$walletDriver/get.php"; + static String addDriversWalletPoints = "$walletDriver/add.php"; + static String deleteDriversWallet = "$walletDriver/delete.php"; + static String updateDriversWallet = "$walletDriver/update.php"; + + //=======================promo===================ride.mobile-app.store/ride/promo/get.php + static String promo = '$server/ride/promo'; + static String getPassengersPromo = "$promo/get.php"; + static String getPromoBytody = "$promo/getPromoBytody.php"; + static String addPassengersPromo = "$promo/add.php"; + static String deletePassengersPromo = "$promo/delete.php"; + static String updatePassengersPromo = "$promo/update.php"; + + ////=======================cancelRide=================== + static String ride = '$server/ride'; + static String addCancelRideFromPassenger = "$server/ride/cancelRide/add.php"; + static String cancelRide = "$server/ride/cancelRide/get.php"; +//-----------------ridessss------------------ + static String addRides = "$ride/rides/add.php"; + static String getRides = "$ride/rides/get.php"; + static String getRideOrderID = "$ride/rides/getRideOrderID.php"; + static String getRideStatus = "$ride/rides/getRideStatus.php"; + static String getRideStatusBegin = "$ride/rides/getRideStatusBegin.php"; + static String getRideStatusFromStartApp = + "$ride/rides/getRideStatusFromStartApp.php"; + static String updateRides = "$ride/rides/update.php"; + static String updateStausFromSpeed = "$ride/rides/updateStausFromSpeed.php"; + static String deleteRides = "$ride/rides/delete.php"; + +//-----------------DriverPayment------------------ + static String adddriverScam = "$ride/driver_scam/add.php"; + static String getdriverScam = "$ride/driver_scam/get.php"; + +/////////---getKazanPercent===//////////// + static String getKazanPercent = "$ride/kazan/get.php"; + static String addKazanPercent = "$ride/kazan/add.php"; + +////-----------------DriverPayment------------------ + static String addDriverpayment = "$tripzPaymentServer/payment/add.php"; + static String addDriverPaymentPoints = + "$tripzPaymentServer/driverPayment/add.php"; + static String getDriverPaymentPoints = + "$tripzPaymentServer/driverWallet/get.php"; + static String getDriverpaymentToday = "$tripzPaymentServer/payment/get.php"; + static String getCountRide = "$tripzPaymentServer/payment/getCountRide.php"; + static String getAllPaymentFromRide = + "$tripzPaymentServer/payment/getAllPayment.php"; + static String getAllPaymentVisa = + "$tripzPaymentServer/payment/getAllPaymentVisa.php"; + +//-----------------Passenger NotificationCaptain------------------ + static String addNotificationPassenger = + "$ride/notificationPassenger/add.php"; + static String send_whatsapp_message = + "$server/Admin/send_whatsapp_message.php"; + static String getNotificationPassenger = + "$ride/notificationPassenger/get.php"; + static String updateNotificationPassenger = + "$ride/notificationPassenger/update.php"; + +//-----------------Driver NotificationCaptain------------------ + static String addNotificationCaptain = "$ride/notificationCaptain/add.php"; + static String addWaitingRide = "$ride/notificationCaptain/addWaitingRide.php"; + static String getRideWaiting = "$ride/notificationCaptain/getRideWaiting.php"; + static String getNotificationCaptain = "$ride/notificationCaptain/get.php"; + static String updateNotificationCaptain = + "$ride/notificationCaptain/update.php"; + static String deleteNotificationCaptain = + "$ride/notificationCaptain/delete.php"; + //-----------------Api Key------------------ + static String addApiKey = "$ride/apiKey/add.php"; + static String getApiKey = "$ride/apiKey/get.php"; + static String getCnMap = "$server/auth/cnMap.php"; + static String updateApiKey = "$ride/apiKey/update.php"; + static String deleteApiKey = "$ride/apiKey/delete.php"; + +//-----------------Feed Back------------------ + static String addFeedBack = "$ride/feedBack/add.php"; + static String getFeedBack = "$ride/feedBack/get.php"; + static String updateFeedBack = "$ride/feedBack/updateFeedBack.php"; + + //-----------------Tips------------------ + static String addTips = "$ride/tips/add.php"; + static String getTips = "$ride/tips/get.php"; + static String updateTips = "$ride/tips/update.php"; + +//-----------------Help Center------------------ + static String addhelpCenter = "$ride/helpCenter/add.php"; + static String gethelpCenter = "$ride/helpCenter/get.php"; + static String getByIdhelpCenter = "$ride/helpCenter/getById.php"; + static String updatehelpCenter = "$ride/helpCenter/update.php"; + static String deletehelpCenter = "$ride/helpCenter/delete.php"; + + //-----------------license------------------ + static String addLicense = "$ride/license/add.php"; + static String getLicense = "$ride/license/get.php"; + static String updateLicense = "$ride/license/updateFeedBack.php"; +//-----------------RegisrationCar------------------ + static String addRegisrationCar = "$ride/RegisrationCar/add.php"; + static String getRegisrationCar = "$ride/RegisrationCar/get.php"; + static String updateRegisrationCar = "$ride/RegisrationCar/update.php"; + +//-----------------DriverOrder------------------ + + static String addDriverOrder = "$ride/driver_order/add.php"; + static String getDriverOrder = "$ride/driver_order/get.php"; + static String getOrderCancelStatus = + "$ride/driver_order/getOrderCancelStatus.php"; + static String updateDriverOrder = "$ride/driver_order/update.php"; + static String deleteDriverOrder = "$ride/driver_order/delete.php"; + + // ===================================== + static String addRateToPassenger = "$ride/rate/add.php"; + static String addRateToDriver = "$ride/rate/addRateToDriver.php"; + static String getDriverRate = "$ride/rate/getDriverRate.php"; + static String getPassengerRate = "$ride/rate/getPassengerRate.php"; + + ////////////////emails ============// + static String sendEmailToPassengerForTripDetails = + "$ride/rides/emailToPassengerTripDetail.php"; + static String sendEmailToDrivertransaction = + "$server/Admin/sendEmailToDrivertransaction.php"; + +// =========================================== + static String pathImage = "$server/upload/types/"; + static String uploadImage = "$server/uploadImage.php"; + static String uploadImage1 = "$server/uploadImage1.php"; + static String uploadImagePortrate = "$server/uploadImagePortrate.php"; + static String uploadImageType = "$server/uploadImageType.php"; +//=============egypt documents ============== + static String uploadEgyptidFront = + "$server/EgyptDocuments/uploadEgyptidFront.php"; + static String uploadEgypt = "$server/uploadEgypt.php"; + + //==================certifcate========== + static String location = '$server/ride/location'; + static String getCarsLocationByPassenger = "$location/get.php"; + static String getFemalDriverLocationByPassenger = + "$location/getFemalDriver.php"; + static String getDriverCarsLocationToPassengerAfterApplied = + "$location/getDriverCarsLocationToPassengerAfterApplied.php"; + static String addCarsLocationByPassenger = "$location/add.php"; + static String deleteCarsLocationByPassenger = "$location/delete.php"; + static String updateCarsLocationByPassenger = "$location/update.php"; + static String getTotalDriverDuration = "$location/getTotalDriverDuration.php"; + static String getTotalDriverDurationToday = + "$location/getTotalDriverDurationToday.php"; + + //==================Blog============= + static String profile = '$server/ride/profile'; + static String getprofile = "$profile/get.php"; + static String getCaptainProfile = "$profile/getCaptainProfile.php"; + static String addprofile = "$profile/add.php"; + static String deleteprofile = "$profile/delete.php"; + static String updateprofile = "$profile/update.php"; + + //===================Auth============ + + static String auth = '$server/auth'; + static String login = "$auth/login.php"; + static String signUp = "$auth/signup.php"; + static String sendVerifyEmail = "$auth/sendVerifyEmail.php"; + static String passengerRemovedAccountEmail = + "$auth/passengerRemovedAccountEmail.php"; + static String verifyEmail = "$auth/verifyEmail.php"; +//===================Auth Captin============ + static String authCaptin = '$server/auth/captin'; + static String loginCaptin = "$authCaptin/login.php"; + static String signUpCaptin = "$authCaptin/register.php"; + static String sendVerifyEmailCaptin = "$authCaptin/sendVerifyEmail.php"; + static String verifyEmailCaptin = "$authCaptin/verifyEmail.php"; + static String removeUser = "$authCaptin/removeAccount.php"; + static String deletecaptainAccounr = "$authCaptin/deletecaptainAccounr.php"; + static String updateAccountBank = "$authCaptin/updateAccountBank.php"; + static String getAccount = "$authCaptin/getAccount.php"; + + //===================Admin Captin============ + static String getDriversPhonesAndTokens = + "$server/Admin/AdminCaptain/getDriversPhonesAndTokens.php"; + static String getPassengerDetailsByPassengerID = + "$server/Admin/getPassengerDetailsByPassengerID.php"; + static String getPassengerDetails = "$server/Admin/getPassengerDetails.php"; + static String getPassengerbyEmail = "$server/Admin/getPassengerbyEmail.php"; + static String addAdminUser = "$server/Admin/adminUser/add.php"; + static String getdashbord = "$server/Admin/dashbord.php"; + static String getEmployee = "$server/Admin/employee/get.php"; + static String getBestDriver = "$server/Admin/driver/getBestDriver.php"; + static String getBestDriverGiza = + "https://gizasefer.online/sefer/Admin/driver/getBestDriver.php"; + static String getBestDriverAlexandria = + "$tripzAlexandriaServer/Admin/driver/getBestDriver.php"; + static String deleteRecord = "$server/Admin/driver/deleteRecord.php"; + static String addEmployee = "$server/Admin/employee/add.php"; + static String getdashbordPayment = "$server/Admin/dashbordPayment.php"; + static String getAdminUser = "$server/Admin/adminUser/get.php"; + static String getCaptainDetailsByEmailOrIDOrPhone = + "$server/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php"; + static String getCaptainDetails = "$server/Admin/AdminCaptain/get.php"; + static String getVisaForEachDriver = + "$seferPaymentServer/Admin/getVisaForEachDriver.php"; + static String getRidesPerMonth = + "$server/Admin/AdminRide/getRidesPerMonth.php"; + static String getRidesDetails = "$server/Admin/AdminRide/get.php"; + static String getPassengersStatic = "$serviceApp/getPassengersStatic.php"; + static String getRidesStatic = "$serviceApp/getRidesStatic.php"; + static String getEmployeeStatic = "$serviceApp/getEmployeeStatic.php"; + static String getdriverstotalMonthly = + "$serviceApp/getdriverstotalMonthly.php"; + +//////////////////////// + static String serviceApp = "$server/serviceapp"; + static String editCarPlate = "$serviceApp/editCarPlate.php"; + static String getComplaintAllData = "$serviceApp/getComplaintAllData.php"; + static String getComplaintAllDataForDriver = + "$serviceApp/getComplaintAllDataForDriver.php"; + static String addCriminalDocuments = "$authCaptin/addCriminalDocuments.php"; + static String getPassengersByPhone = + "$server/serviceApp/getPassengersByPhone.php"; + static String getDriverByPhone = "$serviceApp/getDriverByPhone.php"; + static String getNewDriverRegister = "$serviceApp/getNewDriverRegister.php"; + static String addWelcomeDriverNote = "$serviceApp/addWelcomeDriverNote.php"; + static String getDriverNotCompleteRegistration = + "$serviceApp/getDriverNotCompleteRegistration.php"; + static String getPassengersNotCompleteRegistration = + "$serviceApp/getPassengersNotCompleteRegistration.php"; + static String addNotesDriver = "$serviceApp/addNotesDriver.php"; + static String getCarPlateNotEdit = "$serviceApp/getCarPlateNotEdit.php"; + static String addNotesPassenger = "$serviceApp/addNotesPassenger.php"; + static String getPackages = "$serviceApp/getPackages.php"; + static String updatePackages = "$serviceApp/updatePackages.php"; + ////// + static String sendSms = "https://sms.kazumi.me/api/sms/send-sms"; + static String senddlr = "https://sms.kazumi.me/api/sms/send-dlr"; + static String sendvalidity = "https://sms.kazumi.me/api/sms/send-validity"; + static String sendmany = "https://sms.kazumi.me/api/sms/send-many"; + static String checkCredit = "https://sms.kazumi.me/api/sms/check-credit"; + static String getSender = "$server/auth/sms/getSender.php"; + static String checkStatus = "https://sms.kazumi.me/api/sms/check-status"; + static String updatePhoneInvalidSMSPassenger = + "$server/auth/sms/updatePhoneInvalidSMSPassenger.php"; +} diff --git a/lib/constant/style.dart b/lib/constant/style.dart new file mode 100644 index 0000000..71eab1c --- /dev/null +++ b/lib/constant/style.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import '../main.dart'; +import 'box_name.dart'; +import 'colors.dart'; + +class AppStyle { + static TextStyle headTitle = const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 40, + color: AppColor.accentColor, + ); + static TextStyle headTitle2 = const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 26, + color: AppColor.primaryColor, + ); + static TextStyle title = const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: AppColor.primaryColor, + ); + static TextStyle subtitle = const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13, + color: AppColor.primaryColor, + ); + static TextStyle number = const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + color: AppColor.primaryColor, + ); + + static BoxDecoration boxDecoration = const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(12)), + color: AppColor.secondaryColor, + boxShadow: [ + BoxShadow( + color: AppColor.accentColor, + offset: Offset(-3, -3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer), + BoxShadow( + color: AppColor.accentColor, + offset: Offset(3, 3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer) + ]); + static BoxDecoration boxDecoration1 = const BoxDecoration( + boxShadow: [ + BoxShadow( + color: AppColor.accentColor, blurRadius: 5, offset: Offset(2, 4)), + BoxShadow( + color: AppColor.accentColor, blurRadius: 5, offset: Offset(-2, -2)) + ], + color: AppColor.secondaryColor, + borderRadius: BorderRadius.all( + Radius.elliptical(15, 30), + ), + ); +} diff --git a/lib/constant/table_names.dart b/lib/constant/table_names.dart new file mode 100644 index 0000000..47cd831 --- /dev/null +++ b/lib/constant/table_names.dart @@ -0,0 +1,9 @@ +class TableName { + static const String placesFavorite = "placesFavorite"; + static const String recentLocations = "recentLocations"; + static const String carLocations = "carLocations"; + static const String driverOrdersRefuse = "driverOrdersRefuse"; + static const String rideLocation = "rideLocation"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String captainNotification = "captainNotification"; +} diff --git a/lib/controller/admin/captain_admin_controller.dart b/lib/controller/admin/captain_admin_controller.dart new file mode 100644 index 0000000..debca72 --- /dev/null +++ b/lib/controller/admin/captain_admin_controller.dart @@ -0,0 +1,105 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class CaptainAdminController extends GetxController { + bool isLoading = false; + Map captainData = {}; + Map captain = {}; + final captainController = TextEditingController(); + final captainPrizeController = TextEditingController(); + final titleNotify = TextEditingController(); + final bodyNotify = TextEditingController(); + final formCaptainKey = GlobalKey(); + final formCaptainPrizeKey = GlobalKey(); + + Future getCaptainCount() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getCaptainDetails, payload: {}); + var d = jsonDecode(res); + if (d['status'] == 'success') { + captainData = d; + } + + isLoading = false; + update(); + } + + Future addCaptainPrizeToWallet() async { + String? paymentId; + //todo link to add wallet to captain + for (var i = 0; i < captainData['message'].length; i++) { + await CRUD().post(link: AppLink.addDriverPaymentPoints, payload: { + 'driverID': captainData['message'][i]['id'], + 'amount': captainPrizeController.text, + 'paymentMethod': 'Prize', + }).then((value) { + paymentId = value['message'].toString(); + }); + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'driverID': captainData['message'][i]['id'], + 'amount': captainPrizeController.text, + 'paymentMethod': 'Prize', + 'paymentID': paymentId.toString(), + }); + } + + Get.back(); + } + + void addCaptainsPrizeToWalletSecure() async { + try { + // Check if local authentication is available + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + ); + if (didAuthenticate) { + // User authenticated successfully, proceed with payment + await addCaptainPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } else { + // Authentication failed, handle accordingly + Get.snackbar('Authentication failed', '', + backgroundColor: AppColor.redColor); + // 'Authentication failed'); + } + } else { + // Local authentication not available, proceed with payment without authentication + await addCaptainPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } + } catch (e) { + rethrow; + } + } + + Future getCaptains() async { + var res = await CRUD() + .get(link: AppLink.getCaptainDetailsByEmailOrIDOrPhone, payload: { + 'driver_id': captainController.text, + 'driverEmail': captainController.text, + 'driverPhone': captainController.text, + }); + var d = jsonDecode(res); + if (d['status'] == 'success') { + captain = d; + } + update(); + } + + @override + void onInit() { + getCaptainCount(); + super.onInit(); + } +} diff --git a/lib/controller/admin/dashboard_controller.dart b/lib/controller/admin/dashboard_controller.dart new file mode 100644 index 0000000..6deefda --- /dev/null +++ b/lib/controller/admin/dashboard_controller.dart @@ -0,0 +1,86 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/controller/functions/crud.dart'; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../../print.dart'; + +class DashboardController extends GetxController { + bool isLoading = false; + List dashbord = []; + String creditSMS = '0'; + final formKey = GlobalKey(); + final smsText = TextEditingController(); + + Future getDashBoard() async { + isLoading = true; + update(); + + // الطلب من السيرفر الرئيسي + var res = await CRUD().get(link: AppLink.getdashbord, payload: {}); + if (res != 'failure') { + var d = jsonDecode(res); + // Log.print('d: ${d}'); + dashbord = d['message']; // هذا عبارة عن List + } + + // الطلب من سيرفر المحافظ + var resPayments = await CRUD().postWallet( + link: AppLink.getPaymentsDashboard, + payload: {}, + ); + + if (resPayments != 'failure') { + var p = resPayments; + // Log.print('p: ${p}'); + + // نتأكد أن الكل Map بداخل List + if (dashbord.isNotEmpty && + p['message'] is List && + p['message'].isNotEmpty) { + dashbord[0].addAll(p['message'][0]); // ندمج المعلومات داخل نفس الـ Map + } + } + + // كريدت الرسائل + var res2 = await CRUD().kazumiSMS( + link: 'https://sms.kazumi.me/api/sms/check-credit', + payload: {"username": "Sefer", "password": AK.smsPasswordEgypt}, + ); + + creditSMS = res2['credit']; + Log.print(' res2[credit]: ${res2['credit']}'); + Log.print('creditSMS: ${creditSMS}'); + + isLoading = false; + update(); + } + + sendSMSMethod() async { + if (formKey.currentState!.validate()) { + for (var phoneNumber in box.read(BoxName.tokensDrivers)['message']) { + // for (var i = 0; i < 2; i++) { + await CRUD().sendSmsEgypt( + phoneNumber['phone'].toString(), + // box.read(BoxName.tokensDrivers)['message'][i]['phone'].toString(), + smsText.text, + ); + // Log.print('CRUD().phoneDriversTest.: ${phoneNumber['phone']}'); + Future.delayed(const Duration(microseconds: 20)); + } + Get.back(); + } + } + + @override + void onInit() async { + getDashBoard(); + + super.onInit(); + } +} diff --git a/lib/controller/admin/get_all_invoice_controller.dart b/lib/controller/admin/get_all_invoice_controller.dart new file mode 100644 index 0000000..b36a0ad --- /dev/null +++ b/lib/controller/admin/get_all_invoice_controller.dart @@ -0,0 +1,25 @@ +class InvoiceModel { + final String invoiceNumber; + final String amount; + final String date; + final String name; + final String? imageLink; + + InvoiceModel({ + required this.invoiceNumber, + required this.amount, + required this.date, + required this.name, + this.imageLink, + }); + + factory InvoiceModel.fromJson(Map json) { + return InvoiceModel( + invoiceNumber: json['invoice_number'], + amount: json['amount'].toString(), + date: json['date'], + name: json['name'], + imageLink: json['image_link'], + ); + } +} diff --git a/lib/controller/admin/passenger_admin_controller.dart b/lib/controller/admin/passenger_admin_controller.dart new file mode 100644 index 0000000..eb6b50a --- /dev/null +++ b/lib/controller/admin/passenger_admin_controller.dart @@ -0,0 +1,108 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class PassengerAdminController extends GetxController { + bool isLoading = false; + Map passengersData = {}; + Map passengers = {}; + double height = 150; + final formPassKey = GlobalKey(); + final formPrizeKey = GlobalKey(); + final titleNotify = TextEditingController(); + final bodyNotify = TextEditingController(); + final passengerController = TextEditingController(); + final passengerPrizeController = TextEditingController(); + + Future getPassengerCount() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getPassengerDetails, payload: {}); + var d = jsonDecode(res); + if (d['status'] == 'success') { + passengersData = d; + } + + isLoading = false; + update(); + } + + Future addPassengerPrizeToWallet() async { + for (var i = 0; i < passengersData['message'].length; i++) { + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'passenger_id': passengersData['message'][i]['id'], + 'balance': passengerPrizeController.text, + }); + } + + Get.back(); + } + + void addPassengerPrizeToWalletSecure() async { + try { + // Check if local authentication is available + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + ); + if (didAuthenticate) { + // User authenticated successfully, proceed with payment + await addPassengerPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } else { + // Authentication failed, handle accordingly + Get.snackbar('Authentication failed', '', + backgroundColor: AppColor.redColor); + // 'Authentication failed'); + } + } else { + // Local authentication not available, proceed with payment without authentication + await addPassengerPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } + } catch (e) { + rethrow; + } + } + + Future getPassengers() async { + var res = await CRUD().get(link: AppLink.getPassengerbyEmail, payload: { + 'passengerEmail': passengerController.text, + 'passengerId': passengerController.text, + 'passengerphone': passengerController.text, + }); + var d = jsonDecode(res); + if (d['status'] == 'success') { + passengers = d; + } + update(); + } + + changeHeight() { + if (passengers.isEmpty) { + height = 0; + update(); + } + height = 150; + update(); + } + + void clearPlaces() { + passengers = {}; + update(); + } + + @override + void onInit() { + getPassengerCount(); + super.onInit(); + } +} diff --git a/lib/controller/admin/register_captain_controller.dart b/lib/controller/admin/register_captain_controller.dart new file mode 100644 index 0000000..9aa95cc --- /dev/null +++ b/lib/controller/admin/register_captain_controller.dart @@ -0,0 +1,590 @@ +import 'dart:convert'; +import 'dart:ffi'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../functions/crud.dart'; + +class RegisterCaptainController extends GetxController { + bool isDriverSaved = false; + bool isCarSaved = false; + Map? arguments; + String? driverId; + String? email; + String? phone; + + @override + void onInit() { + super.onInit(); + arguments = Get.arguments; + initArguments(); + } + + void driveInit() { + arguments = Get.arguments; + initArguments(); + } + + void initArguments() { + if (arguments != null) { + driverId = arguments!['driverId']; + email = arguments!['email']; + phone = arguments!['phone_number']; + } else { + print('Arguments are null'); + } + } + + Map responseMap = {}; + Map responseCarLicenseMapJordan = {}; + Map responseBackCarLicenseMap = {}; + Map responseIdCardMap = {}; + Map responseIdCardDriverEgyptBack = {}; + Map responseForComplaint = {}; + Map responseIdCardDriverEgyptFront = {}; + Map responseIdEgyptFront = {}; + Map responseCriminalRecordEgypt = {}; + Map responseIdEgyptBack = {}; + Map responseIdEgyptDriverLicense = {}; + String? responseIdCardDriverEgypt1; + bool isloading = false; + var image; + DateTime now = DateTime.now(); + + bool isLoading = false; + Future allMethodForAI(String prompt, imagePath, driverID) async { + isLoading = true; + update(); + + var extractedString = await CRUD().arabicTextExtractByVisionAndAI( + imagePath: imagePath, driverID: driverID); + var json = jsonDecode(extractedString); + var textValues = extractTextFromLines(json); + // await Get.put(AI()).geminiAiExtraction(prompt, textValues, imagePath); + await Get.put(RegisterCaptainController()) + .anthropicAI(textValues, prompt, imagePath); + isLoading = false; + update(); + } + + String extractTextFromLines(Map jsonData) { + final readResult = jsonData['readResult']; + final blocks = readResult['blocks']; + + final StringBuffer buffer = StringBuffer(); + + for (final block in blocks) { + final lines = block['lines']; + for (final line in lines) { + final text = line['text']; + buffer.write(text); + buffer.write('\n'); + } + } + + return buffer.toString().trim(); + } + + List driverNotCompleteRegistration = []; + getDriverNotCompleteRegistration() async { + var res = await CRUD() + .get(link: AppLink.getDriverNotCompleteRegistration, payload: {}); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + driverNotCompleteRegistration = d; + update(); + } else { + Get.snackbar(res, ''); + } + } + + final today = DateTime.now(); + + Future addDriverAndCarEgypt() async { + final expiryDate = responseIdEgyptDriverLicense['expiry_date']; + final expiryDateTime = DateTime.tryParse(expiryDate); + final isExpired = expiryDateTime != null && expiryDateTime.isBefore(today); + + final taxExpiryDate = responseIdCardDriverEgyptBack['tax_expiry']; + + // Get the inspection date from the response + final inspectionDate = responseIdCardDriverEgyptBack['inspection_date']; + final year = int.parse(inspectionDate.split('-')[0]); + // Try parsing the tax expiry date. If it fails, set it to null. + final taxExpiryDateTime = DateTime.tryParse(taxExpiryDate ?? ''); + final isExpiredCar = + taxExpiryDateTime != null && taxExpiryDateTime.isBefore(today); + + // Check if the inspection date is before today + final inspectionDateTime = DateTime(year, 1, 1); + final isInspectionExpired = inspectionDateTime.isBefore(today); + + if (isExpiredCar || isInspectionExpired) { + Get.defaultDialog( + title: 'Expired Driver’s License'.tr, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.warning, size: 48, color: Colors.red), + const SizedBox(height: 16), + Text( + 'Your driver’s license and/or car tax has expired. Please renew them before proceeding.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 16), + IconButton( + onPressed: () async { + // await Get.find().speakText( + // 'Your driver’s license and/or car tax has expired. Please renew them before proceeding.' + // .tr, + // ); + }, + icon: const Icon(Icons.volume_up), + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Get.back(); + }, + child: const Text('OK'), + ), + ], + ); + } else if (isExpired) { + Get.defaultDialog( + title: 'Expired Driver’s License'.tr, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.warning, size: 48, color: Colors.red), + const SizedBox(height: 16), + Text( + 'Your driver’s license has expired. Please renew it before proceeding.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 16), + IconButton( + onPressed: () async { + // await Get.find().speakText( + // 'Your driver’s license has expired. Please renew it before proceeding.' + // .tr, + // ); + }, + icon: const Icon(Icons.volume_up), + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Get.back(); + }, + child: const Text('OK'), + ), + ], + ); + } else if (responseIdEgyptDriverLicense['national_number'] + .toString() + .substring(0, 12) != + responseIdEgyptBack['nationalID'].toString().substring(0, 12)) { + Get.defaultDialog( + barrierDismissible: false, + title: 'ID Mismatch', + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.warning, size: 48, color: Colors.red), + const SizedBox(height: 16), + Text( + 'The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 16), + IconButton( + onPressed: () async { + // await Get.find().speakText( + // 'The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.', + // ); + }, + icon: const Icon(Icons.volume_up), + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Get.back(); + }, + child: const Text('OK'), + ), + ], + ); + } + // else if (responseCriminalRecordEgypt['FullName'] != + // responseIdEgyptDriverLicense['name_arabic']) { + // Get.defaultDialog( + // barrierDismissible: false, + // title: 'Criminal Record Mismatch', + // content: Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // const Icon(Icons.warning, size: 48, color: Colors.red), + // const SizedBox(height: 16), + // Text( + // 'The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.' + // .tr, + // textAlign: TextAlign.center, + // style: AppStyle.title, + // ), + // const SizedBox(height: 16), + // IconButton( + // onPressed: () async { + // await Get.find().speakText( + // 'The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.' + // .tr, + // ); + // }, + // icon: const Icon(Icons.volume_up), + // ), + // ], + // ), + // actions: [ + // TextButton( + // onPressed: () { + // Get.back(); + // }, + // child: const Text('OK'), + // ), + // ], + // ); + // } + else { + await addDriverEgypt(); + await addRegistrationCarEgypt(); + + if (isCarSaved && isDriverSaved) { + Get.snackbar('added', '', + backgroundColor: + AppColor.greenColor); // Get.offAll(() => HomeCaptain()); + // Get.offAll(() => HomeCaptain()); + } + } + } + + Future addDriverEgypt() async { + isLoading = true; + update(); + + var payload = { + 'first_name': responseIdEgyptDriverLicense['firstName']?.toString() ?? + 'Not specified', + 'last_name': responseIdEgyptDriverLicense['lastName']?.toString() ?? + 'Not specified', + 'email': email?.toString() ?? 'Not specified', + 'phone': phone?.toString() ?? 'Not specified', + 'id': driverId?.toString() ?? 'Not specified', + 'password': '123456', + 'gender': responseIdEgyptBack['gender']?.toString() ?? 'Not specified', + 'license_type': + responseIdEgyptDriverLicense['license_type']?.toString() ?? + 'Not specified', + 'national_number': + responseIdEgyptBack['nationalID']?.toString() ?? 'Not specified', + 'name_arabic': responseIdEgyptDriverLicense['name_arabic']?.toString() ?? + 'Not specified', + 'name_english': + responseIdEgyptDriverLicense['name_english']?.toString() ?? + 'Not specified', + 'issue_date': responseIdEgyptDriverLicense['issue_date']?.toString() ?? + 'Not specified', + 'expiry_date': responseIdEgyptDriverLicense['expiry_date']?.toString() ?? + 'Not specified', + 'license_categories': responseIdEgyptDriverLicense['license_categories'] + is List + ? responseIdEgyptDriverLicense['license_categories'].join(', ') + : responseIdEgyptDriverLicense['license_categories']?.toString() ?? + 'Not specified', + 'address': responseIdEgyptFront['address']?.toString() ?? 'Not specified', + 'card_id': responseIdEgyptFront['card_id']?.toString() ?? 'Not specified', + 'occupation': + responseIdEgyptBack['occupation']?.toString() ?? 'Not specified', + 'education': + responseIdEgyptBack['occupation']?.toString() ?? 'Not specified', + 'licenseIssueDate': + responseIdEgyptDriverLicense['issue_date']?.toString() ?? + 'Not specified', + 'religion': + responseIdEgyptBack['religion']?.toString() ?? 'Not specified', + 'status': 'yet', + 'birthdate': responseIdEgyptFront['dob']?.toString() ?? 'Not specified', + 'maritalStatus': + responseIdEgyptBack['maritalStatus']?.toString() ?? 'Not specified', + 'site': responseIdEgyptDriverLicense['address']?.toString() ?? + 'Not specified', + 'employmentType': + responseIdEgyptDriverLicense['employmentType']?.toString() ?? + 'Not specified', + }; + var res = await CRUD().post(link: AppLink.signUpCaptin, payload: payload); + var status1 = jsonDecode(res); + isLoading = false; + update(); + // Handle response + if (status1['status'] == 'success') { + isDriverSaved = true; + Get.snackbar('Success', 'Driver data saved successfully', + backgroundColor: AppColor.greenColor); + } else { + Get.snackbar('Error', 'Failed to save driver data', + backgroundColor: Colors.red); + } + } + + addCriminalDeocuments() async { + var res = await CRUD().post(link: AppLink.addCriminalDocuments, payload: { + "driverId": box.read(BoxName.driverID), + "IssueDate": responseCriminalRecordEgypt['IssueDate'], + "InspectionResult": responseCriminalRecordEgypt['InspectionResult'], + }); + if (res != 'failure') { + Get.snackbar('uploaded sucssefuly'.tr, ''); + } + } + + Future addRegistrationCarEgypt() async { + try { + isLoading = true; + update(); + var res = await CRUD().post(link: AppLink.addRegisrationCar, payload: { + 'driverID': driverId, + 'vin': responseIdCardDriverEgyptBack['chassis'].toString(), + 'car_plate': responseIdCardDriverEgyptFront['car_plate'].toString(), + 'make': responseIdCardDriverEgyptBack['make'].toString(), + 'model': responseIdCardDriverEgyptBack['model'], + 'year': responseIdCardDriverEgyptBack['year'].toString(), + 'expiration_date': + responseIdCardDriverEgyptFront['LicenseExpirationDate'].toString(), + 'color': responseIdCardDriverEgyptBack['color'], + 'owner': responseIdCardDriverEgyptFront['owner'], + 'color_hex': responseIdCardDriverEgyptBack['color_hex'].toString(), + 'address': responseIdCardDriverEgyptFront['address'].toString(), + 'displacement': responseIdCardDriverEgyptBack['engine'].toString(), + 'fuel': responseIdCardDriverEgyptBack['fuel'].toString(), + 'registration_date': + '${responseIdCardDriverEgyptBack['inspection_date']}', + }); + isLoading = false; + update(); + var status = jsonDecode(res); + if (status['status'] == 'success') { + isCarSaved = true; + Get.snackbar('Success', 'message', + backgroundColor: AppColor.greenColor); + } + } catch (e) {} + } + + Future getComplaintDataToAI() async { + var res = await CRUD().get( + link: AppLink.getComplaintAllDataForDriver, + payload: {'driver_id': driverId.toString()}, + ); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + return d; + } else { + return [ + {'data': 'no data'} + ]; + } + } + + Future anthropicAIForComplaint() async { + var dataComplaint = await getComplaintDataToAI(); + var messagesData = [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "$dataComplaint ${AppInformation.complaintPrompt} " + } + ] + } + ]; + var requestBody = jsonEncode({ + "model": "claude-3-haiku-20240307", + "max_tokens": 1024, + "temperature": 0, + "system": "Json output only without any additional ", + "messages": messagesData, + }); + final response = await http.post( + Uri.parse('https://api.anthropic.com/v1/messages'), + headers: { + 'x-api-key': AK.anthropicAIkeySeferNew, + 'anthropic-version': '2023-06-01', + 'content-type': 'application/json' + }, + body: requestBody, + ); + if (response.statusCode == 200) { + var responseData = jsonDecode(utf8.decode(response.bodyBytes)); + // Process the responseData as needed + + responseForComplaint = jsonDecode(responseData['content'][0]['text']); + } + } + + Future anthropicAI( + String payload, String prompt, String idType) async { + var messagesData = [ + { + "role": "user", + "content": [ + {"type": "text", "text": "$payload $prompt"} + ] + } + ]; + + var requestBody = jsonEncode({ + "model": "claude-3-haiku-20240307", + "max_tokens": 1024, + "temperature": 0, + "system": "Json output only without any additional ", + "messages": messagesData, + }); + + final response = await http.post( + Uri.parse('https://api.anthropic.com/v1/messages'), + headers: { + 'x-api-key': AK.anthropicAIkeySeferNew, + 'anthropic-version': '2023-06-01', + 'content-type': 'application/json' + }, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(utf8.decode(response.bodyBytes)); + // Process the responseData as needed + if (idType == 'car_back') { + responseIdCardDriverEgyptBack = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'car_front') { + responseIdCardDriverEgyptFront = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'id_front') { + responseIdEgyptFront = jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'id_back') { + responseIdEgyptBack = jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'driver_license') { + responseIdEgyptDriverLicense = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'criminalRecord') { + responseCriminalRecordEgypt = + jsonDecode(responseData['content'][0]['text']); + } + + update(); + return responseData.toString(); + } + return responseIdCardDriverEgyptBack.toString(); + } + + Future geminiAiExtraction(String prompt, payload, String idType) async { + var requestBody = jsonEncode({ + "contents": [ + { + "parts": [ + {"text": "$payload $prompt"} + ] + } + ], + "generationConfig": { + "temperature": 1, + "topK": 64, + "topP": 0.95, + "maxOutputTokens": 8192, + "stopSequences": [] + }, + "safetySettings": [ + { + "category": "HARM_CATEGORY_HARASSMENT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_HATE_SPEECH", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS_CONTENT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + } + ] + }); + + final response = await http.post( + Uri.parse( + // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=${AK.geminiApi}'), + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + + if (idType == 'car_back') { + responseIdCardDriverEgyptBack = jsonDecode(jsonString); + } else if (idType == 'car_front') { + responseIdCardDriverEgyptFront = jsonDecode(jsonString); + } else if (idType == 'id_front') { + responseIdEgyptFront = jsonDecode(jsonString); + } else if (idType == 'id_back') { + responseIdEgyptBack = jsonDecode(jsonString); + } else if (idType == 'driver_license') { + responseIdEgyptDriverLicense = jsonDecode(jsonString); + } + + update(); + } else { + Get.snackbar('Error', "JSON string not found", + backgroundColor: AppColor.redColor); + } + + // Rest of your code... + } else {} + } +} diff --git a/lib/controller/admin/ride_admin_controller.dart b/lib/controller/admin/ride_admin_controller.dart new file mode 100644 index 0000000..ee1ffcd --- /dev/null +++ b/lib/controller/admin/ride_admin_controller.dart @@ -0,0 +1,73 @@ +import 'dart:convert'; + +import 'package:fl_chart/fl_chart.dart'; +import 'package:get/get.dart'; + +import '../../constant/links.dart'; +import '../../models/model/admin/monthly_ride.dart'; +import '../functions/crud.dart'; + +class RideAdminController extends GetxController { + bool isLoading = false; + late List rideData; + late Map jsonResponse; + List ridesDetails = []; + var chartData; + // late List chartDatasync; + Future getRidesAdminDash() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {}); + jsonResponse = jsonDecode(res); + rideData = (jsonResponse['message'] as List) + .map((item) => MonthlyDataModel.fromJson(item)) + .toList(); + + chartData = rideData + .map((data) => FlSpot(data.day.toDouble(), data.ridesCount.toDouble())) + .toList(); + + // chartDatasync = (jsonResponse['message'] as List) + // .map((item) => ChartDataS( + // item['year'], + // item['month'], + // item['day'], + // item['rides_count'], + // )) + // .toList(); + isLoading = false; + update(); + } + + Future getRidesDetails() async { + // isLoading = true; + // update(); + var res = await CRUD().get(link: AppLink.getRidesDetails, payload: {}); + + var d = jsonDecode(res); + ridesDetails = d['message']; + + // isLoading = false; + // update(); + } + + @override + void onInit() async { + List initializationTasks = [ + getRidesAdminDash(), + getRidesDetails(), + ]; + // cameras = await availableCameras(); + await Future.wait(initializationTasks); + super.onInit(); + } +} + +// class ChartDataS { +// ChartDataS(this.year, this.month, this.day, this.ridesCount); + +// final int year; +// final int month; +// final int day; +// final int ridesCount; +// } diff --git a/lib/controller/admin/static_controller.dart b/lib/controller/admin/static_controller.dart new file mode 100644 index 0000000..8797cfe --- /dev/null +++ b/lib/controller/admin/static_controller.dart @@ -0,0 +1,238 @@ +import 'dart:convert'; + +import 'package:fl_chart/fl_chart.dart'; +import 'package:get/get.dart'; + +import '../../constant/links.dart'; +import '../../models/model/passengers_model.dart'; +import '../../print.dart'; +import '../functions/crud.dart'; + +class StaticController extends GetxController { + Map jsonData1 = {}; + Map jsonData2 = {}; + List staticList = []; + var chartDataPassengers; + var chartDataDrivers; + var chartDataDriversCalling; + var chartDataRides; + var chartDataEmployee; + var chartDataEmployeeMaryam; + var chartDataEmployeeRawda; + var chartDataEmployeeMena; + var chartDataEmployeeSefer4; + var chartDataDriversMatchingNotes; + bool isLoading = false; + String totalMonthlyPassengers = ''; + String totalMonthlyRides = ''; + String totalMonthlyEmployee = ''; + String totalMonthlyDrivers = ''; + late List passengersData; + late List ridesData; + late List employeeData; + late List driversData; + + Future fetch() async { + isLoading = true; + update(); // Notify the observers about the loading state change + + var res = await CRUD().get( + link: AppLink.getPassengersStatic, + payload: {}, + ); + jsonData1 = jsonDecode(res); + var jsonResponse = jsonDecode(res) as Map; + isLoading = false; + final List jsonData = jsonResponse['message']; + totalMonthlyPassengers = jsonData[0]['totalMonthly'].toString(); + passengersData = jsonData.map((item) { + return MonthlyPassengerInstall.fromJson(item); + }).toList(); + final List spots = passengersData + .map((data) => FlSpot( + data.day.toDouble(), + data.totalPassengers.toDouble(), + )) + .toList(); + chartDataPassengers = spots; + + update(); // Notify the observers about the data and loading state change + } + + Future fetchRides() async { + isLoading = true; + update(); // Notify the observers about the loading state change + + var res = await CRUD().get( + link: AppLink.getRidesStatic, + payload: {}, + ); + jsonData1 = jsonDecode(res); + var jsonResponse = jsonDecode(res) as Map; + isLoading = false; + final List jsonData = jsonResponse['message']; + totalMonthlyRides = jsonData[0]['totalMonthly'].toString(); + ridesData = jsonData.map((item) { + return MonthlyRidesInstall.fromJson(item); + }).toList(); + final List spots = ridesData + .map((data) => FlSpot( + data.day.toDouble(), + data.totalRides.toDouble(), + )) + .toList(); + chartDataRides = spots; + + update(); // Notify the observers about the data and loading state change + } + + Future fetchEmployee() async { + try { + isLoading = true; + update(); + + var res = await CRUD().get(link: AppLink.getEmployeeStatic, payload: {}); + + // First check if the response is valid JSON + if (res == 'failure') { + throw FormatException('Invalid response: $res'); + } + + var jsonResponse = jsonDecode(res) as Map; + + // Initialize empty lists for all chart data + chartDataEmployeeMaryam = []; + chartDataEmployeeRawda = []; + chartDataEmployeeMena = []; + chartDataEmployeeSefer4 = []; + totalMonthlyRides = '0'; + + // Check for error response + if (jsonResponse['status'] == 'failure') { + isLoading = false; + update(); + return; + } + + final List jsonData = jsonResponse['message']; + if (jsonData.isEmpty) { + isLoading = false; + update(); + return; + } + + totalMonthlyRides = jsonData[0]['totalMonthly']?.toString() ?? '0'; + + // Group data by employee + Map> employeeDataMap = {}; + + for (var item in jsonData) { + var employeeData = MonthlyEmployeeData.fromJson(item); + if (!employeeDataMap.containsKey(employeeData.name)) { + employeeDataMap[employeeData.name] = []; + } + employeeDataMap[employeeData.name]!.add(employeeData); + } + + final today = DateTime.now().day; + + // Create data for each employee + final employeeNames = { + 'maryam': chartDataEmployeeMaryam, + 'yasmine': chartDataEmployeeRawda, + 'mena': chartDataEmployeeMena, + 'ashjan': chartDataEmployeeSefer4, + }; + + employeeNames.forEach((name, chartData) { + var spots = []; + for (int day = 1; day <= today; day++) { + spots.add(FlSpot( + day.toDouble(), + employeeDataMap[name] + ?.firstWhere( + (e) => e.day == day, + orElse: () => MonthlyEmployeeData( + day: day, + totalEmployees: 0, + name: name, + ), + ) + .totalEmployees + .toDouble() ?? + 0, + )); + } + + // Explicitly cast to List + if (name == 'maryam') + chartDataEmployeeMaryam = List.from(spots); + if (name == 'yasmine') + chartDataEmployeeRawda = List.from(spots); + if (name == 'mena') chartDataEmployeeMena = List.from(spots); + if (name == 'ashjan') + chartDataEmployeeSefer4 = List.from(spots); + }); + } catch (e) { + Log.print('Error in fetchEmployee: $e'); + // Set empty FlSpot lists in case of error + chartDataEmployeeMaryam = []; + chartDataEmployeeRawda = []; + chartDataEmployeeMena = []; + chartDataEmployeeSefer4 = []; + totalMonthlyRides = '0'; + } finally { + isLoading = false; + update(); + } + } + + Future fetchDrivers() async { + isLoading = true; + update(); // Notify the observers about the loading state change + + var res = await CRUD().get( + link: AppLink.getdriverstotalMonthly, + payload: {}, + ); + jsonData2 = jsonDecode(res); + var jsonResponse = jsonDecode(res) as Map; + isLoading = false; + final List jsonData = jsonResponse['message']; + staticList = jsonData; + totalMonthlyDrivers = jsonData[0]['totalDrivers'].toString(); + driversData = jsonData.map((item) { + return MonthlyDriverInstall.fromJson(item); + }).toList(); + final List spots = driversData + .map((data) => FlSpot( + data.day.toDouble(), + data.dailyTotalDrivers.toDouble(), + )) + .toList(); + chartDataDrivers = spots; + final List spotsCalling = driversData + .map((data) => FlSpot( + data.day.toDouble(), + data.dailyTotalCallingDrivers.toDouble(), + )) + .toList(); + chartDataDriversCalling = spotsCalling; + final List spotsTotalMatchingNotes = driversData + .map((data) => FlSpot( + data.day.toDouble(), + data.dailyMatchingNotes.toDouble(), + )) + .toList(); + chartDataDriversMatchingNotes = spotsTotalMatchingNotes; + + update(); // Notify the observers about the data and loading state change + } + + Future getAll() async { + await fetch(); + await fetchRides(); + await fetchDrivers(); + await fetchEmployee(); + } +} diff --git a/lib/controller/admin/wallet_admin_controller.dart b/lib/controller/admin/wallet_admin_controller.dart new file mode 100644 index 0000000..f26a5c3 --- /dev/null +++ b/lib/controller/admin/wallet_admin_controller.dart @@ -0,0 +1,195 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../functions/crud.dart'; + +class WalletAdminController extends GetxController { + bool isLoading = false; + + late Map jsonResponse; + List walletDetails = []; + List driversWalletPoints = []; + + @override + void onInit() { + getWalletForEachDriverToPay(); + super.onInit(); + } + + Future getWalletAdminDash() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {}); + jsonResponse = jsonDecode(res); + } + + Future payToBankDriverAll() async { + for (var i = 0; i < driversWalletPoints.length; i++) { + String token = await getToken(); + await Future.delayed(const Duration(seconds: 1)); + try { + await payToDriverBankAccount( + token, + driversWalletPoints[i]['total_amount'].toString(), + driversWalletPoints[i]['accountBank'].toString(), + driversWalletPoints[i]['bankCode'].toString(), + driversWalletPoints[i]['name_arabic'].toString(), + driversWalletPoints[i]['driverID'].toString(), + driversWalletPoints[i]['phone'].toString(), + driversWalletPoints[i]['email'].toString(), + ); + await Future.delayed(const Duration(seconds: 3)); + } on FormatException catch (e) { + // Handle the error or rethrow the exception as needed + } + } + } + + Future payToDriverBankAccount( + String token, + String amount, + String bankCardNumber, + String bankCode, + String name, + String driverId, + String phone, + String email) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + + var body = jsonEncode({ + "issuer": "bank_card", + "amount": amount, + "full_name": name, + "bank_card_number": bankCardNumber, + "bank_code": bankCode, + "bank_transaction_type": "cash_transfer" + }); + + var response = await http.post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body); + + if (response.statusCode == 200) { + var d = jsonDecode(response.body); + + if (d['status_description'] == + "Transaction received and validated successfully. Dispatched for being processed by the bank") { + await addPayment('payFromSeferToDriver', driverId, + ((-1) * double.parse(amount)).toString()); + await addSeferWallet('payFromSeferToDriver', driverId, + ((-1) * double.parse(amount)).toString()); + await updatePaymentToPaid(driverId); + await sendEmail(driverId, amount, phone, name, bankCardNumber, email); + } + } else {} + } + + // String paymentToken = ''; + Future generateToken(String amount) async { + var res = await CRUD().post(link: AppLink.addPaymentTokenDriver, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'amount': amount.toString(), + }); + var d = jsonDecode(res); + return d['message']; + } + + Future sendEmail( + String driverId, amount, phone, name, bankCardNumber, email) async { + await CRUD().sendEmail(AppLink.sendEmailToDrivertransaction, { + "driverID": driverId, + "total_amount": amount, + "phone": phone, + "name_arabic": name, + "accountBank": bankCardNumber, + "email": email + }); + } + + Future addSeferWallet( + String paymentMethod, String driverID, String point) async { + var seferToken = await generateToken(point.toString()); + await CRUD().post(link: AppLink.addSeferWallet, payload: { + 'amount': point.toString(), + 'paymentMethod': paymentMethod, + 'passengerId': 'driver', + 'token': seferToken, + 'driverId': driverID.toString(), + }); + } + + Future addPayment( + String paymentMethod, String driverID, String amount) async { + var paymentToken = + await generateToken(((double.parse(amount))).toStringAsFixed(0)); + await CRUD().post(link: AppLink.addDrivePayment, payload: { + 'rideId': DateTime.now().toIso8601String(), + 'amount': ((double.parse(amount))).toStringAsFixed(0), + 'payment_method': paymentMethod, + 'passengerID': 'myself', + 'token': paymentToken, + 'driverID': driverID.toString(), + }); + } + + Future updatePaymentToPaid(String driverID) async { + await CRUD().post(link: AppLink.updatePaymetToPaid, payload: { + 'driverID': driverID.toString(), + }); + } + + Future getToken() async { + var headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + // 'Cookie': + // 'csrftoken=74iZJ8XYyuTm5WRq2W4tpWX5eqoJLZVK5QhuDrChWpDtzpgGA269bbCWuEcW85t4' + }; + var body = { + 'grant_type': 'password', + 'username': AK.payMobOutUserName, + 'password': AK.payMobOutPassword, + 'client_id': AK.payMobOutClient_id, + 'client_secret': AK.payMobOutClientSecrret + }; + var res = await http.post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/o/token/'), + headers: headers, + body: body, + ); + String token = ''; + if (res.statusCode == 200) { + var decode = jsonDecode(res.body); + token = decode['access_token']; + } + return token; + } + + Future getWalletForEachDriverToPay() async { + isLoading = true; + update(); + var res = await CRUD() + .postWallet(link: AppLink.getVisaForEachDriver, payload: {}); + var d = (res); + if (d != 'failure') { + driversWalletPoints = d['message']; + isLoading = false; + update(); + } + driversWalletPoints = []; + isLoading = false; + update(); + } +} diff --git a/lib/controller/auth/login_controller.dart b/lib/controller/auth/login_controller.dart new file mode 100644 index 0000000..e750322 --- /dev/null +++ b/lib/controller/auth/login_controller.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'otp_helper.dart'; + +class OtpVerificationAdmin extends StatefulWidget { + final String phone; + const OtpVerificationAdmin({required this.phone}); + + @override + State createState() => _OtpVerificationAdminState(); +} + +class _OtpVerificationAdminState extends State { + final _otpController = TextEditingController(); + bool _isLoading = false; + + Future _verifyOtp() async { + setState(() => _isLoading = true); + + final otpHelper = OtpHelper(); + await otpHelper.verifyOtp(widget.phone, _otpController.text.trim()); + // if (success) { + // Get.offAllNamed('/admin-dashboard'); + // } else { + // Get.snackbar('خطأ', 'رمز التحقق غير صحيح'); + // } + setState(() => _isLoading = false); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('التحقق من الرمز')), + body: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + children: [ + TextFormField( + controller: _otpController, + keyboardType: TextInputType.number, + decoration: const InputDecoration(labelText: 'رمز التحقق'), + ), + const SizedBox(height: 20), + _isLoading + ? const CircularProgressIndicator() + : ElevatedButton( + onPressed: _verifyOtp, + child: const Text('تحقق وأدخل'), + ) + ], + ), + ), + ); + } +} diff --git a/lib/controller/auth/otp_helper.dart b/lib/controller/auth/otp_helper.dart new file mode 100644 index 0000000..c0b4f0b --- /dev/null +++ b/lib/controller/auth/otp_helper.dart @@ -0,0 +1,114 @@ +import 'package:get/get.dart'; +import 'package:sefer_admin1/controller/functions/device_info.dart'; +import 'package:sefer_admin1/views/auth/login_page.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/admin/admin_home_page.dart'; +import '../../views/widgets/snackbar.dart'; +import '../functions/crud.dart'; + +class OtpHelper extends GetxController { + static final String _sendOtpUrl = + '${AppLink.server}/Admin/auth/send_otp_admin.php'; + static final String _verifyOtpUrl = + '${AppLink.server}/Admin/auth/verify_otp_admin.php'; + static final String _checkAdminLogin = + '${AppLink.server}/Admin/auth/login.php'; + + /// إرسال OTP + static Future sendOtp(String phoneNumber) async { + try { + final response = await CRUD().post( + link: _sendOtpUrl, + payload: {'receiver': phoneNumber}, + ); + + if (response != 'failure') { + mySnackeBarError('تم إرسال رمز التحقق إلى رقمك عبر WhatsApp'); + return true; + } else { + mySnackeBarError('حدث خطأ من الخادم. حاول مجددًا.'); + return false; + } + } catch (e) { + Log.print('OTP SEND ERROR: $e'); + mySnackeBarError('حدث خطأ أثناء الإرسال: $e'); + return false; + } + } + + /// التحقق من OTP + Future verifyOtp(String phoneNumber, String otp) async { + try { + final response = await CRUD().post( + link: _verifyOtpUrl, + payload: { + 'phone_number': phoneNumber, + 'otp': otp, + 'device_number': box.read(BoxName.fingerPrint) + }, + ); + + if (response != 'failure') { + if (response['status'] == 'success') { + box.write(BoxName.phoneVerified, true); + box.write(BoxName.adminPhone, phoneNumber); + + mySnackbarSuccess('تم التحقق من الرقم بنجاح'); + await checkAdminLogin(); + } else { + mySnackeBarError(response['message'] ?? 'فشل في التحقق.'); + } + } else { + mySnackeBarError('فشل من الخادم. حاول مرة أخرى.'); + } + } catch (e) { + Log.print('OTP VERIFY ERROR: $e'); + mySnackeBarError('خطأ في التحقق: $e'); + } + } + + Future checkAdminLogin() async { + final deviceNumber = + box.read(BoxName.fingerPrint); // خزّنه عند التشغيل أول مرة + final phoneNumber = box.read(BoxName.adminPhone); // عند التحقق من OTP + + if (deviceNumber != null && phoneNumber != null) { + final response = await CRUD().post( + link: _checkAdminLogin, + payload: { + "device_number": deviceNumber, + "phone_number": phoneNumber, + }, + ); + + if (response != "failure") { + Get.offAll(() => AdminHomePage()); + } else { + Get.offAll(() => AdminLoginPage()); + } + } else { + Get.offAll(() => AdminLoginPage()); + } + } + + @override + void onInit() { + super.onInit(); + DeviceHelper.getDeviceFingerprint().then((deviceFingerprint) { + box.write(BoxName.fingerPrint, deviceFingerprint); + }); + // تأجيل تنفيذ التنقل حتى تنتهي مرحلة البناء + Future.microtask(() { + if (box.read(BoxName.phoneVerified) == true && + box.read(BoxName.adminPhone) != null) { + checkAdminLogin(); + } else { + Get.offAll(() => AdminLoginPage()); + } + }); + } +} diff --git a/lib/controller/bank_account/payout.dart b/lib/controller/bank_account/payout.dart new file mode 100644 index 0000000..0001a96 --- /dev/null +++ b/lib/controller/bank_account/payout.dart @@ -0,0 +1,113 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../../constant/links.dart'; +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../main.dart'; +import '../functions/crud.dart'; + +class PaymobPayout extends GetxController { + bool isLoading = false; + String dropdownValue = 'etisalat'; + + Future getToken() async { + var headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + // 'Cookie': + // 'csrftoken=74iZJ8XYyuTm5WRq2W4tpWX5eqoJLZVK5QhuDrChWpDtzpgGA269bbCWuEcW85t4' + }; + var body = { + 'grant_type': 'password', + 'username': AK.payMobOutUserName, + 'password': AK.payMobOutPassword, + 'client_id': AK.payMobOutClient_id, + 'client_secret': AK.payMobOutClientSecrret + }; + var res = await http.post( + Uri.parse('https://payouts.paymobsolutions.com/api/secure/o/token/'), + headers: headers, + body: body, + ); + String token = ''; + if (res.statusCode == 200) { + var decode = jsonDecode(res.body); + token = decode['access_token']; + } + return token; + } + + payToDriverWallet( + String token, String amount, String issuer, String msisdn) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + var body = json.encode({ + "amount": amount, //"10.00", + "issuer": issuer, //"vodafone", + "msisdn": msisdn, // "01023456789" + }); + var res = await http.post( + Uri.parse('https://payouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body, + ); + var dec = jsonDecode(res.body); + if (dec['disbursement_status'] == 'successful') { + await CRUD().post(link: AppLink.addDriverpayment, payload: { + 'rideId': DateTime.now().toIso8601String(), + 'amount': ((-1) * (double.parse(dec['amount'])) + 5).toStringAsFixed(0), + 'payment_method': 'payout', + 'passengerID': 'admin', + 'driverID': box.read(BoxName.driverID).toString(), + }); + Get.snackbar('Transaction successful'.tr, + '${'Transaction successful'.tr} ${dec['amount']}', + backgroundColor: AppColor.greenColor); + // Get.find().getCaptainWalletFromRide(); + } else if (dec['disbursement_status'] == 'failed') { + Get.snackbar('Transaction failed'.tr, 'Transaction failed'.tr, + backgroundColor: AppColor.redColor); + } + } + + payToDriverBankAccount(String token, String amount, String bankCardNumber, + String bankCode) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + var body = { + "issuer": "bank_card", + "amount": amount, //9.0, + "full_name": + '${box.read(BoxName.nameDriver)} ${box.read(BoxName.lastNameDriver)}', + "bank_card_number": bankCardNumber, //"1111-2222-3333-4444", + "bank_code": bankCode, //"CIB", + "bank_transaction_type": "cash_transfer" + }; + var res = await http + .post( + Uri.parse('https://payouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body, + ) + .then((value) {}); + } + + Future payToWalletDriverAll( + String amount, String issuer, String msisdn) async { + String token = await getToken(); + await payToDriverWallet(token, amount, issuer, msisdn); + } + + Future payToBankDriverAll( + String amount, String bankCardNumber, String bankCode) async { + String token = await getToken(); + await payToDriverBankAccount(token, amount, bankCardNumber, bankCode); + } +} diff --git a/lib/controller/drivers/driverthebest.dart b/lib/controller/drivers/driverthebest.dart new file mode 100644 index 0000000..a6298c8 --- /dev/null +++ b/lib/controller/drivers/driverthebest.dart @@ -0,0 +1,68 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class Driverthebest extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = await CRUD().get(link: AppLink.getBestDriver, payload: {}); + if (res != 'failure') { + driver = jsonDecode(res)['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} + +class DriverTheBestGizaController extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = await CRUD().get(link: AppLink.getBestDriverGiza, payload: {}); + if (res != 'failure') { + driver = jsonDecode(res)['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} + +class DriverTheBestAlexandriaController extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = + await CRUD().get(link: AppLink.getBestDriverAlexandria, payload: {}); + if (res != 'failure') { + driver = jsonDecode(res)['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} diff --git a/lib/controller/employee_controller/employee_controller.dart b/lib/controller/employee_controller/employee_controller.dart new file mode 100644 index 0000000..d9c61dc --- /dev/null +++ b/lib/controller/employee_controller/employee_controller.dart @@ -0,0 +1,76 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:flutter/widgets.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/colors.dart'; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/controller/functions/crud.dart'; + +class EmployeeController extends GetxController { + List employee = []; + final name = TextEditingController(); + final education = TextEditingController(); + final site = TextEditingController(); + final phone = TextEditingController(); + final status = TextEditingController(); + final formKey = GlobalKey(); + + fetchEmployee() async { + var res = await CRUD().get(link: AppLink.getEmployee, payload: {}); + if (res != 'failure') { + employee = jsonDecode(res)['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + late String id; + String generateRandomId(int length) { + const String chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + Random random = Random(); + + return String.fromCharCodes(Iterable.generate( + length, + (_) => chars.codeUnitAt(random.nextInt(chars.length)), + )); + } + + addEmployee() async { + // Create the payload with the employee data + var res = await CRUD().post(link: AppLink.addEmployee, payload: { + "id": id, + "name": name.text, + "education": education.text, + "site": site.text, + "phone": phone.text, + "status": status.text, + }); + + // Check the response from the API + if (res != 'failure') { + // You can handle the success case here, such as showing a success message + + Get.back(); + Get.snackbar('Success', 'Employee added successfully', + backgroundColor: AppColor.greenColor); + name.clear(); + education.clear(); + site.clear(); + phone.clear(); + status.clear(); + fetchEmployee(); + } else { + // Handle the error case by showing a snackbar with an error message + Get.snackbar('Error', 'Failed to add employee', + backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + fetchEmployee(); + super.onInit(); + } +} diff --git a/lib/controller/firebase/firbase_messge.dart b/lib/controller/firebase/firbase_messge.dart new file mode 100644 index 0000000..a4e5ef4 --- /dev/null +++ b/lib/controller/firebase/firbase_messge.dart @@ -0,0 +1,517 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:secure_string_operations/secure_string_operations.dart'; +import 'package:sefer_admin1/constant/info.dart'; +import 'package:sefer_admin1/env/env.dart'; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/char_map.dart'; +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/widgets/elevated_btn.dart'; +import '../functions/encrypt_decrypt.dart'; +import '../notification_controller.dart'; +import 'local_notification.dart'; +import 'token_access.dart'; + +class FirebaseMessagesController extends GetxController { + final fcmToken = FirebaseMessaging.instance; + + List tokens = []; + List tokensPassengers = []; + List dataTokens = []; + List dataTokensPassenger = []; + late String driverID; + late String driverToken; + NotificationSettings? notificationSettings; + bool isLoading = false; + Future getNotificationSettings() async { + // Get the current notification settings + NotificationSettings? notificationSettings = + await FirebaseMessaging.instance.getNotificationSettings(); + 'Notification authorization status: ${notificationSettings.authorizationStatus}'; + + // Call the update function if needed + update(); + } + + Future requestFirebaseMessagingPermission() async { + FirebaseMessaging messaging = FirebaseMessaging.instance; + + // Check if the platform is Android + if (Platform.isAndroid) { + // Request permission for Android + await messaging.requestPermission(); + } else if (Platform.isIOS) { + // Request permission for iOS + NotificationSettings settings = await messaging.requestPermission( + alert: true, + announcement: true, + badge: true, + carPlay: true, + criticalAlert: true, + provisional: false, + sound: true, + ); + messaging.setForegroundNotificationPresentationOptions( + alert: true, badge: true, sound: true); + } + } + + Future getTokens() async { + var res = await http.post( + Uri.parse(AppLink.getTokens), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + body: {}, + ); + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + dataTokens = jsonResponse['data']; + for (var i = 0; i < dataTokens.length; i++) { + tokens.add(jsonResponse['data'][i]['token']); + } + box.write(BoxName.tokens, tokens); + } else { + Get.defaultDialog(title: "Warning", middleText: "Server Error"); + } + } + + var currentPage = 1; + var totalPages = 1; + Future getAllTokenDrivers() async { + isLoading = true; + try { + var res = await http.post( + Uri.parse(AppLink.getDriversPhonesAndTokens), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' + // 'Authorization': 'Bearer ${box.read(BoxName.jwt)}' + }, + body: { + // 'page': page.toString(), + }, + ); + + var jsonResponse = jsonDecode(res.body); + Log.print('jsonResponse: ${jsonResponse}'); + if (jsonResponse['status'] == 'success') { + // var newData = jsonResponse['data'] as List; + // Log.print('newData: ${newData}'); + // // if (page == 1) { + // // dataTokens.clear(); + // // tokens.clear(); + // // } + // dataTokens.addAll(newData); + // for (var item in newData) { + // tokens.add(item['token']); + // } + // currentPage = int.parse(jsonResponse['currentPage']); + // totalPages = jsonResponse['totalPages']; + box.write(BoxName.tokensDrivers, jsonResponse); + Log.print( + 'box.write(BoxName.tokensDrivers: ${box.read(BoxName.tokensDrivers)}'); + } else { + Get.defaultDialog( + title: "Warning", middleText: "No more data available"); + } + } catch (e) { + Get.defaultDialog(title: "Error", middleText: "Server Error: $e"); + } finally { + isLoading = false; + } + } + + var currentPagePassenger = 1; + var totalPagesPassenger = 1; + Future getAllTokenPassenger({int page = 1}) async { + isLoading = true; + try { + var res = await http.post( + Uri.parse(AppLink.getAllTokenPassengers), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' + }, + body: {}, + ); + + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + box.write(BoxName.tokensPassengers, jsonResponse); + Log.print( + 'box.write(BoxName.tokensPassenger: ${box.read(BoxName.tokensPassengers)}'); + } else { + Get.defaultDialog( + title: "Warning", middleText: "No more data available"); + } + } catch (e) { + Get.defaultDialog(title: "Error", middleText: "Server Error: $e"); + } finally { + isLoading = false; + } + } + + bool isSendingNotifications = false; + Future loadAllPagesAndSendNotifications() async { + isSendingNotifications = true; + // currentPage = 1; + + // while (currentPage <= totalPages) { + // await getAllTokenDrivers(page: currentPage); + await getAllTokenDrivers(); + // Log.print('tokens: ${tokens}'); + await NotificationController().sendNotificationDrivers(); + // print(tokens); + + // if (currentPage < totalPages) { + // await Future.delayed(const Duration(seconds: 3)); + // } + // currentPage++; + // } + + isSendingNotifications = false; + Get.snackbar("Success", "All notifications sent!"); + } + + bool isSendingNotificationsPassenger = false; + Future loadAllPagesAndSendNotificationsPassengers() async { + isSendingNotificationsPassenger = true; + currentPage = 1; + + // while (currentPagePassenger <= totalPagesPassenger) { + await getAllTokenPassenger(); + await NotificationController().sendNotificationPassengers(); + // print(tokensPassengers); + // if (currentPagePassenger < totalPagesPassenger) { + // await Future.delayed(const Duration(seconds: 3)); + // } + // currentPagePassenger++; + // } + + isSendingNotificationsPassenger = false; + Get.snackbar("Success", "All notifications sent!"); + } + + Future getAllTokenPassengers() async { + var res = await http.post( + Uri.parse(AppLink.getAllTokenPassengers), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' + // 'Authorization': 'Bearer ${box.read(BoxName.jwt)}' + }, + body: {}, + ); + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + dataTokens = jsonResponse['data']; + for (var i = 0; i < dataTokens.length; i++) { + tokensPassengers.add(jsonResponse['data'][i]['token']); + } + box.write(BoxName.tokensPassengers, jsonResponse['data']); + } else { + Get.defaultDialog(title: "Warning", middleText: "Server Error"); + } + } + + Future getToken() async { + fcmToken.getToken().then((token) { + if (box.read(BoxName.email) == null) { + box.write(BoxName.tokenDriver, token); + } else { + box.write(BoxName.tokenFCM, token); + } + }); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + // If the app is in the background or terminated, show a system tray message + RemoteNotification? notification = message.notification; + AndroidNotification? android = notification?.android; + // if (notification != null && android != null) { + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + } + + void fireBaseTitles(RemoteMessage message) { + if (message.notification!.title! == 'Order') { + if (Platform.isAndroid) { + // NotificationController().showNotification('Order', '', 'order'); + } + var myListString = message.data['DriverList']; + // var points = message.data['PolylineJson']; + + var myList = jsonDecode(myListString) as List; + // var myPoints = jsonDecode(points) as List; + driverToken = myList[14].toString(); + // This is for location using and uploading status + + update(); + } + } + + SnackbarController driverAppliedTripSnakBar() { + return Get.snackbar( + 'Driver Applied the Ride for You'.tr, + '', + colorText: AppColor.greenColor, + duration: const Duration(seconds: 3), + snackPosition: SnackPosition.TOP, + titleText: Text( + 'Applied'.tr, + style: const TextStyle(color: AppColor.redColor), + ), + messageText: Text( + 'Driver Applied the Ride for You'.tr, + style: AppStyle.title, + ), + icon: const Icon(Icons.approval), + shouldIconPulse: true, + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(16), + ); + } + + Future passengerDialog(String message) { + return Get.defaultDialog( + barrierDismissible: false, + title: 'message From passenger'.tr, + titleStyle: AppStyle.title, + middleTextStyle: AppStyle.title, + middleText: message.tr, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + // FirebaseMessagesController().sendNotificationToPassengerToken( + // 'Hi ,I will go now'.tr, + // 'I will go now'.tr, + // Get.find().driverToken, []); + // Get.find() + // .startTimerDriverWaitPassenger5Minute(); + + Get.back(); + })); + } + + // Future driverFinishTripDialoge(List driverList) { + // return Get.defaultDialog( + // title: 'Driver Finish Trip'.tr, + // content: const DriverTipWidget(), + // confirm: MyElevatedButton( + // title: 'Yes'.tr, + // onPressed: () async { + // var tip = (Get.find().totalPassenger) * + // (double.parse(box.read(BoxName.tipPercentage.toString()))); + // var res = await CRUD().post(link: AppLink.addTips, payload: { + // 'passengerID': box.read(BoxName.passengerID), + // 'driverID': driverList[0].toString(), + // 'rideID': driverList[1].toString(), + // 'tipAmount': tip.toString(), + // }); + // await CRUD().post(link: AppLink.addPassengersWallet, payload: { + // 'passenger_id': box.read(BoxName.passengerID).toString(), + // 'balance': ((-1) * tip).toString() + // }); + + // await CRUD().post(link: AppLink.addDriversWalletPoints, payload: { + // 'driverID': driverList[0].toString(), + // 'paymentID': '${Get.find().rideId}tip', + // 'amount': (tip * 100).toString(), + // 'paymentMethod': 'visa-tip', + // }); + + // if (res != 'failure') { + // FirebaseMessagesController().sendNotificationToAnyWithoutData( + // 'You Have Tips', + // '${'${tip.toString()}\$${' tips\nTotal is'.tr}'} ${tip + (Get.find().totalPassenger)}', + // driverList[2].toString(), + // ); + // } + // Get.to(() => RateDriverFromPassenger(), arguments: { + // 'driverId': driverList[0].toString(), + // 'rideId': driverList[1].toString(), + // 'price': driverList[3].toString() + // }); + // }, + // kolor: AppColor.greenColor, + // ), + // cancel: MyElevatedButton( + // title: 'No,I want'.tr, + // onPressed: () { + // Get.to(() => RateDriverFromPassenger(), arguments: { + // 'driverId': driverList[0].toString(), + // 'rideId': driverList[1].toString(), + // 'price': driverList[3].toString() + // }); + // }, + // kolor: AppColor.redColor, + // )); + // } + + void sendNotificationAll(String title, body) async { + // Get the token you want to subtract. + String token = box.read(BoxName.tokenFCM); + tokens = box.read(BoxName.tokens); + // Subtract the token from the list of tokens. + tokens.remove(token); + + // Save the list of tokens back to the box. + // box.write(BoxName.tokens, tokens); + tokens = box.read(BoxName.tokens); + for (var i = 0; i < tokens.length; i++) { + String serviceAccountKeyJson = '''{ + "type": "service_account", + "project_id": "ride-b1bd8", + "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249", + "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n", + "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com", + "client_id": "111210077025005706623", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} +'''; // As defined above + + // Initialize AccessTokenManager + final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); + + // Obtain an OAuth 2.0 access token + final accessToken = await accessTokenManager.getAccessToken(); + + // Send the notification + final response = await http + .post( + Uri.parse( + 'https://fcm.googleapis.com/v1/projects/ride-b1bd8/messages:send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $accessToken', + }, + body: jsonEncode({ + 'notification': { + 'title': title, + 'body': body, + 'sound': 'ding.wav' + }, + 'priority': 'high', + 'data': { + 'click_action': 'FLUTTER_NOTIFICATION_CLICK', + 'id': '1', + 'status': 'done' + }, + 'to': tokens[i], + })) + .whenComplete(() {}) + .catchError((e) {}); + } + } + + // for (var i = 0; i < tokens.length; i++) { + // http + // .post(Uri.parse('https://fcm.googleapis.com/fcm/send'), + // headers: { + // 'Content-Type': 'application/json', + // 'Authorization': 'key=${storage.read(key: BoxName.serverAPI}' + // }, + // body: jsonEncode({ + // 'notification': { + // 'title': title, + // 'body': body, + // 'sound': 'true' + // }, + // 'priority': 'high', + // 'data': { + // 'click_action': 'FLUTTER_NOTIFICATION_CLICK', + // 'id': '1', + // 'status': 'done' + // }, + // 'to': tokens[i], + // })) + // .whenComplete(() {}) + // .catchError((e) { + // }); + // } + // } +//android/app/src/main/res/raw/iphone_ringtone.wav + + late String serviceAccountKeyJson; + void sendNotificationToAnyWithoutData( + String title, String body, String token, String tone) async { + try { + var encryptedKey = Env.privateKeyFCM; + // Log.print('encryptedKey: ${encryptedKey}'); + serviceAccountKeyJson = + EncryptionHelper.instance.decryptData(encryptedKey); +// As defined above + + // Initialize AccessTokenManager + final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); + + // Obtain an OAuth 2.0 access token + final accessToken = await accessTokenManager.getAccessToken(); + // Log.print('accessToken: ${accessToken}'); + + // Send the notification + final response = await http.post( + Uri.parse( + 'https://fcm.googleapis.com/v1/projects/intaleq-d48a7/messages:send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $accessToken', + }, + body: jsonEncode({ + 'message': { + 'token': token, + 'notification': { + 'title': title, + 'body': body, + }, + 'android': { + 'notification': { + 'sound': tone, + }, + }, + 'apns': { + 'payload': { + 'aps': { + 'sound': tone, + }, + }, + }, + }, + }), + ); + + if (response.statusCode == 200) { + SnackBar(content: Text('${response.statusCode}')); + print( + 'Notification sent successfully. Status code: ${response.statusCode}'); + print('Response body: ${response.body}'); + } else { + print( + 'Failed to send notification. Status code: ${response.statusCode}'); + print('Response body: ${response.body}'); + } + } catch (e) { + print('Error sending notification: $e'); + } + } +} diff --git a/lib/controller/firebase/local_notification.dart b/lib/controller/firebase/local_notification.dart new file mode 100644 index 0000000..6ea5160 --- /dev/null +++ b/lib/controller/firebase/local_notification.dart @@ -0,0 +1,29 @@ +// import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +// import 'package:get/get.dart'; + +// class NotificationController extends GetxController { +// final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = +// FlutterLocalNotificationsPlugin(); + +// // Initializes the local notifications plugin +// Future initNotifications() async { +// const AndroidInitializationSettings android = +// AndroidInitializationSettings('@mipmap/launcher_icon'); +// const InitializationSettings initializationSettings = +// InitializationSettings(android: android); +// await _flutterLocalNotificationsPlugin.initialize(initializationSettings); +// } + +// // Displays a notification with the given title and message +// void showNotification(String title, String message, String tone) async { +// AndroidNotificationDetails android = AndroidNotificationDetails( +// 'your channel id', 'your channel name', +// importance: Importance.max, +// priority: Priority.high, +// showWhen: false, +// sound: RawResourceAndroidNotificationSound(tone)); + +// NotificationDetails details = NotificationDetails(android: android); +// await _flutterLocalNotificationsPlugin.show(0, title, message, details); +// } +// } diff --git a/lib/controller/firebase/token_access.dart b/lib/controller/firebase/token_access.dart new file mode 100644 index 0000000..fc28ef8 --- /dev/null +++ b/lib/controller/firebase/token_access.dart @@ -0,0 +1,53 @@ +import 'dart:convert'; +import 'package:googleapis_auth/auth_io.dart'; + +import '../../print.dart'; + +class AccessTokenManager { + static final AccessTokenManager _instance = AccessTokenManager._internal(); + late final String serviceAccountJsonKey; + AccessToken? _accessToken; + DateTime? _expiryDate; + + AccessTokenManager._internal(); + + factory AccessTokenManager(String jsonKey) { + if (_instance._isServiceAccountKeyInitialized()) { + // Prevent re-initialization + return _instance; + } + _instance.serviceAccountJsonKey = jsonKey; + return _instance; + } + + bool _isServiceAccountKeyInitialized() { + try { + serviceAccountJsonKey; // Access to check if initialized + return true; + } catch (e) { + return false; + } + } + + Future getAccessToken() async { + if (_accessToken != null && DateTime.now().isBefore(_expiryDate!)) { + return _accessToken!.data; + } + try { + final serviceAccountCredentials = ServiceAccountCredentials.fromJson( + json.decode(serviceAccountJsonKey)); + final client = await clientViaServiceAccount( + serviceAccountCredentials, + ['https://www.googleapis.com/auth/firebase.messaging'], + ); + + _accessToken = client.credentials.accessToken; + _expiryDate = client.credentials.accessToken.expiry; + client.close(); + Log.print('_accessToken!.data: ${_accessToken!.data}'); + return _accessToken!.data; + } catch (e) { + throw Exception('Failed to obtain access token'); + } + } +} diff --git a/lib/controller/functions/crud.dart b/lib/controller/functions/crud.dart new file mode 100644 index 0000000..e634b8d --- /dev/null +++ b/lib/controller/functions/crud.dart @@ -0,0 +1,2093 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:math'; + +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:jwt_decoder/jwt_decoder.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/char_map.dart'; +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../env/env.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/widgets/elevated_btn.dart'; +import 'device_info.dart'; +import 'encrypt_decrypt.dart'; +import 'security_checks.dart'; + +class CRUD { + var dev = ''; + getJWT() async { + dev = Platform.isAndroid ? 'android' : 'ios'; + + var payload = { + 'id': 'admin', + 'password': AK.passnpassenger, + 'aud': '${AK.allowed}$dev', + }; + Log.print('payload: ${payload}'); + var response1 = await http.post( + Uri.parse(AppLink.loginJwtDriver), + body: payload, + ); + + if (response1.statusCode == 200) { + final decodedResponse1 = jsonDecode(response1.body); + + final jwt = decodedResponse1['jwt']; + Log.print('jwt: ${jwt}'); + await box.write(BoxName.jwt, X.c(X.c(X.c(jwt, cn), cC), cs)); + // await AppInitializer().getKey(); + } + } + + Future get({ + required String link, + Map? payload, + }) async { + if (box.read(BoxName.jwt) == null) { + await getJWT(); + } + bool isTokenExpired = JwtDecoder.isExpired(X + .r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs) + .toString() + .split(AppInformation.addd)[0]); + if (isTokenExpired) { + await getJWT(); + } + // await Get.put(LoginDriverController()).getJWT(); + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' + }, + ); + print(response.request); + Log.print('response.body: ${response.body}'); + print(payload); + if (response.statusCode == 200) { + Log.print('response: ${response.body}'); + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return response.body; + } + + return jsonData['status']; + } else if (response.statusCode == 401) { + // Specifically handle 401 Unauthorized + var jsonData = jsonDecode(response.body); + + if (jsonData['error'] == 'Token expired') { + // Show snackbar prompting to re-login + // await Get.put(LoginDriverController()).getJWT(); + // mySnackbarSuccess('please order now'.tr); + + return 'token_expired'; // Return a specific value for token expiration + } else { + // Other 401 errors + // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); + return 'failure'; + } + } else { + // addError('Non-200 response code: ${response.statusCode}', + // 'crud().post - Other'); + return 'failure'; + } + } + + // Future getWallet({ + // required String link, + // Map? payload, + // }) async { + // var s = await getJwtWallet(); + // var url = Uri.parse( + // link, + // ); + // var response = await http.post( + // url, + // body: payload, + // headers: { + // "Content-Type": "application/x-www-form-urlencoded", + // 'Authorization': 'Bearer $s' + // }, + // ); + // if (response.statusCode == 200) { + // var jsonData = jsonDecode(response.body); + // if (jsonData['status'] == 'success') { + // return response.body; + // } + + // return jsonData['status']; + // } else if (response.statusCode == 401) { + // // Specifically handle 401 Unauthorized + // var jsonData = jsonDecode(response.body); + + // if (jsonData['error'] == 'Token expired') { + // // Show snackbar prompting to re-login + // // await Get.put(LoginDriverController()).getJwtWallet(); + + // return 'token_expired'; // Return a specific value for token expiration + // } else { + // // Other 401 errors + // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); + // return 'failure'; + // } + // } else { + // addError('Non-200 response code: ${response.statusCode}', + // 'crud().post - Other'); + // return 'failure'; + // } + // } + + Future post( + {required String link, Map? payload}) async { + var url = Uri.parse(link); + try { + bool isTokenExpired = JwtDecoder.isExpired(X + .r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs) + .toString() + .split(AppInformation.addd)[0]); + if (isTokenExpired) { + await getJWT(); + } + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' + // 'Authorization': 'Bearer ${box.read(BoxName.jwt)}' + }, + ); + print(response.request); + Log.print('response.body: ${response.body}'); + print(payload); + if (response.statusCode == 200) { + try { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return jsonData; + } else { + return jsonData['status']; + } + } catch (e) { + // addError(e.toString(), 'crud().post - JSON decoding'); + return 'failure'; + } + } else if (response.statusCode == 401) { + // Specifically handle 401 Unauthorized + var jsonData = jsonDecode(response.body); + + if (jsonData['error'] == 'Token expired') { + // Show snackbar prompting to re-login + await getJWT(); + // MyDialog().getDialog( + // 'Session expired. Please log in again.'.tr, + // '', + // () { + // Get.put(LoginController()).loginUsingCredentials( + // box.read(BoxName.passengerID), box.read(BoxName.email)); + // Get.back(); + // }, + // ); + + return 'token_expired'; // Return a specific value for token expiration + } else { + // Other 401 errors + // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); + return 'failure'; + } + } else { + // addError('Non-200 response code: ${response.statusCode}', + // 'crud().post - Other'); + return 'failure'; + } + } catch (e) { + // addError('HTTP request error: $e', 'crud().post - HTTP'); + return 'failure'; + } + } + + getJwtWallet() async { + String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + print('fingerPrint: ${fingerPrint}'); + + await SecurityChecks.isDeviceRootedFromNative(Get.context!); + + dev = Platform.isAndroid ? 'android' : 'ios'; + var payload = { + 'id': '1', + 'password': AK.passnpassenger, + 'aud': '${Env.allowedWallet}$dev', + 'fingerPrint': fingerPrint + }; + // Log.print('payload: ${payload}'); + var response1 = await http.post( + Uri.parse(AppLink.loginWalletAdmin), + body: payload, + ); + // Log.print('response.request: ${response1.request}'); + // Log.print('response.body: ${response1.body}'); + // print(payload); + // Log.print( + // 'jsonDecode(response1.body)["jwt"]: ${jsonDecode(response1.body)['jwt']}'); + await box.write(BoxName.hmac, jsonDecode(response1.body)['hmac']); + return jsonDecode(response1.body)['jwt'].toString(); + } + + Future postWallet( + {required String link, Map? payload}) async { + var s = await getJwtWallet(); + Log.print('jwt: ${s}'); + final hmac = box.read(BoxName.hmac); + Log.print('hmac: ${hmac}'); + var url = Uri.parse(link); + Log.print('url: ${url}'); + try { + // await LoginDriverController().getJWT(); + + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': 'Bearer $s', + 'X-HMAC-Auth': hmac.toString(), + }, + ); + Log.print('response.request:${response.request}'); + Log.print('response.body: ${response.body}'); + Log.print('payload:$payload'); + if (response.statusCode == 200) { + try { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return jsonData; + } else { + return jsonData['status']; + } + } catch (e) { + // addError(e.toString(), 'crud().post - JSON decoding'); + return 'failure'; + } + } else if (response.statusCode == 401) { + // Specifically handle 401 Unauthorized + var jsonData = jsonDecode(response.body); + + if (jsonData['error'] == 'Token expired') { + return 'token_expired'; // Return a specific value for token expiration + } else { + // Other 401 errors + // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); + return 'failure'; + } + } else { + // addError('Non-200 response code: ${response.statusCode}', + // 'crud().post - Other'); + return 'failure'; + } + } catch (e) { + // addError('HTTP request error: $e', 'crud().post - HTTP'); + return 'failure'; + } + } + + // } + Future sendWhatsAppAuth(String to, message) async { + var res = await CRUD().post( + link: AppLink.send_whatsapp_message, + payload: {'receiver': to, 'message': message}); + if (res != 'failure') { + Get.snackbar('Success', 'Message sent successfully'); + } else { + Get.snackbar('Error', 'Failed to send message'); + } + } + + Future getAgoraToken({ + required String channelName, + required String uid, + }) async { + var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + var res = await http.get( + Uri.parse( + 'https://repulsive-pig-rugby-shirt.cyclic.app/token?channelName=$channelName'), + headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'}); + + if (res.statusCode == 200) { + var response = jsonDecode(res.body); + return response['token']; + } else {} + } + + Future getLlama({ + required String link, + required String payload, + required String prompt, + }) async { + var url = Uri.parse( + link, + ); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': + 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy' + // 'Authorization': 'Bearer ${Env.llamaKey}' + }; + var data = json.encode({ + "model": "Llama-3-70b-Inst-FW", + // "model": "llama-13b-chat", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post( + url, + body: data, + headers: headers, + ); + + if (response.statusCode == 200) { + return response.body; + } + return response.statusCode; + } + + Future allMethodForAI(String prompt, driverID, imagePath) async { + // await ImageController().choosImage(linkPHP, imagePath); + Future.delayed(const Duration(seconds: 2)); + var extractedString = await arabicTextExtractByVisionAndAI( + imagePath: imagePath, driverID: driverID); + var json = jsonDecode(extractedString); + var textValues = getAllTextValuesWithLineNumbers(json); + // List textValues = getAllTextValues(json); + + // await AI().geminiAiExtraction(prompt, textValues); + } + + Map>> getAllTextValuesWithLineNumbers( + Map json) { + Map>> output = {}; + int lineNumber = 1; + + if (json.containsKey('regions')) { + List regions = json['regions']; + for (Map region in regions) { + if (region.containsKey('lines')) { + List lines = region['lines']; + List> linesWithText = []; + for (Map line in lines) { + if (line.containsKey('words')) { + List words = line['words']; + String lineText = ""; + for (Map word in words) { + if (word.containsKey('text')) { + lineText += word['text'] + " "; + } + } + lineText = lineText.trim(); + linesWithText.add( + {"line_number": lineNumber.toString(), "text": lineText}); + lineNumber++; + } + } + output["region_${region.hashCode}"] = linesWithText; + } + } + } + + return output; + } + + // List getAllTextValues(Map json) { + // List textValues = []; + + // if (json.containsKey('regions')) { + // List regions = json['regions']; + // for (Map region in regions) { + // if (region.containsKey('lines')) { + // List lines = region['lines']; + // for (Map line in lines) { + // if (line.containsKey('words')) { + // List words = line['words']; + // for (Map word in words) { + // if (word.containsKey('text')) { + // textValues.add(word['text']); + // } + // } + // } + // } + // } + // } + // } + + // return textValues; + // } + + Future arabicTextExtractByVisionAndAI({ + required String imagePath, + required String driverID, + }) async { + var headers = { + 'Content-Type': 'application/json', + 'Ocp-Apim-Subscription-Key': AK.ocpApimSubscriptionKey + }; + + String imagePathFull = + '${AppLink.server}/card_image/$imagePath-$driverID.jpg'; + var request = http.Request( + 'POST', + Uri.parse( + 'https://eastus.api.cognitive.microsoft.com/computervision/imageanalysis:analyze?features=caption,read&model-version=latest&language=en&api-version=2024-02-01')); + request.body = json.encode({"url": imagePathFull}); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + return await response.stream.bytesToString(); + } else {} + } + + Future getChatGPT({ + required String link, + required String payload, + }) async { + var url = Uri.parse( + link, + ); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}' + }; + var data = json.encode({ + "model": "gpt-3.5-turbo", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like vin,make,made,year,expiration_date,color,owner,registration_date just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post( + url, + body: data, + headers: headers, + ); + + if (response.statusCode == 200) { + return response.body; + } + return response.statusCode; + } + + Future postStripe({ + required String link, + Map? payload, + }) async { + // String? secretKey = await storage.read(key: BoxName.secretKey); + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': 'Bearer ${AK.secretKey}', + }, + ); + if (response.statusCode == 200) { + return response.body; + } else {} + } + + Future kazumiSMS({ + required String link, + Map? payload, + }) async { + var url = Uri.parse( + link, + ); + var headers = {'Content-Type': 'application/json'}; + var request = http.Request('POST', url); + request.body = json.encode({ + "username": "Sefer", + "password": AK.smsPasswordEgypt, + }); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + var responseBody = await response.stream.bytesToString(); + var data = json.decode(responseBody); + return data; + } else {} + } + + Future sendSmsEgypt(String phone, otp) async { + // String sender = await getSender(); + var headers = {'Content-Type': 'application/json'}; + var body = jsonEncode({ + "username": "Sefer", + "password": "E)Pu=an/@Z", + "message": otp, + "language": "e", + "sender": "Sefer Egy", + "receiver": phone + }); + + var res = await http.post( + Uri.parse(AppLink.sendSms), + body: body, + headers: headers, + ); + } + + Future postPayMob({ + required String link, + Map? payload, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse( + link, + ); + var response = await http.post(url, + body: payload, headers: {'Content-Type': 'application/json'}); + + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + return response.body; + } else { + return (jsonData['status']); + } + } else { + return response.statusCode; + } + } + + sendEmail( + String link, + Map? payload, + ) async { + var headers = { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }; + var request = http.Request('POST', Uri.parse(link)); + request.bodyFields = payload!; + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + if (response.statusCode == 200) { + } else {} + } + + Future postFromDialogue({ + required String link, + Map? payload, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + + if (response.body.isNotEmpty) { + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + Get.back(); + // Get.snackbar( + // jsonData['status'], + // jsonData['message'], + // ); + + return response.body; + } + } + return (jsonData['status']); + } + } + + Future sendVerificationRequest(String phoneNumber) async { + final accountSid = AK.accountSIDTwillo; + final authToken = AK.authTokenTwillo; + final verifySid = AK.twilloRecoveryCode; + + final Uri verificationUri = Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/Verifications'); + + // Send the verification request + final response = await http.post( + verificationUri, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: { + 'To': phoneNumber, + 'Channel': 'sms', + }, + ); + + if (response.statusCode == 201) { + } else {} + + // Prompt the user to enter the OTP + const otpCode = "123456"; // Replace with user input + + // Check the verification code + final checkUri = Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/VerificationCheck'); + + final checkResponse = await http.post( + checkUri, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: { + 'To': phoneNumber, + 'Code': otpCode, + }, + ); + + if (checkResponse.statusCode == 201) { + } else {} + } + + Future getGoogleApi({ + required String link, + Map? payload, + }) async { + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + ); + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'OK') { + return jsonData; + } + return (jsonData['status']); + } + + Future update({ + required String endpoint, + required Map data, + required String id, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse('$endpoint/$id'); + var response = await http.put( + url, + body: json.encode(data), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + return json.decode(response.body); + } + + Future delete({ + required String endpoint, + required String id, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse('$endpoint/$id'); + var response = await http.delete( + url, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + return json.decode(response.body); + } + + List phoneDriversTest = [ + 201023248456, + 201023248456, + ]; + List phoneDrivers = [ + 201000038159, + 201000038736, + 201000064464, + 201000091230, + 201000136570, + 201000151861, + 201000198736, + 201000228580, + 201000237951, + 201000255720, + 201000287614, + 201000292939, + 201000304215, + 201000332271, + 201000392607, + 201000405678, + 201000426363, + 201000435451, + 201000480175, + 201000669808, + 201000692012, + 201000892261, + 201000927483, + 201001022044, + 201001088358, + 201001195138, + 201001216083, + 201001227223, + 201001231343, + 201001281229, + 201001324045, + 201001372270, + 201001448413, + 201001456101, + 201001460169, + 201001484302, + 201001486990, + 201001609106, + 201001614305, + 201001616098, + 201001695782, + 201001741428, + 201001868999, + 201001880988, + 201001917872, + 201001974843, + 201002026121, + 201002034349, + 201002050890, + 201002205527, + 201002211383, + 201002220298, + 201002380874, + 201002507461, + 201002524889, + 201002559121, + 201002593666, + 201002726223, + 201002757121, + 201002772429, + 201002831939, + 201002918886, + 201003008890, + 201003093029, + 201003111434, + 201003247072, + 201003284035, + 201003312497, + 201003322933, + 201003335753, + 201003395388, + 201003454075, + 201003457552, + 201003464748, + 201003516746, + 201003519354, + 201003562562, + 201003624502, + 201003660350, + 201003698426, + 201003732688, + 201003758852, + 201003769330, + 201003970205, + 201003973327, + 201004008170, + 201004034125, + 201004361687, + 201004362477, + 201004378446, + 201004508215, + 201004519539, + 201004558484, + 201004625077, + 201004658742, + 201004663695, + 201004712116, + 201004754688, + 201004770495, + 201004771729, + 201004800479, + 201004848413, + 201004965744, + 201005004603, + 201005094804, + 201005126645, + 201005145830, + 201005170670, + 201005215092, + 201005259664, + 201005285496, + 201005308188, + 201005315146, + 201005457333, + 201005457388, + 201005464946, + 201005467997, + 201005496502, + 201005591720, + 201005655832, + 201005748724, + 201005778338, + 201005802822, + 201005804981, + 201005840296, + 201005857716, + 201005894006, + 201006098594, + 201006119945, + 201006261655, + 201006336012, + 201006373310, + 201006399505, + 201006529560, + 201006550621, + 201006566057, + 201006568992, + 201006576933, + 201006642448, + 201006681860, + 201006701396, + 201006775356, + 201006833930, + 201006841969, + 201006874127, + 201006886819, + 201006905156, + 201006911892, + 201006953238, + 201006997521, + 201007006197, + 201007126077, + 201007135060, + 201007174032, + 201007210871, + 201007251945, + 201007420153, + 201007431781, + 201007436392, + 201007467887, + 201007526078, + 201007532774, + 201007536613, + 201007573334, + 201007581968, + 201007737308, + 201007740820, + 201007901024, + 201007910121, + 201008018110, + 201008053391, + 201008073697, + 201008235676, + 201008269802, + 201008306697, + 201008330262, + 201008360039, + 201008527428, + 201008529970, + 201008597171, + 201008698488, + 201008864162, + 201008872941, + 201008900034, + 201008940080, + 201008968686, + 201009033817, + 201009089217, + 201009120576, + 201009150184, + 201009171151, + 201009190006, + 201009225265, + 201009440993, + 201009752899, + 201009759313, + 201009793301, + 201009797500, + 201009804581, + 201009869329, + 201009886308, + 201009939077, + 201009945537, + 201009969727, + 201010025269, + 201010041236, + 201010107223, + 201010259482, + 201010376273, + 201010382250, + 201010490869, + 201010684229, + 201010743158, + 201010789827, + 201010866363, + 201010885870, + 201010887621, + 201010887705, + 201011205708, + 201011492446, + 201011508900, + 201011604297, + 201011723604, + 201011936165, + 201011953955, + 201011999310, + 201012036826, + 201012338391, + 201012342004, + 201012475707, + 201012530826, + 201012574024, + 201012775059, + 201012856677, + 201012962316, + 201013004000, + 201013135258, + 201013248449, + 201013327761, + 201013331683, + 201013725067, + 201014063641, + 201014242962, + 201014446768, + 201014626816, + 201014687816, + 201014714084, + 201014781950, + 201014786553, + 201015084707, + 201015162969, + 201015264416, + 201015328382, + 201015493716, + 201015554008, + 201015555050, + 201015654885, + 201015665467, + 201015736460, + 201015817826, + 201015994940, + 201016388436, + 201016408801, + 201016497939, + 201016565911, + 201016636646, + 201016748176, + 201017035902, + 201017062590, + 201017212144, + 201017435616, + 201017505135, + 201017567245, + 201017580860, + 201017650550, + 201017672180, + 201017690285, + 201017815188, + 201018042320, + 201018180201, + 201018416878, + 201018518723, + 201018861694, + 201018933273, + 201018984078, + 201019023091, + 201019069097, + 201019217036, + 201019266797, + 201019502290, + 201019782128, + 201019785811, + 201019859988, + 201020007540, + 201020060588, + 201020093997, + 201020170343, + 201020172859, + 201020178391, + 201020184220, + 201020235190, + 201020301781, + 201020335329, + 201020555412, + 201020649148, + 201020695352, + 201020847945, + 201020969782, + 201021017211, + 201021160682, + 201021222549, + 201021235129, + 201021394443, + 201021655556, + 201021736217, + 201021875274, + 201022226451, + 201022246204, + 201022265083, + 201022329267, + 201022446211, + 201022518181, + 201022660026, + 201023005090, + 201023069002, + 201023069907, + 201023095063, + 201023118846, + 201023130711, + 201023247045, + 201023248455, + 201023248456, + 201023248457, + 201023248488, + 201023626140, + 201023674737, + 201023790070, + 201023848787, + 201024052053, + 201024181778, + 201024420162, + 201024470224, + 201024501874, + 201024769948, + 201025075574, + 201025227216, + 201025255404, + 201025393959, + 201025412613, + 201025432017, + 201025463793, + 201025500060, + 201025581505, + 201025647745, + 201025737661, + 201025767385, + 201025887117, + 201026191863, + 201026200067, + 201026264611, + 201026300904, + 201026440737, + 201026773473, + 201026798518, + 201026807264, + 201027030168, + 201027234885, + 201027316763, + 201027481133, + 201027605557, + 201027719574, + 201027774092, + 201027775432, + 201027788822, + 201027994009, + 201028258757, + 201028313498, + 201028340666, + 201028603589, + 201028885144, + 201028912082, + 201029116604, + 201029135123, + 201029139900, + 201029296526, + 201029362080, + 201029484514, + 201029602004, + 201029777011, + 201029885806, + 201029929017, + 201029950342, + 201030014226, + 201030039804, + 201030047331, + 201030096464, + 201030145357, + 201030282895, + 201030356606, + 201030367702, + 201030382740, + 201030499449, + 201030530211, + 201030596294, + 201030673353, + 201030751777, + 201030806901, + 201030812036, + 201030885983, + 201030985581, + 201032073723, + 201032080240, + 201032197354, + 201032215558, + 201032599049, + 201032900804, + 201032960990, + 201032995929, + 201033006950, + 201033014117, + 201033053068, + 201033054527, + 201033087547, + 201033159408, + 201033499971, + 201033552484, + 201033598513, + 201033854635, + 201033970821, + 201040535096, + 201040873577, + 201050048044, + 201050774777, + 201050797017, + 201050894194, + 201050916243, + 201050923423, + 201060037563, + 201060040065, + 201060090105, + 201060156231, + 201060163215, + 201060208601, + 201060371260, + 201060444330, + 201060525792, + 201060577208, + 201060686267, + 201060794536, + 201060896771, + 201060906267, + 201060974333, + 201061099914, + 201061131720, + 201061337043, + 201061350410, + 201061489820, + 201061973544, + 201062031886, + 201062166038, + 201062319321, + 201062415502, + 201062603244, + 201062702907, + 201062718466, + 201062981863, + 201063103737, + 201063141018, + 201063251961, + 201063308303, + 201063525249, + 201063556251, + 201063600748, + 201063688477, + 201063831389, + 201063923914, + 201063955559, + 201064026674, + 201064054511, + 201064101887, + 201064153512, + 201064178167, + 201064312767, + 201064334558, + 201064468695, + 201064626776, + 201064630354, + 201064644619, + 201064684185, + 201064921214, + 201064982002, + 201065048819, + 201065050067, + 201065161321, + 201065286286, + 201065451010, + 201065601203, + 201065635907, + 201066228870, + 201066229104, + 201066253365, + 201066292351, + 201066465787, + 201066596220, + 201066730578, + 201067611319, + 201067696612, + 201067788258, + 201067791624, + 201067859062, + 201067889013, + 201067970457, + 201067986841, + 201068212833, + 201068640092, + 201068653978, + 201069074613, + 201069133688, + 201069483289, + 201069766969, + 201069938005, + 201070021630, + 201070076171, + 201070129941, + 201070290269, + 201070641133, + 201070665752, + 201080058399, + 201080068372, + 201080076746, + 201080269149, + 201080322306, + 201080351275, + 201080454035, + 201080688081, + 201080827009, + 201080931721, + 201080979919, + 201090009131, + 201090090088, + 201090119050, + 201090213039, + 201090333810, + 201090744905, + 201090809381, + 201091029772, + 201091467068, + 201091677319, + 201091729780, + 201091951144, + 201092955061, + 201092977597, + 201093030032, + 201093092520, + 201093122561, + 201093359914, + 201093594953, + 201093882353, + 201093981308, + 201094057691, + 201094186227, + 201094255708, + 201094584806, + 201094688043, + 201094688644, + 201094769303, + 201094924486, + 201094960584, + 201095032754, + 201095288771, + 201095667357, + 201095782382, + 201095956669, + 201096133443, + 201096148124, + 201096351318, + 201096567961, + 201096662301, + 201096725050, + 201096776146, + 201097229576, + 201097267405, + 201097761778, + 201097765410, + 201097846083, + 201097919136, + 201098123666, + 201098127395, + 201098166776, + 201098386668, + 201098582216, + 201098700882, + 201098957440, + 201099336257, + 201099412985, + 201099420820, + 201099530964, + 201099550606, + 201099600846, + 201099670072, + 201099785084, + 201099907868, + 201099915861, + 201099924551, + 201099981747, + 201099997143, + 201100038956, + 201100040727, + 201100074027, + 201100082801, + 201100170600, + 201100245413, + 201100316991, + 201100485561, + 201100583911, + 201100588511, + 201100667988, + 201100680306, + 201100711857, + 201100721522, + 201100726360, + 201101163626, + 201101371471, + 201101474377, + 201101512699, + 201101626410, + 201101795866, + 201101986128, + 201102192489, + 201102432276, + 201102563435, + 201102660856, + 201102752569, + 201102766374, + 201102779987, + 201104429778, + 201110110495, + 201110121075, + 201110144858, + 201110333451, + 201110600956, + 201110668338, + 201110797333, + 201110868027, + 201110921077, + 201111047616, + 201111105976, + 201111250676, + 201111282490, + 201111300613, + 201111512106, + 201111522040, + 201111528707, + 201111667567, + 201111697961, + 201111715992, + 201111716562, + 201111718210, + 201111751166, + 201111751446, + 201111754283, + 201111951209, + 201111981450, + 201112000443, + 201112022291, + 201112044799, + 201112105588, + 201112215276, + 201112235547, + 201112299884, + 201112524534, + 201112539202, + 201112591953, + 201112861834, + 201113001950, + 201113024717, + 201113305615, + 201113328519, + 201113512958, + 201113617737, + 201113701121, + 201113931993, + 201113999375, + 201114202318, + 201114211410, + 201114384428, + 201114568129, + 201114729635, + 201114776641, + 201114801155, + 201114988892, + 201115232474, + 201115299186, + 201115307275, + 201115440591, + 201115553247, + 201115605581, + 201115691406, + 201115790410, + 201115794827, + 201115801585, + 201115892867, + 201115934957, + 201115997592, + 201116036599, + 201116062390, + 201116155328, + 201116195736, + 201116360444, + 201116362464, + 201116397705, + 201116410122, + 201116646518, + 201116661682, + 201116662263, + 201116669877, + 201116684607, + 201116787624, + 201116951169, + 201116985014, + 201117008885, + 201117059617, + 201117246068, + 201117265855, + 201117558213, + 201117651958, + 201117663059, + 201117685256, + 201117730892, + 201117745888, + 201117937985, + 201118001729, + 201118002160, + 201118175123, + 201118243930, + 201118313079, + 201118331500, + 201118342702, + 201118636820, + 201118653148, + 201118674734, + 201118689666, + 201118706518, + 201118787900, + 201118882012, + 201118886390, + 201118970961, + 201119044711, + 201119079364, + 201119100748, + 201119137787, + 201119159545, + 201119187827, + 201119256418, + 201119298768, + 201119490066, + 201119499018, + 201119557005, + 201119601947, + 201119905035, + 201119928400, + 201119993654, + 201120071355, + 201120086686, + 201120161089, + 201120194397, + 201120272743, + 201120357820, + 201120732419, + 201120760088, + 201120777527, + 201120803031, + 201120840502, + 201120917643, + 201121000454, + 201121104000, + 201121115920, + 201121218416, + 201121262634, + 201121537458, + 201121539342, + 201121641905, + 201121645943, + 201121676093, + 201121721649, + 201121738274, + 201121833893, + 201121880293, + 201121904651, + 201121999951, + 201122130454, + 201122277009, + 201122352926, + 201122352929, + 201122441260, + 201122453889, + 201122466640, + 201122681852, + 201123138354, + 201123200082, + 201123237473, + 201123338071, + 201123355123, + 201123386341, + 201123606787, + 201123850040, + 201124166622, + 201124215002, + 201124355455, + 201124484309, + 201124525303, + 201124535519, + 201124554413, + 201124585917, + 201124868717, + 201124939986, + 201125111045, + 201125308780, + 201125388876, + 201125811384, + 201125869973, + 201126002027, + 201126047174, + 201126255847, + 201126312269, + 201126442254, + 201126625122, + 201126636750, + 201126659891, + 201126669098, + 201126946975, + 201127000498, + 201127009293, + 201127010150, + 201127029020, + 201127040489, + 201127068159, + 201127100040, + 201127233460, + 201127301093, + 201127315881, + 201128008500, + 201128144862, + 201128293924, + 201128316869, + 201128399780, + 201128482002, + 201128652929, + 201128716058, + 201128852395, + 201128872000, + 201128932455, + 201129157079, + 201129158922, + 201129706750, + 201129808001, + 201140276818, + 201140490935, + 201140823736, + 201140826987, + 201141094583, + 201141191135, + 201141231122, + 201141307507, + 201141385551, + 201141438922, + 201141473992, + 201141549347, + 201141573088, + 201141614543, + 201141675135, + 201141679102, + 201141679162, + 201141696200, + 201141724381, + 201141761526, + 201141822739, + 201141941402, + 201142001090, + 201142088851, + 201142136063, + 201142224902, + 201142381399, + 201142394076, + 201142461102, + 201142492474, + 201142783738, + 201142877782, + 201142889397, + 201142985578, + 201143123876, + 201143283485, + 201143335405, + 201143490888, + 201143631229, + 201143730080, + 201143791394, + 201143915554, + 201144038991, + 201144129961, + 201144175633, + 201144224787, + 201144294246, + 201144338541, + 201144352678, + 201144601683, + 201144626239, + 201144707747, + 201145000373, + 201145579943, + 201145611618, + 201145621795, + 201145809497, + 201145814704, + 201145828830, + 201145922310, + 201146055558, + 201146207812, + 201146445021, + 201146448910, + 201146461695, + 201146628267, + 201146791090, + 201147155402, + 201147181768, + 201147333047, + 201147429209, + 201147504941, + 201147769989, + 201147912222, + 201147965344, + 201148073829, + 201148140582, + 201148163794, + 201148283337, + 201148460674, + 201148504650, + 201148581664, + 201148656049, + 201149228245, + 201149363795, + 201149492463, + 201149518708, + 201150259592, + 201150300052, + 201150304075, + 201150343503, + 201150352022, + 201150451768, + 201150516739, + 201150533289, + 201150548146, + 201150647985, + 201150650378, + 201150793312, + 201150872150, + 201150921271, + 201151296487, + 201151458889, + 201151510446, + 201151593953, + 201151616245, + 201151845956, + 201151869870, + 201152054617, + 201152154482, + 201152184337, + 201152228476, + 201152336491, + 201152636067, + 201152851954, + 201152994061, + 201153086752, + 201153094925, + 201153260339, + 201153506778, + 201153508619, + 201153590337, + 201154004771, + 201154322032, + 201154404977, + 201154505875, + 201154554795, + 201154558329, + 201154566231, + 201154962800, + 201155018765, + 201155072426, + 201155110000, + 201155215891, + 201155394107, + 201155449375, + 201155465556, + 201155512282, + 201155540425, + 201155581701, + 201155617074, + 201155633622, + 201155705126, + 201155883321, + 201156012567, + 201156265716, + 201156422481, + 201156839185, + 201156894666, + 201156941320, + 201157009020, + 201157055175, + 201157121939, + 201157347771, + 201157566765, + 201157693835, + 201158232008, + 201158313756, + 201158342680, + 201158601956, + 201158680006, + 201158913381, + 201158937603, + 201159109401, + 201159430166, + 201159519690, + 201159555233, + 201159775543, + 201200008264, + 201200205662, + 201200225120, + 201200240122, + 201200360155, + 201200395648, + 201200520512, + 201200622072, + 201200622129, + 201200678667, + 201200751933, + 201200757011, + 201200811161, + 201200999580, + 201201025700, + 201201155000, + 201201294180, + 201201312691, + 201201383512, + 201201421326, + 201201491025, + 201201621622, + 201201840871, + 201202000888, + 201202211450, + 201202530513, + 201202665435, + 201202912341, + 201203014151, + 201203039750, + 201203181372, + 201203456879, + 201203477332, + 201204023121, + 201204281981, + 201204514017, + 201204688081, + 201204855400, + 201204977751, + 201205000292, + 201205031905, + 201205686247, + 201205759040, + 201206017464, + 201206600861, + 201206975332, + 201207121802, + 201207372344, + 201207616444, + 201207750441, + 201208085263, + 201208414347, + 201208977177, + 201210023938, + 201210583591, + 201210588038, + 201210732122, + 201210818176, + 201210945113, + 201211066299, + 201211079908, + 201211161032, + 201211795422, + 201211986162, + 201212145380, + 201212258721, + 201212479538, + 201220444133, + 201220612822, + 201220724766, + 201220820976, + 201220914219, + 201221041254, + 201221138834, + 201221212426, + 201221212824, + 201221278704, + 201221280828, + 201221328517, + 201221408219, + 201221732389, + 201221800122, + 201221954550, + 201222143516, + 201222278308, + 201222282205, + 201222332047, + 201222517257, + 201222620610, + 201222695023, + 201222748994, + 201222781707, + 201222967787, + 201222971467, + 201223234257, + 201223336884, + 201223376686, + 201223401519, + 201223456731, + 201223521664, + 201223596905, + 201223671633, + 201223705456, + 201223838760, + 201223874421, + 201223940650, + 201224050760, + 201224053907, + 201224213162, + 201224217248, + 201224236042, + 201224353363, + 201224380088, + 201224483706, + 201224508493, + 201224535248, + 201224661061, + 201224752065, + 201224825057, + 201224911013, + 201224927485, + 201224970278, + 201224971527, + 201225001313, + 201225015388, + 201225294141, + 201225301553, + 201225328559, + 201225460762, + 201225570507, + 201225656181, + 201225958509, + 201226262906, + 201226291683, + 201226315730, + 201226416059, + 201226461243, + 201226595175, + 201226655253, + 201226672939, + 201226757626, + 201226782942, + 201226790797, + 201226965492, + 201226994629, + 201227070538, + 201227314954, + 201227757571, + 201227831100, + 201227885100, + 201228030501, + 201228216918, + 201228781347, + 201228922343, + 201228946285, + 201229082850, + 201229123460, + 201229974967, + 201270550493, + 201270565699, + 201270626113, + 201271122314, + 201271132209, + 201271133956, + 201271160173, + 201271401468, + 201272021184, + 201272072854, + 201272336635, + 201272649581, + 201272939093, + 201273024547, + 201273073912, + 201273114754, + 201273170033, + 201273273705, + 201273808399, + 201273888510, + 201273943548, + 201274050210, + 201274206995, + 201274302911, + 201274527249, + 201274768678, + 201274793455, + 201274842863, + 201275200924, + 201275298194, + 201275610030, + 201275624989, + 201275662461, + 201275668382, + 201275901512, + 201276330019, + 201276624302, + 201276766553, + 201277014277, + 201277117926, + 201277131373, + 201277606290, + 201277740069, + 201277773181, + 201277855345, + 201277862323, + 201278119893, + 201278324075, + 201278378190, + 201278539943, + 201278956638, + 201279236054, + 201279296936, + 201279803133, + 201279872337, + 201279920962, + 201280024389, + 201280256821, + 201280433297, + 201280832425, + 201280838169, + 201281011857, + 201281181008, + 201281659132, + 201281802541, + 201281898421, + 201282199565, + 201282427635, + 201283170305, + 201283329751, + 201283991212, + 201284350745, + 201284436627, + 201284601547, + 201285060920, + 201285686701, + 201285980741, + 201286065056, + 201286254841, + 201287277734, + 201287585360, + 201287839817, + 201288006876, + 201288090780, + 201288199133, + 201288326620, + 201288446043, + 201288496608, + 201288863470, + 201289006333, + 201289354010, + 201289488182, + 201289723337, + 201289723730, + 201289920270, + 201500085192, + 201500263335, + 201500567444, + 201500791104, + 201500888614, + 201501355877, + 201501538118, + 201501602948, + 201501877880, + 201503227949, + 201507255344, + 201507416444, + 201508325183, + 201550132936, + 201550707584, + 201550801300, + 201550817512, + 201550861194, + 201550919395, + 201551141835, + 201551233318, + 201551418313, + 201551421493, + 201551465551, + 201551500674, + 201551630844, + 201551980169, + 201553022775, + 201553077785, + 201553222768, + 201553324455, + 201553335619, + 201553540894, + 201553684030, + 201553806016, + 201553996793, + 201554435301, + 201554666842, + 201554752044, + 201555000205, + 201555116452, + 201555181159, + 201555310975, + 201555320344, + 201555402805, + 201555408958, + 201555577228, + 201555583558, + 201555604325, + 201555791055, + 201555888091, + 201555944650, + 201556206194, + 201556754333, + 201557454447, + 201557567007, + 201557770122, + 201558550454, + 201559170967, + 201559975610, + 21142703233 + ]; +} diff --git a/lib/controller/functions/custom_pant.dart b/lib/controller/functions/custom_pant.dart new file mode 100644 index 0000000..8b85ce4 --- /dev/null +++ b/lib/controller/functions/custom_pant.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class LineChartPainter extends CustomPainter { + final List data; + + LineChartPainter(this.data); + + @override + void paint(Canvas canvas, Size size) { + // Calculate the scale factor. + final scaleFactor = size.height / 240; + + // Draw the line chart. + for (var i = 0; i < data.length - 1; i++) { + final x1 = i * size.width / data.length; + final y1 = data[i] * scaleFactor; + final x2 = (i + 1) * size.width / data.length; + final y2 = data[i + 1] * scaleFactor; + + canvas.drawLine(Offset(x1, y1), Offset(x2, y2), Paint()); + } + } + + @override + bool shouldRepaint(LineChartPainter oldDelegate) => false; +} diff --git a/lib/controller/functions/device_info.dart b/lib/controller/functions/device_info.dart new file mode 100644 index 0000000..c0d5c3b --- /dev/null +++ b/lib/controller/functions/device_info.dart @@ -0,0 +1,295 @@ +// import 'dart:io'; + +// import 'package:device_info_plus/device_info_plus.dart'; + +import 'dart:async'; +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'package:device_info_plus/device_info_plus.dart'; +import '../../main.dart'; + +class DeviceHelper { + static Future getDeviceFingerprint() async { + final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + var deviceData; + + try { + if (Platform.isAndroid) { + // Fetch Android-specific device information + AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; + deviceData = androidInfo.toMap(); // Convert to a map for easier access + // Log.print('deviceData: ${jsonEncode(deviceData)}'); + } else if (Platform.isIOS) { + // Fetch iOS-specific device information + IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; + deviceData = iosInfo.toMap(); // Convert to a map for easier access + } else { + throw UnsupportedError('Unsupported platform'); + } + + // Extract relevant device information + final String deviceId = Platform.isAndroid + ? deviceData['androidId'] ?? deviceData['serialNumber'] ?? 'unknown' + : deviceData['identifierForVendor'] ?? 'unknown'; + + final String deviceModel = deviceData['model'] ?? 'unknown'; + final String osVersion = Platform.isAndroid + ? deviceData['version']['release'] ?? 'unknown' + : deviceData['systemVersion'] ?? 'unknown'; + + // Log the extracted information + + // Generate and return the encrypted fingerprint + final String fingerprint = '${deviceId}_${deviceModel}_$osVersion'; + // print(EncryptionHelper.instance.encryptData(fingerprint)); + return (fingerprint); + } catch (e) { + throw Exception('Failed to generate device fingerprint'); + } + } +} + +// class SecurityHelper { +// /// Performs security checks and handles potential risks +// static Future performSecurityChecks() async { +// bool isNotTrust = false; +// bool isJailBroken = false; +// bool isRealDevice = true; +// bool isOnExternalStorage = false; +// bool checkForIssues = false; +// bool isDevMode = false; +// bool isTampered = false; +// String bundleId = ""; + +// try { +// isNotTrust = await JailbreakRootDetection.instance.isNotTrust; +// isJailBroken = await JailbreakRootDetection.instance.isJailBroken; +// isRealDevice = await JailbreakRootDetection.instance.isRealDevice; +// isOnExternalStorage = +// await JailbreakRootDetection.instance.isOnExternalStorage; + +// List issues = +// await JailbreakRootDetection.instance.checkForIssues; +// checkForIssues = issues.isNotEmpty; + +// isDevMode = await JailbreakRootDetection.instance.isDevMode; + +// // Get Bundle ID +// PackageInfo packageInfo = await PackageInfo.fromPlatform(); +// bundleId = packageInfo.packageName; +// if (bundleId.isNotEmpty) { +// // Pass the CORRECT bundle ID to isTampered +// isTampered = await JailbreakRootDetection.instance.isTampered(bundleId); +// } +// } catch (e) { +// debugPrint("Error during security checks: $e"); +// // Consider handling specific exceptions, not just general errors. +// } + +// // Save values to storage (using GetStorage) +// await box.write('isNotTrust', isNotTrust); // Use await for write operations +// await box.write('isTampered', isTampered); // Use await +// await box.write('isJailBroken', isJailBroken); // Use await + +// // debugPrint("Security Check Results:"); +// // debugPrint("isNotTrust: $isNotTrust"); +// // debugPrint("isJailBroken: $isJailBroken"); +// // debugPrint("isRealDevice: $isRealDevice"); +// // debugPrint("isOnExternalStorage: $isOnExternalStorage"); +// // debugPrint("checkForIssues: $checkForIssues"); +// // debugPrint("isDevMode: $isDevMode"); +// // debugPrint("isTampered: $isTampered"); +// // debugPrint("Bundle ID: $bundleId"); // Print the bundle ID + +// // Check for security risks and potentially show a warning +// if (isJailBroken || isRealDevice == false || isTampered) { +// // print("security_warning".tr); //using easy_localization +// // Use a more robust approach to show a warning, like a dialog: +// _showSecurityWarning(); +// } +// } + +// /// Deletes all app data +// static Future clearAllData() async { +// //await storage.deleteAll(); // What's 'storage'? Be specific. Likely GetStorage as well. +// await box.erase(); // Clear GetStorage data +// exit(0); // This will terminate the app. Be VERY careful with this. +// } + +// // static void _showSecurityWarning() { +// // // Show a dialog, navigate to an error screen, etc. +// // // Example using Get.dialog (if you use GetX): +// // +// // Get.dialog( +// // AlertDialog( +// // title: Text("Security Warning".tr), // Or use localized string +// // content: Text( +// // "Potential security risks detected. The application may not function correctly." +// // .tr), //Or use localized string +// // actions: [ +// // TextButton( +// // onPressed: () async { +// // await storage.deleteAll(); +// // await box.erase(); +// // Get.back(); // Close the dialog +// // // Or, if you really must, exit the app (but give the user a chance!) +// // exit(0); +// // }, +// // child: Text("OK"), // Or use a localized string +// // ), +// // ], +// // ), +// // barrierDismissible: false, // Prevent closing by tapping outside +// // ); +// // } +// static void _showSecurityWarning() { +// // Use an RxInt to track the remaining seconds. This is the KEY! +// RxInt secondsRemaining = 10.obs; + +// Get.dialog( +// CupertinoAlertDialog( +// title: Text("Security Warning".tr), +// content: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// Obx(() => Text( +// "Potential security risks detected. The application will close in @seconds seconds." +// .trParams({ +// // Use trParams for placeholders +// 'seconds': secondsRemaining.value.toString(), +// }), +// // Wrap the Text widget in Obx +// )), +// SizedBox(height: 24), // More spacing before the progress bar +// Obx(() => SizedBox( +// width: double.infinity, // Make progress bar full width +// child: CupertinoActivityIndicator( +// // in case of loading +// radius: 15, +// animating: true, +// ))), +// SizedBox(height: 8), +// Obx(() => ClipRRect( +// borderRadius: BorderRadius.circular(8), // Rounded corners +// child: LinearProgressIndicator( +// value: secondsRemaining.value / 10, +// backgroundColor: Colors.grey.shade300, // Lighter background +// valueColor: AlwaysStoppedAnimation( +// CupertinoColors.systemRed), // iOS-style red +// minHeight: 8, // Slightly thicker progress bar +// ), +// )), +// ], +// ), +// ), +// barrierDismissible: false, +// ); + +// Timer.periodic(Duration(seconds: 1), (timer) { +// secondsRemaining.value--; +// if (secondsRemaining.value <= 0) { +// timer.cancel(); +// // Get.back(); +// _clearDataAndExit(); +// } +// }); +// } + +// static Future _clearDataAndExit() async { +// await storage.deleteAll(); +// await box.erase(); +// exit(0); // Exit the app +// print('exit'); +// } +// } + +// class DeviceInfoPlus { +// static List> deviceDataList = []; + +// static Future>> getDeviceInfo() async { +// final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + +// try { +// if (Platform.isAndroid) { +// AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; +// Map deviceData = { +// 'platform': 'Android', +// 'brand': androidInfo.brand, +// 'model': androidInfo.model, +// 'androidId': androidInfo.device, +// 'versionRelease': androidInfo.version.release, +// 'sdkVersion': androidInfo.version.sdkInt, +// 'manufacturer': androidInfo.manufacturer, +// 'isPhysicalDevice': androidInfo.isPhysicalDevice, +// 'serialNumber': androidInfo.serialNumber, +// 'fingerprint': androidInfo.fingerprint, +// 'type': androidInfo.type, +// 'data': androidInfo.data, +// 'version': androidInfo.version, +// 'tags': androidInfo.tags, +// 'display': androidInfo.display, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isIOS) { +// IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; +// Map deviceData = { +// 'brand': 'Apple', +// 'model': iosInfo.model, +// 'systemName': iosInfo.systemName, +// 'systemVersion': iosInfo.systemVersion, +// 'utsname': iosInfo.utsname, +// 'isPhysicalDevice': iosInfo.isPhysicalDevice, +// 'identifierForVendor': iosInfo.identifierForVendor, +// 'name': iosInfo.name, +// 'localizedModel': iosInfo.localizedModel, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isMacOS) { +// MacOsDeviceInfo macInfo = await deviceInfoPlugin.macOsInfo; +// Map deviceData = { +// 'platform': 'macOS', +// 'model': macInfo.model, +// 'version': macInfo.systemGUID, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isWindows) { +// WindowsDeviceInfo windowsInfo = await deviceInfoPlugin.windowsInfo; +// Map deviceData = { +// 'platform': 'Windows', +// 'manufacturer': windowsInfo.computerName, +// 'version': windowsInfo.majorVersion, +// 'deviceId': windowsInfo.deviceId, +// 'userName': windowsInfo.userName, +// 'productName': windowsInfo.productName, +// 'installDate': windowsInfo.installDate, +// 'productId': windowsInfo.productId, +// 'numberOfCores': windowsInfo.numberOfCores, +// 'systemMemoryInMegabytes': windowsInfo.systemMemoryInMegabytes, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isLinux) { +// LinuxDeviceInfo linuxInfo = await deviceInfoPlugin.linuxInfo; +// Map deviceData = { +// 'platform': 'Linux', +// 'manufacturer': linuxInfo.name, +// 'version': linuxInfo.version, +// }; +// deviceDataList.add(deviceData); +// } +// } catch (e) { +// } + +// return deviceDataList; +// } + +// // Method to print all device data +// static void printDeviceInfo() { +// for (Map deviceData in deviceDataList) { +// 'Version: ${deviceData['version'] ?? deviceData['versionRelease'] ?? 'N/A'}'); +// } +// } +// } diff --git a/lib/controller/functions/digit_obsecur_formate.dart b/lib/controller/functions/digit_obsecur_formate.dart new file mode 100644 index 0000000..b5972e4 --- /dev/null +++ b/lib/controller/functions/digit_obsecur_formate.dart @@ -0,0 +1,42 @@ +import 'package:flutter/services.dart'; + +class DigitObscuringFormatter extends TextInputFormatter { + @override + TextEditingValue formatEditUpdate( + TextEditingValue oldValue, TextEditingValue newValue) { + final maskedText = maskDigits(newValue.text); + return newValue.copyWith( + text: maskedText, + selection: updateCursorPosition(maskedText, newValue.selection)); + } + + String maskDigits(String text) { + final totalDigits = text.length; + final visibleDigits = 4; + final hiddenDigits = totalDigits - visibleDigits * 2; + + final firstVisibleDigits = text.substring(0, visibleDigits); + final lastVisibleDigits = text.substring(totalDigits - visibleDigits); + + final maskedDigits = List.filled(hiddenDigits, '*').join(); + + return '$firstVisibleDigits$maskedDigits$lastVisibleDigits'; + } + + TextSelection updateCursorPosition( + String maskedText, TextSelection currentSelection) { + final cursorPosition = currentSelection.baseOffset; + final cursorOffset = + currentSelection.extentOffset - currentSelection.baseOffset; + final totalDigits = maskedText.length; + const visibleDigits = 4; + final hiddenDigits = totalDigits - visibleDigits * 2; + + final updatedPosition = cursorPosition <= visibleDigits + ? cursorPosition + : hiddenDigits + visibleDigits + (cursorPosition - visibleDigits); + + return TextSelection.collapsed( + offset: updatedPosition, affinity: currentSelection.affinity); + } +} diff --git a/lib/controller/functions/document_scanner.dart b/lib/controller/functions/document_scanner.dart new file mode 100644 index 0000000..198992c --- /dev/null +++ b/lib/controller/functions/document_scanner.dart @@ -0,0 +1,41 @@ +// import 'dart:io'; +// +// import 'package:get/get.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:google_ml_kit/google_ml_kit.dart'; +// +// class ImagePickerController extends GetxController { +// RxBool textScanning = false.obs; +// RxString scannedText = ''.obs; +// +// Future getImage(ImageSource source) async { +// try { +// final pickedImage = await ImagePicker().pickImage(source: source); +// if (pickedImage != null) { +// textScanning.value = true; +// final imageFile = File(pickedImage.path); +// getRecognisedText(imageFile); +// } +// } catch (e) { +// textScanning.value = false; +// scannedText.value = "Error occurred while scanning"; +// } +// } +// +// Future getRecognisedText(File image) async { +// final inputImage = InputImage.fromFilePath(image.path); +// final textDetector = GoogleMlKit.vision.textRecognizer(); +// final RecognizedText recognisedText = +// await textDetector.processImage(inputImage); +// await textDetector.close(); +// +// scannedText.value = ''; +// for (TextBlock block in recognisedText.blocks) { +// for (TextLine line in block.lines) { +// scannedText.value += line.text + '\n'; +// } +// } +// +// textScanning.value = false; +// } +// } diff --git a/lib/controller/functions/encrypt_decrypt.dart b/lib/controller/functions/encrypt_decrypt.dart new file mode 100644 index 0000000..6f62f1b --- /dev/null +++ b/lib/controller/functions/encrypt_decrypt.dart @@ -0,0 +1,79 @@ +import 'package:encrypt/encrypt.dart' as encrypt; +import 'package:flutter/foundation.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/char_map.dart'; +import '../../env/env.dart'; +import '../../main.dart'; +import '../../print.dart'; + +class EncryptionHelper { + static EncryptionHelper? _instance; + + late final encrypt.Key key; + late final encrypt.IV iv; + + EncryptionHelper._(this.key, this.iv); + static EncryptionHelper get instance { + if (_instance == null) { + throw Exception( + "EncryptionHelper is not initialized. Call `await EncryptionHelper.initialize()` in main."); + } + return _instance!; + } + + /// Initializes and stores the instance globally + static Future initialize() async { + if (_instance != null) { + debugPrint("EncryptionHelper is already initialized."); + return; // Prevent re-initialization + } + debugPrint("Initializing EncryptionHelper..."); + var keyOfApp = r(Env.keyOfApp).toString().split(Env.addd)[0]; + Log.print('keyOfApp: ${keyOfApp}'); + var initializationVector = + r(Env.initializationVector).toString().split(Env.addd)[0]; + Log.print('initializationVector: ${initializationVector}'); + + // Set the global instance + _instance = EncryptionHelper._( + encrypt.Key.fromUtf8(keyOfApp), + encrypt.IV.fromUtf8(initializationVector), + ); + debugPrint("EncryptionHelper initialized successfully."); + } + + /// Encrypts a string + String encryptData(String plainText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypter.encrypt(plainText, iv: iv); + return encrypted.base64; + } catch (e) { + debugPrint('Encryption Error: $e'); + return ''; + } + } + + /// Decrypts a string + String decryptData(String encryptedText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypt.Encrypted.fromBase64(encryptedText); + return encrypter.decrypt(encrypted, iv: iv); + } catch (e) { + debugPrint('Decryption Error: $e'); + return ''; + } + } +} + +r(String string) { + return X.r(X.r(X.r(string, cn), cC), cs).toString(); +} + +c(String string) { + return X.c(X.c(X.c(string, cn), cC), cs).toString(); +} diff --git a/lib/controller/functions/gemeni.dart b/lib/controller/functions/gemeni.dart new file mode 100644 index 0000000..14bca12 --- /dev/null +++ b/lib/controller/functions/gemeni.dart @@ -0,0 +1,829 @@ +// import 'dart:convert'; +// import 'dart:io'; +// import 'package:get/get.dart'; +// import 'package:image_cropper/image_cropper.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:http/http.dart' as http; +// import 'package:image/image.dart' as img; +// import 'package:path_provider/path_provider.dart'; + +// import '../../constant/api_key.dart'; +// import '../../constant/colors.dart'; + +// class AI extends GetxController { +// final picker = ImagePicker(); +// Map responseMap = {}; +// Map responseCarLicenseMap = {}; +// Map responseBackCarLicenseMap = {}; +// Map responseIdCardeMap = {}; +// bool isloading = false; +// var image; +// CroppedFile? croppedFile; +// DateTime now = DateTime.now(); +// Future pickImage() async { +// final pickedImage = await picker.pickImage(source: ImageSource.gallery); + +// if (pickedImage != null) { +// image = File(pickedImage.path); +// // Crop the image +// croppedFile = await ImageCropper().cropImage( +// sourcePath: image!.path, +// aspectRatioPresets: [ +// CropAspectRatioPreset.square, +// CropAspectRatioPreset.ratio3x2, +// CropAspectRatioPreset.original, +// CropAspectRatioPreset.ratio4x3, +// CropAspectRatioPreset.ratio16x9 +// ], +// uiSettings: [ +// AndroidUiSettings( +// toolbarTitle: 'Cropper'.tr, +// toolbarColor: AppColor.blueColor, +// toolbarWidgetColor: AppColor.yellowColor, +// initAspectRatio: CropAspectRatioPreset.original, +// lockAspectRatio: false), +// IOSUiSettings( +// title: 'Cropper'.tr, +// ), +// ], +// ); +// // image = croppedFile; + +// // Resize the image +// final rawImage = +// img.decodeImage(File(croppedFile!.path).readAsBytesSync()); +// final resizedImage = +// img.copyResize(rawImage!, width: 800); // Adjust the width as needed + +// final appDir = await getTemporaryDirectory(); +// final resizedImagePath = '${appDir.path}/resized_image.jpg'; + +// final resizedImageFile = File(resizedImagePath); +// resizedImageFile.writeAsBytesSync( +// img.encodeJpg(resizedImage)); // Save the resized image as JPEG + +// image = resizedImageFile; +// update(); +// } +// } + +// Future generateContent() async { +// await pickImage(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json for all data as first name ,last name,dob,licenseID,expiration date,issued date asdress class type ,output json type', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future geminiAiExtraction(String prompt, payload) async { +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// // { +// // 'inlineData': { +// // 'mimeType': 'image/jpeg', +// // 'data': imageData, +// // }, +// // }, +// { +// 'text': +// "Extract the desired information from the following passage as json decoded like $prompt .and look for this instruction first name in line 3or 2 ,fullname in line 4 from it written left to right but you modify it rtl,address in line 5 it written left to right but you modify it rtl and 6,dob,nationalid in the last line as just in this:\n\n$payload" +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safety_settings': [ +// {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, +// {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, +// { +// "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", +// "threshold": "BLOCK_NONE" +// }, +// { +// "category": "HARM_CATEGORY_DANGEROUS_CONTENT", +// "threshold": "BLOCK_NONE" +// }, +// ] +// }); + +// final response = await http.post( +// Uri.parse( +// // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=AIzaSyCyoLcSkDzK5_SMe00nhut56SSXWPR074w'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } + +// Future getDriverLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json for all data as first name ,last name,dob,id ,expiration date,issued date asdress class type,age in years ,output json type in arabic value and stay engish key and make date format like YYYY-MM-DD , for name please extract name in arabic in Name in json plus first_name ', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getCarLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the Jordanian ID card: +// Name +// National ID number +// Gender +// Date of birth +// Output the extracted information in the following JSON format''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// // 'https://${API_ENDPOINT}/v1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/publishers/google/models/${MODEL_ID}:streamGenerateContent'), +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future jordanID() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the Jordanian ID card: +// Name +// National ID number +// Gender +// Date of birth +// Output the extracted information in the following JSON format''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future carLicenseJordan() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the car license card in Jordan: + +// * name +// * Address +// * Vehicle type +// * car_kind +// * car_color +// * Vehicle category +// * car_year +// * car_plate +// * Registration type +// * Usage type +// * expire_date_of_license + +// Output the extracted information in the following JSON formate and make date format like YYYY-MM-DD''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getTextFromCard(String prompt) async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': prompt, +// }, +// ], +// }, +// ], +// 'generationConfig': { +// "temperature": 1, +// "topK": 32, +// "topP": 0.1, +// "maxOutputTokens": 4096, +// "stopSequences": [] +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseBackCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future generateBackCarLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json output from extracting car license back face for these key ,vin,fuelType,passengerType,curbWeight,insuranceCompany,policyNumber,notes,insuranceType and output it json .dont add data else this image', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 343, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseBackCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getFromCarRegistration() async { +// await pickImage(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write output json from image for[ vin, make, model, year, expiration_date, color, owner, registration_date ],output json type ', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// @override +// void onInit() { +// // generateContent(); +// super.onInit(); +// } +// } diff --git a/lib/controller/functions/launch.dart b/lib/controller/functions/launch.dart new file mode 100644 index 0000000..72fc360 --- /dev/null +++ b/lib/controller/functions/launch.dart @@ -0,0 +1,71 @@ +import 'package:url_launcher/url_launcher.dart'; +import 'dart:io'; + +void showInBrowser(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} + +Future makePhoneCall(String phoneNumber) async { + final Uri launchUri = Uri( + scheme: 'tel', + path: phoneNumber, + ); + await launchUrl(launchUri); +} + +void launchCommunication( + String method, String contactInfo, String message) async { + String url; + + if (Platform.isIOS) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + + case 'sms': + url = 'sms:$contactInfo?body=$message'; + break; + + case 'whatsapp': + url = 'https://api.whatsapp.com/send?phone=$contactInfo&text=$message'; + break; + + case 'email': + url = 'mailto:$contactInfo?subject=Subject&body=$message'; + break; + + default: + return; + } + } else if (Platform.isAndroid) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + + case 'sms': + url = 'sms:$contactInfo?body=$message'; + break; + + case 'whatsapp': + url = 'whatsapp://send?phone=$contactInfo&text=$message'; + break; + + case 'email': + url = 'mailto:$contactInfo?subject=Subject&body=$message'; + break; + + default: + return; + } + } else { + return; + } + + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} diff --git a/lib/controller/functions/llama_ai.dart b/lib/controller/functions/llama_ai.dart new file mode 100644 index 0000000..60e8c33 --- /dev/null +++ b/lib/controller/functions/llama_ai.dart @@ -0,0 +1,36 @@ +import 'dart:convert'; + +import '../../constant/links.dart'; +import 'crud.dart'; + +class LlamaAi { + Future getCarRegistrationData(String input, prompt) async { + Map exrtatDataFinal = {}; + String oneLine = input.replaceAll('\n', ' '); + // var res = await CRUD().getLlama(link: AppLink.gemini, payload: oneLine); + var res = await CRUD() + .getLlama(link: AppLink.llama, payload: oneLine, prompt: prompt); + + var decod = jsonDecode(res.toString()); + // exrtatDataFinal = jsonDecode(extractDataFromJsonString(decod['choices'])); + extractDataFromJsonString(decod['choices'][0]['message']['content']); + return exrtatDataFinal; + } + + String extractDataFromJsonString(String jsonString) { + // Remove any leading or trailing whitespace from the string + jsonString = jsonString.trim(); + + // Extract the JSON substring from the given string + final startIndex = jsonString.indexOf('{'); + final endIndex = jsonString.lastIndexOf('}'); + final jsonSubstring = jsonString.substring(startIndex, endIndex + 1); + + // Parse the JSON substring into a Map + final jsonData = jsonDecode(jsonSubstring); + + // Return the extracted data + + return jsonEncode(jsonData); + } +} diff --git a/lib/controller/functions/location_controller.dart b/lib/controller/functions/location_controller.dart new file mode 100644 index 0000000..35a57e7 --- /dev/null +++ b/lib/controller/functions/location_controller.dart @@ -0,0 +1,133 @@ +// import 'dart:async'; + +// import 'package:get/get.dart'; +// import 'package:google_maps_flutter/google_maps_flutter.dart'; +// import 'package:location/location.dart'; + +// import '../../constant/box_name.dart'; +// import '../../constant/links.dart'; +// import '../../main.dart'; +// import 'crud.dart'; + +// // LocationController.dart +// class LocationController extends GetxController { +// LocationData? _currentLocation; +// late Location location; +// bool isLoading = false; +// late double heading = 0; +// late double accuracy = 0; +// late double previousTime = 0; +// late double latitude; +// late double totalDistance = 0; +// late double longitude; +// late DateTime time; +// late double speed = 0; +// late double speedAccuracy = 0; +// late double headingAccuracy = 0; +// bool isActive = false; +// late LatLng myLocation; +// String totalPoints = '0'; +// LocationData? get currentLocation => _currentLocation; +// Timer? _locationTimer; + +// @override +// void onInit() async { +// super.onInit(); +// location = Location(); +// getLocation(); +// // startLocationUpdates(); +// } + +// Future startLocationUpdates() async { +// if (box.read(BoxName.driverID) != null) { +// _locationTimer = +// Timer.periodic(const Duration(seconds: 5), (timer) async { +// try { +// // if (isActive) { +// if (double.parse(totalPoints) > -300) { + +// await getLocation(); + +// // if (box.read(BoxName.driverID) != null) { +// await CRUD() +// .post(link: AppLink.addCarsLocationByPassenger, payload: { +// 'driver_id': box.read(BoxName.driverID).toString(), +// 'latitude': myLocation.latitude.toString(), +// 'longitude': myLocation.longitude.toString(), +// 'heading': heading.toString(), +// 'speed': (speed * 3.6).toStringAsFixed(1), +// 'distance': totalDistance == 0 +// ? '0' +// : totalDistance < 1 +// ? totalDistance.toStringAsFixed(3) +// : totalDistance.toStringAsFixed(1), +// 'status': box.read(BoxName.statusDriverLocation).toString() +// }); +// } +// } catch (e) { +// // Handle the error gracefully +// } +// }); +// } +// } + +// void stopLocationUpdates() { +// _locationTimer?.cancel(); +// } + +// Future getLocation() async { +// // isLoading = true; +// // update(); +// bool serviceEnabled; +// PermissionStatus permissionGranted; + +// // Check if location services are enabled +// serviceEnabled = await location.serviceEnabled(); +// if (!serviceEnabled) { +// serviceEnabled = await location.requestService(); +// if (!serviceEnabled) { +// // Location services are still not enabled, handle the error +// return; +// } +// } + +// // Check if the app has permission to access location +// permissionGranted = await location.hasPermission(); +// if (permissionGranted == PermissionStatus.denied) { +// permissionGranted = await location.requestPermission(); +// if (permissionGranted != PermissionStatus.granted) { +// // Location permission is still not granted, handle the error +// return; +// } +// } + +// // Configure location accuracy +// // LocationAccuracy desiredAccuracy = LocationAccuracy.high; + +// // Get the current location +// LocationData _locationData = await location.getLocation(); +// myLocation = +// (_locationData.latitude != null && _locationData.longitude != null +// ? LatLng(_locationData.latitude!, _locationData.longitude!) +// : null)!; +// speed = _locationData.speed!; +// heading = _locationData.heading!; + +// // isLoading = false; +// update(); +// } + +// double calculateDistanceInKmPerHour( +// double? startTime, double? endTime, double speedInMetersPerSecond) { +// // Calculate the time difference in hours +// double timeDifferenceInHours = (endTime! - startTime!) / 1000 / 3600; + +// // Convert speed to kilometers per hour +// double speedInKmPerHour = speedInMetersPerSecond * 3.6; + +// // Calculate the distance in kilometers +// double distanceInKilometers = speedInKmPerHour * timeDifferenceInHours; + +// return distanceInKilometers; +// } +// } diff --git a/lib/controller/functions/location_permission.dart b/lib/controller/functions/location_permission.dart new file mode 100644 index 0000000..4c7b37d --- /dev/null +++ b/lib/controller/functions/location_permission.dart @@ -0,0 +1,16 @@ +// import 'package:location/location.dart'; +// import 'package:get/get.dart'; + +// class LocationPermissions { +// late Location location; + +// Future locationPermissions() async { +// location = Location(); +// var permissionStatus = await location.requestPermission(); +// if (permissionStatus == PermissionStatus.denied) { +// // The user denied the location permission. +// Get.defaultDialog(title: 'GPS Required Allow !.'.tr, middleText: ''); +// return null; +// } +// } +// } diff --git a/lib/controller/functions/log_out.dart b/lib/controller/functions/log_out.dart new file mode 100644 index 0000000..3143884 --- /dev/null +++ b/lib/controller/functions/log_out.dart @@ -0,0 +1,181 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../views/widgets/elevated_btn.dart'; +import '../../views/widgets/my_textField.dart'; +import 'crud.dart'; + +class LogOutController extends GetxController { + TextEditingController checkTxtController = TextEditingController(); + final formKey = GlobalKey(); + final formKey1 = GlobalKey(); + final emailTextController = TextEditingController(); + + Future deleteMyAccountDriver(String id) async { + await CRUD().post(link: AppLink.removeUser, payload: {'id': id}).then( + (value) => Get.snackbar('Deleted'.tr, 'Your Account is Deleted', + backgroundColor: AppColor.redColor)); + } + + checkBeforeDelete() async { + var res = await CRUD().post( + link: AppLink.deletecaptainAccounr, + payload: {'id': box.read(BoxName.driverID)}).then((value) => exit(0)); + } + + deletecaptainAccount() { + Get.defaultDialog( + backgroundColor: AppColor.yellowColor, + title: 'Are you sure to delete your account?'.tr, + middleText: + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month ', + titleStyle: AppStyle.title, + content: Column( + children: [ + Container( + width: Get.width, + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month' + .tr, + style: AppStyle.title.copyWith(color: AppColor.redColor), + ), + ), + ), + const SizedBox( + height: 20, + ), + Form( + key: formKey, + child: SizedBox( + width: Get.width, + child: MyTextForm( + controller: checkTxtController, + label: 'Enter Your First Name'.tr, + hint: 'Enter Your First Name'.tr, + type: TextInputType.name, + ), + )) + ], + ), + confirm: MyElevatedButton( + title: 'Delete'.tr, + onPressed: () { + if (checkTxtController.text == box.read(BoxName.nameDriver)) { + deletecaptainAccount(); + } + })); + } + + Future logOutPassenger() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () { + // box.remove(BoxName.agreeTerms); + box.remove(BoxName.driverID); + box.remove(BoxName.email); + box.remove(BoxName.lang); + box.remove(BoxName.name); + box.remove(BoxName.passengerID); + box.remove(BoxName.phone); + box.remove(BoxName.tokenFCM); + box.remove(BoxName.tokens); + box.remove(BoxName.addHome); + box.remove(BoxName.addWork); + box.remove(BoxName.agreeTerms); + box.remove(BoxName.apiKeyRun); + box.remove(BoxName.countryCode); + box.remove(BoxName.accountIdStripeConnect); + box.remove(BoxName.passengerWalletTotal); + Get.offAll(const MainApp()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + Future logOutCaptain() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + titleStyle: AppStyle.title, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () { + // box.remove(BoxName.agreeTerms); + box.remove(BoxName.driverID); + box.remove(BoxName.sexDriver); + box.remove(BoxName.dobDriver); + box.remove(BoxName.nameDriver); + box.remove(BoxName.emailDriver); + box.remove(BoxName.phoneDriver); + box.remove(BoxName.statusDriverLocation); + box.remove(BoxName.cvvCodeDriver); + box.remove(BoxName.lastNameDriver); + box.remove(BoxName.passwordDriver); + box.remove(BoxName.cardNumberDriver); + box.remove(BoxName.expiryDateDriver); + box.remove(BoxName.cardHolderNameDriver); + box.remove(BoxName.vin); + box.remove(BoxName.make); + box.remove(BoxName.year); + box.remove(BoxName.owner); + box.remove(BoxName.onBoarding); + box.remove(BoxName.agreeTerms); + Get.offAll(const MainApp()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + deletePassengerAccount() async { + if (formKey1.currentState!.validate()) { + if (box.read(BoxName.email).toString() == emailTextController.text) { + await CRUD().post(link: AppLink.passengerRemovedAccountEmail, payload: { + 'email': box.read(BoxName.email), + }); + } else { + Get.snackbar('Email Wrong'.tr, 'Email you inserted is Wrong.'.tr, + snackPosition: SnackPosition.BOTTOM, + backgroundColor: AppColor.redColor); + } + } + } +} diff --git a/lib/controller/functions/scan_id_card.dart b/lib/controller/functions/scan_id_card.dart new file mode 100644 index 0000000..b0e6336 --- /dev/null +++ b/lib/controller/functions/scan_id_card.dart @@ -0,0 +1,25 @@ +// import 'package:credit_card_scanner/credit_card_scanner.dart'; +// import 'package:get/get.dart'; +// +// class ScanIdCard extends GetxController { +// CardDetails? _cardDetails; +// CardScanOptions scanOptions = const CardScanOptions( +// scanCardHolderName: true, +// enableDebugLogs: true, +// validCardsToScanBeforeFinishingScan: 5, +// possibleCardHolderNamePositions: [ +// CardHolderNameScanPosition.aboveCardNumber, +// ], +// ); +// +// Future scanCard() async { +// final CardDetails? cardDetails = +// await CardScanner.scanCard(scanOptions: scanOptions); +// if (cardDetails == null) { +// return; +// } +// +// _cardDetails = cardDetails; +// update(); +// } +// } diff --git a/lib/controller/functions/secure_storage.dart b/lib/controller/functions/secure_storage.dart new file mode 100644 index 0000000..364dced --- /dev/null +++ b/lib/controller/functions/secure_storage.dart @@ -0,0 +1,14 @@ +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class SecureStorage { + final FlutterSecureStorage _storage = const FlutterSecureStorage(); + + void saveData(String key, value) async { + await _storage.write(key: key, value: value); + } + + Future readData(String boxName) async { + final String? value = await _storage.read(key: boxName); + return value; + } +} diff --git a/lib/controller/functions/security_checks.dart b/lib/controller/functions/security_checks.dart new file mode 100755 index 0000000..1835dfa --- /dev/null +++ b/lib/controller/functions/security_checks.dart @@ -0,0 +1,50 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +class SecurityChecks { + static const platform = MethodChannel( + 'com.intaleq.intaleq_admin/security'); // Choose a unique channel name + + static Future isDeviceCompromised() async { + try { + final bool result = await platform + .invokeMethod('isNativeRooted'); // Invoke the native method + return result; + } on PlatformException catch (e) { + print("Failed to check security status: ${e.message}"); + return true; // Treat platform errors as a compromised device (for safety) + } + } + + static isDeviceRootedFromNative(BuildContext context) async { + bool compromised = await isDeviceCompromised(); + if (compromised) { + showDialog( + barrierDismissible: false, + context: context, + builder: (context) => AlertDialog( + title: Text("Security Warning".tr), + content: Text( + "Your device appears to be compromised. The app will now close." + .tr), + actions: [ + TextButton( + onPressed: () { + SystemNavigator.pop(); // Close the app + }, + child: Text("OK"), + ), + ], + ), + ); + } else { + // Continue with normal app flow + print("Device is secure."); + } + } +} diff --git a/lib/controller/functions/upload_image copy.dart b/lib/controller/functions/upload_image copy.dart new file mode 100644 index 0000000..02596ec --- /dev/null +++ b/lib/controller/functions/upload_image copy.dart @@ -0,0 +1,446 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter_image_compress/flutter_image_compress.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:path/path.dart'; +import 'package:image/image.dart' as img; + +import 'package:path_provider/path_provider.dart' as path_provider; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../main.dart'; +import '../../print.dart'; + +class ImageController extends GetxController { + File? myImage; + bool isloading = false; + CroppedFile? croppedFile; + final picker = ImagePicker(); + var image; + + Future detectAndCropDocument(File imageFile) async { + img.Image? image = img.decodeImage(await imageFile.readAsBytes()); + if (image == null) throw Exception('Unable to decode image'); + + int left = image.width, top = image.height, right = 0, bottom = 0; + + // Threshold for considering a pixel as part of the document (adjust as needed) + const int threshold = 240; + + for (int y = 0; y < image.height; y++) { + for (int x = 0; x < image.width; x++) { + final pixel = image.getPixel(x, y); + final luminance = img.getLuminance(pixel); + + if (luminance < threshold) { + left = x < left ? x : left; + top = y < top ? y : top; + right = x > right ? x : right; + bottom = y > bottom ? y : bottom; + } + } + } + + // Add a small padding + left = (left - 5).clamp(0, image.width); + top = (top - 5).clamp(0, image.height); + right = (right + 5).clamp(0, image.width); + bottom = (bottom + 5).clamp(0, image.height); + + return img.copyCrop(image, + x: left, y: top, width: right - left, height: bottom - top); + } + + Future rotateImageIfNeeded(File imageFile) async { + img.Image croppedDoc = await detectAndCropDocument(imageFile); + + // Check if the document is in portrait orientation + bool isPortrait = croppedDoc.height > croppedDoc.width; + + img.Image processedImage; + if (isPortrait) { + // Rotate the image by 90 degrees clockwise + processedImage = img.copyRotate(croppedDoc, angle: 90); + } else { + processedImage = croppedDoc; + } + + // Get temporary directory + final tempDir = await path_provider.getTemporaryDirectory(); + final tempPath = tempDir.path; + + // Create the processed image file + File processedFile = File('$tempPath/processed_image.jpg'); + await processedFile.writeAsBytes(img.encodeJpg(processedImage)); + + return processedFile; + } + + Future rotateImage(File imageFile) async { + // Read the image file + img.Image? image = img.decodeImage(await imageFile.readAsBytes()); + + if (image == null) return imageFile; + + // Rotate the image by 90 degrees clockwise + img.Image rotatedImage = img.copyRotate(image, angle: 90); + + // Get temporary directory + final tempDir = await path_provider.getTemporaryDirectory(); + final tempPath = tempDir.path; + + // Create the rotated image file + File rotatedFile = File('$tempPath/rotated_image.jpg'); + await rotatedFile.writeAsBytes(img.encodeJpg(rotatedImage)); + + return rotatedFile; + } + + choosImage(String link, String imageType, String id) async { + try { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.rear, + ); + + if (pickedImage == null) return; + + image = File(pickedImage.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + + if (croppedFile == null) return; + + myImage = File(croppedFile!.path); + isloading = true; + update(); + + // Rotate the compressed image + File processedImage = await rotateImageIfNeeded(File(croppedFile!.path)); + File compressedImage = await compressImage(processedImage); + + print('link =$link'); + Log.print('link: ${link}'); + + await uploadImage( + compressedImage, + { + 'driverID': id, + 'imageType': imageType, + }, + link, + ); + } catch (e) { + print('Error in choosImage: $e'); + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.primaryColor); + } finally { + isloading = false; + update(); + } + } + + // choosFaceFromDriverLicense(String link, String imageType) async { + // final pickedImage = await picker.pickImage( + // source: ImageSource.camera, + // preferredCameraDevice: CameraDevice.rear, + // ); + + // if (pickedImage == null) return; + + // image = File(pickedImage.path); + + // File? processedImage; + + // // For face images, use face detection and cropping + // processedImage = await detectAndCropFace(image!); + // if (processedImage == null) { + // Get.snackbar('Face Detection Failed', 'No face detected in the image.'); + // return; + // } + + // isloading = true; + // update(); + + // File compressedImage = await compressImage(processedImage); + + // try { + // await uploadImage( + // compressedImage, + // { + // 'driverID': box.read(BoxName.driverID).toString(), + // 'imageType': imageType + // }, + // link, + // ); + // } catch (e) { + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.redColor); + // } finally { + // isloading = false; + // update(); + // } + // } + + choosFace(String link, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.front, + ); + if (pickedImage != null) { + image = File(pickedImage.path); + isloading = true; + update(); +// Compress the image + File compressedImage = await compressImage(File(pickedImage.path)); + + // Save the picked image directly + // File savedImage = File(pickedImage.path); + print('link =$link'); + try { + await uploadImage( + compressedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType + }, + link, + ); + } catch (e) { + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + } + + uploadImage(File file, Map data, String link) async { + var request = http.MultipartRequest( + 'POST', + Uri.parse(link), + ); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + var multipartFile = http.MultipartFile( + 'image', + stream, + length, + filename: basename(file.path), + ); + request.headers.addAll({ + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}', + }); + // Set the file name to the driverID + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + if (res.statusCode == 200) { + Log.print('jsonDecode(res.body): ${jsonDecode(res.body)}'); + + Get.snackbar('title', 'message', backgroundColor: AppColor.greenColor); + return jsonDecode(res.body); + } else { + throw Exception( + 'Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } + + choosImagePicture(String link, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.gallery, + // preferredCameraDevice: CameraDevice.rear, + // maxHeight: Get.height * .3, + // maxWidth: Get.width * .9, + // imageQuality: 100, + ); + image = File(pickedImage!.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + myImage = File(pickedImage.path); + isloading = true; + update(); +// Save the cropped image + // File savedCroppedImage = File(croppedFile!.path); + File compressedImage = await compressImage(File(croppedFile!.path)); + print('link =$link'); + try { + await uploadImage( + compressedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType + }, + link, + ); + } catch (e) { + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + + uploadImagePicture(File file, Map data, String link) async { + var request = http.MultipartRequest( + 'POST', + Uri.parse(link), //'https://ride.mobile-app.store/uploadImage1.php' + ); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + var multipartFile = http.MultipartFile( + 'image', + stream, + length, + filename: basename(file.path), + ); + request.headers.addAll({ + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}', + }); + // Set the file name to the driverID + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + if (res.statusCode == 200) { + return jsonDecode(res.body); + } else { + throw Exception( + 'Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } +} + +Future compressImage(File file) async { + final dir = await path_provider.getTemporaryDirectory(); + final targetPath = "${dir.absolute.path}/temp.jpg"; + + var result = await FlutterImageCompress.compressAndGetFile( + file.absolute.path, + targetPath, + quality: 70, + minWidth: 1024, + minHeight: 1024, + ); + + return File(result!.path); +} + +// Future detectAndCropFace(File imageFile) async { +// final inputImage = InputImage.fromFilePath(imageFile.path); +// final options = FaceDetectorOptions( +// enableClassification: false, +// enableLandmarks: false, +// enableTracking: false, +// minFaceSize: 0.15, +// performanceMode: FaceDetectorMode.accurate, +// ); +// final faceDetector = FaceDetector(options: options); + +// try { +// final List faces = await faceDetector.processImage(inputImage); +// final image = img.decodeImage(await imageFile.readAsBytes()); + +// if (image == null) throw Exception('Unable to decode image'); + +// int left, top, width, height; + +// if (faces.isNotEmpty) { +// // Face detected, crop around the face +// final face = faces[0]; +// double padding = 0.2; // 20% padding +// int paddingX = (face.boundingBox.width * padding).round(); +// int paddingY = (face.boundingBox.height * padding).round(); + +// left = (face.boundingBox.left - paddingX).round(); +// top = (face.boundingBox.top - paddingY).round(); +// width = (face.boundingBox.width + 2 * paddingX).round(); +// height = (face.boundingBox.height + 2 * paddingY).round(); +// } else { +// // No face detected, crop the center of the image +// int size = min(image.width, image.height); +// left = (image.width - size) ~/ 2; +// top = (image.height - size) ~/ 2; +// width = size; +// height = size; +// } + +// // Ensure dimensions are within image bounds +// left = left.clamp(0, image.width - 1); +// top = top.clamp(0, image.height - 1); +// width = width.clamp(1, image.width - left); +// height = height.clamp(1, image.height - top); + +// final croppedImage = +// img.copyCrop(image, x: left, y: top, width: width, height: height); + +// // Save the cropped image +// final tempDir = await path_provider.getTemporaryDirectory(); +// final tempPath = tempDir.path; +// final croppedFile = File('$tempPath/cropped_image.jpg'); +// await croppedFile.writeAsBytes(img.encodeJpg(croppedImage, quality: 100)); + +// return croppedFile; +// } finally { +// faceDetector.close(); +// } +// } diff --git a/lib/controller/functions/upload_image.dart b/lib/controller/functions/upload_image.dart new file mode 100644 index 0000000..635b3c2 --- /dev/null +++ b/lib/controller/functions/upload_image.dart @@ -0,0 +1,108 @@ +// import 'dart:convert'; +// import 'dart:io'; + +// import 'package:get/get.dart'; +// import 'package:http/http.dart' as http; +// import 'package:image_cropper/image_cropper.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:path/path.dart'; + +// import '../../constant/api_key.dart'; +// import '../../constant/box_name.dart'; +// import '../../constant/colors.dart'; +// import '../../main.dart'; + +// class ImageController extends GetxController { +// File? myImage; +// bool isloading = false; +// CroppedFile? croppedFile; +// final picker = ImagePicker(); +// var image; +// choosImage(String link, String imageType) async { +// final pickedImage = await picker.pickImage(source: ImageSource.gallery); +// image = File(pickedImage!.path); +// croppedFile = await ImageCropper().cropImage( +// sourcePath: image!.path, +// aspectRatioPresets: [ +// CropAspectRatioPreset.square, +// CropAspectRatioPreset.ratio3x2, +// CropAspectRatioPreset.original, +// CropAspectRatioPreset.ratio4x3, +// CropAspectRatioPreset.ratio16x9 +// ], +// uiSettings: [ +// AndroidUiSettings( +// toolbarTitle: 'Cropper'.tr, +// toolbarColor: AppColor.blueColor, +// toolbarWidgetColor: AppColor.yellowColor, +// initAspectRatio: CropAspectRatioPreset.original, +// lockAspectRatio: false), +// IOSUiSettings( +// title: 'Cropper'.tr, +// ), +// ], +// ); +// myImage = File(pickedImage.path); +// isloading = true; +// update(); +// // Save the cropped image +// File savedCroppedImage = File(croppedFile!.path); +// try { +// await uploadImage( +// savedCroppedImage, +// { +// 'driverID': +// box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), +// 'imageType': imageType +// }, +// link, +// ); +// } catch (e) { +// Get.snackbar('Image Upload Failed'.tr, e.toString(), +// backgroundColor: AppColor.redColor); +// } finally { +// isloading = false; +// update(); +// } +// } + +// uploadImage(File file, Map data, String link) async { +// var request = http.MultipartRequest( +// 'POST', +// Uri.parse(link), //'https://ride.mobile-app.store/uploadImage1.php' +// ); + +// var length = await file.length(); +// var stream = http.ByteStream(file.openRead()); +// var multipartFile = http.MultipartFile( +// 'image', +// stream, +// length, +// filename: basename(file.path), +// ); +// request.headers.addAll({ +// 'Authorization': +// 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}', +// }); +// // Set the file name to the driverID +// request.files.add( +// http.MultipartFile( +// 'image', +// stream, +// length, +// filename: '${box.read(BoxName.driverID)}.jpg', +// ), +// ); +// data.forEach((key, value) { +// request.fields[key] = value; +// }); +// var myrequest = await request.send(); +// var res = await http.Response.fromStream(myrequest); +// if (res.statusCode == 200) { +// return jsonDecode(res.body); +// } else { +// throw Exception( +// 'Failed to upload image: ${res.statusCode} - ${res.body}'); +// } +// } +// } diff --git a/lib/controller/functions/wallet.dart b/lib/controller/functions/wallet.dart new file mode 100644 index 0000000..a644599 --- /dev/null +++ b/lib/controller/functions/wallet.dart @@ -0,0 +1,64 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/colors.dart'; + +import '../../constant/links.dart'; +import '../firebase/firbase_messge.dart'; +import 'crud.dart'; + +class WalletController extends GetxController { + String paymentToken = ''; + Future generateTokenDriver(String amount, driverID) async { + var res = await CRUD().post(link: AppLink.addPaymentTokenDriver, payload: { + 'driverID': driverID.toString(), + 'amount': amount.toString(), + }); + var d = jsonDecode(res); + return d['message']; + } + + addPaymentToDriver(String amount, driverID, token) async { + paymentToken = await generateTokenDriver(amount.toString(), driverID); + var res = await CRUD().post(link: AppLink.addDrivePayment, payload: { + 'rideId': 'gift_$driverID _${DateTime.now().toIso8601String()}', + 'amount': amount, + 'payment_method': 'visaRide', + 'passengerID': 'gift', + 'token': paymentToken, + 'driverID': driverID.toString(), + }); + if (res != 'failure') { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + "لديك هدية من سفَر".tr, + 'لقد حصلت على هدية من سفر بقيمة $amount ', + token, // Access token correctly + 'ding.wav', + ); + Get.snackbar('success', 'addPaymentToDriver', + backgroundColor: AppColor.greenColor); + } else { + Get.snackbar('error', 'addPaymentToDriver', + backgroundColor: AppColor.redColor); + } + } + + Future addSeferWallet(String point, driverID) async { + var amount = (int.parse(point) * -1).toStringAsFixed(0); + var seferToken = await generateTokenDriver(amount, driverID); + var res = await CRUD().post(link: AppLink.addSeferWallet, payload: { + 'amount': amount.toString(), + 'paymentMethod': 'visaRide', + 'passengerId': 'gift$driverID', + 'token': seferToken, + 'driverId': driverID.toString(), + }); + if (res != 'failure') { + Get.snackbar('success', 'addSeferWallet', + backgroundColor: AppColor.greenColor); + } else { + Get.snackbar('error', 'addSeferWallet', + backgroundColor: AppColor.redColor); + } + } +} diff --git a/lib/controller/notification_controller.dart b/lib/controller/notification_controller.dart new file mode 100644 index 0000000..10d8781 --- /dev/null +++ b/lib/controller/notification_controller.dart @@ -0,0 +1,220 @@ +import 'package:flutter/widgets.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/box_name.dart'; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/controller/firebase/firbase_messge.dart'; +import 'package:sefer_admin1/controller/functions/crud.dart'; +import 'package:sefer_admin1/main.dart'; +import 'package:sefer_admin1/views/widgets/elevated_btn.dart'; +import 'package:sefer_admin1/views/widgets/my_textField.dart'; + +import '../constant/style.dart'; +import '../print.dart'; + +class NotificationController extends GetxController { + final formKey = GlobalKey(); + final title = TextEditingController(); + final body = TextEditingController(); + List tokensDriver = []; + List tokensPassengers = []; + + getTokensDrivers() async { + await FirebaseMessagesController().loadAllPagesAndSendNotifications(); + } + + getTokensPassengers() async { + await FirebaseMessagesController() + .loadAllPagesAndSendNotificationsPassengers(); + } + + Future sendNotificationDrivers() { + return Get.defaultDialog( + title: 'send notification'.tr, + titleStyle: AppStyle.title, + content: Form( + key: formKey, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: MyTextForm( + controller: title, + label: 'title notification'.tr, + hint: 'title notification'.tr, + type: TextInputType.name), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: MyTextForm( + controller: body, + label: 'body notification'.tr, + hint: 'body notification'.tr, + type: TextInputType.name), + ), + ], + ), + ), + confirm: MyElevatedButton( + title: 'send'.tr, + onPressed: () async { + // tokensDriver = box.read(BoxName.tokensDrivers)['message']; + // Log.print('tokensDriver: ${tokensDriver}'); + // if (formKey.currentState!.validate()) { + box.read(BoxName.tokensDrivers)['message'].length; + for (var i = 0; + i < box.read(BoxName.tokensDrivers)['message'].length; + i++) { + // for (var i = 0; i < 2; i++) { + // print(i); + var res = await CRUD() + .post(link: AppLink.addNotificationCaptain, payload: { + "driverID": box + .read(BoxName.tokensDrivers)['message'][i]['id'] + .toString(), + "title": title.text, + "body": body.text, + "isPin": 'unPin', + }); + Log.print( + 'res: ${res}for ${box.read(BoxName.tokensDrivers)['message'][i]['id']}'); + // Log.print('tokensDriver[i]: ${tokensDriver[i]}'); + Future.delayed(const Duration(microseconds: 50)); + + FirebaseMessagesController().sendNotificationToAnyWithoutData( + title.text, + body.text, + box + .read(BoxName.tokensDrivers)['message'][i]['token'] + .toString(), + 'tone2.wav'); + } + Get.back(); + // } + }), + cancel: MyElevatedButton( + title: 'cancel', + onPressed: () { + Get.back(); + })); + } + + Future sendNotificationPassengers() { + return Get.defaultDialog( + title: 'send notification'.tr, + titleStyle: AppStyle.title, + content: Form( + key: formKey, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: MyTextForm( + controller: title, + label: 'title notification'.tr, + hint: 'title notification'.tr, + type: TextInputType.name), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: MyTextForm( + controller: body, + label: 'body notification'.tr, + hint: 'body notification'.tr, + type: TextInputType.name), + ), + ], + ), + ), + confirm: MyElevatedButton( + title: 'send'.tr, + onPressed: () async { + // tokensPassengers = box.read(BoxName.tokensPassengers); + var tokensPassengersData = + box.read(BoxName.tokensPassengers)['data']; + +// Debug print to check structure of the 'data' field + print('Tokens Passengers Data: $tokensPassengersData'); + + if (tokensPassengersData is List) { + for (var i = 0; i < tokensPassengersData.length; i++) { + if (formKey.currentState!.validate()) { + var res = await CRUD() + .post(link: AppLink.addNotificationPassenger, payload: { + "passenger_id": + tokensPassengersData[i]['passengerID'].toString(), + "title": title.text, + "body": body.text, + }); + Log.print('res: ${res}'); + FirebaseMessagesController() + .sendNotificationToAnyWithoutData( + title.text, + body.text, + tokensPassengersData[i]['token'] + .toString(), // Access token correctly + 'order.wav', + ); + } + } + Get.back(); + } else { + // Handle the case where 'data' is not a list + print('Data is not a list: $tokensPassengersData'); + } + }), + cancel: MyElevatedButton( + title: 'cancel', + onPressed: () { + Get.back(); + })); + } +} +// يلا دلوقتي! تطبيق سفر جاهز عشان تبدأ تستقبل الطلبات +// • افتح التطبيق دلوقتي، واستعد إنك تستقبل طلبات أكتر. كل ما تكون فاتح، فرصتك في الطلبات بتزيد! +// 2. خليك فاتح واستقبل طلبات أكتر مع تطبيق سفر +// • وجودك متصل في التطبيق هيخليك تستقبل طلبات أكتر. افتح التطبيق دلوقتي وما تفوتش الفرصة! +// 3. فرصتك لزيادة دخلك مع تطبيق سفر تبدأ من دلوقتي! +// • مجرد إنك تفتح التطبيق مش هيأثر عليك، بالعكس، هيزود فرصتك في طلبات أكتر. افتح التطبيق واشترك دلوقتي! + +//sms +// link sefer driver is https://shorturl.at/IHJcm1. +// // ميزات الأمان بعد 500 رحلة: +// • “بعد 500 رحلة مع سفر، تحصل على مميزات أمان إضافية لضمان راحتك.” +// • “نوفر لك ميزات أمان متقدمة بعد 500 رحلة لتجربة قيادة أكثر أمانًا.” +// • “مع 500 رحلة، تحصل على دعم أمني متقدم لتوفير أفضل تجربة قيادة.” +// 2. ميزات الصيانة: +// • “احصل على خدمات صيانة مجانية بعد عدد معين من الرحلات مع سفر.” +// • “استمتع بخدمات صيانة حصرية عند الوصول إلى عدد محدد من الرحلات.” +// • “مع سفر، نقدم لك عروض صيانة مميزة لتحافظ على سيارتك في أفضل حال.” +// 3. ميزات فتح حسابات البنوك: +// • “مع سفر، يمكنك فتح حساب بنكي بسهولة واستفادة من عروض مميزة.” +// • “افتح حساب بنكي مع تطبيق سفر واستفد من خدمات مالية حصرية.” +// • “نساعدك على فتح حساب بنكي بأفضل العروض بالتعاون مع البنوك المحلية.” +// 4. ميزات ورود السيارات ومعارض السيارات الخاصة بنا: +// • “استمتع بعروض مميزة لشراء السيارات من معارض سفر الحصرية.” +// • “اختر سيارتك المثالية من معارض سفر بأسعار تنافسية وخدمات مميزة.” +// • “نقدم لك أفضل عروض السيارات من معارضنا لتسهيل امتلاك سيارتك الجديدة.” +// 5. ميزات أوفر كار: +// • “أوفر كار من سفر توفر لك سيارات اقتصادية لزيادة دخلك بكفاءة.” +// • “مع أوفر كار، يمكنك العمل بسيارات اقتصادية وتحقيق أرباح أكبر.” +// • “تطبيق سفر يقدم لك أوفر كار، الخيار الاقتصادي المثالي لزيادة دخلك.” +// 6. مستوى الدخل المحدود والطلبات الاقتصادية: +// • “لأصحاب الدخل المحدود، وفرنا طلبات اقتصادية تضمن لك زيادة دخلك.” +// • “الطلبات الاقتصادية من سفر تساعدك على زيادة دخلك بسهولة وفعالية.” +// • “استفد من طلبات اقتصادية تناسب أصحاب الدخل المحدود لزيادة أرباحك.” +// 7. طلبات الليل: +// • “مع طلبات الليل من سفر، زود دخلك واستفد من فرص إضافية في المساء.” +// • “لا تفوت فرصة طلبات الليل مع سفر، زود دخلك في أي وقت.” +// • “طلبات الليل من سفر توفر لك فرصًا إضافية لتحقيق دخل أعلى.” +// 8. طلبات الكمفورت الأكثر راحة والسيارات المكيفة: +// • “قدّم خدمة مريحة مع طلبات الكمفورت من سفر والسيارات المكيفة.” +// • “طلبات الكمفورت توفر تجربة راقية للركاب بسيارات مكيفة ومريحة.” +// • “مع سفر، سيارات الكمفورت المكيفة تضمن راحة الركاب وزيادة الطلبات.” +// 9. طلبات السبيد: +// • “استقبل طلبات السبيد مع سفر لتقديم رحلات أسرع وزيادة دخلك.” +// • “طلبات السبيد توفر لك فرصة إكمال المزيد من الرحلات في وقت أقل.” +// • “مع طلبات السبيد من سفر، تقدم خدمة سريعة وفعالة لزيادة الأرباح.” +// 10. الطلبات الثابتة والمعتدلة السعر والنسبة الثابتة 8%: +// • “مع نسبة ثابتة 8%، تحصل على أفضل عروض الأسعار مع سفر.” +// • “استمتع بنسبة ثابتة 8%، أقل نسبة بين المنافسين لزيادة دخلك.” +// • “طلبات سفر الثابتة تضمن لك دخلاً مستقراً بنسبة أقل من 8%.” diff --git a/lib/env/env.dart b/lib/env/env.dart new file mode 100644 index 0000000..e728339 --- /dev/null +++ b/lib/env/env.dart @@ -0,0 +1,328 @@ +import 'package:envied/envied.dart'; + +part 'env.g.dart'; + +@Envied() +abstract class Env { + @EnviedField(varName: 'addd', obfuscate: true) + static final String addd = _Env.addd; + + @EnviedField(varName: 'initializationVector', obfuscate: true) + static final String initializationVector = _Env.initializationVector; + @EnviedField(varName: 'ALLOWED_ADMIN_PHONES', obfuscate: true) + static final String ALLOWED_ADMIN_PHONES = _Env.ALLOWED_ADMIN_PHONES; + + @EnviedField(varName: 'privateKeyFCM', obfuscate: true) + static final String privateKeyFCM = _Env.privateKeyFCM; + + @EnviedField(varName: 'passnpassenger', obfuscate: true) + static final String passnpassenger = _Env.passnpassenger; + + @EnviedField(varName: 'newId', obfuscate: true) + static final String newId = _Env.newId; + + @EnviedField(varName: 'allowed', obfuscate: true) + static final String allowed = _Env.allowed; + + @EnviedField(varName: 'basicAuthCredentials', obfuscate: true) + static final String basicAuthCredentials = _Env.basicAuthCredentials; + + @EnviedField(varName: 'basicCompareFaces', obfuscate: true) + static final String basicCompareFaces = _Env.basicCompareFaces; + + @EnviedField(varName: 'basicCompareFacesURL', obfuscate: true) + static final String basicCompareFacesURL = _Env.basicCompareFacesURL; + + @EnviedField(varName: 'accountSIDTwillo', obfuscate: true) + static final String accountSIDTwillo = _Env.accountSIDTwillo; + + @EnviedField(varName: 'serverAPI', obfuscate: true) + static final String serverAPI = _Env.serverAPI; + + @EnviedField(varName: 'mapAPIKEY', obfuscate: true) + static final String mapAPIKEY = _Env.mapAPIKEY; + + @EnviedField(varName: 'twilloRecoveryCode', obfuscate: true) + static final String twilloRecoveryCode = _Env.twilloRecoveryCode; + + @EnviedField(varName: 'authTokenTwillo', obfuscate: true) + static final String authTokenTwillo = _Env.authTokenTwillo; + + @EnviedField(varName: 'chatGPTkey', obfuscate: true) + static final String chatGPTkey = _Env.chatGPTkey; + + @EnviedField(varName: 'transactionCloude', obfuscate: true) + static final String transactionCloude = _Env.transactionCloude; + + @EnviedField(varName: 'visionApi', obfuscate: true) + static final String visionApi = _Env.visionApi; + + @EnviedField(varName: 'secretKey', obfuscate: true) + static final String secretKey = _Env.secretKey; + + @EnviedField(varName: 'stripe_publishableKe', obfuscate: true) + static final String stripePublishableKe = _Env.stripePublishableKe; + + @EnviedField(varName: 'chatGPTkeySefer', obfuscate: true) + static final String chatGPTkeySefer = _Env.chatGPTkeySefer; + + @EnviedField(varName: 'llamaKey', obfuscate: true) + static final String llamaKey = _Env.llamaKey; + + @EnviedField(varName: 'serverPHP', obfuscate: true) + static final String serverPHP = _Env.serverPHP; + + @EnviedField(varName: 'seferAlexandriaServer', obfuscate: true) + static final String seferAlexandriaServer = _Env.seferAlexandriaServer; + + @EnviedField(varName: 'whatsapp', obfuscate: true) + static final String whatsapp = _Env.whatsapp; + + @EnviedField(varName: 'whatappID', obfuscate: true) + static final String whatappID = _Env.whatappID; + + @EnviedField(varName: 'seferPaymentServer', obfuscate: true) + static final String seferPaymentServer = _Env.seferPaymentServer; + + @EnviedField(varName: 'seferCairoServer', obfuscate: true) + static final String seferCairoServer = _Env.seferCairoServer; + + @EnviedField(varName: 'seferGizaServer', obfuscate: true) + static final String seferGizaServer = _Env.seferGizaServer; + + @EnviedField(varName: 'chatGPTkeySeferNew', obfuscate: true) + static final String chatGPTkeySeferNew = _Env.chatGPTkeySeferNew; + + @EnviedField(varName: 'cohere', obfuscate: true) + static final String cohere = _Env.cohere; + + @EnviedField(varName: 'claudeAiAPI', obfuscate: true) + static final String claudeAiAPI = _Env.claudeAiAPI; + + @EnviedField(varName: 'payPalClientId', obfuscate: true) + static final String payPalClientId = _Env.payPalClientId; + + @EnviedField(varName: 'payPalSecret', obfuscate: true) + static final String payPalSecret = _Env.payPalSecret; + + @EnviedField(varName: 'geminiApi', obfuscate: true) + static final String geminiApi = _Env.geminiApi; + + @EnviedField(varName: 'geminiApiMasa', obfuscate: true) + static final String geminiApiMasa = _Env.geminiApiMasa; + + @EnviedField(varName: 'agoraAppId', obfuscate: true) + static final String agoraAppId = _Env.agoraAppId; + + @EnviedField(varName: 'agoraAppCertificate', obfuscate: true) + static final String agoraAppCertificate = _Env.agoraAppCertificate; + + @EnviedField(varName: 'payPalClientIdLive', obfuscate: true) + static final String payPalClientIdLive = _Env.payPalClientIdLive; + + @EnviedField(varName: 'payPalSecretLive', obfuscate: true) + static final String payPalSecretLive = _Env.payPalSecretLive; + + @EnviedField(varName: 'integrationIdPayMob', obfuscate: true) + static final String integrationIdPayMob = _Env.integrationIdPayMob; + + @EnviedField(varName: 'passwordPayMob', obfuscate: true) + static final String passwordPayMob = _Env.passwordPayMob; + + @EnviedField(varName: 'usernamePayMob', obfuscate: true) + static final String usernamePayMob = _Env.usernamePayMob; + + @EnviedField(varName: 'payMobApikey', obfuscate: true) + static final String payMobApikey = _Env.payMobApikey; + + @EnviedField(varName: 'integrationIdPayMobWallet', obfuscate: true) + static final String integrationIdPayMobWallet = + _Env.integrationIdPayMobWallet; + + @EnviedField(varName: 'smsPasswordEgypt', obfuscate: true) + static final String smsPasswordEgypt = _Env.smsPasswordEgypt; + + @EnviedField(varName: 'ocpApimSubscriptionKey', obfuscate: true) + static final String ocpApimSubscriptionKey = _Env.ocpApimSubscriptionKey; + + @EnviedField(varName: 'chatGPTkeySeferNew4', obfuscate: true) + static final String chatGPTkeySeferNew4 = _Env.chatGPTkeySeferNew4; + + @EnviedField(varName: 'anthropicAIkeySeferNew', obfuscate: true) + static final String anthropicAIkeySeferNew = _Env.anthropicAIkeySeferNew; + + @EnviedField(varName: 'llama3Key', obfuscate: true) + static final String llama3Key = _Env.llama3Key; + + @EnviedField(varName: 'payMobOutClientSecrret', obfuscate: true) + static final String payMobOutClientSecrret = _Env.payMobOutClientSecrret; + + @EnviedField(varName: 'allowedWallet', obfuscate: true) + static final String allowedWallet = _Env.allowedWallet; + @EnviedField(varName: 'payMobOutClient_id', obfuscate: true) + static final String payMobOutClient_id = _Env.payMobOutClient_id; + + @EnviedField(varName: 'payMobOutPassword', obfuscate: true) + static final String payMobOutPassword = _Env.payMobOutPassword; + + @EnviedField(varName: 'payMobOutUserName', obfuscate: true) + static final String payMobOutUserName = _Env.payMobOutUserName; + + @EnviedField(varName: 'A', obfuscate: true) + static final String A = _Env.A; + + @EnviedField(varName: 'B', obfuscate: true) + static final String B = _Env.B; + + @EnviedField(varName: 'C', obfuscate: true) + static final String C = _Env.C; + + @EnviedField(varName: 'D', obfuscate: true) + static final String D = _Env.D; + + @EnviedField(varName: 'E', obfuscate: true) + static final String E = _Env.E; + + @EnviedField(varName: 'F', obfuscate: true) + static final String F = _Env.F; + + @EnviedField(varName: 'G', obfuscate: true) + static final String G = _Env.G; + + @EnviedField(varName: 'H', obfuscate: true) + static final String H = _Env.H; + + @EnviedField(varName: 'I', obfuscate: true) + static final String I = _Env.I; + + @EnviedField(varName: 'J', obfuscate: true) + static final String J = _Env.J; + + @EnviedField(varName: 'K', obfuscate: true) + static final String K = _Env.K; + + @EnviedField(varName: 'L', obfuscate: true) + static final String L = _Env.L; + + @EnviedField(varName: 'M', obfuscate: true) + static final String M = _Env.M; + + @EnviedField(varName: 'N', obfuscate: true) + static final String N = _Env.N; + + @EnviedField(varName: 'O', obfuscate: true) + static final String O = _Env.O; + + @EnviedField(varName: 'P', obfuscate: true) + static final String P = _Env.P; + + @EnviedField(varName: 'Q', obfuscate: true) + static final String Q = _Env.Q; + + @EnviedField(varName: 'R', obfuscate: true) + static final String R = _Env.R; + + @EnviedField(varName: 'S', obfuscate: true) + static final String S = _Env.S; + + @EnviedField(varName: 'T', obfuscate: true) + static final String T = _Env.T; + + @EnviedField(varName: 'U', obfuscate: true) + static final String U = _Env.U; + + @EnviedField(varName: 'V', obfuscate: true) + static final String V = _Env.V; + + @EnviedField(varName: 'W', obfuscate: true) + static final String W = _Env.W; + + @EnviedField(varName: 'X', obfuscate: true) + static final String X = _Env.X; + + @EnviedField(varName: 'Y', obfuscate: true) + static final String Y = _Env.Y; + + @EnviedField(varName: 'Z', obfuscate: true) + static final String Z = _Env.Z; + @EnviedField(varName: 'a', obfuscate: true) + static final String a = _Env.a; + + @EnviedField(varName: 'b', obfuscate: true) + static final String b = _Env.b; + + @EnviedField(varName: 'c', obfuscate: true) + static final String c = _Env.c; + + @EnviedField(varName: 'd', obfuscate: true) + static final String d = _Env.d; + + @EnviedField(varName: 'e', obfuscate: true) + static final String e = _Env.e; + + @EnviedField(varName: 'f', obfuscate: true) + static final String f = _Env.f; + + @EnviedField(varName: 'g', obfuscate: true) + static final String g = _Env.g; + + @EnviedField(varName: 'h', obfuscate: true) + static final String h = _Env.h; + + @EnviedField(varName: 'i', obfuscate: true) + static final String i = _Env.i; + + @EnviedField(varName: 'j', obfuscate: true) + static final String j = _Env.j; + + @EnviedField(varName: 'k', obfuscate: true) + static final String k = _Env.k; + + @EnviedField(varName: 'l', obfuscate: true) + static final String l = _Env.l; + + @EnviedField(varName: 'm', obfuscate: true) + static final String m = _Env.m; + + @EnviedField(varName: 'n', obfuscate: true) + static final String n = _Env.n; + + @EnviedField(varName: 'o', obfuscate: true) + static final String o = _Env.o; + + @EnviedField(varName: 'p', obfuscate: true) + static final String p = _Env.p; + + @EnviedField(varName: 'q', obfuscate: true) + static final String q = _Env.q; + + @EnviedField(varName: 'r', obfuscate: true) + static final String r = _Env.r; + + @EnviedField(varName: 's', obfuscate: true) + static final String s = _Env.s; + + @EnviedField(varName: 't', obfuscate: true) + static final String t = _Env.t; + + @EnviedField(varName: 'u', obfuscate: true) + static final String u = _Env.u; + + @EnviedField(varName: 'v', obfuscate: true) + static final String v = _Env.v; + + @EnviedField(varName: 'w', obfuscate: true) + static final String w = _Env.w; + + @EnviedField(varName: 'x', obfuscate: true) + static final String x = _Env.x; + + @EnviedField(varName: 'y', obfuscate: true) + static final String y = _Env.y; + + @EnviedField(varName: 'z', obfuscate: true) + static final String z = _Env.z; + + @EnviedField(varName: 'keyOfApp', obfuscate: true) + static final String keyOfApp = _Env.keyOfApp; +} diff --git a/lib/env/env.g.dart b/lib/env/env.g.dart new file mode 100644 index 0000000..a56e8e7 --- /dev/null +++ b/lib/env/env.g.dart @@ -0,0 +1,13808 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'env.dart'; + +// ************************************************************************** +// EnviedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// generated_from: .env +final class _Env { + static const List _enviedkeyaddd = [ + 4184020447, + 3826068138, + 2306559756, + 1173205620, + 2205545518, + 1709814687, + ]; + + static const List _envieddataaddd = [ + 4184020381, + 3826068166, + 2306559822, + 1173205528, + 2205545568, + 1709814771, + ]; + + static final String addd = String.fromCharCodes(List.generate( + _envieddataaddd.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataaddd[i] ^ _enviedkeyaddd[i])); + + static const List _enviedkeyinitializationVector = [ + 1578832389, + 3945784853, + 2222102556, + 2561055490, + 3003663990, + 315084469, + 4080671322, + 1930424743, + 29371404, + 2007386549, + 2526740020, + 3265054637, + 1742339467, + 3885645417, + 4256543904, + 297095771, + 1734808655, + 1845003903, + 2350640508, + 1655823791, + 2085642505, + 3169161950, + ]; + + static const List _envieddatainitializationVector = [ + 1578832500, + 3945784941, + 2222102650, + 2561055611, + 3003663900, + 315084480, + 4080671281, + 1930424784, + 29371491, + 2007386576, + 2526740051, + 3265054687, + 1742339557, + 3885645323, + 4256543945, + 297095725, + 1734808599, + 1845003789, + 2350640420, + 1655823837, + 2085642571, + 3169161900, + ]; + + static final String initializationVector = String.fromCharCodes( + List.generate( + _envieddatainitializationVector.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatainitializationVector[i] ^ + _enviedkeyinitializationVector[i])); + + static const List _enviedkeyALLOWED_ADMIN_PHONES = [ + 248735859, + 3932334051, + 1114544738, + 2534892790, + 1903759904, + 3413640007, + 159785997, + 3592336862, + 2407949844, + 1176379010, + 4287005937, + 2323122464, + 2828443150, + 133433673, + 3719414383, + 4217049170, + 2332029750, + 3288289247, + 3504434441, + 2142167933, + 1760377169, + 1008571409, + 1218222156, + 1482218510, + 2771517915, + 579679196, + 770704758, + 1835282112, + 4119145032, + 1981646524, + 3177275810, + 3249953828, + 437971328, + 3679269541, + 1398101792, + 216886244, + 202325893, + 655569227, + ]; + + static const List _envieddataALLOWED_ADMIN_PHONES = [ + 248735818, + 3932334037, + 1114544720, + 2534892737, + 1903759897, + 3413640063, + 159786040, + 3592336870, + 2407949863, + 1176379058, + 4287005892, + 2323122450, + 2828443170, + 133433712, + 3719414361, + 4217049184, + 2332029697, + 3288289254, + 3504434489, + 2142167877, + 1760377189, + 1008571432, + 1218222204, + 1482218556, + 2771517932, + 579679216, + 770704719, + 1835282166, + 4119145082, + 1981646475, + 3177275802, + 3249953811, + 437971376, + 3679269527, + 1398101777, + 216886237, + 202325943, + 655569276, + ]; + + static final String ALLOWED_ADMIN_PHONES = String.fromCharCodes( + List.generate( + _envieddataALLOWED_ADMIN_PHONES.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataALLOWED_ADMIN_PHONES[i] ^ + _enviedkeyALLOWED_ADMIN_PHONES[i])); + + static const List _enviedkeyprivateKeyFCM = [ + 1279324801, + 662806931, + 3573060356, + 248874147, + 4233723671, + 3285043552, + 2630458545, + 933524445, + 2538237122, + 768559037, + 454998908, + 1636897632, + 1695959601, + 3572055427, + 397192656, + 479484653, + 3360553363, + 2693542099, + 867142903, + 982018826, + 3739553349, + 2665060126, + 4094912046, + 2428771776, + 3904117, + 1099107310, + 1187285877, + 2875788149, + 2140106291, + 2599920156, + 245888894, + 3103987921, + 3484709396, + 2445819193, + 269360687, + 2870785768, + 3494295944, + 2186397973, + 4129629298, + 1384501383, + 532926708, + 1467762445, + 3966026764, + 3985340592, + 2194012018, + 1102261118, + 3126146919, + 3384467891, + 2347086802, + 3515327620, + 3435863452, + 2703679288, + 2891934741, + 1893811358, + 2917625769, + 2606555176, + 207557198, + 1430868603, + 2681823395, + 3321714888, + 4076821312, + 3876125971, + 3018025816, + 46752297, + 751875649, + 2687750936, + 2493589392, + 281238031, + 1392016429, + 1858833329, + 1676449864, + 2759260990, + 185136230, + 2284614744, + 2558605238, + 2960518500, + 1299669859, + 2350161106, + 16064463, + 3910982448, + 2008417012, + 407547874, + 3118350808, + 3293433179, + 4091664050, + 2423551850, + 1683148635, + 3432837766, + 238582655, + 107638077, + 2732344037, + 3975360949, + 422135857, + 96195689, + 1597835140, + 2681376807, + 3274358041, + 1818034892, + 3341389779, + 419404591, + 2574758877, + 252695527, + 1048200291, + 3268075511, + 2409160438, + 771145875, + 1185117954, + 1694497240, + 459547898, + 676667959, + 2931249368, + 2309203615, + 2742376974, + 1476671978, + 291393646, + 3963059177, + 2687925238, + 2333196226, + 2039532024, + 3868674789, + 3251656862, + 4129482288, + 537098602, + 2036688791, + 127471666, + 1704463092, + 930295929, + 4186432086, + 1938967516, + 2948635145, + 1976418135, + 2310394947, + 599352180, + 2551533046, + 1551539358, + 3652950226, + 2689793458, + 3746914856, + 3290972949, + 2341551643, + 3216063357, + 976395763, + 397965167, + 2862779384, + 407461582, + 3554446279, + 1401256190, + 2789888829, + 214115005, + 1836880798, + 3045689085, + 2252442488, + 559151451, + 955966583, + 2584324395, + 1347819100, + 1241980845, + 670123273, + 442575948, + 4292310693, + 1213578431, + 4065098708, + 263616880, + 661276549, + 3965779067, + 1741842208, + 810319462, + 1609570506, + 1854028552, + 2576896907, + 1750042973, + 370761363, + 792214886, + 393825350, + 4194907134, + 405901763, + 2266069492, + 2767386675, + 2335424409, + 436486758, + 782956124, + 469346349, + 4143226699, + 4094633215, + 3999904109, + 3242400485, + 2517591990, + 3624786226, + 111823136, + 2073714047, + 2137141316, + 2853917464, + 3160747945, + 792012429, + 4146319910, + 1910366073, + 2218240156, + 469565072, + 397417975, + 785377955, + 2289490663, + 1034292026, + 1250846653, + 1696619030, + 3623641794, + 1292332725, + 4249317972, + 3006030115, + 2523369032, + 424311352, + 2213959247, + 4174793298, + 2506267908, + 2014370870, + 1591040007, + 3623894541, + 2306075310, + 3482174458, + 1847537405, + 3061488421, + 3603171603, + 1758980821, + 1285476669, + 724408386, + 2480446817, + 2146688764, + 2739074097, + 498871849, + 3353689377, + 3388389130, + 3346375781, + 2325253113, + 2390294825, + 1154741668, + 1504993919, + 1282124079, + 721971231, + 24857070, + 1167052773, + 383537997, + 235607695, + 4175610596, + 1073960161, + 3500791207, + 3699969389, + 1016485183, + 2465839392, + 405657424, + 1987549868, + 1029024761, + 1923774941, + 1463128179, + 2744597008, + 31094043, + 1350466601, + 1056091382, + 2406166059, + 4173589581, + 4077953109, + 2689385039, + 3838283228, + 3729448433, + 715218321, + 4023299044, + 279372415, + 3034273437, + 2590768079, + 1419110863, + 1437379818, + 1612246884, + 2875217063, + 2350993868, + 386010709, + 4099493314, + 1816392117, + 2132833274, + 3621348916, + 1107686717, + 3141789309, + 2143679515, + 464765208, + 195299995, + 1138259226, + 3510535545, + 3272381825, + 3240600343, + 2312848700, + 2567911646, + 178954369, + 3237444763, + 3802718346, + 2909481987, + 2538731661, + 3954242168, + 1698413422, + 1228779851, + 3004078567, + 3367118759, + 3865637623, + 2655570112, + 3113592717, + 58137891, + 446426582, + 2538541466, + 1042910864, + 3786911825, + 21677681, + 613714932, + 1304372501, + 2374222665, + 467999279, + 228581417, + 3960995195, + 719625845, + 1364823232, + 3069278291, + 1131576636, + 285238901, + 2623665703, + 2729319002, + 2947952704, + 850212967, + 2711382108, + 1046114259, + 340528779, + 3553499048, + 68801076, + 3366182038, + 1464491014, + 657625141, + 1725974489, + 3783405674, + 2785813619, + 3898744341, + 397199897, + 4216622036, + 440350134, + 424214360, + 120469017, + 3575889568, + 801123507, + 1013859343, + 4284411423, + 2798070260, + 1594041986, + 1463908798, + 3685343727, + 1057833219, + 3710507741, + 2466877784, + 3930018762, + 1490141614, + 3802831405, + 1502852289, + 2536704393, + 3882517631, + 2589438749, + 1718869653, + 3560182655, + 2309987277, + 3843946284, + 82685884, + 3899015658, + 3675212024, + 3743974221, + 346469902, + 1248030174, + 1057889991, + 3461009628, + 4047796466, + 1486000588, + 1744095103, + 3197389536, + 787249651, + 1306573637, + 3267086364, + 2136229391, + 1559308455, + 4065594596, + 762338821, + 4076022455, + 2412539874, + 189320704, + 1625852787, + 918059117, + 1133099109, + 810669261, + 4239771796, + 2481374149, + 154758357, + 661788011, + 1369230872, + 1413165613, + 3440871522, + 3597282659, + 536602657, + 1340378800, + 2357214231, + 3060217423, + 1220964947, + 1651603306, + 3886164165, + 663233741, + 1910377372, + 3228224696, + 902720177, + 575847733, + 294922849, + 554062726, + 3960883226, + 4281843140, + 2488101470, + 3385862626, + 2512544274, + 688801241, + 3389447469, + 715674790, + 2862522189, + 1190831409, + 1670963445, + 921515508, + 18056951, + 2467595828, + 2155953681, + 919664157, + 784919038, + 2243585246, + 2911772955, + 2174177810, + 466763325, + 3265840614, + 3817949272, + 2582825633, + 580265788, + 2379188076, + 1495884945, + 1404002485, + 3926820842, + 4033938234, + 1818733524, + 1545321836, + 1195728026, + 714991572, + 1876458442, + 3581720313, + 3927993044, + 3308052017, + 2641216765, + 2025194258, + 696579686, + 1328137937, + 1742882739, + 472195900, + 1209358174, + 176746085, + 3821122989, + 3140474537, + 1017441108, + 1983363498, + 2903195081, + 3249920865, + 2377150580, + 285286605, + 708714282, + 723289170, + 4172659399, + 3251422699, + 2849440315, + 4038468210, + 3994216261, + 3991484198, + 104340462, + 2563208758, + 4160938109, + 2031648817, + 273190319, + 670798889, + 1578347720, + 1467222795, + 3086214917, + 3493568177, + 3148667890, + 2131988422, + 3473061565, + 3650344566, + 1857696147, + 2426387684, + 3576219986, + 3214479908, + 4156931760, + 3611674690, + 3461037756, + 202538271, + 884071710, + 1219330254, + 1760985599, + 3694827730, + 3956711588, + 4140414797, + 1897725197, + 1529105000, + 3309886962, + 3019665127, + 3257164185, + 4201803431, + 2096630610, + 3313239943, + 3003709875, + 1282772598, + 4144842570, + 2710028168, + 1082068145, + 231456738, + 1328902728, + 1122638265, + 3029769719, + 3499783351, + 191797130, + 4277277047, + 3476999635, + 3205480367, + 2794949006, + 106421238, + 2819817519, + 2245773986, + 776684761, + 2455759842, + 4132304075, + 3024214955, + 230590071, + 3388157679, + 1358402054, + 1639878964, + 1290540539, + 2759607162, + 3502724975, + 3268901311, + 782662862, + 2183220955, + 2858323569, + 353111669, + 279865821, + 3293454030, + 2385982433, + 1478219881, + 4020118586, + 1464403415, + 1528376271, + 3061459562, + 3306498956, + 431112582, + 781466162, + 440387100, + 3342771633, + 573370787, + 340686774, + 1142327333, + 857784458, + 1453685659, + 1292332859, + 2671071279, + 2048203923, + 2616681245, + 884417803, + 4279183701, + 3244846559, + 2264143494, + 1185596415, + 1193225710, + 1610947012, + 3818825379, + 2077008875, + 3404538250, + 227554213, + 2900252407, + 678706953, + 796928429, + 3904270688, + 3710272702, + 2807154769, + 1722258448, + 3675203010, + 199862920, + 1817125795, + 2447042658, + 2772110132, + 81313342, + 3248547253, + 512320252, + 2660369949, + 693113227, + 284129690, + 2769465985, + 2284376301, + 190098966, + 1394528598, + 124777843, + 1828526501, + 3794258909, + 74591466, + 1509631506, + 3931920644, + 3672226388, + 2823976573, + 786933089, + 628229247, + 2757127715, + 391830291, + 2766045221, + 1532809023, + 1930224701, + 3085778886, + 3537937145, + 4067674680, + 3408170283, + 3193492083, + 2565096379, + 3066090760, + 2317533188, + 3548688932, + 1167410648, + 2329795672, + 4291028507, + 1416516454, + 1764415174, + 1864195019, + 2972786929, + 2916829243, + 4166151081, + 631374402, + 3405622190, + 364324477, + 3930154629, + 1769566159, + 2671772137, + 3935674115, + 4076525915, + 3569199084, + 2461109890, + 3410757141, + 210407447, + 827700580, + 267586043, + 3617930753, + 3312368057, + 642690120, + 155053792, + 4201418813, + 1331409997, + 3352930442, + 3009385603, + 2319880757, + 537233267, + 58056813, + 1595655608, + 2820989750, + 1811237328, + 4080262283, + 864222234, + 3340377730, + 2093768475, + 657712852, + 4290044882, + 2996170198, + 1121074788, + 45455777, + 3019058298, + 562206857, + 1766835928, + 2213867222, + 3494755229, + 2886541381, + 495301008, + 2891646705, + 1533169098, + 2648130032, + 286411038, + 1739010490, + 3306970927, + 69530343, + 2975198042, + 2505509017, + 3345252040, + 1966944233, + 524649320, + 4196039784, + 2066063643, + 71812616, + 3795655726, + 2466476002, + 4234074991, + 515689348, + 2267109127, + 442629458, + 12068878, + 901378970, + 1386990738, + 4281127849, + 2084810365, + 1623159170, + 4067761770, + 1734682698, + 3862207235, + 2644998747, + 2259480519, + 3430190993, + 3063696074, + 3198640654, + 3650042851, + 791754236, + 2856980210, + 3436397066, + 2645644820, + 3737153867, + 2957515765, + 939320076, + 136075857, + 77815238, + 1675220499, + 2328017878, + 1284494720, + 3792103577, + 2087288601, + 832697898, + 2754682007, + 2439614828, + 3428815773, + 1304064341, + 2760975869, + 2829492770, + 81252850, + 3365474145, + 2893149853, + 1113377427, + 3472037943, + 2404946076, + 1922854225, + 3953600685, + 3545067967, + 2761966452, + 4093718515, + 266554046, + 1890394301, + 80780017, + 3875137081, + 1360336384, + 310989137, + 150469103, + 3513758336, + 986396679, + 2430273107, + 3838731568, + 4253425170, + 2339774512, + 590365918, + 4268206386, + 321386010, + 3491258604, + 2585950450, + 4245664828, + 495233600, + 1022167801, + 3584053182, + 3049513848, + 1520085374, + 23098964, + 1834488234, + 3291616678, + 1206743531, + 3422649152, + 2504839153, + 4265398755, + 846818210, + 1470623729, + 1773107316, + 2439445851, + 3914651085, + 859713640, + 420480593, + 2311712958, + 3651233052, + 48196800, + 1042979672, + 4210650594, + 270665638, + 1182977878, + 904368716, + 147197560, + 565835715, + 2516860668, + 3574362416, + 2522395676, + 1119937003, + 1612064843, + 3979787536, + 3840939963, + 3069073696, + 4166687598, + 2501173998, + 3255362130, + 3619783773, + 420899988, + 44233543, + 1547498198, + 4255187921, + 2944520291, + 1506911901, + 359829552, + 4250656984, + 3351895181, + 1810869194, + 2189803032, + 4052769677, + 436049709, + 293294611, + 3608442155, + 3916649513, + 1197519922, + 191918767, + 490342393, + 1362798498, + 1023881372, + 689265210, + 411221825, + 1074513797, + 2792376015, + 3873393559, + 2220921059, + 4143109091, + 2362544898, + 3146595359, + 182482610, + 800436386, + 11161886, + 828769819, + 677380752, + 1461405916, + 3347318633, + 3805774835, + 1021864004, + 1040842891, + 2189758682, + 1535525510, + 1423140698, + 3669263813, + 1469364107, + 3693589859, + 1695297335, + 4012996676, + 3352013019, + 4225758539, + 2011744434, + 2222299032, + 1935836692, + 8884437, + 2282316678, + 334268773, + 2817468551, + 1268537492, + 3676574201, + 3744881783, + 1063244850, + 2874875166, + 1141673327, + 2276808937, + 2003873795, + 950997701, + 1403834605, + 1868876797, + 3010709832, + 1682279084, + 3354233288, + 330779121, + 2341749530, + 759863235, + 2767390543, + 1295384893, + 340761841, + 2544244123, + 1139817663, + 3436078173, + 2539984466, + 1550588492, + 3780056860, + 1828707487, + 3831762543, + 1452964, + 3238274592, + 3631437680, + 210756590, + 28133135, + 725609937, + 1675783139, + 3632300828, + 3019488602, + 1618754606, + 1221214564, + 3723829425, + 843366704, + 1430774073, + 787842271, + 701861149, + 3588171873, + 819578248, + 2503073843, + 1569134527, + 3357654381, + 2717571266, + 1084514055, + 2431836509, + 1466042221, + 3863212566, + 133235637, + 4114325444, + 3774714927, + 2558144404, + 2825582392, + 3450280497, + 2672662014, + 654073489, + 1158222310, + 3411133099, + 4191651521, + 3456561868, + 2422637758, + 3964776560, + 3989225613, + 1290702176, + 1712057633, + 3557133013, + 3881985751, + 3272991324, + 1704351693, + 2776182539, + 4056479986, + 1469162616, + 554679762, + 4175299542, + 2340587186, + 499565661, + 4087324737, + 2737126623, + 2578993670, + 4090987555, + 722820816, + 2591310665, + 561557456, + 4152334208, + 3362393147, + 297395010, + 2302743683, + 2642050011, + 238136472, + 283509908, + 3692724572, + 1794896146, + 1710131070, + 1288356754, + 1599107178, + 3386823048, + 3132620817, + 2072064958, + 4139856984, + 4172904140, + 1841609827, + 2969860440, + 300064864, + 2072781042, + 2313766580, + 3905829388, + 300468256, + 218926621, + 2111463633, + 1764525004, + 3528862007, + 2232265027, + 657585302, + 203070414, + 3473817946, + 1845458756, + 2433371755, + 1319166981, + 1952251531, + 2308639400, + 1883107602, + 1836897835, + 2690241919, + 145466800, + 712934206, + 2205961674, + 2259923222, + 33948113, + 3872249976, + 1340253518, + 3995944871, + 3865229541, + 1944604048, + 1942486305, + 1210584206, + 587084094, + 3100608219, + 3169384175, + 1730840812, + 1397771295, + 3792341799, + 3472668731, + 3521044205, + 1077328368, + 1749817540, + 3363417269, + 1685760368, + 3251199928, + 94115734, + 3840485444, + 500285052, + 3362550256, + 4236164792, + 3788699767, + 2787960226, + 2948187862, + 479233110, + 3918634832, + 594387475, + 1128123145, + 467663913, + 326850336, + 745015371, + 501198675, + 1731174817, + 984479899, + 2824177133, + 2585610443, + 3880155440, + 1392403934, + 1250245531, + 170168423, + 3089227728, + 2890062818, + 2381187579, + 3935314458, + 1348412107, + 2602852184, + 2752572264, + 286523466, + 3016390405, + 4217893566, + 2040580139, + 2356569321, + 3542949964, + 4007372532, + 3052825328, + 2642777291, + 3244927803, + 3999919297, + 2827008779, + 2579686279, + 894362920, + 1207245737, + 2180518109, + 939162188, + 2852656135, + 3907304659, + 2946933931, + 3528009669, + 3462115314, + 896432283, + 531351975, + 2333967381, + 3398410155, + 1679493692, + 165828443, + 3865779341, + 578198195, + 3634759696, + 2458597172, + 548148527, + 1085994627, + 650935910, + 2260580502, + 2646802299, + 223764641, + 1738842166, + 67878472, + 3190595075, + 2159347697, + 3279491107, + 2237723567, + 370870889, + 3367895714, + 753113451, + 3482533082, + 1386128022, + 727427701, + 3629149806, + 3094681280, + 2282827938, + 4153438795, + 366242329, + 3530105252, + 1827576977, + 976079566, + 179345922, + 1859547181, + 2846902627, + 534320759, + 829262324, + 1704311089, + 1986859707, + 603315206, + 1882914646, + 3309585130, + 4084033700, + 267192973, + 3229269385, + 4171285871, + 3505178289, + 3894684956, + 4070775558, + 4072503657, + 1793806195, + 3293211467, + 4169707967, + 4148541809, + 2263528145, + 33538406, + 501242175, + 3506475699, + 2756409766, + 3832755131, + 1605122834, + 3119254619, + 441363470, + 1565601140, + 41320800, + 1660362552, + 2724046264, + 2451558081, + 2830746897, + 3180185455, + 2523380592, + 3615966001, + 2787541925, + 3849084123, + 3794368216, + 2534126074, + 2398463029, + 3053013139, + 2761339392, + 3411981642, + 1554947255, + 2044340622, + 1874804360, + 1149210229, + 2323930884, + 233125597, + 3664587201, + 1965818236, + 3212310660, + 963947218, + 3379565378, + 355185005, + 3330777611, + 3066394274, + 174169883, + 1743828641, + 3387901790, + 2333396101, + 812094098, + 3120976962, + 4084400097, + 1654518359, + 2710923174, + 3069866553, + 3415867382, + 1656493544, + 906726652, + 2590171591, + 1065118867, + 1770568599, + 782635254, + 2588103303, + 642298958, + 3536714031, + 358609939, + 1669298202, + 1970395733, + 3817480569, + 2995079956, + 2282010917, + 2942789358, + 3456729822, + 3669653499, + 2792536713, + 2369672665, + 3696154551, + 2848027280, + 3218550824, + 2609681118, + 2145951250, + 572988258, + 1558981030, + 703756745, + 3247987052, + 2631493507, + 3449630358, + 69498236, + 694670095, + 2170579338, + 2243110293, + 1398576724, + 2302718249, + 2780486608, + 3747438016, + 1274562134, + 1042592970, + 262013025, + 2715314356, + 2776174249, + 3569860558, + 3650709896, + 509975233, + 221931471, + 4097161719, + 1567935159, + 2227892624, + 1567791987, + 1905670043, + 3944716200, + 1710416467, + 3816136673, + 540323856, + 3272978658, + 1290576686, + 2711798553, + 4261692976, + 3946957331, + 3690173019, + 2499605427, + 3762316712, + 2906467241, + 1684061951, + 1196797466, + 888892516, + 93866139, + 3073379940, + 3543158120, + 2228317330, + 3762810881, + 3259564487, + 820166789, + 189372305, + 1362818074, + 695514536, + 1641304741, + 47748322, + 1701078851, + 4145807541, + 1369568556, + 3616309840, + 1090022778, + 2937622095, + 1816432653, + 2475721965, + 1277588240, + 2825290404, + 3717686622, + 2074256987, + 3454343228, + 2490571944, + 3468254879, + 540679348, + 4234100881, + 536495524, + 2935199487, + 2400696891, + 1772037092, + 2747971801, + 2199945316, + 1300201008, + 3811097405, + 517368368, + 2174510455, + 1670491037, + 3118118670, + 3074367302, + 2216070993, + 1720671299, + 719755363, + 1862810962, + 1683204926, + 3948227866, + 2364658765, + 1135869478, + 4273463563, + 2705834539, + 1310481980, + 1320919415, + 607447125, + 3185212378, + 1251376686, + 480995234, + 829537308, + 1658716498, + 950309680, + 2457944703, + 3014362764, + 2835443097, + 2177334333, + 2896536964, + 747755763, + 3778148315, + 2594828346, + 132203282, + 712765742, + 3976928263, + 255387857, + 1563198106, + 609423936, + 3777106923, + 1808957526, + 2845841225, + 580384459, + 985083464, + 2294224740, + 1004515342, + 1067636903, + 2123879687, + 3457972177, + 335261541, + 269360404, + 765530758, + 2712867647, + 2897086953, + 3449439735, + 4247579051, + 3416683973, + 361548881, + 405864004, + 3019753416, + 3320284824, + 3783501891, + 3930173033, + 4282797675, + 1855299596, + 3398313136, + 2643282201, + 503826576, + 3394208902, + 1513757154, + 2246089014, + 972231188, + 2166998530, + 3170984607, + 3846886887, + 1601133127, + 1485963892, + 300602902, + 1758056288, + 1191707371, + 2051321429, + 2044716977, + 787636257, + 1409293777, + 3470957634, + 2280671768, + 842242303, + 1240332261, + 756437361, + 2396464263, + 2602305796, + 3375533106, + 4045924280, + 2341784311, + 958908800, + 315563429, + 2732240198, + 2846454003, + 1434158233, + 431756828, + 3186439148, + 1158851911, + 3708656417, + 1958146051, + 2413668187, + 1754898174, + 3904171751, + 3323075865, + 1131153755, + 777550261, + 2713711391, + 3635264388, + 2198718338, + 3253108578, + 1350331362, + 1245214284, + 113397768, + 3243339265, + 1947845004, + 3374508348, + 3398398670, + 2909188485, + 3996843595, + 805382542, + 3313747893, + 3481849114, + 2681521211, + 1200783806, + 3010460648, + 627511739, + 3858056066, + 333702716, + 605338350, + 670263120, + 730649227, + 197730429, + 1100580631, + 1731787212, + 1121640221, + 12900075, + 3391234924, + 170222482, + 2018056996, + 650276008, + 956681687, + 2089939328, + 470095606, + 4269953397, + 1769619756, + 1612691451, + 1311774575, + 3097115273, + 1668328615, + 161908695, + 1608034215, + 2453179457, + 2057468633, + 3043858559, + 1498330511, + 3868256832, + 2149201001, + 2985322835, + 2428367703, + 3468619469, + 2418611395, + 3035695944, + 1463462124, + 1570538684, + 4213682618, + 2646023710, + 2282459534, + 203134453, + 3280688542, + 499406018, + 740266025, + 3995433083, + 2684708290, + 2786962540, + 3996907855, + 3540888241, + 2504152887, + 95140738, + 3410307732, + 4213281541, + 1130205300, + 1834247148, + 3085288674, + 1757496839, + 2638999860, + 944134568, + 429277883, + 1067024760, + 617238922, + 3488959294, + 741987661, + 3533927194, + 1237932260, + 1995572721, + 4246835548, + 127692972, + 602573069, + 1490010655, + 3279851246, + 2140276569, + 1067976333, + 3759403969, + 756452145, + 2530468147, + 68077798, + 2218817679, + 512488298, + 2952619615, + 411584404, + 1742607558, + 746518467, + 2323495073, + 659804361, + 2942619884, + 3094387666, + 568817846, + 2879746053, + 3466167065, + 2679379976, + 2761123490, + 1329585245, + 2002366789, + 3679068401, + 1269338689, + 3395199627, + 3800455758, + 3673241831, + 2885176066, + 2161360603, + 1524274471, + 1326722459, + 3172345686, + 3368252960, + 3254456694, + 3629314769, + 1845862028, + 2715209137, + 4168611558, + 1524295717, + 2784395814, + 2992195924, + 3880543888, + 124836284, + 3040090878, + 218181852, + 2886993195, + 1704884449, + 1159157773, + 1536949473, + 1110533636, + 2533310352, + 760201094, + 1121713762, + 3938196636, + 3861635442, + 4095223200, + 117486808, + 4016209518, + 3964941005, + 551196862, + 3888587901, + 374668424, + 2361695010, + 4160490124, + 848071013, + 2984698006, + 1217793226, + 608113933, + 3623689684, + 1171940966, + 982916749, + 3736315521, + 4220605762, + 2850639410, + 3596105656, + 2025885673, + 4179051022, + 3951152423, + 1295550588, + 3686027413, + 1069713201, + 3544311165, + 3646053791, + 1639194998, + 3215012224, + 1210495958, + 568432779, + 111218810, + 117568868, + 3623902778, + 1149326269, + 3733763850, + 3464838167, + 770265876, + 3562766163, + 3387916126, + 3267456042, + 1002733626, + 4151531329, + 157851514, + 1610490501, + 312055095, + 3131805395, + 776841067, + 2879382588, + 2986314302, + 269679171, + 3406030716, + 4068967288, + 4000906454, + 1756831720, + 37486536, + 3793273355, + 792421383, + 4070816373, + 105019835, + 1813040073, + 69360958, + 3405080290, + 1521867268, + 2105730871, + 2266564627, + 3028397809, + 4227097627, + 1372235213, + 2792045344, + 1008627816, + 3817395705, + 4275293577, + 3572559021, + 1590121875, + 3583369051, + 1022215899, + 3230960073, + 3537508057, + 1570188896, + 2088594329, + 1717763222, + 1869801634, + 1987190726, + 756019906, + 2474376734, + 1368442927, + 1088292116, + 2126187684, + 2433231968, + 3633264763, + 2100678921, + 2935112821, + 317754427, + 287068073, + 2186283649, + 572959992, + 3268887807, + 582466871, + 605740597, + 1823060721, + 1586061727, + 3111895428, + 695125864, + 1193778878, + 3655248514, + 432622350, + 3476660108, + 2932761860, + 434373208, + 2714312973, + 3039560485, + 1585095336, + 4074857722, + 2079918566, + 4109510854, + 460939301, + 3381598831, + 3365942715, + 1170217248, + 3411288949, + 3011202338, + 296265160, + 2591075506, + 946290134, + 896426416, + 1444209509, + 2460194899, + 811228227, + 3413044911, + 2374413040, + 3065359147, + 3820898995, + 819440678, + 4053324914, + 2896717853, + 4050742095, + 649133013, + 2145779445, + 4060542274, + 3337848814, + 1005314871, + 2232138185, + 3521560480, + 2939409198, + 1408340243, + 4061033550, + 2028675590, + 245729078, + 2022568044, + 204107741, + 1895299060, + 1381589737, + 806484506, + 3630866221, + 1520633492, + 2276423626, + 2191932884, + 241743326, + 2157896592, + 975413295, + 657676970, + 3124552504, + 2540517663, + 1534526342, + 2786995467, + 3208762368, + 3666336723, + 2159026271, + 3728621843, + 838384147, + 3737960495, + 1976756749, + 1882439259, + 3114302068, + 3645125261, + 1492932130, + 284632770, + 2739946427, + 1491763569, + 3318161332, + 771328911, + 624171645, + 4228996746, + 733364936, + 456840866, + 1443720601, + 1444266917, + 961217407, + 3736783322, + 2625621458, + 618487422, + 2889952671, + 2521664368, + 581333950, + 115523205, + 3428877624, + 3322968358, + 751765482, + 1794919031, + 1851508751, + 395964109, + 3339125842, + 970380309, + 675908005, + 4138210506, + 1224300211, + 777398559, + 3558332122, + 4287928453, + 3800252813, + 610534777, + 3784147937, + 2610778305, + 1877063966, + 4142701038, + 3067483222, + 3535300477, + 2093251237, + 2512229480, + 3537473195, + 2781969324, + 2928709818, + 4209870504, + 4212673161, + 4195822001, + 628434946, + 20399169, + 680195569, + 3405325316, + 4165465448, + 3199621403, + 391006568, + 3020231739, + 1150655869, + 495016696, + 1287151341, + 1799320233, + 1592803457, + 3352007667, + 895673102, + 622295143, + 2690066852, + 1840093360, + 1125655762, + 4183614611, + 3921871426, + 1531224510, + 1623852587, + 632427769, + 2484170829, + 1168786394, + 651206171, + 1658313593, + 2570586884, + 780584248, + 1130183763, + 1526530583, + 192039603, + 657220191, + 2804303289, + 3149434304, + 3698840016, + 815527660, + 267315904, + 3557221055, + 371644290, + 1078920840, + 2966475786, + 236719094, + 533820597, + 1759322410, + 2134324170, + 3543042376, + 3486470790, + 1583493125, + 165310541, + 642966488, + 2872788659, + 3609089559, + 3425356710, + 3297649859, + 1020106881, + 1481054944, + 828391201, + 2450594740, + 2965402655, + 1548936698, + 2295554854, + 3751037817, + 1034281477, + 2379874103, + 3930264439, + 953897250, + 3945677823, + 798204605, + 2216063336, + 3862632400, + 806917304, + 3811833488, + 2857989771, + 330021089, + 2310353396, + 2941899483, + 3708639458, + 649357133, + 19614190, + 710824980, + 354277345, + 1536729014, + 3111438706, + 4072091394, + 1074559321, + 3007149134, + 3548734666, + 1233947088, + 3386943152, + 1888647500, + 778313215, + 1890473053, + 659028458, + 3457078538, + 2371532230, + 2613624252, + 3353769794, + 3665815021, + 1464053017, + 2528854398, + 4061336510, + 133114235, + 2970603874, + 430720368, + 938382185, + 2213750276, + 3904566300, + 3994269680, + 3115933762, + 1473314876, + 1761727783, + 3612544130, + 1742321516, + 861456874, + 1140558921, + 94023417, + 2932725433, + 296132011, + 3486348595, + 1482584288, + 2983126516, + 3954326063, + 376192259, + 112816420, + 3423909086, + 1317318112, + 3607305526, + 3886213053, + 1930095157, + 3422259824, + 605178458, + 4274757605, + 1289885780, + 3843068925, + 2129966465, + 3560534089, + 3054852660, + 1783570279, + 224473884, + 3211113640, + 1563170354, + 110795679, + 1389123420, + 3959577935, + 2475945767, + 1091123226, + 3338933854, + 3753637060, + 4252581207, + 4240158440, + 1075574471, + 303603195, + 722016277, + 2048045598, + 2065425101, + 2290205344, + 192836548, + 1595020194, + 1535687228, + 2740465183, + 4243679716, + 2016675028, + 1518584331, + 481735219, + 3114135543, + 2147918223, + 2756601381, + 2649303924, + 4195758532, + 1508962547, + 734820573, + 3859653061, + 2138551323, + 1870138629, + 3713575137, + 164253173, + 974590166, + 3503054001, + 3660107, + 2671479156, + 3006228680, + 4089920500, + 4017796477, + 91733397, + 2434950332, + 3129899726, + 933034494, + 2283654263, + 2013383097, + 2960347433, + 202595399, + 3627841482, + 3051347326, + 89185989, + 3021877967, + 3971994324, + 3048115581, + 1947389766, + 2751014574, + 3529624507, + 761867444, + 2365316800, + 878594981, + 1058702954, + 3668378242, + 2424436780, + 3773473547, + 1236777427, + 461080454, + 245416317, + 1255236154, + 564692917, + 874372578, + 1759848312, + 4245563883, + 2625867528, + 1251399478, + 3258095919, + 1707501563, + 1621441395, + 3653245978, + 3338093925, + 1844047354, + 609432765, + 4043076648, + 3596340820, + 1159222404, + 318889338, + 1244971793, + 33743028, + 2484015238, + 3199014596, + 3798442175, + 2886175296, + 2632855092, + 2650544721, + 7661489, + 1724027283, + 3351085665, + 2586932183, + 449423177, + 3383978590, + 1479039317, + 2989368257, + 953549857, + 2288116373, + 2739866108, + 1551183128, + 871077340, + 1776269110, + 750109399, + 1049794974, + 359889247, + 1320841836, + 3743701692, + 3778613300, + 830351589, + 2217221932, + 1924872036, + 826615609, + 3776538777, + 1467182420, + 3132227816, + 3891007509, + 1634176526, + 2418490955, + 2457888601, + 715746701, + 3259171455, + 2148298870, + 549173429, + 3193173715, + 140556503, + 2068092668, + 4136795761, + 1532754588, + 1116145038, + 1709717951, + 1779552939, + 2111923500, + 681109334, + 1092540987, + 3094838379, + 793437071, + 1927534097, + 2458058573, + 1155011331, + 1203368225, + 2727874645, + 1154185207, + 4018580584, + 925142092, + 1408126118, + 2460276703, + 592363969, + 1513657813, + 1044800096, + 2055859668, + 2138483279, + 2068913499, + 1901909202, + 1238614719, + 852830351, + 755014383, + 614390969, + 4201976112, + 1062162548, + 613762219, + 742617446, + 3982563554, + 3283156464, + 2891989882, + 1701096272, + 3545497023, + 3116480170, + 1280650672, + 89638690, + 543600768, + 414954931, + 916838693, + 396111724, + 2803316982, + 3135475405, + 2621976653, + 1218090804, + 1838856102, + 2056717153, + 4252295202, + 2479296686, + 3858412115, + 81575522, + 2695465, + 1497111895, + 657285612, + 4096303717, + 2148167051, + 3234692487, + 3536488812, + 2468609849, + 1428348346, + 3326767017, + 4178677843, + 3111757296, + 280762683, + 1810191247, + 292584877, + 3177789092, + 857234507, + 1483876851, + 3305232977, + 3303665590, + 1106977696, + 3012850001, + 293192674, + 4100380873, + 4065213294, + 292718178, + 3796005011, + 1357905486, + 3991794681, + 3877808677, + 1547153577, + 3058828948, + 2302130107, + 687088202, + 2794880840, + 2758201250, + 970073658, + 660745174, + 1411608176, + 3484647224, + 4162299755, + 1330833541, + 1344352075, + 1060714531, + 3607273385, + 2041677095, + 1679791697, + 136514133, + 2041573357, + 399458458, + 1817051975, + 35970409, + 3917211363, + 2015347176, + 1110815947, + 1894432990, + 228092828, + 3311719313, + 1771395734, + 1806581333, + 2741010105, + 343549949, + 897289835, + 3032414537, + 1863179671, + 1318444013, + 2481581533, + 133945180, + 1253215175, + 3369775037, + 3266192253, + 2354242305, + 153364984, + 1435311652, + 2205368407, + 829660370, + 4217578952, + 2035950103, + 3353794168, + 453736743, + 4209812929, + 3955222419, + 4235516587, + 519123041, + 3861332504, + 4227800212, + 2965198358, + 2522763709, + 23071476, + 1768909344, + 3843385402, + 3921324496, + 3732833027, + 2873282045, + 1215567135, + 3934309468, + 3920805102, + 1505344881, + 710576978, + 546996906, + 4291748102, + 1008354390, + 2066548645, + 3584424033, + 3588295552, + 464062808, + 3191050955, + 344796141, + 1575326388, + 4060677689, + 3008038648, + 854434551, + 3574444180, + 3460100178, + 4036724387, + 4285228462, + 2341589197, + 2015700204, + 30987583, + 2416765610, + 23010992, + 1421687213, + 3150696836, + 3672158068, + 3809678980, + 3377988762, + 3196043144, + 2467302244, + 4109504393, + 2162767168, + 1773914206, + 1060456426, + 4292166182, + 365778826, + 2931779037, + 1478050019, + 2042666856, + 3778999971, + 1019086753, + 3939643012, + 3972089217, + 835990986, + 459864936, + 2278792042, + 412565492, + 3559136038, + 1307354758, + 2826086112, + 2000514003, + 2940213471, + 636820690, + 820799067, + 2759782365, + 3396378543, + 1835457760, + 2422061146, + 2741158086, + 236745169, + 328317332, + 16089180, + 4107985251, + 2115937918, + 1650787199, + 4048741791, + 3805806194, + 3685458545, + 519936796, + 1117714819, + 3217226175, + 2836889637, + 2337232716, + 1259711607, + 2511514651, + 3329792855, + 2314992349, + 2715523876, + 441125223, + 3508138434, + 439861073, + 2098616385, + 1867851310, + 332314110, + 3484597916, + 3567775387, + 1954704870, + 2701215805, + 536331925, + 3228997190, + 1366245070, + 1443179705, + 20863047, + 2891060687, + 973005577, + 1599156277, + 528357839, + 1034396049, + 788779813, + 187353349, + 924587127, + 660921838, + 3137221060, + 792630083, + 3325180090, + 4103947754, + 2990960220, + 3982570023, + 1577647261, + 3914515593, + 2495934172, + 1036046789, + 1577869927, + 3323701611, + 1065061057, + 238954938, + 397765400, + 2903281650, + 496375122, + 1017033787, + 3934993808, + 3391441282, + 3780082448, + 3510075126, + 1317329180, + 1099800849, + 1932461563, + 2366054921, + 3193578248, + 2035925272, + 1563458752, + 3213674215, + 3950083689, + 453595521, + 3114919314, + 2352423675, + 3707005255, + 2982760374, + 1585428093, + 649308520, + 651439341, + 2859265510, + 2959808702, + 3157962102, + 3047169394, + 1488167084, + 1653907712, + 2432084642, + 3243590989, + 1978755519, + 1497266055, + 2109009651, + 2420007163, + 2129360003, + 2026058002, + 1645936315, + 1430277139, + 264213150, + 2213607706, + 236396627, + 435286657, + 3969222800, + 2544226494, + 3414415347, + 689647016, + 4252074854, + 3947412815, + 2248857525, + 805134503, + 2968585018, + 942104104, + 907078810, + 159474099, + 2644400282, + 779835596, + 686059271, + 3978011090, + 1840689239, + 2815340481, + 69722469, + 3687925704, + 991155651, + 706042752, + 2847638855, + 601221863, + 672064648, + 1996511057, + 2104066903, + 360999790, + 2295884292, + 2056016000, + 1436197494, + 860034645, + 2361893514, + 3382319541, + 851587325, + 390673040, + 2137490190, + 2439402439, + 444430740, + 3581795256, + 2464734612, + 1917530583, + 2407603484, + 57116417, + 1522730320, + 513068832, + 1063234985, + 3325940652, + 803752642, + 4065539816, + 394096116, + 1743577897, + 215387268, + 2109400955, + 1035591327, + 2599486760, + 1319102091, + 1939925081, + 1932139723, + 2202344875, + 2357668114, + 1340412880, + 81450363, + 4246872022, + 4234699347, + 491290156, + 18022572, + 1941999813, + 1896679722, + 3694926638, + 2218265950, + 176945773, + 4170369278, + 3217922867, + 3912824811, + 1990245434, + 2392732196, + 680942563, + 136588675, + 3511253309, + 3813050706, + 709592331, + 2443786646, + 599279818, + 759595324, + 3350389182, + 3781406188, + 1636366361, + 837325583, + 2167108439, + 861458278, + 2879065048, + 169633335, + 93653021, + 3819703464, + 3387639747, + 2904462061, + 3103588147, + 2349108, + 3085163212, + 3263557363, + 2983785415, + 696987550, + 3253084898, + 1086501949, + 3447868153, + 1645160337, + 1413925883, + 197864773, + 2147550073, + 2068342793, + 3410586579, + 4072297712, + 962599407, + 1096448695, + 3142974176, + 4010291425, + 1312899945, + 1123155976, + 2580611808, + 2552414490, + 800876072, + 3183291174, + 3674686150, + 1688386204, + 2351758014, + 196928308, + 954724955, + 2588884608, + 2474637862, + 2459736548, + 2541826618, + 300505620, + 1490297766, + 2164513448, + 2235501877, + 237977615, + 3613394187, + 3881642472, + 3995518743, + 2167863954, + 2716141542, + 2431835439, + 3914563245, + 793406279, + 2219360567, + 2243177930, + 3782173694, + 1639312954, + 2346751445, + 1065948439, + 3808393377, + 1817883679, + 1775574494, + 2228613709, + 3111072120, + 79796634, + 1037250020, + 1443644066, + 4124728855, + 1763537799, + 2359683701, + 4263545527, + 3841613432, + 3195001381, + 2972515171, + 4047339540, + 1756991226, + 2027238437, + 3514395897, + 2261222801, + 2722673239, + 53509616, + 1157714650, + 3312071128, + 1577930175, + 1492447762, + 348822798, + 1297588246, + 2082086192, + 2125356384, + 1396989311, + 3530138687, + 1059160057, + 181073081, + 1663486080, + 3882090733, + 2246396774, + 725367627, + 4269955070, + 869822537, + 1551596877, + 1184818399, + 887119874, + 2833688226, + 2991989262, + 654364229, + 2911692011, + 2301408155, + 2548059167, + 2015266909, + 2015950796, + 2615174825, + 567648231, + 3882575740, + 1395149259, + 924623731, + 2483098135, + 822394059, + 2567331665, + 2683676676, + 709501248, + 1108959946, + 1899086668, + 1427755965, + 2266737966, + 3177489110, + 3798427965, + 2057758856, + 4233082064, + 2638806975, + 379719924, + 134218069, + 3478715500, + 149314541, + 3414242622, + 3198196492, + 3647955315, + 3135004222, + 527504193, + 833836710, + 2310663247, + 3554116832, + 3112339136, + 2261308367, + 2728874686, + 243039804, + 3236546111, + 764057702, + 2914974272, + 558064566, + 1450046956, + 2120314241, + 2471919619, + 2581294108, + 3238958126, + 1682916153, + 2947306545, + 3963790201, + 3368315357, + 875252749, + 1235132336, + 927793412, + 3059857444, + 57114807, + 2857693518, + 2366006836, + 166058491, + 3809324069, + 1373821485, + 3351247961, + 1596855015, + 3478077792, + 1313903052, + 2104966117, + 2613878407, + 2504323468, + 1379572026, + 443943375, + 1328207268, + 677539895, + 3073635576, + 792446049, + 3140598941, + 1372668661, + 2975609796, + 3289404637, + 751044867, + 2663984694, + 3383055917, + 765179813, + 772752784, + 1005422527, + 2163814183, + 76122343, + 261829482, + 4037167981, + 2147708302, + 712064341, + 2935375633, + 1692933219, + 1488998301, + 2549054833, + 1142543241, + 9875949, + 3127743734, + 3937359401, + 1061471663, + 850999350, + 1403179854, + 294296316, + 1355439733, + 716208516, + 2164971035, + 3531069290, + 1878855541, + 2876922607, + 651959370, + 3252777399, + 2560557958, + 3323065099, + 1882842949, + 1167151688, + 299535438, + 4135972863, + 1131499147, + 72017085, + 2628648431, + 3284551475, + 1560472789, + 1021365161, + 709708936, + 3145999153, + 4105639980, + 2472116977, + 4030863797, + 3031531255, + 2267822511, + 3082456603, + 1839241541, + 1066035281, + 842533859, + 799505920, + 1085943937, + 776316118, + 3045366034, + 1635191031, + 1858952211, + 575091608, + 2982570633, + 2602102629, + 3535111676, + 2987133024, + 2884929575, + 697181535, + 3956033342, + 2195270821, + 3049230771, + 990335776, + 3606785572, + 159596291, + 23046518, + 4234414803, + 3442389709, + 3997222612, + 3281447548, + 551253239, + 3522951912, + 3167819901, + 144051649, + 2993314372, + 3074069625, + 3082035344, + 1957011238, + 1819674839, + 2161362277, + 83341577, + 3213159573, + 2096053743, + 1452277606, + 652999696, + 2847462586, + 3937029092, + 3682783453, + 142193482, + 2847362240, + 288172757, + 1713973816, + 1371665498, + 3110378916, + 1567884291, + 1183592128, + 1067054158, + 3285851220, + 2361002810, + 3031551460, + 363219041, + 2593081794, + 2431537671, + 244151613, + 2626312350, + 3986264022, + 1179987719, + 3894923410, + 584030422, + 1757460599, + 2189535689, + 2145279837, + 4035348040, + 784289037, + 1011875214, + 3348604674, + 2894044010, + 3721828913, + 3810671617, + 916278736, + 1052720624, + 4091973543, + 1713010916, + 1729174392, + 817600757, + 2275662554, + 2661020511, + 3132065574, + 807628966, + 215329705, + 483541431, + 2833544976, + 3530282056, + 3950657723, + 1334370345, + 449822822, + 696427986, + 1415396108, + 1438713810, + 3784250005, + 614401826, + 1567288850, + 1557989864, + 3990040078, + 782357083, + 856658826, + 1299109537, + 2755231958, + 689920063, + 823923882, + 2109731661, + 1076461474, + 557277685, + 544365810, + 398477002, + 1851508099, + 942315316, + 2381896220, + 3201560379, + 2239549004, + 3155074513, + 1322760416, + 3694057028, + 3692840875, + 2987104416, + 2177657623, + 637264552, + 1068409916, + 2136641773, + 1925671435, + 2435175841, + 3179798902, + 7227191, + 1526600569, + 262797768, + 2618508037, + 384031662, + 2369795667, + 4108134812, + 1118145984, + 85609570, + 2356992655, + 2126926228, + 129404400, + 10077578, + 538773771, + 497987715, + 413326165, + 3737638960, + 4193337304, + 1749969057, + 2221891573, + 1352066872, + 880041699, + 2902445636, + 1088990105, + 2920271742, + 2628198447, + 3120205316, + 3160612647, + 3233843860, + 2895838590, + 2188458436, + 140786947, + 3497972266, + 3768173707, + 2064502080, + 1183638212, + 4094019817, + 4220501434, + 777226877, + 87949194, + 4166844069, + 1330680326, + 2138525343, + 2055987069, + 3435056364, + 2115232402, + 1221006195, + 1312330179, + 42761877, + 1588266298, + 3043303577, + 794491722, + 483946216, + 2933027297, + 813786395, + 1289696451, + 4255035268, + 1072699154, + 960018941, + 1401495896, + 3936439769, + 3404051594, + 1285423917, + 4138436480, + 2712045681, + 1091840467, + 3115214628, + 960766401, + 428097546, + 2982790759, + 3655065512, + 1817047913, + 2639542239, + 2782689259, + 3817081441, + 4026230252, + 1859227939, + 3832694547, + 129730887, + 254999970, + 1717654907, + 1387489330, + 3926840011, + 1482052799, + 3995626794, + 3522243524, + 3756694163, + 1108068369, + 3959648421, + 885141291, + 1506665475, + 3795449797, + 700712539, + 2413725965, + 4252475925, + 2467333285, + 3680946591, + 2604943182, + 2756697109, + 2338684995, + 1706252065, + 2832707740, + 4196715131, + 4259374294, + 2197477645, + 527382814, + 2858245452, + 3602775564, + 4228935952, + 1071742497, + 2409360047, + 4160287239, + 1238381702, + 2866983379, + 3764728060, + 1784469165, + 772971143, + 1561356704, + 2946428176, + 617878276, + 3205643256, + 3523818071, + 1486575028, + 2997433960, + 2478971270, + 1229957064, + 257495483, + 2041906738, + 1199858698, + 2646437486, + 4246496434, + 1615329778, + 2219021398, + 1840960301, + 1391499486, + 2200011518, + 3036342467, + 3924784084, + 84952565, + 3263060886, + 298567315, + 4062975837, + 3178001157, + 3579592325, + 3492021438, + 4058976337, + 3829583984, + 2882697265, + 3647153675, + 674480001, + 3926656793, + 3606213053, + 1440550943, + 212487967, + 1583406505, + 104638314, + 3152567858, + 168780516, + 2264537820, + 1045042579, + 50632410, + 3810198531, + 4108081603, + 1613749831, + 1962652319, + 2847574016, + 4266093105, + 230230747, + 3544810400, + 3168389228, + 1671883794, + 2658507745, + 80041147, + 1360078141, + 3519470012, + 740064686, + 2398250648, + 2984797202, + 106202432, + 342809727, + 1514292402, + 4017312389, + 91695346, + 337405358, + 524798171, + 3090467622, + 2735871504, + 514017017, + 565091190, + 3906124184, + 58160522, + 1663196816, + 160296197, + 3454997567, + 2185929129, + 3008562018, + 610769834, + 2031259888, + 4292133646, + 4261279929, + 2696845329, + 3502322694, + 3478275340, + 592044986, + 1175893593, + 4152472085, + 1783854671, + 725278183, + 1258164585, + 299666415, + 2318182686, + 4095218587, + 3822784744, + 2898916379, + 2618624506, + 1856438456, + 2899807545, + 1821434385, + 3525301589, + 1190321888, + 3548511751, + 3635017491, + 1339328706, + 3044681331, + 2697186683, + 4186568168, + 236008559, + 601648351, + 1039358187, + 1415995630, + 3227023297, + 3137870607, + 2507760569, + 1575658338, + 4215661826, + 2832000518, + 756723083, + 3627331136, + 4059318751, + 996167755, + 2385233313, + 3370087258, + 3995739397, + 1816872054, + 2142947331, + 4225097082, + 3430635753, + 1018155365, + 3078847586, + 3367977836, + 952299720, + 501848951, + 609312457, + 201968310, + 262515751, + 110883366, + 3996590580, + 868532131, + 2312474814, + 1191322483, + 2432439419, + 1160645711, + 210796323, + 2419767225, + 571667485, + 866873764, + 679011413, + 978341280, + 3755348519, + 4139533512, + 834030377, + 2409994735, + 2017852320, + 1727411538, + 729306866, + 1915582003, + 2156840194, + 189668386, + 1498715180, + 3404084543, + 4289400982, + 504770716, + 672448094, + 2880337079, + 1382033166, + 1933595126, + 3093543846, + 458340580, + 4026211487, + 2764959629, + 1209206419, + 2862408991, + 1404768091, + 4154318873, + 2101216481, + 285628865, + 269934530, + 948399517, + 2031030846, + 687121209, + 338878529, + 3245747476, + 1460004037, + 3583730411, + 4169817607, + 1622389781, + 2647057695, + 513234962, + 3676868773, + 3925914479, + 3522395981, + 1173949539, + 1246155317, + 1819628131, + 1414974276, + 3319178996, + 1648032084, + 372992594, + 1009223406, + 3540457367, + 1973201001, + 1257540670, + 3439797454, + 4015937703, + 4051096017, + 1788038452, + 3028888602, + 2892249670, + 4020327657, + 3442472958, + 1463085667, + 300258449, + 2985416541, + 594069974, + 3099685492, + 3457253571, + 2092807482, + 836899412, + 689841502, + 2829827577, + 2108919136, + 117276781, + 1886069523, + 568953040, + 2349566260, + ]; + + static const List _envieddataprivateKeyFCM = [ + 1279324886, + 662806985, + 3573060439, + 248874219, + 4233723744, + 3285043500, + 2630458596, + 933524371, + 2538237067, + 768558994, + 454998795, + 1636897548, + 1695959624, + 3572055503, + 397192581, + 479484564, + 3360553434, + 2693542025, + 867142847, + 982018899, + 3739553315, + 2665060145, + 4094912094, + 2428771751, + 3904058, + 1099107201, + 1187285827, + 2875788095, + 2140106345, + 2599920236, + 245888786, + 3103987845, + 3484709445, + 2445819208, + 269360740, + 2870785699, + 3494295994, + 2186398045, + 4129629240, + 1384501482, + 532926593, + 1467762526, + 3966026822, + 3985340571, + 2194011904, + 1102261066, + 3126146862, + 3384467914, + 2347086773, + 3515327742, + 3435863475, + 2703679343, + 2891934782, + 1893811374, + 2917625754, + 2606555229, + 207557128, + 1430868523, + 2681823461, + 3321714843, + 4076821364, + 3876126074, + 3018025748, + 46752351, + 751875701, + 2687751001, + 2493589465, + 281238138, + 1392016503, + 1858833284, + 1676449891, + 2759261001, + 185136160, + 2284614682, + 2558605298, + 2960518449, + 1299669850, + 2350161077, + 16064425, + 3910982402, + 2008416960, + 407547858, + 3118350782, + 3293433148, + 4091664088, + 2423551746, + 1683148593, + 3432837836, + 238582552, + 107638092, + 2732344020, + 3975360983, + 422135878, + 96195584, + 1597835219, + 2681376787, + 3274358093, + 1818034878, + 3341389759, + 419404667, + 2574758837, + 252695507, + 1048200250, + 3268075423, + 2409160371, + 771145959, + 1185118026, + 1694497202, + 459547795, + 676668007, + 2931249292, + 2309203677, + 2742377037, + 1476671875, + 291393547, + 3963059077, + 2687925121, + 2333196171, + 2039531931, + 3868674748, + 3251656920, + 4129482306, + 537098498, + 2036688869, + 127471710, + 1704463024, + 930295885, + 4186432046, + 1938967440, + 2948635229, + 1976418079, + 2310394898, + 599352119, + 2551533006, + 1551539448, + 3652950199, + 2689793505, + 3746914930, + 3290973024, + 2341551681, + 3216063305, + 976395655, + 397965148, + 2862779279, + 407461524, + 3554446222, + 1401256109, + 2789888879, + 214115035, + 1836880879, + 3045688983, + 2252442381, + 559151378, + 955966478, + 2584324446, + 1347819113, + 1241980821, + 670123376, + 442575908, + 4292310754, + 1213578378, + 4065098652, + 263616838, + 661276593, + 3965778985, + 1741842249, + 810319360, + 1609570472, + 1854028620, + 2576896958, + 1750042936, + 370761461, + 792214796, + 393825340, + 4194907067, + 405901813, + 2266069439, + 2767386745, + 2335424474, + 436486671, + 782956074, + 469346373, + 4143226626, + 4094633103, + 3999904053, + 3242400390, + 2517592061, + 3624786183, + 111823179, + 2073713998, + 2137141296, + 2853917483, + 3160747931, + 792012513, + 4146319979, + 1910365975, + 2218240240, + 469565148, + 397417916, + 785378009, + 2289490615, + 1034292049, + 1250846702, + 1696619111, + 3623641749, + 1292332679, + 4249317934, + 3006030157, + 2523368971, + 424311392, + 2213959190, + 4174793274, + 2506267990, + 2014370936, + 1591040072, + 3623894620, + 2306075371, + 3482174390, + 1847537366, + 3061488470, + 3603171666, + 1758980793, + 1285476689, + 724408367, + 2480446768, + 2146688690, + 2739074113, + 498871905, + 3353689463, + 3388389235, + 3346375762, + 2325253045, + 2390294888, + 1154741699, + 1504993805, + 1282124055, + 721971245, + 24857047, + 1167052719, + 383537953, + 235607738, + 4175610533, + 1073960078, + 3500791266, + 3699969304, + 1016485239, + 2465839437, + 405657353, + 1987549897, + 1029024668, + 1923774878, + 1463128127, + 2744597087, + 31094098, + 1350466643, + 1056091296, + 2406166046, + 4173589538, + 4077953048, + 2689385003, + 3838283156, + 3729448321, + 715218368, + 4023298979, + 279372347, + 3034273497, + 2590768014, + 1419110830, + 1437379757, + 1612246863, + 2875217093, + 2350993827, + 386010732, + 4099493275, + 1816392145, + 2132833179, + 3621348864, + 1107686739, + 3141789262, + 2143679560, + 464765225, + 195300053, + 1138259266, + 3510535479, + 3272381888, + 3240600416, + 2312848745, + 2567911661, + 178954473, + 3237444771, + 3802718463, + 2909482068, + 2538731774, + 3954242080, + 1698413327, + 1228779786, + 3004078511, + 3367118836, + 3865637574, + 2655570093, + 3113592806, + 58137924, + 446426548, + 2538541486, + 1042910889, + 3786911866, + 21677590, + 613714848, + 1304372575, + 2374222616, + 467999331, + 228581455, + 3960995091, + 719625735, + 1364823224, + 3069278263, + 1131576662, + 285238855, + 2623665741, + 2729318933, + 2947952648, + 850212901, + 2711382126, + 1046114203, + 340528874, + 3553499133, + 68801141, + 3366182049, + 1464491087, + 657625164, + 1725974432, + 3783405594, + 2785813541, + 3898744397, + 397199949, + 4216621968, + 440350147, + 424214301, + 120469059, + 3575889626, + 801123562, + 1013859453, + 4284411462, + 2798070151, + 1594042029, + 1463908757, + 3685343638, + 1057833288, + 3710507759, + 2466877712, + 3930018748, + 1490141635, + 3802831467, + 1502852269, + 2536704493, + 3882517584, + 2589438811, + 1718869732, + 3560182539, + 2309987322, + 3843946306, + 82685912, + 3899015613, + 3675211913, + 3743974184, + 346469984, + 1248030136, + 1057889963, + 3461009640, + 4047796387, + 1486000569, + 1744095049, + 3197389515, + 787249537, + 1306573674, + 3267086422, + 2136229466, + 1559308514, + 4065594540, + 762338925, + 4076022486, + 2412539813, + 189320781, + 1625852725, + 918059043, + 1133099022, + 810669220, + 4239771863, + 2481374125, + 154758307, + 661787935, + 1369230926, + 1413165669, + 3440871432, + 3597282607, + 536602729, + 1340378868, + 2357214296, + 3060217357, + 1220964900, + 1651603293, + 3886164127, + 663233727, + 1910377448, + 3228224725, + 902720132, + 575847774, + 294922789, + 554062844, + 3960883309, + 4281843126, + 2488101416, + 3385862555, + 2512544368, + 688801178, + 3389447547, + 715674876, + 2862522142, + 1190831427, + 1670963375, + 921515445, + 18056832, + 2467595902, + 2155953767, + 919664232, + 784918938, + 2243585162, + 2911772972, + 2174177911, + 466763367, + 3265840524, + 3817949194, + 2582825677, + 580265829, + 2379187998, + 1495885045, + 1404002520, + 3926820824, + 4033938249, + 1818733567, + 1545321754, + 1195728047, + 714991493, + 1876458494, + 3581720206, + 3927992962, + 3308052048, + 2641216644, + 2025194320, + 696579605, + 1328137917, + 1742882801, + 472195947, + 1209358190, + 176746071, + 3821123046, + 3140474621, + 1017441147, + 1983363580, + 2903195067, + 3249920825, + 2377150526, + 285286590, + 708714335, + 723289090, + 4172659341, + 3251422624, + 2849440335, + 4038468155, + 3994216306, + 3991484234, + 104340444, + 2563208796, + 4160938037, + 2031648843, + 273190374, + 670798975, + 1578347774, + 1467222854, + 3086214965, + 3493568199, + 3148667807, + 2131988363, + 3473061605, + 3650344483, + 1857696171, + 2426387606, + 3576219966, + 3214479941, + 4156931800, + 3611674736, + 3461037787, + 202538316, + 884071752, + 1219330210, + 1760985542, + 3694827656, + 3956711676, + 4140414837, + 1897725280, + 1529104932, + 3309886858, + 3019665028, + 3257164232, + 4201803466, + 2096630629, + 3313240046, + 3003709924, + 1282772500, + 4144842502, + 2710028273, + 1082068198, + 231456698, + 1328902776, + 1122638314, + 3029769667, + 3499783391, + 191797219, + 4277276943, + 3476999613, + 3205480392, + 2794949113, + 106421189, + 2819817569, + 2245773961, + 776684723, + 2455759829, + 4132304060, + 3024214983, + 230589955, + 3388157614, + 1358402174, + 1639879021, + 1290540436, + 2759607070, + 3502724873, + 3268901332, + 782662797, + 2183220927, + 2858323515, + 353111583, + 279865837, + 3293453964, + 2385982341, + 1478219788, + 4020118642, + 1464403431, + 1528376213, + 3061459497, + 3306499023, + 431112653, + 781466206, + 440387198, + 3342771696, + 573370861, + 340686789, + 1142327310, + 857784550, + 1453685706, + 1292332893, + 2671071258, + 2048204027, + 2616681300, + 884417905, + 4279183679, + 3244846516, + 2264143557, + 1185596360, + 1193225660, + 1610946983, + 3818825456, + 2077008776, + 3404538296, + 227554269, + 2900252325, + 678707047, + 796928480, + 3904270606, + 3710272655, + 2807154748, + 1722258547, + 3675203003, + 199863033, + 1817125878, + 2447042574, + 2772110207, + 81313294, + 3248547319, + 512320149, + 2660370035, + 693113314, + 284129737, + 2769466086, + 2284376239, + 190099013, + 1394528575, + 124777739, + 1828526561, + 3794258926, + 74591392, + 1509631606, + 3931920756, + 3672226323, + 2823976517, + 786933044, + 628229163, + 2757127782, + 391830346, + 2766045296, + 1532808970, + 1930224723, + 3085778848, + 3537937069, + 4067674734, + 3408170319, + 3193491988, + 2565096392, + 3066090864, + 2317533231, + 3548688962, + 1167410619, + 2329795630, + 4291028593, + 1416516355, + 1764415219, + 1864194959, + 2972786845, + 2916829268, + 4166151110, + 631374452, + 3405622228, + 364324383, + 3930154729, + 1769566084, + 2671772043, + 3935674186, + 4076525837, + 3569198982, + 2461109991, + 3410757165, + 210407521, + 827700492, + 267585998, + 3617930828, + 3312368106, + 642690062, + 155053706, + 4201418864, + 1331410047, + 3352930547, + 3009385713, + 2319880705, + 537233181, + 58056738, + 1595655624, + 2820989780, + 1811237249, + 4080262398, + 864222243, + 3340377783, + 2093768557, + 657712795, + 4290044805, + 2996170233, + 1121074702, + 45455858, + 3019058211, + 562206940, + 1766835890, + 2213867195, + 3494755247, + 2886541330, + 495301079, + 2891646593, + 1533169082, + 2648129971, + 286411123, + 1739010506, + 3306970989, + 69530289, + 2975197987, + 2505509070, + 3345251985, + 1966944142, + 524649220, + 4196039704, + 2066063663, + 71812681, + 3795655746, + 2466475916, + 4234074904, + 515689408, + 2267109193, + 442629396, + 12068930, + 901378986, + 1386990755, + 4281127897, + 2084810318, + 1623159272, + 4067761691, + 1734682721, + 3862207282, + 2644998658, + 2259480494, + 3430191081, + 3063696026, + 3198640730, + 3650042809, + 791754134, + 2856980124, + 3436397178, + 2645644832, + 3737153801, + 2957515672, + 939320120, + 136075785, + 77815169, + 1675220602, + 2328017809, + 1284494793, + 3792103628, + 2087288695, + 832697927, + 2754682109, + 2439614766, + 3428815864, + 1304064278, + 2760975820, + 2829492762, + 81252785, + 3365474096, + 2893149864, + 1113377440, + 3472037957, + 2404946171, + 1922854266, + 3953600716, + 3545068008, + 2761966338, + 4093718454, + 266553993, + 1890394344, + 80779933, + 3875137142, + 1360336461, + 310989090, + 150468992, + 3513758441, + 986396789, + 2430273076, + 3838731621, + 4253425187, + 2339774569, + 590365941, + 4268206406, + 321386075, + 3491258516, + 2585950344, + 4245664862, + 495233592, + 1022167758, + 3584053130, + 3049513728, + 1520085258, + 23098893, + 1834488268, + 3291616705, + 1206743461, + 3422649130, + 2504839056, + 4265398677, + 846818267, + 1470623669, + 1773107295, + 2439445788, + 3914651065, + 859713597, + 420480518, + 2311712981, + 3651233107, + 48196762, + 1042979592, + 4210650518, + 270665709, + 1182977797, + 904368664, + 147197469, + 565835665, + 2516860631, + 3574362368, + 2522395753, + 1119936937, + 1612064825, + 3979787638, + 3840940015, + 3069073733, + 4166687494, + 2501173928, + 3255362073, + 3619783791, + 420900000, + 44233494, + 1547498159, + 4255187873, + 2944520243, + 1506911912, + 359829631, + 4250656908, + 3351895230, + 1810869166, + 2189803082, + 4052769775, + 436049772, + 293294692, + 3608442233, + 3916649599, + 1197519964, + 191918794, + 490342272, + 1362798577, + 1023881432, + 689265264, + 411221774, + 1074513909, + 2792375980, + 3873393606, + 2220920994, + 4143109082, + 2362545018, + 3146595405, + 182482647, + 800436475, + 11161966, + 828769873, + 677380855, + 1461405875, + 3347318590, + 3805774785, + 1021864061, + 1040842956, + 2189758624, + 1535525576, + 1423140630, + 3669263755, + 1469364165, + 3693589772, + 1695297394, + 4012996627, + 3352013040, + 4225758589, + 2011744391, + 2222299088, + 1935836765, + 8884388, + 2282316767, + 334268724, + 2817468592, + 1268537539, + 3676574098, + 3744881697, + 1063244888, + 2874875182, + 1141673269, + 2276808920, + 2003873845, + 950997660, + 1403834530, + 1868876688, + 3010709801, + 1682279043, + 3354233247, + 330779033, + 2341749576, + 759863287, + 2767390466, + 1295384942, + 340761785, + 2544244172, + 1139817679, + 3436078098, + 2539984447, + 1550588477, + 3780056932, + 1828707529, + 3831762478, + 1453053, + 3238274671, + 3631437571, + 210756521, + 28133247, + 725609867, + 1675783060, + 3632300837, + 3019488523, + 1618754624, + 1221214519, + 3723829443, + 843366761, + 1430774038, + 787842204, + 701861211, + 3588171823, + 819578288, + 2503073862, + 1569134580, + 3357654277, + 2717571227, + 1084514135, + 2431836446, + 1466042201, + 3863212612, + 133235698, + 4114325387, + 3774714977, + 2558144476, + 2825582421, + 3450280538, + 2672661963, + 654073554, + 1158222262, + 3411133083, + 4191651507, + 3456561816, + 2422637808, + 3964776497, + 3989225661, + 1290702099, + 1712057688, + 3557132967, + 3881985685, + 3272991247, + 1704351741, + 2776182611, + 4056479906, + 1469162558, + 554679713, + 4175299484, + 2340587146, + 499565611, + 4087324713, + 2737126584, + 2578993740, + 4090987598, + 722820754, + 2591310715, + 561557415, + 4152334314, + 3362393198, + 297394993, + 2302743735, + 2642050029, + 238136529, + 283509968, + 3692724484, + 1794896167, + 1710130954, + 1288356820, + 1599107096, + 3386823149, + 3132620866, + 2072064905, + 4139856937, + 4172904184, + 1841609730, + 2969860384, + 300064787, + 2072780989, + 2313766631, + 3905829492, + 300468346, + 218926672, + 2111463558, + 1764524959, + 3528862054, + 2232265007, + 657585348, + 203070342, + 3473817913, + 1845458748, + 2433371704, + 1319167073, + 1952251644, + 2308639470, + 1883107652, + 1836897898, + 2690241818, + 145466816, + 712934268, + 2205961603, + 2259923312, + 33948094, + 3872249919, + 1340253465, + 3995944943, + 3865229494, + 1944604101, + 1942486348, + 1210584267, + 587084046, + 3100608168, + 3169384087, + 1730840732, + 1397771372, + 3792341853, + 3472668688, + 3521044104, + 1077328263, + 1749817479, + 3363417297, + 1685760297, + 3251199948, + 94115788, + 3840485430, + 500284971, + 3362550185, + 4236164861, + 3788699719, + 2787960264, + 2948187809, + 479233043, + 3918634785, + 594387578, + 1128123229, + 467663936, + 326850411, + 745015321, + 501198690, + 1731174892, + 984479919, + 2824177029, + 2585610427, + 3880155486, + 1392403943, + 1250245579, + 170168406, + 3089227709, + 2890062763, + 2381187531, + 3935314521, + 1348412035, + 2602852138, + 2752572161, + 286523516, + 3016390512, + 4217893612, + 2040580222, + 2356569264, + 3542950014, + 4007372477, + 3052825245, + 2642777331, + 3244927757, + 3999919274, + 2827008894, + 2579686338, + 894362991, + 1207245800, + 2180518120, + 939162123, + 2852656194, + 3907304682, + 2946934014, + 3528009719, + 3462115274, + 896432300, + 531352021, + 2333967450, + 3398410206, + 1679493726, + 165828365, + 3865779406, + 578198229, + 3634759763, + 2458597151, + 548148582, + 1085994747, + 650935859, + 2260580514, + 2646802189, + 223764718, + 1738842200, + 67878406, + 3190595178, + 2159347649, + 3279491094, + 2237723593, + 370870823, + 3367895702, + 753113351, + 3482533008, + 1386128099, + 727427585, + 3629149706, + 3094681240, + 2282827976, + 4153438780, + 366242428, + 3530105324, + 1827577055, + 976079609, + 179345998, + 1859547164, + 2846902585, + 534320701, + 829262272, + 1704311161, + 1986859659, + 603315271, + 1882914597, + 3309585068, + 4084033730, + 267193086, + 3229269425, + 4171285822, + 3505178242, + 3894685012, + 4070775637, + 4072503585, + 1793806136, + 3293211433, + 4169707985, + 4148541764, + 2263528092, + 33538354, + 501242229, + 3506475750, + 2756409802, + 3832755197, + 1605122848, + 3119254569, + 441363554, + 1565601052, + 41320750, + 1660362583, + 2724046293, + 2451558028, + 2830747005, + 3180185379, + 2523380538, + 3615966047, + 2787542007, + 3849084073, + 3794368156, + 2534125952, + 2398463084, + 3053013242, + 2761339475, + 3411981568, + 1554947201, + 2044340729, + 1874804417, + 1149210135, + 2323930950, + 233125509, + 3664587195, + 1965818152, + 3212310716, + 963947194, + 3379565424, + 355184990, + 3330777692, + 3066394362, + 174169931, + 1743828716, + 3387901712, + 2333396215, + 812094150, + 3120976937, + 4084400003, + 1654518335, + 2710923166, + 3069866606, + 3415867293, + 1656493496, + 906726537, + 2590171552, + 1065118934, + 1770568647, + 782635140, + 2588103415, + 642299006, + 3536714083, + 358609991, + 1669298275, + 1970395679, + 3817480496, + 2995079974, + 2282010962, + 2942789275, + 3456729772, + 3669653438, + 2792536801, + 2369672625, + 3696154599, + 2848027353, + 3218550852, + 2609681071, + 2145951320, + 572988181, + 1558981088, + 703756714, + 3247986972, + 2631493609, + 3449630400, + 69498154, + 694670204, + 2170579406, + 2243110392, + 1398576658, + 2302718306, + 2780486589, + 3747437972, + 1274562087, + 1042592903, + 262012932, + 2715314387, + 2776174307, + 3569860541, + 3650709986, + 509975288, + 221931404, + 4097161679, + 1567935196, + 2227892696, + 1567791898, + 1905670115, + 3944716281, + 1710416508, + 3816136586, + 540323945, + 3272978614, + 1290576670, + 2711798616, + 4261692996, + 3946957378, + 3690173032, + 2499605442, + 3762316796, + 2906467327, + 1684061831, + 1196797565, + 888892460, + 93866187, + 3073379915, + 3543158097, + 2228317436, + 3762811001, + 3259564478, + 820166896, + 189372406, + 1362818166, + 695514622, + 1641304799, + 47748230, + 1701078822, + 4145807567, + 1369568605, + 3616309820, + 1090022712, + 2937622143, + 1816432692, + 2475721876, + 1277588319, + 2825290446, + 3717686536, + 2074256949, + 3454343245, + 2490571911, + 3468254951, + 540679393, + 4234100922, + 536495562, + 2935199377, + 2400696943, + 1772037020, + 2747971819, + 2199945270, + 1300201064, + 3811097348, + 517368320, + 2174510395, + 1670491117, + 3118118760, + 3074367351, + 2216071016, + 1720671345, + 719755303, + 1862810976, + 1683204877, + 3948227944, + 2364658718, + 1135869520, + 4273463679, + 2705834589, + 1310482010, + 1320919344, + 607447137, + 3185212310, + 1251376751, + 480995281, + 829537326, + 1658716452, + 950309724, + 2457944592, + 3014362823, + 2835443189, + 2177334359, + 2896537039, + 747755700, + 3778148331, + 2594828355, + 132203355, + 712765801, + 3976928361, + 255387813, + 1563198172, + 609423882, + 3777106825, + 1808957503, + 2845841186, + 580384392, + 985083451, + 2294224658, + 1004515391, + 1067636933, + 2123879766, + 3457972151, + 335261501, + 269360483, + 765530855, + 2712867595, + 2897086858, + 3449439663, + 4247579081, + 3416684019, + 361548863, + 405863981, + 3019753379, + 3320284907, + 3783501943, + 3930172959, + 4282797660, + 1855299685, + 3398313154, + 2643282266, + 503826682, + 3394208970, + 1513757080, + 2246089075, + 972231264, + 2166998651, + 3170984662, + 3846886819, + 1601133117, + 1485963806, + 300602959, + 1758056193, + 1191707274, + 2051321350, + 2044717051, + 787636290, + 1409293793, + 3470957605, + 2280671851, + 842242249, + 1240332252, + 756437253, + 2396464382, + 2602305905, + 3375533151, + 4045924351, + 2341784263, + 958908898, + 315563462, + 2732240241, + 2846453938, + 1434158323, + 431756886, + 3186439053, + 1158851955, + 3708656480, + 1958146165, + 2413668137, + 1754898106, + 3904171667, + 3323075935, + 1131153720, + 777550301, + 2713711441, + 3635264438, + 2198718447, + 3253108571, + 1350331314, + 1245214228, + 113397839, + 3243339335, + 1947845091, + 3374508403, + 3398398598, + 2909188550, + 3996843643, + 805382635, + 3313747953, + 3481849175, + 2681521226, + 1200783832, + 3010460585, + 627511797, + 3858056161, + 333702670, + 605338296, + 670263082, + 730649343, + 197730334, + 1100580686, + 1731787168, + 1121640283, + 12900014, + 3391234849, + 170222554, + 2018056980, + 650276078, + 956681639, + 2089939375, + 470095520, + 4269953286, + 1769619813, + 1612691342, + 1311774470, + 3097115357, + 1668328680, + 161908612, + 1608034286, + 2453179512, + 2057468557, + 3043858444, + 1498330605, + 3868256888, + 2149200926, + 2985322809, + 2428367621, + 3468619425, + 2418611377, + 3035695917, + 1463462043, + 1570538637, + 4213682569, + 2646023771, + 2282459647, + 203134370, + 3280688587, + 499405978, + 740266087, + 3995433039, + 2684708346, + 2786962463, + 3996907837, + 3540888295, + 2504152959, + 95140835, + 3410307794, + 4213281635, + 1130205197, + 1834247092, + 3085288631, + 1757496900, + 2638999894, + 944134651, + 429277899, + 1067024669, + 617239023, + 3488959314, + 741987619, + 3533927275, + 1237932199, + 1995572628, + 4246835566, + 127692957, + 602573128, + 1490010728, + 3279851177, + 2140276502, + 1067976445, + 3759403943, + 756452182, + 2530468162, + 68077697, + 2218817754, + 512488201, + 2952619562, + 411584443, + 1742607603, + 746518420, + 2323495109, + 659804349, + 2942619829, + 3094387610, + 568817821, + 2879746144, + 3466167086, + 2679380046, + 2761123474, + 1329585159, + 2002366838, + 3679068297, + 1269338677, + 3395199709, + 3800455800, + 3673241739, + 2885176152, + 2161360533, + 1524274518, + 1326722509, + 3172345697, + 3368253005, + 3254456609, + 3629314696, + 1845862137, + 2715209160, + 4168611487, + 1524295747, + 2784395807, + 2992195863, + 3880543913, + 124836332, + 3040090760, + 218181813, + 2886993261, + 1704884361, + 1159157821, + 1536949435, + 1110533697, + 2533310419, + 760201165, + 1121713722, + 3938196725, + 3861635332, + 4095223239, + 117486830, + 4016209432, + 3964940991, + 551196910, + 3888587849, + 374668536, + 2361695059, + 4160490184, + 848070966, + 2984698080, + 1217793215, + 608114040, + 3623689699, + 1171940959, + 982916823, + 3736315626, + 4220605712, + 2850639362, + 3596105689, + 2025885629, + 4179051112, + 3951152403, + 1295550543, + 3686027483, + 1069713249, + 3544311051, + 3646053848, + 1639194916, + 3215012297, + 1210495903, + 568432857, + 111218764, + 117568812, + 3623902808, + 1149326295, + 3733763966, + 3464838204, + 770265945, + 3562766112, + 3387916087, + 3267456025, + 1002733689, + 4151531274, + 157851401, + 1610490583, + 312055131, + 3131805343, + 776840985, + 2879382642, + 2986314246, + 269679152, + 3406030607, + 4068967188, + 4000906414, + 1756831662, + 37486510, + 3793273417, + 792421427, + 4070816303, + 105019874, + 1813040057, + 69361007, + 3405080193, + 1521867331, + 2105730906, + 2266564695, + 3028397705, + 4227097679, + 1372235177, + 2792045328, + 1008627742, + 3817395599, + 4275293671, + 3572559052, + 1590121953, + 3583369021, + 1022215854, + 3230960121, + 3537508028, + 1570188826, + 2088594403, + 1717763235, + 1869801701, + 1987190675, + 756019958, + 2474376799, + 1368442999, + 1088292181, + 2126187671, + 2433231909, + 3633264665, + 2100678973, + 2935112711, + 317754466, + 287068109, + 2186283744, + 572959895, + 3268887741, + 582466820, + 605740664, + 1823060643, + 1586061799, + 3111895538, + 695125770, + 1193778924, + 3655248580, + 432622369, + 3476660158, + 2932761930, + 434373141, + 2714313065, + 3039560532, + 1585095370, + 4074857681, + 2079918507, + 4109510899, + 460939340, + 3381598783, + 3365942767, + 1170217334, + 3411288850, + 3011202416, + 296265106, + 2591075461, + 946290080, + 896426461, + 1444209441, + 2460194848, + 811228170, + 3413044928, + 2374412951, + 3065359198, + 3820898951, + 819440745, + 4053324870, + 2896717942, + 4050742056, + 649132965, + 2145779372, + 4060542220, + 3337848708, + 1005314919, + 2232138124, + 3521560466, + 2939409260, + 1408340261, + 4061033592, + 2028675671, + 245729100, + 2022568003, + 204107678, + 1895298966, + 1381589691, + 806484563, + 3630866203, + 1520633559, + 2276423571, + 2191932818, + 241743263, + 2157896702, + 975413353, + 657676953, + 3124552525, + 2540517740, + 1534526413, + 2786995553, + 3208762478, + 3666336669, + 2159026227, + 3728621866, + 838384248, + 3737960474, + 1976756847, + 1882439197, + 3114302008, + 3645125301, + 1492932166, + 284632820, + 2739946435, + 1491763546, + 3318161393, + 771328960, + 624171559, + 4228996843, + 733364880, + 456840911, + 1443720619, + 1444266951, + 961217317, + 3736783282, + 2625621407, + 618487346, + 2889952682, + 2521664315, + 581333905, + 115523242, + 3428877644, + 3322968420, + 751765464, + 1794918947, + 1851508860, + 395964042, + 3339125822, + 970380320, + 675908071, + 4138210493, + 1224300164, + 777398636, + 3558332052, + 4287928546, + 3800252906, + 610534714, + 3784147924, + 2610778359, + 1877064021, + 4142700959, + 3067483161, + 3535300408, + 2093251306, + 2512229391, + 3537473181, + 2781969403, + 2928709844, + 4209870572, + 4212673216, + 4195822046, + 628435067, + 20399221, + 680195519, + 3405325438, + 4165465362, + 3199621458, + 391006469, + 3020231775, + 1150655813, + 495016625, + 1287151272, + 1799320264, + 1592803564, + 3352007558, + 895673172, + 622295043, + 2690066895, + 1840093401, + 1125655731, + 4183614706, + 3921871376, + 1531224530, + 1623852563, + 632427730, + 2484170850, + 1168786314, + 651206184, + 1658313524, + 2570587006, + 780584211, + 1130183729, + 1526530596, + 192039553, + 657220202, + 2804303314, + 3149434266, + 3698839978, + 815527597, + 267315882, + 3557221005, + 371644391, + 1078920871, + 2966475839, + 236718992, + 533820624, + 1759322482, + 2134324133, + 3543042365, + 3486470902, + 1583493181, + 165310491, + 642966519, + 2872788731, + 3609089571, + 3425356739, + 3297649831, + 1020106952, + 1481054867, + 828391272, + 2450594803, + 2965402746, + 1548936627, + 2295554892, + 3751037745, + 1034281547, + 2379874114, + 3930264354, + 953897225, + 3945677712, + 798204617, + 2216063266, + 3862632424, + 806917364, + 3811833537, + 2857989810, + 330021028, + 2310353306, + 2941899414, + 3708639396, + 649357066, + 19614095, + 710825038, + 354277255, + 1536729053, + 3111438619, + 4072091488, + 1074559286, + 3007149062, + 3548734717, + 1233947062, + 3386943189, + 1888647435, + 778313166, + 1890472970, + 659028421, + 3457078628, + 2371532286, + 2613624271, + 3353769752, + 3665814956, + 1464053109, + 2528854283, + 4061336525, + 133114134, + 2970603797, + 430720275, + 938382105, + 2213750369, + 3904566357, + 3994269603, + 3115933708, + 1473314910, + 1761727828, + 3612544233, + 1742321455, + 861456775, + 1140558872, + 94023346, + 2932725494, + 296131999, + 3486348551, + 1482584207, + 2983126461, + 3954326039, + 376192324, + 112816404, + 3423909001, + 1317318071, + 3607305588, + 3886213069, + 1930095225, + 3422259774, + 605178421, + 4274757585, + 1289885819, + 3843068872, + 2129966543, + 3560534023, + 3054852613, + 1783570225, + 224473896, + 3211113712, + 1563170375, + 110795727, + 1389123355, + 3959577881, + 2475945800, + 1091123283, + 3338933814, + 3753637052, + 4252581126, + 4240158395, + 1075574408, + 303603097, + 722016345, + 2048045658, + 2065425039, + 2290205416, + 192836523, + 1595020272, + 1535687240, + 2740465259, + 4243679625, + 2016674969, + 1518584389, + 481735291, + 3114135431, + 2147918268, + 2756601409, + 2649303843, + 4195758514, + 1508962520, + 734820495, + 3859653116, + 2138551368, + 1870138696, + 3713575065, + 164253114, + 974590115, + 3503054018, + 3660092, + 2671479084, + 3006228626, + 4089920429, + 4017796366, + 91733465, + 2434950377, + 3129899652, + 933034426, + 2283654210, + 2013383119, + 2960347493, + 202595331, + 3627841529, + 3051347223, + 89186044, + 3021877909, + 3971994286, + 3048115519, + 1947389747, + 2751014626, + 3529624521, + 761867510, + 2365316772, + 878595020, + 1058702881, + 3668378341, + 2424436842, + 3773473632, + 1236777444, + 461080564, + 245416235, + 1255236220, + 564692931, + 874372534, + 1759848202, + 4245563793, + 2625867577, + 1251399541, + 3258095974, + 1707501458, + 1621441329, + 3653246046, + 3338093870, + 1844047263, + 609432827, + 4043076700, + 3596340770, + 1159222473, + 318889235, + 1244971860, + 33743058, + 2484015299, + 3199014576, + 3798442220, + 2886175251, + 2632855141, + 2650544698, + 7661560, + 1724027302, + 3351085583, + 2586932153, + 449423137, + 3383978607, + 1479039281, + 2989368201, + 953549938, + 2288116461, + 2739866030, + 1551183178, + 871077278, + 1776269124, + 750109370, + 1049795033, + 359889214, + 1320841795, + 3743701737, + 3778613369, + 830351520, + 2217221891, + 1924871936, + 826615674, + 3776538877, + 1467182342, + 3132227759, + 3891007609, + 1634176632, + 2418490911, + 2457888515, + 715746808, + 3259171383, + 2148298801, + 549173467, + 3193173666, + 140556540, + 2068092588, + 4136795670, + 1532754646, + 1116145096, + 1709717971, + 1779552963, + 2111923567, + 681109349, + 1092541012, + 3094838322, + 793437123, + 1927534163, + 2458058533, + 1155011404, + 1203368299, + 2727874614, + 1154185088, + 4018580574, + 925142137, + 1408126151, + 2460276652, + 592363913, + 1513657758, + 1044800013, + 2055859693, + 2138483323, + 2068913455, + 1901909173, + 1238614771, + 852830442, + 755014312, + 614391004, + 4201976167, + 1062162478, + 613762194, + 742617395, + 3982563483, + 3283156356, + 2891989823, + 1701096246, + 3545497034, + 3116480220, + 1280650693, + 89638766, + 543600818, + 414954964, + 916838764, + 396111661, + 2803316899, + 3135475352, + 2621976636, + 1218090840, + 1838856086, + 2056717074, + 4252295278, + 2479296708, + 3858412084, + 81575436, + 2695550, + 1497111829, + 657285507, + 4096303647, + 2148167091, + 3234692531, + 3536488756, + 2468609914, + 1428348369, + 3326767079, + 4178677765, + 3111757245, + 280762731, + 1810191293, + 292584907, + 3177789158, + 857234555, + 1483876784, + 3305232952, + 3303665536, + 1106977774, + 3012849936, + 293192576, + 4100380827, + 4065213192, + 292718119, + 3796005026, + 1357905460, + 3991794611, + 3877808717, + 1547153553, + 3058828996, + 2302130157, + 687088130, + 2794880813, + 2758201304, + 970073724, + 660745120, + 1411608070, + 3484647293, + 4162299684, + 1330833641, + 1344352115, + 1060714600, + 3607273439, + 2041677169, + 1679791674, + 136514073, + 2041573276, + 399458524, + 1817051955, + 35970323, + 3917211313, + 2015347097, + 1110815916, + 1894432906, + 228092906, + 3311719418, + 1771395802, + 1806581251, + 2741010070, + 343549854, + 897289729, + 3032414478, + 1863179695, + 1318443919, + 2481581483, + 133945110, + 1253215156, + 3369775081, + 3266192156, + 2354242377, + 153364883, + 1435311688, + 2205368370, + 829660344, + 4217578897, + 2035950118, + 3353794124, + 453736782, + 4209812919, + 3955222456, + 4235516635, + 519122982, + 3861332520, + 4227800307, + 2965198415, + 2522763751, + 23071424, + 1768909415, + 3843385425, + 3921324473, + 3732833122, + 2873281992, + 1215567221, + 3934309418, + 3920805053, + 1505344779, + 710576917, + 546996939, + 4291748149, + 1008354335, + 2066548735, + 3584423972, + 3588295665, + 464062768, + 3191050884, + 344796074, + 1575326337, + 4060677713, + 3008038560, + 854434458, + 3574444241, + 3460100112, + 4036724463, + 4285228493, + 2341589135, + 2015700111, + 30987609, + 2416765658, + 23010951, + 1421687276, + 3150696948, + 3672157989, + 3809679025, + 3377988831, + 3196043250, + 2467302155, + 4109504505, + 2162767156, + 1773914215, + 1060456367, + 4292166252, + 365778908, + 2931778992, + 1478050007, + 2042666819, + 3779000008, + 1019086835, + 3939643091, + 3972089268, + 835990948, + 459864895, + 2278791976, + 412565442, + 3559136127, + 1307354838, + 2826086025, + 2000513954, + 2940213437, + 636820648, + 820799037, + 2759782311, + 3396378519, + 1835457697, + 2422061112, + 2741158129, + 236745214, + 328317409, + 16089098, + 4107985237, + 2115937849, + 1650787126, + 4048741832, + 3805806113, + 3685458491, + 519936883, + 1117714884, + 3217226120, + 2836889667, + 2337232764, + 1259711516, + 2511514700, + 3329792870, + 2314992310, + 2715523905, + 441125170, + 3508138422, + 439861021, + 2098616440, + 1867851389, + 332314029, + 3484597934, + 3567775477, + 1954704852, + 2701215858, + 536332013, + 3228997121, + 1366245117, + 1443179754, + 20863095, + 2891060631, + 973005662, + 1599156351, + 528357821, + 1034396104, + 788779850, + 187353419, + 924587086, + 660921755, + 3137221024, + 792630037, + 3325180108, + 4103947651, + 2990960154, + 3982570051, + 1577647345, + 3914515644, + 2495934107, + 1036046772, + 1577869859, + 3323701530, + 1065061013, + 238954972, + 397765499, + 2903281606, + 496375101, + 1017033823, + 3934993865, + 3391441339, + 3780082534, + 3510075074, + 1317329274, + 1099800949, + 1932461485, + 2366054970, + 3193578346, + 2035925333, + 1563458727, + 3213674162, + 3950083673, + 453595569, + 3114919339, + 2352423592, + 3707005310, + 2982760399, + 1585428043, + 649308428, + 651439267, + 2859265460, + 2959808726, + 3157962015, + 3047169345, + 1488167166, + 1653907797, + 2432084726, + 3243590956, + 1978755569, + 1497266126, + 2109009552, + 2420007073, + 2129360075, + 2026058067, + 1645936365, + 1430277233, + 264213211, + 2213607766, + 236396643, + 435286743, + 3969222856, + 2544226500, + 3414415275, + 689647079, + 4252074767, + 3947412832, + 2248857543, + 805134483, + 2968585075, + 942104171, + 907078896, + 159474174, + 2644400348, + 779835540, + 686059377, + 3978011013, + 1840689153, + 2815340423, + 69722461, + 3687925680, + 991155610, + 706042808, + 2847638805, + 601221763, + 672064706, + 1996510977, + 2104066866, + 360999690, + 2295884401, + 2056016057, + 1436197438, + 860034588, + 2361893608, + 3382319606, + 851587241, + 390673121, + 2137490213, + 2439402387, + 444430788, + 3581795266, + 2464734683, + 1917530544, + 2407603564, + 57116489, + 1522730303, + 513068897, + 1063235047, + 3325940694, + 803752623, + 4065539792, + 394096038, + 1743577923, + 215387369, + 2109400905, + 1035591414, + 2599486750, + 1319102145, + 1939925100, + 1932139679, + 2202344935, + 2357668167, + 1340412854, + 81450250, + 4246871986, + 4234699264, + 491290139, + 18022626, + 1941999756, + 1896679778, + 3694926663, + 2218265913, + 176945749, + 4170369203, + 3217922822, + 3912824711, + 1990245460, + 2392732237, + 680942555, + 136588723, + 3511253357, + 3813050686, + 709592388, + 2443786746, + 599279780, + 759595345, + 3350389209, + 3781406106, + 1636366451, + 837325673, + 2167108450, + 861458197, + 2879065070, + 169633383, + 93653098, + 3819703497, + 3387639735, + 2904461983, + 3103588177, + 2349178, + 3085163258, + 3263557282, + 2983785356, + 696987603, + 3253084826, + 1086501974, + 3447868097, + 1645160435, + 1413925788, + 197864819, + 2147550005, + 2068342886, + 3410586522, + 4072297666, + 962599318, + 1096448752, + 3142974105, + 4010291412, + 1312899872, + 1123156043, + 2580611754, + 2552414511, + 800876108, + 3183291208, + 3674686117, + 1688386282, + 2351758045, + 196928358, + 954724980, + 2588884679, + 2474637889, + 2459736496, + 2541826626, + 300505692, + 1490297827, + 2164513496, + 2235501903, + 237977660, + 3613394282, + 3881642371, + 3995518841, + 2167864006, + 2716141442, + 2431835490, + 3914563292, + 793406221, + 2219360634, + 2243177900, + 3782173575, + 1639313001, + 2346751361, + 1065948448, + 3808393442, + 1817883762, + 1775574423, + 2228613693, + 3111072044, + 79796693, + 1037249969, + 1443644142, + 4124728914, + 1763537864, + 2359683649, + 4263545549, + 3841613333, + 3195001420, + 2972515112, + 4047339622, + 1756991149, + 2027238524, + 3514395791, + 2261222887, + 2722673211, + 53509557, + 1157714615, + 3312071097, + 1577930206, + 1492447850, + 348822841, + 1297588348, + 2082086145, + 2125356294, + 1396989237, + 3530138704, + 1059159939, + 181073037, + 1663486169, + 3882090716, + 2246396732, + 725367673, + 4269955015, + 869822483, + 1551596832, + 1184818408, + 887119913, + 2833688271, + 2991989321, + 654364284, + 2911691911, + 2301408220, + 2548059245, + 2015266846, + 2015950745, + 2615174855, + 567648148, + 3882575657, + 1395149298, + 924623664, + 2483098189, + 822394020, + 2567331600, + 2683676790, + 709501295, + 1108959918, + 1899086695, + 1427755995, + 2266737986, + 3177489052, + 3798427987, + 2057758939, + 4233081991, + 2638806984, + 379719824, + 134218018, + 3478715396, + 149314465, + 3414242577, + 3198196574, + 3647955243, + 3135004246, + 527504180, + 833836685, + 2310663231, + 3554116738, + 3112339115, + 2261308331, + 2728874699, + 243039758, + 3236546136, + 764057650, + 2914974253, + 558064593, + 1450046933, + 2120314336, + 2471919729, + 2581294120, + 3238958147, + 1682916174, + 2947306590, + 3963790142, + 3368315268, + 875252861, + 1235132297, + 927793475, + 3059857483, + 57114838, + 2857693483, + 2366006866, + 166058396, + 3809324134, + 1373821540, + 3351247916, + 1596854935, + 3478077705, + 1313902976, + 2104966097, + 2613878483, + 2504323519, + 1379572080, + 443943338, + 1328207311, + 677539961, + 3073635499, + 792446030, + 3140598992, + 1372668547, + 2975609769, + 3289404551, + 751044933, + 2663984724, + 3383055940, + 765179874, + 772752872, + 1005422547, + 2163814163, + 76122291, + 261829436, + 4037167931, + 2147708385, + 712064311, + 2935375739, + 1692933206, + 1488998352, + 2549054722, + 1142543312, + 9875877, + 3127743639, + 3937359454, + 1061471715, + 850999365, + 1403179899, + 294296255, + 1355439692, + 716208581, + 2164971135, + 3531069200, + 1878855455, + 2876922538, + 651959359, + 3252777468, + 2560558000, + 3323065184, + 1882842929, + 1167151673, + 299535375, + 4135972749, + 1131499195, + 72017106, + 2628648414, + 3284551498, + 1560472758, + 1021365227, + 709709055, + 3145999191, + 4105640006, + 2472116935, + 4030863747, + 3031531164, + 2267822554, + 3082456682, + 1839241494, + 1066035263, + 842533814, + 799505975, + 1085944010, + 776316039, + 3045366135, + 1635190931, + 1858952318, + 575091700, + 2982570701, + 2602102550, + 3535111631, + 2987132984, + 2884929610, + 697181491, + 3956033407, + 2195270868, + 3049230807, + 990335847, + 3606785615, + 159596341, + 23046432, + 4234414817, + 3442389647, + 3997222545, + 3281447439, + 551253184, + 3522951879, + 3167819807, + 144051690, + 2993314342, + 3074069535, + 3082035429, + 1957011315, + 1819674781, + 2161362194, + 83341624, + 3213159635, + 2096053644, + 1452277567, + 652999798, + 2847462531, + 3937029033, + 3682783371, + 142193426, + 2847362189, + 288172676, + 1713973846, + 1371665428, + 3110378901, + 1567884403, + 1183592098, + 1067054090, + 3285851167, + 2361002864, + 3031551410, + 363218965, + 2593081760, + 2431537708, + 244151655, + 2626312428, + 3986263984, + 1179987756, + 3894923475, + 584030351, + 1757460518, + 2189535728, + 2145279800, + 4035348028, + 784289112, + 1011875294, + 3348604786, + 2894043929, + 3721828958, + 3810671685, + 916278696, + 1052720543, + 4091973578, + 1713010902, + 1729174326, + 817600703, + 2275662472, + 2661020472, + 3132065612, + 807629004, + 215329741, + 483541444, + 2833545052, + 3530282019, + 3950657783, + 1334370400, + 449822774, + 696427946, + 1415396169, + 1438713736, + 3784250019, + 614401898, + 1567288920, + 1557989818, + 3990040143, + 782357022, + 856658921, + 1299109583, + 2755231902, + 689920071, + 823923870, + 2109731700, + 1076461543, + 557277607, + 544365785, + 398476976, + 1851508193, + 942315344, + 2381896272, + 3201560336, + 2239549051, + 3155074460, + 1322760363, + 3694057003, + 3692840903, + 2987104482, + 2177657669, + 637264594, + 1068409936, + 2136641722, + 1925671487, + 2435175884, + 3179798828, + 7227263, + 1526600501, + 262797713, + 2618508142, + 384031709, + 2369795632, + 4108134906, + 1118145976, + 85609557, + 2356992749, + 2126926309, + 129404327, + 10077648, + 538773880, + 497987787, + 413326176, + 3737639008, + 4193337260, + 1749969099, + 2221891505, + 1352066888, + 880041690, + 2902445569, + 1088990205, + 2920271695, + 2628198487, + 3120205414, + 3160612719, + 3233843940, + 2895838483, + 2188458419, + 140787013, + 3497972296, + 3768173821, + 2064502135, + 1183638172, + 4094019775, + 4220501384, + 777226768, + 87949267, + 4166844099, + 1330680405, + 2138525387, + 2055987019, + 3435056290, + 2115232487, + 1221006155, + 1312330151, + 42761945, + 1588266339, + 3043303666, + 794491749, + 483946206, + 2933027222, + 813786480, + 1289696442, + 4255035358, + 1072699243, + 960018847, + 1401495854, + 3936439777, + 3404051682, + 1285423971, + 4138436581, + 2712045632, + 1091840388, + 3115214670, + 960766446, + 428097598, + 2982790664, + 3655065475, + 1817047808, + 2639542162, + 2782689209, + 3817081359, + 4026230179, + 1859227984, + 3832694608, + 129730834, + 255000003, + 1717654792, + 1387489382, + 3926840050, + 1482052856, + 3995626849, + 3522243458, + 3756694177, + 1108068468, + 3959648479, + 885141316, + 1506665574, + 3795449775, + 700712554, + 2413726047, + 4252475973, + 2467333343, + 3680946641, + 2604943229, + 2756697170, + 2338684969, + 1706252112, + 2832707790, + 4196715083, + 4259374257, + 2197477739, + 527382892, + 2858245410, + 3602775656, + 4228936062, + 1071742485, + 2409360031, + 4160287329, + 1238381790, + 2866983317, + 3764727954, + 1784469145, + 772971202, + 1561356690, + 2946428286, + 617878332, + 3205643184, + 3523817991, + 1486574988, + 2997433915, + 2478971341, + 1229957037, + 257495544, + 2041906778, + 1199858787, + 2646437408, + 4246496468, + 1615329753, + 2219021437, + 1840960357, + 1391499419, + 2200011396, + 3036342433, + 3924784046, + 84952465, + 3263060911, + 298567410, + 4062975850, + 3178001249, + 3579592431, + 3492021478, + 4058976276, + 3829583939, + 2882697321, + 3647153764, + 674480111, + 3926656801, + 3606213010, + 1440551037, + 212488062, + 1583406572, + 104638219, + 3152567910, + 168780465, + 2264537758, + 1045042648, + 50632320, + 3810198614, + 4108081580, + 1613749774, + 1962652357, + 2847574073, + 4266093182, + 230230685, + 3544810457, + 3168389148, + 1671883847, + 2658507722, + 80041198, + 1360078168, + 3519470035, + 740064670, + 2398250715, + 2984797272, + 106202416, + 342809654, + 1514292363, + 4017312454, + 91695240, + 337405419, + 524798130, + 3090467670, + 2735871606, + 514016929, + 565091078, + 3906124203, + 58160614, + 1663196887, + 160296268, + 3454997586, + 2185929215, + 3008561930, + 610769881, + 2031259796, + 4292133727, + 4261279987, + 2696845347, + 3502322759, + 3478275451, + 592045032, + 1175893559, + 4152472140, + 1783854713, + 725278127, + 1258164482, + 299666359, + 2318182733, + 4095218604, + 3822784732, + 2898916456, + 2618624414, + 1856438400, + 2899807501, + 1821434401, + 3525301533, + 1190321817, + 3548511838, + 3635017577, + 1339328646, + 3044681268, + 2697186615, + 4186568152, + 236008493, + 601648359, + 1039358086, + 1415995576, + 3227023287, + 3137870696, + 2507760616, + 1575658261, + 4215661915, + 2832000588, + 756723162, + 3627331129, + 4059318684, + 996167776, + 2385233369, + 3370087186, + 3995739479, + 1816871963, + 2142947405, + 4225097007, + 3430635695, + 1018155306, + 3078847579, + 3367977753, + 952299695, + 501848858, + 609312417, + 201968377, + 262515786, + 110883454, + 3996590501, + 868532169, + 2312474856, + 1191322397, + 2432439312, + 1160645660, + 210796407, + 2419767168, + 571667525, + 866873813, + 679011359, + 978341328, + 3755348554, + 4139533543, + 834030431, + 2409994648, + 2017852404, + 1727411475, + 729306795, + 1915581953, + 2156840250, + 189668449, + 1498715139, + 3404084606, + 4289401082, + 504770733, + 672448055, + 2880337148, + 1382033251, + 1933595067, + 3093543884, + 458340514, + 4026211566, + 2764959706, + 1209206481, + 2862409053, + 1404768021, + 4154318962, + 2101216408, + 285628819, + 269934472, + 948399609, + 2031030792, + 687121237, + 338878485, + 3245747553, + 1460004022, + 3583730387, + 4169817648, + 1622389883, + 2647057782, + 513235016, + 3676868823, + 3925914436, + 3522395961, + 1173949459, + 1246155343, + 1819628065, + 1414974228, + 3319178936, + 1648032003, + 372992612, + 1009223358, + 3540457421, + 1973200941, + 1257540703, + 3439797391, + 4015937732, + 4051095938, + 1788038401, + 3028888699, + 2892249618, + 4020327609, + 3442472877, + 1463085644, + 300258549, + 2985416491, + 594069990, + 3099685445, + 3457253524, + 2092807439, + 836899379, + 689841426, + 2829827484, + 2108919077, + 117276677, + 1886069586, + 568953069, + 2349566217, + ]; + + static final String privateKeyFCM = String.fromCharCodes(List.generate( + _envieddataprivateKeyFCM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataprivateKeyFCM[i] ^ _enviedkeyprivateKeyFCM[i])); + + static const List _enviedkeypassnpassenger = [ + 1757414005, + 514986313, + 4151797804, + 97325440, + 3379937222, + 576595249, + 2559539658, + 8567208, + 4271065238, + 508041504, + 3204796963, + 1435370898, + 3094755634, + ]; + + static const List _envieddatapassnpassenger = [ + 1757413917, + 514986283, + 4151797835, + 97325538, + 3379937199, + 576595269, + 2559539624, + 8567280, + 4271065316, + 508041592, + 3204797009, + 1435370960, + 3094755648, + ]; + + static final String passnpassenger = String.fromCharCodes(List.generate( + _envieddatapassnpassenger.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapassnpassenger[i] ^ _enviedkeypassnpassenger[i])); + + static const List _enviedkeynewId = [ + 2009498597, + 1912159798, + 349064147, + ]; + + static const List _envieddatanewId = [ + 2009498507, + 1912159827, + 349064100, + ]; + + static final String newId = String.fromCharCodes(List.generate( + _envieddatanewId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatanewId[i] ^ _enviedkeynewId[i])); + + static const List _enviedkeyallowed = [ + 3235956510, + 571889789, + 3400769876, + 265587103, + 655752813, + 629462643, + 2025133890, + 2351496342, + 3413331780, + 1114393771, + 2036505266, + 3959304053, + ]; + + static const List _envieddataallowed = [ + 3235956554, + 571889679, + 3400769853, + 265587183, + 655752727, + 629462583, + 2025133872, + 2351496447, + 3413331762, + 1114393806, + 2036505280, + 3959304015, + ]; + + static final String allowed = String.fromCharCodes(List.generate( + _envieddataallowed.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowed[i] ^ _enviedkeyallowed[i])); + + static const List _enviedkeybasicAuthCredentials = [ + 1511654194, + 3575795244, + 1227490417, + 527640050, + 3871923376, + 4031295051, + 1390183179, + 3442892390, + 2212257034, + 949045519, + 2188626333, + 2283817801, + 2133657331, + 1619454805, + 2010750059, + 1020888170, + 850672916, + 3276641294, + 376387638, + 3248865663, + 2438550937, + 3491074149, + 3046128887, + 3612797548, + 3197124550, + 3896314357, + 4110396586, + 780170803, + 2137888112, + 1413493953, + 67174621, + ]; + + static const List _envieddatabasicAuthCredentials = [ + 1511654213, + 3575795293, + 1227490335, + 527639967, + 3871923393, + 4031295034, + 1390183288, + 3442892300, + 2212257139, + 949045625, + 2188626410, + 2283817763, + 2133657221, + 1619454831, + 2010749957, + 1020888091, + 850672998, + 3276641367, + 376387708, + 3248865583, + 2438551001, + 3491074132, + 3046128832, + 3612797535, + 3197124593, + 3896314285, + 4110396632, + 780170859, + 2137888028, + 1413493891, + 67174577, + ]; + + static final String basicAuthCredentials = String.fromCharCodes( + List.generate( + _envieddatabasicAuthCredentials.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicAuthCredentials[i] ^ + _enviedkeybasicAuthCredentials[i])); + + static const List _enviedkeybasicCompareFaces = [ + 2421100800, + 3397933571, + 2369214106, + 3136895179, + 3615729333, + 2636360191, + 2152261677, + 1456834091, + 3656203984, + 1289266952, + 2470039579, + 2408141792, + 3587954520, + 501373726, + 1466408144, + 59280945, + 4146715710, + 1868614554, + 90924153, + 1703149559, + 2671491957, + 1876571842, + 1007708727, + 3051381325, + 4131722653, + 3318332617, + 3347307057, + 667605013, + ]; + + static const List _envieddatabasicCompareFaces = [ + 2421100922, + 3397933673, + 2369214191, + 3136895137, + 3615729369, + 2636360074, + 2152261724, + 1456834125, + 3656203936, + 1289267042, + 2470039585, + 2408141710, + 3587954473, + 501373804, + 1466408073, + 59280987, + 4146715726, + 1868614618, + 90924104, + 1703149504, + 2671491910, + 1876571893, + 1007708783, + 3051381311, + 4131722693, + 3318332581, + 3347307123, + 667605113, + ]; + + static final String basicCompareFaces = String.fromCharCodes( + List.generate( + _envieddatabasicCompareFaces.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicCompareFaces[i] ^ _enviedkeybasicCompareFaces[i])); + + static const List _enviedkeybasicCompareFacesURL = [ + 4235979342, + 107091280, + 3769740472, + 2222084587, + 384144624, + 3140250032, + 1997944230, + 1918081104, + 2596592456, + 1777376467, + 988115540, + 2075032590, + 1667533897, + 2031814449, + 79891751, + 3922355855, + 2137405931, + 2570742106, + 1735317659, + 1877794703, + 4041141819, + 4064715208, + 2151919522, + 701152092, + 4135360582, + 3590111345, + 3964339254, + 488816067, + 342387056, + 3669799231, + 156793059, + 2214319007, + 1679768627, + 2031538490, + 65772023, + 2069195370, + 728988288, + 3658819502, + 3578487325, + 779352690, + 577911063, + 937381759, + 2034503781, + 2258435376, + 3025814797, + 2495417297, + 3911226822, + 200632297, + 2187542188, + 448707784, + 4168377315, + 340404973, + 554493486, + 1716731532, + 2387259924, + 2615105614, + 2396184738, + 2798086821, + 1255080927, + 1232424033, + ]; + + static const List _envieddatabasicCompareFacesURL = [ + 4235979302, + 107091236, + 3769740492, + 2222084507, + 384144515, + 3140249994, + 1997944201, + 1918081151, + 2596592430, + 1777376434, + 988115511, + 2075032683, + 1667533924, + 2031814485, + 79891778, + 3922355963, + 2137405838, + 2570742073, + 1735317743, + 1877794722, + 4041141853, + 4064715262, + 2151919515, + 701152110, + 4135360626, + 3590111298, + 3964339215, + 488816113, + 342386963, + 3669799179, + 156792960, + 2214319016, + 1679768605, + 2031538514, + 65771922, + 2069195288, + 728988399, + 3658819525, + 3578487400, + 779352595, + 577911143, + 937381647, + 2034503755, + 2258435411, + 3025814882, + 2495417276, + 3911226857, + 200632202, + 2187542211, + 448707749, + 4168377235, + 340404876, + 554493532, + 1716731625, + 2387259979, + 2615105576, + 2396184771, + 2798086854, + 1255080890, + 1232423954, + ]; + + static final String basicCompareFacesURL = String.fromCharCodes( + List.generate( + _envieddatabasicCompareFacesURL.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicCompareFacesURL[i] ^ + _enviedkeybasicCompareFacesURL[i])); + + static const List _enviedkeyaccountSIDTwillo = [ + 3721408600, + 3947171842, + 3278552791, + 1290841325, + 1883121039, + 2848794990, + 1845944893, + 858090342, + 1317737027, + 4044106667, + 2056165759, + 3698222050, + 2969351416, + 2321420962, + 3550569128, + 181592456, + 3757412330, + 2463370668, + 483441015, + 1395969574, + 1542632707, + 3748823934, + 1307424768, + 110451220, + 462031736, + 409558539, + 60274066, + 1056939778, + 3413923450, + 1547907937, + 2130755320, + 1992047794, + 1091933354, + 547822685, + 2440111100, + 3424577644, + 2247696802, + 3734255597, + 1482445038, + 2772372126, + 2770894772, + ]; + + static const List _envieddataaccountSIDTwillo = [ + 3721408521, + 3947171908, + 3278552751, + 1290841309, + 1883121150, + 2848794903, + 1845944841, + 858090323, + 1317737077, + 4044106689, + 2056165642, + 3698221960, + 2969351371, + 2321420954, + 3550569115, + 181592550, + 3757412307, + 2463370708, + 483440898, + 1395969631, + 1542632753, + 3748823887, + 1307424825, + 110451232, + 462031625, + 409558589, + 60274080, + 1056939835, + 3413923339, + 1547907920, + 2130755230, + 1992047832, + 1091933338, + 547822628, + 2440111051, + 3424577588, + 2247696848, + 3734255541, + 1482444930, + 2772372188, + 2770894808, + ]; + + static final String accountSIDTwillo = String.fromCharCodes( + List.generate( + _envieddataaccountSIDTwillo.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataaccountSIDTwillo[i] ^ _enviedkeyaccountSIDTwillo[i])); + + static const List _enviedkeyserverAPI = [ + 3094642348, + 4121506206, + 827617737, + 2848816033, + 3213192673, + 4228182843, + 999386122, + 1220272359, + 267423703, + 1900033012, + 1944522775, + 3527212004, + 1859421952, + 889465882, + 1434182672, + 2184684236, + 737152098, + 1771835272, + 2010674798, + 2878793908, + 4226638094, + 1112911882, + 3292015836, + 666822431, + 3025891230, + 2173838592, + 3844334995, + 2263447002, + 2176013394, + 3009282342, + 1562658662, + 3746143550, + 3067587152, + 2521593711, + 3429293712, + 2303766424, + 2922240631, + 1156219267, + 1805959872, + 37212918, + 127814544, + 2028392127, + 2676479203, + 1996060275, + 620111390, + 1099120563, + 3424543361, + 3931194771, + 2012636768, + 2472981310, + 1825367032, + 3677390013, + 745083740, + 3403190758, + 3242229914, + 2805151842, + 2306765567, + 382466205, + 1388308985, + 942683536, + 3571948047, + 1175434082, + 4072429267, + 3872998741, + 1284492511, + 1964889309, + 467562698, + 3230552194, + 4004618865, + 2209982301, + 2117482407, + 1982549967, + 1334186295, + 2947885287, + 3806681118, + 4260875097, + 3997005067, + 1946017544, + 109237713, + 909068578, + 608529079, + 279817952, + 378484100, + 752413422, + 3356837079, + 16994617, + 2741430961, + 3798529846, + 2426473427, + 210315061, + 375479981, + 3239625849, + 1743921987, + 453901307, + 2903998185, + 3858934269, + 3788721278, + 2087128503, + 3831753353, + 2224498213, + 3022281978, + 1135043387, + 3668798529, + 503401808, + 1270770969, + 2012982971, + 4080372035, + 802447983, + 2311082641, + 3926045920, + 1189273073, + 1456400080, + 1684598679, + 2968257951, + 2678762546, + 3298858786, + 1228590739, + 350776737, + 2849006208, + 481759723, + 4157940961, + 2661362995, + 2733466299, + 3268771250, + 3519278686, + 1166194619, + 2883179992, + 2171852174, + 3593191018, + 1814621414, + 2825656219, + 1315956728, + 2225883374, + 3935953512, + 3843957003, + 3992352210, + 791623037, + 1900046594, + 2194281717, + 173693204, + 3188046480, + 1977818732, + 2636224273, + 1834520938, + 564647724, + 3466055227, + 2352858981, + 4139238342, + 2609575473, + 181332596, + 3247722768, + 4220498014, + 3696639377, + 3428982343, + 297904278, + 2231950037, + 3297882200, + 1005405782, + ]; + + static const List _envieddataserverAPI = [ + 3094642429, + 4121506255, + 827617688, + 2848816112, + 3213192590, + 4228182873, + 999386201, + 1220272277, + 267423653, + 1900032946, + 1944522878, + 3527211998, + 1859422033, + 889465932, + 1434182721, + 2184684276, + 737152085, + 1771835376, + 2010674747, + 2878793859, + 4226638196, + 1112911997, + 3292015775, + 666822505, + 3025891315, + 2173838682, + 3844335081, + 2263446912, + 2176013366, + 3009282375, + 1562658590, + 3746143563, + 3067587075, + 2521593693, + 3429293814, + 2303766442, + 2922240580, + 1156219354, + 1805959924, + 37212827, + 127814634, + 2028392072, + 2676479150, + 1996060169, + 620111463, + 1099120636, + 3424543483, + 3931194849, + 2012636760, + 2472981329, + 1825366940, + 3677389967, + 745083710, + 3403190676, + 3242229932, + 2805151785, + 2306765478, + 382466276, + 1388308892, + 942683606, + 3571948142, + 1175434038, + 4072429189, + 3872998681, + 1284492440, + 1964889326, + 467562625, + 3230552241, + 4004618777, + 2209982245, + 2117482386, + 1982549909, + 1334186326, + 2947885234, + 3806681191, + 4260875041, + 3997005116, + 1946017645, + 109237640, + 909068628, + 608529142, + 279817913, + 378484212, + 752413359, + 3356836993, + 16994653, + 2741431034, + 3798529885, + 2426473470, + 210315015, + 375479957, + 3239625807, + 1743921933, + 453901231, + 2903998139, + 3858934164, + 3788721229, + 2087128525, + 3831753466, + 2224498204, + 3022281875, + 1135043432, + 3668798478, + 503401790, + 1270771009, + 2012982991, + 4080371995, + 802447933, + 2311082712, + 3926045848, + 1189272962, + 1456400039, + 1684598768, + 2968257964, + 2678762617, + 3298858823, + 1228590832, + 350776803, + 2849006317, + 481759640, + 4157940877, + 2661362944, + 2733466349, + 3268771274, + 3519278612, + 1166194562, + 2883179951, + 2171852225, + 3593190983, + 1814621328, + 2825656274, + 1315956616, + 2225883289, + 3935953437, + 3843957055, + 3992352130, + 791622923, + 1900046645, + 2194281617, + 173693311, + 3188046552, + 1977818631, + 2636224329, + 1834520836, + 564647749, + 3466055246, + 2352858909, + 4139238283, + 2609575522, + 181332528, + 3247722871, + 4220497929, + 3696639433, + 3428982325, + 297904334, + 2231950009, + 3297882138, + 1005405754, + ]; + + static final String serverAPI = String.fromCharCodes(List.generate( + _envieddataserverAPI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverAPI[i] ^ _enviedkeyserverAPI[i])); + + static const List _enviedkeymapAPIKEY = [ + 2153809501, + 1717724714, + 2151938677, + 1229863763, + 2746914801, + 2696393788, + 3964805992, + 2628282829, + 2971325611, + 1913336259, + 3410639682, + 1074762273, + 2849331597, + 2019010228, + 1671228132, + 1758485582, + 1648641920, + 2740973582, + 1209685156, + 2572170395, + 3507709988, + 418998655, + 1555447890, + 1211807488, + 1885466080, + 3862747019, + 2048117101, + 3537696603, + 2578736352, + 3464547711, + 4184654064, + 1925582979, + 1564045091, + 3602355776, + 1521167478, + 1619900017, + 303179868, + 1742350684, + 483803176, + ]; + + static const List _envieddatamapAPIKEY = [ + 2153809436, + 1717724771, + 2151938575, + 1229863730, + 2746914722, + 2696393797, + 3964805931, + 2628282763, + 2971325656, + 1913336212, + 3410639616, + 1074762320, + 2849331707, + 2019010271, + 1671228092, + 1758485556, + 1648642027, + 2740973631, + 1209685219, + 2572170489, + 3507709961, + 418998557, + 1555447825, + 1211807559, + 1885466008, + 3862747132, + 2048117020, + 3537696527, + 2578736279, + 3464547637, + 4184653985, + 1925583048, + 1564045162, + 3602355749, + 1521167422, + 1619899931, + 303179796, + 1742350698, + 483803164, + ]; + + static final String mapAPIKEY = String.fromCharCodes(List.generate( + _envieddatamapAPIKEY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapAPIKEY[i] ^ _enviedkeymapAPIKEY[i])); + + static const List _enviedkeytwilloRecoveryCode = [ + 3537420439, + 3071366073, + 4124975510, + 4079975764, + 1641569888, + 1090253385, + 961259178, + 2480470956, + 2156023688, + 2331328498, + 1578917116, + 436602571, + 1213917411, + 2660599139, + 1124019908, + 3226120242, + 1000488265, + 1653285308, + 884328320, + 361930530, + 4085604186, + 387663512, + 728462850, + 1031208531, + 1745429678, + 4179566444, + 1366642943, + 480691156, + 3926943327, + 1177733874, + 3999473938, + ]; + + static const List _envieddatatwilloRecoveryCode = [ + 3537420500, + 3071366136, + 4124975555, + 4079975779, + 1641569881, + 1090253325, + 961259234, + 2480471036, + 2156023744, + 2331328451, + 1578917054, + 436602529, + 1213917350, + 2660599130, + 1124019860, + 3226120295, + 1000488193, + 1653285256, + 884328389, + 361930614, + 4085604098, + 387663564, + 728462929, + 1031208459, + 1745429748, + 4179566388, + 1366642829, + 480691084, + 3926943283, + 1177733808, + 3999474046, + ]; + + static final String twilloRecoveryCode = String.fromCharCodes( + List.generate( + _envieddatatwilloRecoveryCode.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatatwilloRecoveryCode[i] ^ _enviedkeytwilloRecoveryCode[i])); + + static const List _enviedkeyauthTokenTwillo = [ + 3362180945, + 3000957571, + 94474985, + 2902254753, + 259948397, + 3358661688, + 3894298645, + 3823635530, + 105227886, + 4107232009, + 3935735069, + 2075554634, + 2145437488, + 49444953, + 3434409934, + 181967200, + 997177958, + 968129460, + 2217376028, + 3345799519, + 4255271060, + 3516841777, + 1609997986, + 3324685951, + 319716042, + 1531829892, + 3141436171, + 1678235352, + 3679542999, + 1174829834, + 3576519681, + 2717004457, + 978001268, + 1346107625, + 1448636811, + 3908533015, + 3494071621, + 1002886071, + 3251450010, + ]; + + static const List _envieddataauthTokenTwillo = [ + 3362180966, + 3000957619, + 94474908, + 2902254744, + 259948373, + 3358661714, + 3894298720, + 3823635578, + 105227868, + 4107232056, + 3935735081, + 2075554597, + 2145437512, + 49444897, + 3434409978, + 181967121, + 997177942, + 968129473, + 2217376043, + 3345799531, + 4255271076, + 3516841731, + 1609997978, + 3324685834, + 319716090, + 1531829942, + 3141436218, + 1678235309, + 3679543011, + 1174829947, + 3576519796, + 2717004447, + 978001217, + 1346107569, + 1448636921, + 3908533071, + 3494071593, + 1002886133, + 3251450102, + ]; + + static final String authTokenTwillo = String.fromCharCodes(List.generate( + _envieddataauthTokenTwillo.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataauthTokenTwillo[i] ^ _enviedkeyauthTokenTwillo[i])); + + static const List _enviedkeychatGPTkey = [ + 3786852239, + 3732632804, + 1053776283, + 609961636, + 3506360346, + 625368775, + 2871139619, + 2231800289, + 1635317307, + 1543784181, + 2094286987, + 172967389, + 2741963363, + 1223310290, + 328811405, + 3373915683, + 2685671354, + 369992755, + 663737942, + 4032223782, + 1781476190, + 1326656188, + 765874861, + 1064585155, + 3868720560, + 1364876958, + 443431170, + 3262248349, + 3375731716, + 4170786754, + 545906736, + 2778646075, + 2090318803, + 2041482066, + 1152946381, + 130562977, + 560898742, + 2988169869, + 3017356002, + 4050807567, + 2695741927, + 318740299, + 1909018411, + 3623348726, + 3322266726, + 1327776977, + 1933379424, + 94627726, + 3658778696, + 4230763093, + 3699488827, + 1059401774, + 117625551, + 49472154, + 372487933, + 3089433325, + 3795614663, + 1356721168, + ]; + + static const List _envieddatachatGPTkey = [ + 3786852341, + 3732632707, + 1053776310, + 609961616, + 3506360409, + 625368821, + 2871139605, + 2231800208, + 1635317263, + 1543784102, + 2094287058, + 172967354, + 2741963297, + 1223310233, + 328811484, + 3373915718, + 2685671410, + 369992809, + 663737874, + 4032223831, + 1781476149, + 1326656235, + 765874882, + 1064585140, + 3868720627, + 1364876967, + 443431258, + 3262248431, + 3375731836, + 4170786725, + 545906789, + 2778646142, + 2090318773, + 2041481991, + 1152946356, + 130562968, + 560898812, + 2988169951, + 3017355925, + 4050807613, + 2695741845, + 318740262, + 1909018397, + 3623348647, + 3322266708, + 1327776944, + 1933379332, + 94627820, + 3658778747, + 4230763070, + 3699488849, + 1059401817, + 117625495, + 49472232, + 372487845, + 3089433217, + 3795614597, + 1356721276, + ]; + + static final String chatGPTkey = String.fromCharCodes(List.generate( + _envieddatachatGPTkey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatachatGPTkey[i] ^ _enviedkeychatGPTkey[i])); + + static const List _enviedkeytransactionCloude = [ + 4256137704, + 1131235090, + 3524805807, + 1137093455, + 95805664, + 2028039779, + 403105163, + 2466168397, + 2959604363, + 265564894, + 1442637881, + 2407873072, + 556426829, + 2097078225, + 116178150, + 1999637691, + 1766923333, + 433938057, + 3182632941, + 778732578, + 4054520808, + 3398533491, + 2450186659, + 2575208799, + 1962670118, + 1263195345, + 2599037580, + 2087788003, + 3752380882, + 3451045572, + 3937155722, + 4008799724, + 1920870975, + 153705789, + 2381914293, + 1556283338, + 1783684442, + 1394036715, + 2348122788, + 835763958, + 2857575123, + 191745781, + 72176964, + 1329174336, + 1492221001, + 3270884876, + 3667641416, + 3951314661, + 2719291792, + 1078630316, + 74369559, + 3064791176, + 2484022190, + 4189065941, + 3882930302, + 1050346586, + 2459339915, + 781594494, + 467086029, + 4130603018, + 4129298068, + 3655195844, + ]; + + static const List _envieddatatransactionCloude = [ + 4256137657, + 1131235194, + 3524805836, + 1137093432, + 95805589, + 2028039690, + 403105255, + 2466168354, + 2959604454, + 265564847, + 1442637914, + 2407873119, + 556426788, + 2097078195, + 116178140, + 1999637738, + 1766923283, + 433938118, + 3182632882, + 778732648, + 4054520742, + 3398533418, + 2450186726, + 2575208731, + 1962670100, + 1263195273, + 2599037659, + 2087787938, + 3752380896, + 3451045618, + 3937155795, + 4008799668, + 1920871028, + 153705854, + 2381914247, + 1556283294, + 1783684362, + 1394036689, + 2348122877, + 835763901, + 2857575138, + 191745713, + 72176914, + 1329174280, + 1492221055, + 3270884959, + 3667641346, + 3951314599, + 2719291811, + 1078630301, + 74369625, + 3064791227, + 2484022270, + 4189065872, + 3882930255, + 1050346511, + 2459339987, + 781594380, + 467085973, + 4130603110, + 4129298134, + 3655195816, + ]; + + static final String transactionCloude = String.fromCharCodes( + List.generate( + _envieddatatransactionCloude.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatatransactionCloude[i] ^ _enviedkeytransactionCloude[i])); + + static const List _enviedkeyvisionApi = [ + 2587413125, + 3873776415, + 4101742375, + 1175413350, + 2211467417, + 3359371623, + 2765348110, + 72153215, + 1510187110, + 3007833241, + 2285799989, + 498201912, + 1109185188, + 2025019304, + 3496052825, + 3397956748, + 2184623442, + 1836007574, + 102070427, + 1598026421, + 3465689361, + 703356516, + 1413374599, + 3735457548, + 1147409172, + 1855542604, + 1685439105, + 2567710940, + 1458392111, + 1030621460, + 576465074, + 1340377154, + 1771370400, + 1137886121, + 3320372229, + 861270479, + 4026741435, + 3287230557, + ]; + + static const List _envieddatavisionApi = [ + 2587413174, + 3873776495, + 4101742438, + 1175413290, + 2211467498, + 3359371542, + 2765348189, + 72153132, + 1510187071, + 3007833293, + 2285800003, + 498201922, + 1109185236, + 2025019294, + 3496052832, + 3397956829, + 2184623463, + 1836007632, + 102070486, + 1598026492, + 3465689462, + 703356422, + 1413374717, + 3735457638, + 1147409235, + 1855542650, + 1685439195, + 2567710957, + 1458392149, + 1030621567, + 576465094, + 1340377096, + 1771370488, + 1137886171, + 3320372317, + 861270435, + 4026741497, + 3287230513, + ]; + + static final String visionApi = String.fromCharCodes(List.generate( + _envieddatavisionApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatavisionApi[i] ^ _enviedkeyvisionApi[i])); + + static const List _enviedkeysecretKey = [ + 3654463152, + 3416585590, + 3149442923, + 717063272, + 3080547632, + 266800536, + 2759980491, + 2472288810, + 4121794722, + 2196338447, + 906107486, + 1090401676, + 1134651509, + 1511420274, + 1825853416, + 1798074629, + 218876838, + 537036421, + 2404747747, + 16063446, + 2432645494, + 2520161535, + 476781644, + 2819869157, + 1122326427, + 2108107605, + 1296509960, + 1324443907, + 2349447386, + 3531397169, + 3458259817, + 3907233693, + 2827287199, + 2435574896, + 3572243293, + 1198251345, + 3998966605, + 1435932076, + 2261345401, + 3274847032, + 4010681091, + 1919423268, + 3071606787, + 3053141085, + 4123880137, + 3029216777, + 796750198, + 798322019, + 3300309355, + 1631443949, + 4100494388, + 612815205, + 1671043887, + 2042330225, + 3485693301, + 1158490048, + 946237303, + 3001039540, + 4167115672, + 3859138898, + 1117687614, + 1658579885, + 3647987345, + 2607633038, + 2491991917, + 2238113065, + 999163941, + 3334549387, + 1014819469, + 2365576395, + 2123276065, + 239732841, + 3411829899, + 614444503, + 3420340265, + 1224259483, + 2756679908, + 116821267, + 3288044276, + 1634826746, + 1912454918, + 3080184510, + 3531761406, + 403624695, + 1754471204, + 2352341728, + 554577622, + 684370183, + 1937395147, + 964593560, + 2125111951, + 2484308985, + 469494435, + 2156652283, + 2410203027, + 4174100142, + 1456331799, + 569240699, + 3318451332, + 2379208115, + 2829592092, + 268674417, + 2601915327, + 640630908, + 1241136337, + 3526214825, + 78576860, + 3068800988, + 2492167598, + 2155894656, + 103631069, + 2133170522, + 4110066301, + 2136591219, + ]; + + static const List _envieddatasecretKey = [ + 3654463178, + 3416585489, + 3149442868, + 717063194, + 3080547679, + 266800616, + 2759980449, + 2472288885, + 4121794711, + 2196338488, + 906107415, + 1090401765, + 1134651395, + 1511420228, + 1825853336, + 1798074696, + 218876896, + 537036486, + 2404747681, + 16063376, + 2432645383, + 2520161484, + 476781583, + 2819869143, + 1122326517, + 2108107619, + 1296510017, + 1324443995, + 2349447350, + 3531397212, + 3458259715, + 3907233764, + 2827287284, + 2435574784, + 3572243237, + 1198251285, + 3998966560, + 1435932155, + 2261345344, + 3274846987, + 4010681168, + 1919423347, + 3071606832, + 3053141035, + 4123880127, + 3029216849, + 796750110, + 798322005, + 3300309331, + 1631443896, + 4100494453, + 612815196, + 1671043963, + 2042330180, + 3485693235, + 1158489999, + 946237221, + 3001039584, + 4167115727, + 3859138869, + 1117687657, + 1658579934, + 3647987397, + 2607633085, + 2491991898, + 2238113146, + 999163985, + 3334549440, + 1014819582, + 2365576324, + 2123276145, + 239732749, + 3411830012, + 614444435, + 3420340301, + 1224259560, + 2756679837, + 116821291, + 3288044165, + 1634826664, + 1912454975, + 3080184525, + 3531761292, + 403624634, + 1754471281, + 2352341644, + 554577571, + 684370278, + 1937395107, + 964593643, + 2125111996, + 2484308887, + 469494515, + 2156652211, + 2410203109, + 4174100169, + 1456331861, + 569240602, + 3318451383, + 2379208064, + 2829592168, + 268674358, + 2601915348, + 640630853, + 1241136353, + 3526214879, + 78576778, + 3068801001, + 2492167670, + 2155894770, + 103630981, + 2133170486, + 4110066239, + 2136591135, + ]; + + static final String secretKey = String.fromCharCodes(List.generate( + _envieddatasecretKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatasecretKey[i] ^ _enviedkeysecretKey[i])); + + static const List _enviedkeystripePublishableKe = [ + 876514748, + 3658219415, + 2076135858, + 40205727, + 1517171072, + 3477284252, + 362607344, + 4243435846, + 1318148537, + 2070291139, + 3189615878, + 2658254458, + 3451629188, + 2366106020, + 3425948970, + 4262994335, + 619782453, + 38440205, + 3779921531, + 95454900, + 3064295405, + 325337346, + 2582345877, + 663305894, + 4181923300, + 2733377203, + 1744020604, + 2444027456, + 2787558541, + 2827753833, + 1279538374, + 2513160312, + 2790913443, + 460154456, + 1908612745, + 3001862570, + 604842350, + 3194255383, + 3825639760, + 834700785, + 1351339590, + 1068699204, + 2276945742, + 3905087556, + 1201994132, + 1433007093, + 572855162, + 2978592381, + 1089092991, + 2435560104, + 1585561424, + 2024222980, + 587364406, + 2066162669, + 2158595549, + 3793911624, + 1301986217, + 1840181878, + 488320380, + 1429381767, + 2093424505, + 1430017187, + 1599842342, + 2358096446, + 2888291713, + 4234892307, + 3652652610, + 1734387639, + 1227483346, + 3146929026, + 3339544755, + 2817461714, + 70042317, + 1252342861, + 2312293144, + 1544430299, + 1737279479, + 217116193, + 3462497349, + 3712190436, + 1298055884, + 1587166190, + 191591702, + 719346531, + 3771333436, + 1779391119, + 3800857304, + 1136654901, + 3559928019, + 2912180931, + 1202711060, + 3358184719, + 473143128, + 3947649157, + 500211350, + 255404824, + 3214288455, + 4161791343, + 202463212, + 1007650001, + 2637754075, + 2509849682, + 3197368873, + 4059814102, + 1226905424, + 3450998767, + 615888451, + 3599988369, + 4279456103, + 2744807956, + 1394542425, + 1853957078, + 3143588770, + 2033137164, + ]; + + static const List _envieddatastripePublishableKe = [ + 876514762, + 3658219504, + 2076135917, + 40205807, + 1517171186, + 3477284339, + 362607232, + 4243435820, + 1318148582, + 2070291190, + 3189615921, + 2658254387, + 3451629293, + 2366106066, + 3425948956, + 4262994386, + 619782515, + 38440270, + 3779921465, + 95454962, + 3064295324, + 325337393, + 2582345942, + 663305876, + 4181923210, + 2733377157, + 1744020503, + 2444027406, + 2787558599, + 2827753735, + 1279538332, + 2513160250, + 2790913498, + 460154382, + 1908612799, + 3001862596, + 604842267, + 3194255443, + 3825639716, + 834700713, + 1351339555, + 1068699261, + 2276945671, + 3905087534, + 1201994193, + 1433007013, + 572855093, + 2978592283, + 1089092887, + 2435560133, + 1585561376, + 2024223040, + 587364418, + 2066162618, + 2158595504, + 3793911612, + 1301986202, + 1840181819, + 488320304, + 1429381845, + 2093424457, + 1430017220, + 1599842423, + 2358096462, + 2888291816, + 4234892379, + 3652652577, + 1734387686, + 1227483327, + 3146929091, + 3339544821, + 2817461663, + 70042264, + 1252342813, + 2312293226, + 1544430209, + 1737279380, + 217116178, + 3462497300, + 3712190349, + 1298055823, + 1587166122, + 191591804, + 719346459, + 3771333502, + 1779391189, + 3800857236, + 1136654935, + 3559927979, + 2912180871, + 1202711127, + 3358184764, + 473143101, + 3947649251, + 500211438, + 255404879, + 3214288447, + 4161791253, + 202463199, + 1007650018, + 2637754041, + 2509849605, + 3197368929, + 4059814119, + 1226905354, + 3450998664, + 615888433, + 3599988450, + 4279456063, + 2744808038, + 1394542337, + 1853957050, + 3143588832, + 2033137248, + ]; + + static final String stripePublishableKe = String.fromCharCodes( + List.generate( + _envieddatastripePublishableKe.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatastripePublishableKe[i] ^ + _enviedkeystripePublishableKe[i])); + + static const List _enviedkeychatGPTkeySefer = [ + 3828515769, + 1122510313, + 3953262767, + 1408310452, + 1822194240, + 154082633, + 1001660738, + 484193291, + 2002203759, + 629351227, + 3973770150, + 26674579, + 1284003086, + 3422591402, + 3920459085, + 2134304979, + 1913021756, + 1336748742, + 1746926880, + 2817268193, + 192604422, + 1582102568, + 2785560302, + 2762244930, + 1572274322, + 384464138, + 4180286216, + 686462029, + 3218873456, + 3526440497, + 2825628193, + 2000997445, + 1300670423, + 1664907881, + 1816966356, + 3323342264, + 3038708469, + 1211530530, + 2493583177, + 1749362911, + 43204795, + 2694147136, + 2658505682, + 2792646701, + 4068187237, + 3193187187, + 3152040852, + 1921832143, + 4044809475, + 2491530058, + 2192584287, + 315634015, + 1575880275, + 2766211356, + 459800476, + 952682329, + 1397265637, + 3700145818, + ]; + + static const List _envieddatachatGPTkeySefer = [ + 3828515779, + 1122510222, + 3953262722, + 1408310525, + 1822194217, + 154082587, + 1001660785, + 484193378, + 2002203739, + 629351252, + 3973770185, + 26674665, + 1284003183, + 3422591385, + 3920459028, + 2134304933, + 1913021780, + 1336748720, + 1746926914, + 2817268184, + 192604532, + 1582102642, + 2785560197, + 2762244979, + 1572274385, + 384464179, + 4180286288, + 686462015, + 3218873352, + 3526440534, + 2825628276, + 2000997376, + 1300670439, + 1664907781, + 1816966380, + 3323342290, + 3038708391, + 1211530608, + 2493583123, + 1749362861, + 43204851, + 2694147114, + 2658505697, + 2792646780, + 4068187136, + 3193187142, + 3152040901, + 1921832087, + 4044809555, + 2491530022, + 2192584238, + 315633929, + 1575880203, + 2766211438, + 459800516, + 952682293, + 1397265575, + 3700145910, + ]; + + static final String chatGPTkeySefer = String.fromCharCodes(List.generate( + _envieddatachatGPTkeySefer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddatachatGPTkeySefer[i] ^ _enviedkeychatGPTkeySefer[i])); + + static const List _enviedkeyllamaKey = [ + 718274881, + 43918519, + 1035336099, + 3530924980, + 4177290048, + 3891250685, + 1417458965, + 2462639059, + 1173170674, + 134564287, + 3916589804, + 3907114176, + 59541341, + 1084921401, + 399944843, + 2167463616, + 985939721, + 3602640176, + 3637308129, + 445991234, + 1042298384, + 4261190747, + 75311953, + 4076073787, + 3146584602, + 3753629753, + 3615512101, + 875903464, + 883808121, + 3468599075, + 2746200671, + 1072473529, + 4002086586, + 1973891555, + 2864880638, + 704984882, + 1760979656, + 3589747206, + 3252999772, + 3864969355, + 2619144558, + 2506943584, + 3852811552, + 2726057005, + 1664604992, + 577026891, + 3109760396, + 240297872, + 975650921, + 1447165586, + 1201836595, + 912313223, + 3587424956, + 4039444014, + 1142697319, + 1101696944, + 2981762231, + 2586652660, + 3810960882, + 3795959514, + 3307311850, + 2929648546, + 3409186162, + 3918093583, + 3259877139, + 1253635736, + 3006720290, + 3882729327, + 3870725696, + 1350987208, + 248531164, + 4062780763, + 3478462698, + 2191690024, + ]; + + static const List _envieddatallamaKey = [ + 718274835, + 43918565, + 1035336078, + 3530925041, + 4177290037, + 3891250564, + 1417459066, + 2462638997, + 1173170614, + 134564330, + 3916589722, + 3907114150, + 59541263, + 1084921469, + 399944905, + 2167463599, + 985939811, + 3602640132, + 3637308119, + 445991204, + 1042298442, + 4261190672, + 75311888, + 4076073807, + 3146584657, + 3753629811, + 3615512086, + 875903390, + 883808022, + 3468599150, + 2746200679, + 1072473588, + 4002086606, + 1973891540, + 2864880584, + 704984842, + 1760979627, + 3589747286, + 3252999737, + 3864969409, + 2619144504, + 2506943575, + 3852811623, + 2726057059, + 1664604964, + 577026826, + 3109760487, + 240297920, + 975650877, + 1447165657, + 1201836631, + 912313310, + 3587424900, + 4039444065, + 1142697219, + 1101696989, + 2981762190, + 2586652570, + 3810960838, + 3795959485, + 3307311757, + 2929648613, + 3409186051, + 3918093638, + 3259877158, + 1253635807, + 3006720347, + 3882729216, + 3870725656, + 1350987194, + 248531076, + 4062780727, + 3478462632, + 2191690052, + ]; + + static final String llamaKey = String.fromCharCodes(List.generate( + _envieddatallamaKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatallamaKey[i] ^ _enviedkeyllamaKey[i])); + + static const List _enviedkeyserverPHP = [ + 690267321, + 986154779, + 3912670525, + 2020362393, + 2727368054, + 868762389, + 3336627634, + 1486140679, + 3854218818, + 345798652, + 2113101983, + 1413021410, + 4254920968, + 2567637083, + 3216036756, + 2638115032, + 538950038, + 3568054948, + 2024838444, + 1936285171, + 123229642, + 2521088569, + 4142818245, + 3069657302, + 948569947, + 3065710519, + 41540649, + 249400926, + ]; + + static const List _envieddataserverPHP = [ + 690267345, + 986154863, + 3912670537, + 2020362473, + 2727367941, + 868762415, + 3336627613, + 1486140712, + 3854218787, + 345798540, + 2113102070, + 1413021388, + 4254921083, + 2567637054, + 3216036850, + 2638115005, + 538950116, + 3568054922, + 2024838464, + 1936285082, + 123229628, + 2521088604, + 4142818282, + 3069657253, + 948569918, + 3065710545, + 41540684, + 249400876, + ]; + + static final String serverPHP = String.fromCharCodes(List.generate( + _envieddataserverPHP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverPHP[i] ^ _enviedkeyserverPHP[i])); + + static const List _enviedkeyseferAlexandriaServer = [ + 3130442956, + 4159453127, + 1435322127, + 3505180604, + 2378495829, + 1487183399, + 1372745074, + 3321809836, + 2210972875, + 2436730833, + 156324606, + 479930271, + 2278564115, + 1625529197, + 2462548402, + 2110251768, + 1800913045, + 3914764925, + 2561423239, + 28131136, + 3808095291, + 3826571942, + 3192331182, + 3151262737, + 612910381, + 1116367226, + 339139684, + 82367597, + 1878153550, + 1438314440, + 1071949741, + 4226074809, + 2006603887, + 104296793, + ]; + + static const List _envieddataseferAlexandriaServer = [ + 3130442916, + 4159453107, + 1435322235, + 3505180620, + 2378495782, + 1487183389, + 1372745053, + 3321809795, + 2210972856, + 2436730804, + 156324504, + 479930362, + 2278564193, + 1625529100, + 2462548446, + 2110251677, + 1800913133, + 3914764828, + 2561423337, + 28131108, + 3808095305, + 3826571983, + 3192331215, + 3151262783, + 612910430, + 1116367123, + 339139600, + 82367496, + 1878153569, + 1438314427, + 1071949768, + 4226074847, + 2006603786, + 104296747, + ]; + + static final String seferAlexandriaServer = String.fromCharCodes( + List.generate( + _envieddataseferAlexandriaServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferAlexandriaServer[i] ^ + _enviedkeyseferAlexandriaServer[i])); + + static const List _enviedkeywhatsapp = [ + 2314826291, + 3705858160, + 2733576005, + 2574229956, + 2193296548, + 1803609467, + 2978302673, + 1525226554, + 461544383, + 4269942853, + 1901453392, + 787427305, + 610992601, + 3396561063, + 3600604474, + 4038130351, + 3674117733, + 3065755419, + 1658137477, + 1095657005, + 304006016, + 145406252, + 2027048891, + 1173962907, + 2172563228, + 2278848442, + 752169586, + 531303566, + 3492598424, + 66380735, + 136852293, + 2956932059, + 669191123, + 527777235, + 167191276, + 2805348444, + 1729263794, + 1385765292, + 2591641537, + 715966522, + 1513753165, + 48266555, + 2458133980, + 3451583562, + 2548265665, + 829900145, + 3246705661, + 1124976797, + 3193694097, + 1002460522, + 1642617955, + 3776995085, + 2682978427, + 3057991762, + 1853396094, + 3216259780, + 2031149651, + 1084895166, + 1369940232, + 2874274133, + 4022239950, + 2636929910, + 1690173967, + 1687171307, + 3506209777, + 3374925507, + 1865398683, + 3633869538, + 3638894531, + 4239993695, + 2497880038, + 1360153668, + 2834566748, + 1249564345, + 3204343765, + 1308247711, + 2050515352, + 708068455, + 792968551, + 4141844180, + 2213364689, + 2662098845, + 1766804796, + 1156367325, + 239889576, + 2939081648, + 3918245325, + 3542161055, + 3233083982, + 2055579115, + 1781284714, + 144356209, + 4270888948, + 1121549347, + 1140834615, + 1493519308, + 595114979, + 1164782533, + 2989457958, + 1238777474, + 2272656959, + 2100593090, + 2625403831, + 2233559563, + 1811942331, + 1604782696, + 999024462, + 845286856, + 1753266125, + 299767516, + 469256077, + 1751323727, + 4020414466, + 1625710104, + 3399152516, + 291604961, + 639180565, + 2373261919, + 2378984807, + 2708802280, + 4195641655, + 771291976, + 1574473714, + 1018605914, + 1885712612, + 1031487623, + 432381962, + 4124790828, + 4208931970, + 1559732144, + 1401344603, + 1163908458, + 3923533473, + 1115587448, + 2793584775, + 962624732, + 2058771688, + 529408705, + 2966443566, + 3769757663, + 3761308600, + 1450097904, + 961674376, + 1415639059, + 362893202, + 908268066, + 2997060034, + 3204324547, + 26249817, + 2401321084, + 3092399958, + 3662211376, + 1837897414, + 134852601, + 1614383128, + 3581532033, + 1639059727, + 1824224605, + 1382933689, + 2896175625, + 1925511203, + 3935692519, + 539664745, + 1365029565, + 2164037395, + 3812836188, + 2557390918, + 2906196765, + 4228420694, + 1848412359, + 3337391915, + 2303142266, + 114547934, + 3938964087, + 928354934, + 3785376213, + 2166350240, + 398157133, + 2947652590, + 1461468363, + 686077996, + 4251629055, + 1514833890, + 1883577095, + 2428118207, + 3649479287, + 2386283762, + 3992819500, + 1627572360, + 2823609251, + 3188042215, + 1096240208, + 2743216881, + 3671930706, + 2750355672, + 687529587, + 1124238295, + 118820826, + 2871849821, + 2640521823, + 511491064, + 1544570156, + 164984782, + 3697817683, + 395117147, + 3333850388, + 3736536663, + 512864734, + 3196286767, + 1431087716, + 1573567079, + 3691459886, + 2960306340, + 2827187368, + 1682304056, + 580258271, + 2747284367, + 2401707395, + 3894499304, + 600982657, + 1848141143, + 4207274952, + 1511492725, + 3482158830, + 2846325392, + ]; + + static const List _envieddatawhatsapp = [ + 2314826358, + 3705858097, + 2733575940, + 2574229899, + 2193296592, + 1803609369, + 2978302603, + 1525226616, + 461544428, + 4269942800, + 1901453339, + 787427294, + 610992621, + 3396561125, + 3600604533, + 4038130389, + 3674117682, + 3065755426, + 1658137596, + 1095657039, + 304006071, + 145406232, + 2027048958, + 1173963004, + 2172563293, + 2278848458, + 752169507, + 531303639, + 3492598508, + 66380790, + 136852349, + 2956932067, + 669191101, + 527777162, + 167191192, + 2805348377, + 1729263755, + 1385765318, + 2591641488, + 715966547, + 1513753204, + 48266602, + 2458133938, + 3451583494, + 2548265606, + 829900033, + 3246705546, + 1124976814, + 3193694167, + 1002460475, + 1642617875, + 3776995182, + 2682978382, + 3057991734, + 1853395974, + 3216259725, + 2031149631, + 1084895226, + 1369940335, + 2874274051, + 4022239876, + 2636929804, + 1690174060, + 1687171238, + 3506209672, + 3374925492, + 1865398750, + 3633869472, + 3638894514, + 4239993617, + 2497879999, + 1360153634, + 2834566767, + 1249564362, + 3204343789, + 1308247791, + 2050515443, + 708068364, + 792968529, + 4141844151, + 2213364619, + 2662098911, + 1766804745, + 1156367244, + 239889560, + 2939081668, + 3918245286, + 3542161108, + 3233083963, + 2055579064, + 1781284645, + 144356139, + 4270888886, + 1121549392, + 1140834680, + 1493519290, + 595114926, + 1164782495, + 2989458023, + 1238777521, + 2272657003, + 2100593057, + 2625403843, + 2233559651, + 1811942283, + 1604782625, + 999024418, + 845286794, + 1753266053, + 299767439, + 469256172, + 1751323650, + 4020414548, + 1625710188, + 3399152615, + 291604915, + 639180623, + 2373261852, + 2378984724, + 2708802185, + 4195641699, + 771291907, + 1574473660, + 1018605833, + 1885712561, + 1031487735, + 432382060, + 4124790880, + 4208932048, + 1559732215, + 1401344521, + 1163908360, + 3923533457, + 1115587338, + 2793584879, + 962624656, + 2058771597, + 529408699, + 2966443616, + 3769757593, + 3761308628, + 1450097820, + 961674488, + 1415639114, + 362893264, + 908268101, + 2997060015, + 3204324525, + 26249791, + 2401320990, + 3092399934, + 3662211429, + 1837897383, + 134852483, + 1614383179, + 3581532123, + 1639059789, + 1824224516, + 1382933729, + 2896175725, + 1925511249, + 3935692499, + 539664729, + 1365029587, + 2164037502, + 3812836114, + 2557390962, + 2906196812, + 4228420627, + 1848412320, + 3337391964, + 2303142175, + 114547861, + 3938964037, + 928354835, + 3785376164, + 2166350329, + 398157084, + 2947652480, + 1461468319, + 686078072, + 4251628977, + 1514833815, + 1883577205, + 2428118214, + 3649479203, + 2386283709, + 3992819541, + 1627572426, + 2823609288, + 3188042156, + 1096240138, + 2743216819, + 3671930723, + 2750355605, + 687529515, + 1124238234, + 118820781, + 2871849835, + 2640521738, + 511491023, + 1544570237, + 164984736, + 3697817607, + 395117065, + 3333850437, + 3736536595, + 512864678, + 3196286823, + 1431087622, + 1573567026, + 3691459960, + 2960306376, + 2827187417, + 1682304095, + 580258198, + 2747284445, + 2401707479, + 3894499226, + 600982761, + 1848141110, + 4207274919, + 1511492634, + 3482158772, + 2846325460, + ]; + + static final String whatsapp = String.fromCharCodes(List.generate( + _envieddatawhatsapp.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatawhatsapp[i] ^ _enviedkeywhatsapp[i])); + + static const List _enviedkeywhatappID = [ + 3541601174, + 1376766950, + 276779285, + 104349768, + 2130563736, + 1547842195, + 4153132128, + 1829301397, + 3309911463, + 163177719, + 4023562387, + 697894604, + 3604205243, + 2228891821, + 1033273803, + 2800896661, + ]; + + static const List _envieddatawhatappID = [ + 3541601189, + 1376766928, + 276779308, + 104349809, + 2130563755, + 1547842218, + 4153132119, + 1829301414, + 3309911441, + 163177669, + 4023562411, + 697894653, + 3604205194, + 2228891797, + 1033273852, + 2800896684, + ]; + + static final String whatappID = String.fromCharCodes(List.generate( + _envieddatawhatappID.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatawhatappID[i] ^ _enviedkeywhatappID[i])); + + static const List _enviedkeyseferPaymentServer = [ + 4041910065, + 3750565872, + 1774250308, + 1109874365, + 2462053754, + 156182580, + 1932377152, + 3860367672, + 951561788, + 2208884840, + 2450769819, + 3703756580, + 1793324006, + 574671184, + 2885330743, + 2531320255, + 216834867, + 198077899, + 3720958049, + 4058092462, + 3827553790, + 1903208137, + 906085840, + 2160187600, + 3089562779, + 1680658518, + ]; + + static const List _envieddataseferPaymentServer = [ + 4041910105, + 3750565764, + 1774250288, + 1109874381, + 2462053641, + 156182542, + 1932377199, + 3860367639, + 951561807, + 2208884749, + 2450769917, + 3703756609, + 1793323924, + 574671136, + 2885330752, + 2531320209, + 216834880, + 198077859, + 3720957966, + 4058092510, + 3827553745, + 1903208122, + 906085813, + 2160187574, + 3089562878, + 1680658468, + ]; + + static final String seferPaymentServer = String.fromCharCodes( + List.generate( + _envieddataseferPaymentServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferPaymentServer[i] ^ _enviedkeyseferPaymentServer[i])); + + static const List _enviedkeyseferCairoServer = [ + 138743384, + 438834682, + 1798193620, + 1922682257, + 633113906, + 3031685544, + 2449610601, + 1478661285, + 530099082, + 1902153614, + 1183656720, + 439667246, + 2075771564, + 2548611103, + 366266381, + 3661016385, + 816362445, + 1513882374, + 3310966987, + 3181267732, + 108417366, + 3198277404, + 3903338650, + 3146982780, + 2229529171, + 4191915930, + 3307556352, + 3207956038, + 132947553, + 506915609, + 3503227296, + 81779609, + 2824310429, + 3297570925, + 2539239238, + 1928047182, + 660747716, + 1340781596, + 2336552572, + 285946027, + 4122051035, + 235994590, + 1380966811, + ]; + + static const List _envieddataseferCairoServer = [ + 138743344, + 438834574, + 1798193568, + 1922682337, + 633113921, + 3031685522, + 2449610566, + 1478661258, + 530099193, + 1902153707, + 1183656802, + 439667288, + 2075771593, + 2548611181, + 366266403, + 3661016370, + 816362408, + 1513882464, + 3310966958, + 3181267814, + 108417400, + 3198277488, + 3903338739, + 3146982666, + 2229529142, + 4191915957, + 3307556467, + 3207956003, + 132947463, + 506915708, + 3503227346, + 81779639, + 2824310526, + 3297570817, + 2539239215, + 1928047149, + 660747695, + 1340781619, + 2336552463, + 285946062, + 4122051005, + 235994555, + 1380966889, + ]; + + static final String seferCairoServer = String.fromCharCodes( + List.generate( + _envieddataseferCairoServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferCairoServer[i] ^ _enviedkeyseferCairoServer[i])); + + static const List _enviedkeyseferGizaServer = [ + 1057231226, + 3186685233, + 1129519098, + 2322481574, + 3219424309, + 2923622608, + 2931597946, + 572062068, + 2629570670, + 2573757500, + 145639330, + 3602249100, + 2475129460, + 1734840390, + 2750869143, + 3366876069, + 1720094607, + 2996828456, + 3467619886, + 945392666, + 3111306502, + 885856024, + 3588930078, + 1682878843, + 3268170832, + 1401766694, + 2583383148, + 9231482, + 2291772170, + 2925242720, + ]; + + static const List _envieddataseferGizaServer = [ + 1057231122, + 3186685253, + 1129518990, + 2322481622, + 3219424326, + 2923622634, + 2931597909, + 572062043, + 2629570569, + 2573757525, + 145639384, + 3602249197, + 2475129351, + 1734840355, + 2750869233, + 3366876096, + 1720094717, + 2996828422, + 3467619905, + 945392756, + 3111306602, + 885856113, + 3588930160, + 1682878750, + 3268170879, + 1401766741, + 2583383049, + 9231388, + 2291772271, + 2925242642, + ]; + + static final String seferGizaServer = String.fromCharCodes(List.generate( + _envieddataseferGizaServer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataseferGizaServer[i] ^ _enviedkeyseferGizaServer[i])); + + static const List _enviedkeychatGPTkeySeferNew = [ + 1041695226, + 2173373535, + 341990905, + 1763264159, + 777042825, + 1991126721, + 1761259376, + 257188993, + 1839602067, + 3385619378, + 2103230069, + 1649316915, + 3557661837, + 3392412546, + 2971883861, + 963126969, + 3981368869, + 1887415813, + 1581534540, + 2517575305, + 3083998530, + 3410633466, + 1554506031, + 1312723327, + 218632814, + 1848454071, + 1974239534, + 3011871356, + 1803099298, + 1212482053, + 2147833951, + 1348216715, + 3065585456, + 1100485486, + 3735039057, + 2004104375, + 2438984628, + 294886511, + 2430772296, + 2854454045, + 908603532, + 1779808136, + 3317780304, + 683854560, + 1400999196, + 2601887940, + 1959572244, + 971692621, + 3132645241, + 1493266058, + 1837758334, + 1930937451, + 2422274802, + 3932310372, + 3264064477, + 810936702, + 335122644, + 2037393774, + ]; + + static const List _envieddatachatGPTkeySeferNew = [ + 1041695104, + 2173373496, + 341990868, + 1763264197, + 777042877, + 1991126702, + 1761259313, + 257189067, + 1839602160, + 3385619443, + 2103229991, + 1649316988, + 3557661930, + 3392412620, + 2971883789, + 963126995, + 3981368898, + 1887415927, + 1581534473, + 2517575360, + 3083998487, + 3410633410, + 1554506057, + 1312723252, + 218632749, + 1848454030, + 1974239606, + 3011871246, + 1803099354, + 1212482146, + 2147833866, + 1348216782, + 3065585412, + 1100485439, + 3735039013, + 2004104389, + 2438984646, + 294886403, + 2430772281, + 2854454060, + 908603637, + 1779808225, + 3317780261, + 683854488, + 1400999212, + 2601887918, + 1959572312, + 971692670, + 3132645149, + 1493266115, + 1837758250, + 1930937400, + 2422274730, + 3932310294, + 3264064389, + 810936594, + 335122582, + 2037393666, + ]; + + static final String chatGPTkeySeferNew = String.fromCharCodes( + List.generate( + _envieddatachatGPTkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatachatGPTkeySeferNew[i] ^ _enviedkeychatGPTkeySeferNew[i])); + + static const List _enviedkeycohere = [ + 611511544, + 1494452428, + 3788262256, + 1681395157, + 82861946, + 586291657, + 671229906, + 1459241267, + 3678840420, + 2268281541, + 2294500242, + 1235456790, + 344793054, + 3610961336, + 3486158049, + 3116145203, + 507636381, + 1092952097, + 305669009, + 1839841840, + 322404352, + 2002994562, + 3016821069, + 3923148745, + 2661946875, + 1638514321, + 1234237929, + 2460210205, + 982114055, + 4154344271, + 1767367401, + 65715456, + 2625375753, + 3960063167, + 2822422269, + 274135076, + 2099222704, + 2488762699, + 1766933556, + 3849061471, + 1693806126, + 462421162, + 3674358775, + 4243502407, + 1730120886, + 248869296, + 2373970844, + ]; + + static const List _envieddatacohere = [ + 611511481, + 1494452409, + 3788262172, + 1681395106, + 82861854, + 586291697, + 671229867, + 1459241222, + 3678840375, + 2268281493, + 2294500293, + 1235456889, + 344793005, + 3610961288, + 3486157961, + 3116145273, + 507636469, + 1092952141, + 305669078, + 1839841792, + 322404468, + 2002994669, + 3016821016, + 3923148719, + 2661946819, + 1638514422, + 1234237862, + 2460210293, + 982114130, + 4154344218, + 1767367323, + 65715568, + 2625375855, + 3960063114, + 2822422188, + 274135062, + 2099222756, + 2488762651, + 1766933593, + 3849061385, + 1693806185, + 462421234, + 3674358661, + 4243502367, + 1730120922, + 248869362, + 2373970928, + ]; + + static final String cohere = String.fromCharCodes(List.generate( + _envieddatacohere.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatacohere[i] ^ _enviedkeycohere[i])); + + static const List _enviedkeyclaudeAiAPI = [ + 3034037130, + 926388308, + 2455240759, + 2877837449, + 3178666606, + 3821984622, + 4035713713, + 2631947741, + 1741436046, + 347044261, + 2098230402, + 392270337, + 2087315398, + 56462518, + 3734757705, + 3805753747, + 1896715169, + 1838201098, + 257384494, + 871300050, + 3618684997, + 3934443295, + 4288677946, + 1367192345, + 1419308381, + 1306837461, + 1890637660, + 1651492271, + 3803257689, + 3315215278, + 1251866829, + 3796364120, + 1731641453, + 572888194, + 998800706, + 3860569544, + 271737826, + 1639692636, + 4179042251, + 780752137, + 3219204908, + 1048360616, + 2746918807, + 794537253, + 3545111528, + 353133027, + 83548857, + 559271346, + 785867514, + 589789459, + 2779141453, + 2727871382, + 2321668104, + 503551951, + 813609973, + 2227406076, + 2380044236, + 2215276103, + 1632693059, + 3373195732, + 1266312605, + 3232243129, + 2656157427, + 749274454, + 3735205680, + 3102857140, + 3503773715, + 1965366288, + 2246790831, + 2872431953, + 3366195114, + 3702820457, + 1984719832, + 3376326976, + 1477444999, + 3114914308, + 2033253554, + 1420961223, + 3261751890, + 2688806475, + 2248134969, + 3613819559, + 610110857, + 2994420122, + 3640746315, + 561256401, + 1548474356, + 813435086, + 905045331, + 3402198959, + 1989131828, + 603703707, + 301770614, + 1359789795, + 3865286971, + 1025129323, + 567810933, + 3620075973, + 2063387978, + 958920781, + 595959923, + 3211584822, + 2718879729, + 3624452564, + 1535922140, + 239550681, + 559737499, + 2704810600, + 1056935442, + 2514312056, + 1552663011, + 2848449571, + 2951657340, + 2294438483, + 3515215606, + ]; + + static const List _envieddataclaudeAiAPI = [ + 3034037232, + 926388275, + 2455240730, + 2877837560, + 3178666508, + 3821984525, + 4035713692, + 2631947692, + 1741436152, + 347044298, + 2098230449, + 392270392, + 2087315370, + 56462491, + 3734757681, + 3805753796, + 1896715246, + 1838201202, + 257384551, + 871299989, + 3618684978, + 3934443336, + 4288677998, + 1367192406, + 1419308327, + 1306837398, + 1890637594, + 1651492333, + 3803257655, + 3315215335, + 1251866772, + 3796364043, + 1731641382, + 572888265, + 998800682, + 3860569518, + 271737755, + 1639692582, + 4179042196, + 780752194, + 3219204986, + 1048360681, + 2746918881, + 794537303, + 3545111456, + 353133006, + 83548815, + 559271405, + 785867470, + 589789513, + 2779141384, + 2727871452, + 2321668164, + 503551993, + 813609933, + 2227406011, + 2380044179, + 2215276054, + 1632692993, + 3373195676, + 1266312623, + 3232243087, + 2656157340, + 749274419, + 3735205732, + 3102857211, + 3503773790, + 1965366365, + 2246790848, + 2872431872, + 3366195167, + 3702820366, + 1984719841, + 3376326923, + 1477445106, + 3114914379, + 2033253592, + 1420961197, + 3261751833, + 2688806424, + 2248135017, + 3613819640, + 610110920, + 2994420142, + 3640746264, + 561256418, + 1548474279, + 813435035, + 905045271, + 3402198979, + 1989131862, + 603703779, + 301770532, + 1359789786, + 3865287007, + 1025129246, + 567810851, + 3620075967, + 2063387941, + 958920732, + 595959902, + 3211584891, + 2718879642, + 3624452492, + 1535922051, + 239550604, + 559737546, + 2704810553, + 1056935491, + 2514311968, + 1552662929, + 2848449659, + 2951657232, + 2294438417, + 3515215514, + ]; + + static final String claudeAiAPI = String.fromCharCodes(List.generate( + _envieddataclaudeAiAPI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataclaudeAiAPI[i] ^ _enviedkeyclaudeAiAPI[i])); + + static const List _enviedkeypayPalClientId = [ + 1245667966, + 227233349, + 3794959348, + 923429575, + 170143512, + 3801056279, + 1915401842, + 381508056, + 1720779303, + 737290740, + 372559087, + 3341684616, + 1398938778, + 3093826911, + 2491397004, + 4041213175, + 244631680, + 2969628473, + 3207079429, + 3492445348, + 2348575385, + 1874376850, + 1379553046, + 1573461379, + 1981592417, + 1215829251, + 4187859974, + 1705037924, + 60941902, + 1362041303, + 228137601, + 2078349372, + 2831689278, + 2355424757, + 3775236762, + 4293487373, + 2650580100, + 92662277, + 2792189609, + 1430609215, + 2281167567, + 4135954845, + 4024483176, + 3508522880, + 3769715392, + 756727223, + 357591894, + 3698688968, + 4139033573, + 1129879094, + 4013009958, + 2240408549, + 1492589943, + 1706047308, + 2383728431, + 2202134356, + 2172594300, + 1044677234, + 1339198555, + 3944168732, + 896150162, + 3918395605, + 2393229529, + 2307339880, + 743989309, + 3256797385, + 2593354391, + 2634038619, + 4050414374, + 4069865429, + 3269967716, + 2966681969, + 2917236585, + 3285522120, + 3664527378, + 2996539919, + 2769522357, + 1190603530, + 433158334, + 3073888508, + 953054685, + 2719313268, + 4033892201, + 1802901234, + 3336517296, + 1794505272, + 2807414204, + ]; + + static const List _envieddatapayPalClientId = [ + 1245667887, + 227233284, + 3794959288, + 923429566, + 170143605, + 3801056379, + 1915401748, + 381507990, + 1720779374, + 737290689, + 372559035, + 3341684722, + 1398938862, + 3093826923, + 2491397119, + 4041213146, + 244631801, + 2969628490, + 3207079530, + 3492445406, + 2348575407, + 1874376932, + 1379553106, + 1573461431, + 1981592382, + 1215829357, + 4187860087, + 1705037884, + 60941950, + 1362041220, + 228137684, + 2078349384, + 2831689301, + 2355424694, + 3775236805, + 4293487484, + 2650580189, + 92662355, + 2792189572, + 1430609258, + 2281167528, + 4135954934, + 4024483165, + 3508522983, + 3769715361, + 756727290, + 357591817, + 3698689008, + 4139033535, + 1129879067, + 4013009997, + 2240408450, + 1492589891, + 1706047232, + 2383728410, + 2202134375, + 2172594199, + 1044677194, + 1339198478, + 3944168809, + 896150250, + 3918395530, + 2393229549, + 2307339778, + 743989368, + 3256797342, + 2593354447, + 2634038559, + 4050414413, + 4069865371, + 3269967636, + 2966681897, + 2917236526, + 3285522075, + 3664527429, + 2996539999, + 2769522373, + 1190603587, + 433158340, + 3073888440, + 953054619, + 2719313196, + 4033892123, + 1802901162, + 3336517340, + 1794505338, + 2807414224, + ]; + + static final String payPalClientId = String.fromCharCodes(List.generate( + _envieddatapayPalClientId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayPalClientId[i] ^ _enviedkeypayPalClientId[i])); + + static const List _enviedkeypayPalSecret = [ + 4097230390, + 409274982, + 3986381828, + 1126060983, + 4025195224, + 3229571054, + 4200471853, + 3530104170, + 2562340089, + 3207912622, + 1303946376, + 4255179412, + 2672010539, + 530603730, + 2735314550, + 1588364198, + 224433740, + 2138854245, + 1634315212, + 3887068491, + 2592083602, + 149932143, + 3761560414, + 1861713019, + 4047284722, + 660332942, + 3183798240, + 141036367, + 3155031233, + 2625557955, + 4130997351, + 1835197350, + 1307911331, + 2662435319, + 2931696636, + 3838892196, + 50948466, + 1777052518, + 4032089335, + 3242091593, + 3667446436, + 976308791, + 4288190479, + 3710952568, + 582412470, + 3913648290, + 3923255932, + 3796114741, + 1773260059, + 2651411619, + 2334061222, + 2990157995, + 3542407215, + 4040109192, + 3540127508, + 457370847, + 2966831933, + 2819044937, + 1610244882, + 2517559657, + 6056933, + 2703290450, + 4030072248, + 1922003142, + 1240355097, + 2386392644, + 2175587674, + 2894399966, + 3412003933, + 1745054168, + 2826067156, + 2991046135, + 2532404447, + 292941992, + 3170151114, + 867722518, + 1383987886, + 2761198598, + 865968039, + 3360562170, + 3420380332, + 3768223007, + 3652731353, + 836640485, + 1381201539, + 2233857248, + ]; + + static const List _envieddatapayPalSecret = [ + 4097230460, + 409274916, + 3986381893, + 1126061046, + 4025195182, + 3229570975, + 4200471911, + 3530104123, + 2562340030, + 3207912699, + 1303946491, + 4255179487, + 2672010607, + 530603746, + 2735314476, + 1588364236, + 224433700, + 2138854225, + 1634315143, + 3887068449, + 2592083703, + 149932044, + 3761560356, + 1861712899, + 4047284628, + 660333004, + 3183798182, + 141036343, + 3155031276, + 2625558000, + 4130997343, + 1835197429, + 1307911367, + 2662435227, + 2931696542, + 3838892269, + 50948385, + 1777052499, + 4032089281, + 3242091551, + 3667446518, + 976308858, + 4288190519, + 3710952502, + 582412530, + 3913648324, + 3923255833, + 3796114691, + 1773260150, + 2651411657, + 2334061291, + 2990158030, + 3542407285, + 4040109250, + 3540127612, + 457370769, + 2966831985, + 2819044867, + 1610244983, + 2517559554, + 6056912, + 2703290378, + 4030072287, + 1922003095, + 1240355162, + 2386392629, + 2175587601, + 2894399901, + 3412003861, + 1745054124, + 2826067078, + 2991046033, + 2532404457, + 292942053, + 3170151072, + 867722564, + 1383987927, + 2761198635, + 865968065, + 3360562114, + 3420380404, + 3768223085, + 3652731265, + 836640393, + 1381201601, + 2233857164, + ]; + + static final String payPalSecret = String.fromCharCodes(List.generate( + _envieddatapayPalSecret.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayPalSecret[i] ^ _enviedkeypayPalSecret[i])); + + static const List _enviedkeygeminiApi = [ + 2632934229, + 1799219161, + 2652696151, + 457168196, + 1287626220, + 2904559486, + 3328762106, + 961302768, + 3262865357, + 3144526109, + 1316648923, + 2237072714, + 2013347072, + 2654723587, + 1314406791, + 4257415766, + 1939354793, + 2949127422, + 2839830465, + 1374752426, + 4229958301, + 2995234880, + 1087160856, + 1092247069, + 3297872119, + 2898949752, + 4092528646, + 4048177241, + 3602977648, + 3394584930, + 185127446, + 1511605545, + 662907953, + 4013823520, + 1456949060, + 2028984991, + 232179696, + 1828989902, + 2819857040, + 3719195687, + 4053544757, + 2962551322, + 1635624208, + 2943450587, + 2450255297, + 939534702, + ]; + + static const List _envieddatageminiApi = [ + 2632934148, + 1799219094, + 2652696122, + 457168181, + 1287626166, + 2904559373, + 3328762027, + 961302697, + 3262865312, + 3144526125, + 1316648931, + 2237072700, + 2013347180, + 2654723660, + 1314406902, + 4257415740, + 1939354848, + 2949127369, + 2839830442, + 1374752454, + 4229958347, + 2995234826, + 1087160958, + 1092247147, + 3297872039, + 2898949708, + 4092528721, + 4048177179, + 3602977590, + 3394584871, + 185127545, + 1511605580, + 662907996, + 4013823562, + 1456949027, + 2028985062, + 232179651, + 1828989943, + 2819857062, + 3719195726, + 4053544813, + 2962551400, + 1635624264, + 2943450551, + 2450255235, + 939534594, + ]; + + static final String geminiApi = String.fromCharCodes(List.generate( + _envieddatageminiApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatageminiApi[i] ^ _enviedkeygeminiApi[i])); + + static const List _enviedkeygeminiApiMasa = [ + 3806554372, + 3964273813, + 3400690841, + 3993107285, + 947332588, + 567067889, + 330120572, + 602810814, + 4281129194, + 2556527681, + 765587194, + 4055156520, + 2754889642, + 375225097, + 2659311947, + 4266142455, + 988454182, + 3368144050, + 3034478035, + 3283879555, + 3241937762, + 1153323755, + 3896500637, + 1457344484, + 3731385330, + 2796947665, + 1949737039, + 1509915978, + 1790607971, + 2467701288, + 4162684551, + 2843447192, + 776609348, + 2714258467, + 1007709031, + 3409819276, + 3354235594, + 2794921085, + 3765662632, + 1218084057, + 4202748104, + 1628753253, + 482743602, + 2355830269, + 3091259095, + 3584092524, + ]; + + static const List _envieddatageminiApiMasa = [ + 3806554453, + 3964273882, + 3400690932, + 3993107236, + 947332534, + 567067778, + 330120493, + 602810871, + 4281129114, + 2556527653, + 765587127, + 4055156508, + 2754889704, + 375225179, + 2659311928, + 4266142396, + 988454219, + 3368144083, + 3034477975, + 3283879625, + 3241937709, + 1153323707, + 3896500650, + 1457344384, + 3731385256, + 2796947617, + 1949737082, + 1509916007, + 1790607872, + 2467701278, + 4162684617, + 2843447247, + 776609314, + 2714258496, + 1007708943, + 3409819323, + 3354235546, + 2794921020, + 3765662660, + 1218083976, + 4202748048, + 1628753175, + 482743658, + 2355830161, + 3091259029, + 3584092416, + ]; + + static final String geminiApiMasa = String.fromCharCodes(List.generate( + _envieddatageminiApiMasa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatageminiApiMasa[i] ^ _enviedkeygeminiApiMasa[i])); + + static const List _enviedkeyagoraAppId = [ + 322955499, + 1802132897, + 3408345873, + 1443736637, + 914296049, + 1913720577, + 554753389, + 95197085, + 3289387699, + 789808860, + 2122614257, + 1369410329, + 2424838099, + 2123384348, + 1927654694, + 1694373322, + 1646119434, + 261856971, + 1778967242, + 2041226896, + 494830624, + 1288662876, + 69059238, + 3353998990, + 4291260580, + 2791920964, + 342453163, + 2696431704, + 1528636599, + 693731065, + 3444510574, + 1113712187, + 2512581473, + 722785461, + 640812732, + 3966182575, + 3258614772, + 32533122, + 1525433224, + ]; + + static const List _envieddataagoraAppId = [ + 322955484, + 1802132880, + 3408345897, + 1443736581, + 914296001, + 1913720679, + 554753375, + 95197175, + 3289387653, + 789808879, + 2122614215, + 1369410422, + 2424838118, + 2123384364, + 1927654687, + 1694373280, + 1646119480, + 261857023, + 1778967219, + 2041226917, + 494830610, + 1288662885, + 69059218, + 3353999034, + 4291260572, + 2791921012, + 342453202, + 2696431723, + 1528636551, + 693730956, + 3444510550, + 1113712143, + 2512581465, + 722785517, + 640812750, + 3966182647, + 3258614680, + 32533184, + 1525433316, + ]; + + static final String agoraAppId = String.fromCharCodes(List.generate( + _envieddataagoraAppId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataagoraAppId[i] ^ _enviedkeyagoraAppId[i])); + + static const List _enviedkeyagoraAppCertificate = [ + 2093383308, + 4072188091, + 3133437958, + 3398519137, + 4168681924, + 3305708443, + 1836163883, + 4115738259, + 2635356837, + 2962494938, + 1175059944, + 1022231908, + 225341599, + 3253833437, + 82958117, + 1990924149, + 1681161152, + 3062789812, + 887500146, + 3649523233, + 3327407503, + 3818657312, + 4236937263, + 3858187622, + 3228713217, + 1812878730, + 1842633884, + 361190977, + 1312293375, + 1070378818, + 2994094878, + 3115615204, + 1418405586, + 1356323056, + 2215851209, + 1449682783, + 4204472986, + 3392506278, + 3103005220, + 1042906214, + ]; + + static const List _envieddataagoraAppCertificate = [ + 2093383398, + 4072188042, + 3133438001, + 3398519056, + 4168681981, + 3305708463, + 1836163871, + 4115738342, + 2635356817, + 2962494947, + 1175059931, + 1022231901, + 225341615, + 3253833399, + 82958157, + 1990924036, + 1681161207, + 3062789761, + 887500106, + 3649523284, + 3327407550, + 3818657302, + 4236937243, + 3858187615, + 3228713269, + 1812878782, + 1842633892, + 361190960, + 1312293325, + 1070378811, + 2994094888, + 3115615132, + 1418405556, + 1356322949, + 2215851153, + 1449682733, + 4204473026, + 3392506314, + 3103005286, + 1042906122, + ]; + + static final String agoraAppCertificate = String.fromCharCodes( + List.generate( + _envieddataagoraAppCertificate.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataagoraAppCertificate[i] ^ + _enviedkeyagoraAppCertificate[i])); + + static const List _enviedkeypayPalClientIdLive = [ + 3114574254, + 4010651511, + 461696017, + 3960507585, + 2098272697, + 2228179679, + 2215403740, + 2297499665, + 576332403, + 2097842102, + 655895736, + 2500215309, + 3669982586, + 50105411, + 2070097355, + 1481179313, + 4249675769, + 3538483031, + 3352260188, + 2322021775, + 2176665063, + 3696037112, + 492538790, + 3278174367, + 1558135091, + 830475840, + 105246111, + 1291944224, + 2556018688, + 3631731097, + 2150560026, + 135542065, + 2833156012, + 4149554516, + 2647863720, + 1280162410, + 2021821697, + 1453202556, + 728225760, + 427000676, + 780069603, + 2100147223, + 504309289, + 3498080016, + 2028235676, + 225153491, + 1138640981, + 1494496832, + 4058401920, + 3205071119, + 3480650765, + 852899703, + 3507406242, + 762861345, + 246426241, + 415122435, + 3162136073, + 2904346179, + 1663927195, + 3090817861, + 2584211414, + 2211017538, + 526345851, + 3142538720, + 3329114310, + 3501397612, + 1432215677, + 2299195949, + 3891157240, + 3259849767, + 1906461528, + 2573319057, + 3845383478, + 822825742, + 3823871886, + 3516703043, + 876077945, + 331348410, + 3996949037, + 704426408, + 1695871896, + 317062564, + 1197473844, + 2065326364, + 1641085809, + 430851767, + 2456830432, + ]; + + static const List _envieddatapayPalClientIdLive = [ + 3114574335, + 4010651437, + 461696087, + 3960507562, + 2098272723, + 2228179614, + 2215403699, + 2297499723, + 576332309, + 2097842161, + 655895756, + 2500215395, + 3669982493, + 50105357, + 2070097336, + 1481179348, + 4249675659, + 3538483003, + 3352260144, + 2322021817, + 2176664981, + 3696037067, + 492538821, + 3278174428, + 1558135046, + 830475894, + 105246151, + 1291944268, + 2556018737, + 3631731178, + 2150560076, + 135542141, + 2833156093, + 4149554495, + 2647863750, + 1280162399, + 2021821797, + 1453202481, + 728225666, + 427000605, + 780069510, + 2100147317, + 504309313, + 3498080106, + 2028235734, + 225153418, + 1138640992, + 1494496889, + 4058401989, + 3205071198, + 3480650814, + 852899615, + 3507406296, + 762861334, + 246426328, + 415122555, + 3162136168, + 2904346118, + 1663927274, + 3090817792, + 2584211346, + 2211017499, + 526345771, + 3142538676, + 3329114259, + 3501397546, + 1432215582, + 2299196028, + 3891157167, + 3259849814, + 1906461486, + 2573319156, + 3845383526, + 822825839, + 3823871967, + 3516703094, + 876077868, + 331348464, + 3996949095, + 704426494, + 1695871946, + 317062652, + 1197473862, + 2065326404, + 1641085725, + 430851829, + 2456830348, + ]; + + static final String payPalClientIdLive = String.fromCharCodes( + List.generate( + _envieddatapayPalClientIdLive.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayPalClientIdLive[i] ^ _enviedkeypayPalClientIdLive[i])); + + static const List _enviedkeypayPalSecretLive = [ + 3013884973, + 2821916540, + 1942616952, + 1810264227, + 3814851345, + 1887400487, + 172621378, + 1074368265, + 1689283907, + 485675311, + 2855761881, + 993568442, + 3694712110, + 3267197672, + 3956580973, + 1893918083, + 4253013203, + 3473546496, + 3365059475, + 1517926911, + 3887841047, + 3999058038, + 1423115631, + 2440681843, + 847951055, + 2113286267, + 1702376040, + 3590943609, + 2062245659, + 2652460525, + 3672155105, + 2744221350, + 1622306795, + 2382218978, + 689735113, + 3247929415, + 4284686008, + 3250981844, + 3743012099, + 1609967369, + 705237651, + 760366665, + 3186003733, + 1643040906, + 1014347274, + 1787969461, + 3879481471, + 3227929057, + 784003730, + 1942885733, + 2107109739, + 91227898, + 2012482545, + 705024103, + 2925611884, + 831722647, + 497250309, + 1092407769, + 2872329371, + 838133701, + 1756643026, + 3139562425, + 1548671685, + 2639759269, + 2945263624, + 3978352841, + 1181054723, + 2723996002, + 855323137, + 3902120524, + 2283070037, + 3182355662, + 3420428529, + 3579345955, + 2327686259, + 3186996435, + 2354649418, + 2284392487, + 3613993087, + 1942803059, + 4182207187, + 2293213850, + 1418220806, + 1347035498, + 1360454355, + 3813416994, + 1660339295, + 292375086, + ]; + + static const List _envieddatapayPalSecretLive = [ + 3013885031, + 2821916461, + 1942616892, + 1810264290, + 3814851397, + 1887400534, + 172621353, + 1074368354, + 1689283885, + 485675371, + 2855761855, + 993568467, + 3694712168, + 3267197592, + 3956580904, + 1893918146, + 4253013149, + 3473546550, + 3365059491, + 1517926836, + 3887841109, + 3999057986, + 1423115551, + 2440681780, + 847951039, + 2113286207, + 1702375945, + 3590943539, + 2062245745, + 2652460436, + 3672155024, + 2744221412, + 1622306730, + 2382218886, + 689735152, + 3247929389, + 4284686016, + 3250981785, + 3743012161, + 1609967449, + 705237731, + 760366643, + 3186003778, + 1643040991, + 1014347323, + 1787969509, + 3879481422, + 3227928970, + 784003745, + 1942885677, + 2107109722, + 91227792, + 2012482475, + 705024015, + 2925611837, + 831722749, + 497250411, + 1092407790, + 2872329384, + 838133632, + 1756642970, + 3139562442, + 1548671630, + 2639759348, + 2945263718, + 3978352808, + 1181054772, + 2723995990, + 855323217, + 3902120564, + 2283069989, + 3182355703, + 3420428489, + 3579345995, + 2327686164, + 3186996380, + 2354649380, + 2284392554, + 3613992990, + 1942802980, + 4182207107, + 2293213901, + 1418220894, + 1347035416, + 1360454283, + 3813417038, + 1660339229, + 292375106, + ]; + + static final String payPalSecretLive = String.fromCharCodes( + List.generate( + _envieddatapayPalSecretLive.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayPalSecretLive[i] ^ _enviedkeypayPalSecretLive[i])); + + static const List _enviedkeyintegrationIdPayMob = [ + 2712678300, + 3061768505, + 3719050571, + 3681882834, + 570397643, + 2305195569, + 1316007571, + 3727240136, + 2628718788, + 2722902749, + 3701125463, + 3841634291, + 1881441900, + ]; + + static const List _envieddataintegrationIdPayMob = [ + 2712678316, + 3061768459, + 3719050616, + 3681882853, + 570397693, + 2305195522, + 1316007587, + 3727240080, + 2628718774, + 2722902661, + 3701125435, + 3841634225, + 1881441792, + ]; + + static final String integrationIdPayMob = String.fromCharCodes( + List.generate( + _envieddataintegrationIdPayMob.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataintegrationIdPayMob[i] ^ + _enviedkeyintegrationIdPayMob[i])); + + static const List _enviedkeypasswordPayMob = [ + 1623830400, + 484366932, + 1761549607, + 3934118037, + 3841612148, + 96780172, + 1154983199, + 965549846, + 1855095364, + 2791790061, + 26302373, + 653521578, + 1644891670, + 4076340387, + 577819052, + 3452680564, + 736182487, + 1174382954, + 1985009894, + 2491429983, + 419747161, + 3716564113, + ]; + + static const List _envieddatapasswordPayMob = [ + 1623830503, + 484366868, + 1761549641, + 3934118142, + 3841612080, + 96780222, + 1154983228, + 965549871, + 1855095421, + 2791789958, + 26302340, + 653521602, + 1644891730, + 4076340476, + 577819010, + 3452680451, + 736182415, + 1174382872, + 1985009854, + 2491429939, + 419747099, + 3716564221, + ]; + + static final String passwordPayMob = String.fromCharCodes(List.generate( + _envieddatapasswordPayMob.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapasswordPayMob[i] ^ _enviedkeypasswordPayMob[i])); + + static const List _enviedkeyusernamePayMob = [ + 4090151, + 4102553018, + 3621236088, + 2568791231, + 644055495, + 2703371348, + 2862650941, + 424822023, + 1644786860, + 2374079916, + 1749124849, + 1284711377, + 3391499103, + 1329214336, + 1023678449, + 945916939, + 3448395998, + ]; + + static const List _envieddatausernamePayMob = [ + 4090132, + 4102552973, + 3621236043, + 2568791182, + 644055550, + 2703371365, + 2862650893, + 424822067, + 1644786844, + 2374079897, + 1749124803, + 1284711305, + 3391499053, + 1329214424, + 1023678365, + 945917001, + 3448395954, + ]; + + static final String usernamePayMob = String.fromCharCodes(List.generate( + _envieddatausernamePayMob.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatausernamePayMob[i] ^ _enviedkeyusernamePayMob[i])); + + static const List _enviedkeypayMobApikey = [ + 2723835122, + 4101613959, + 347849490, + 1256357132, + 3941792656, + 2799531417, + 2581736305, + 202498234, + 3138935695, + 4231646060, + 542674357, + 113527357, + 172516467, + 3120512878, + 1202982540, + 1241650034, + 2735931488, + 650652221, + 2382281890, + 354991547, + 4257628324, + 795138838, + 2575843195, + 1352132538, + 1416295413, + 4069490316, + 2206550763, + 463084226, + 2307849317, + 3606409115, + 1522223813, + 2531038350, + 3983170633, + 4095540617, + 497405447, + 204944123, + 1622558672, + 270361343, + 3336492904, + 1680444640, + 15974998, + 3411295354, + 1309218607, + 561281008, + 2656752336, + 3450113799, + 3053823594, + 3459283762, + 1248989118, + 3801170603, + 3412970787, + 2963678766, + 256166268, + 1154403590, + 2883118158, + 1959264146, + 641594074, + 1055807500, + 2243925081, + 1149183845, + 1710564951, + 2701594175, + 105332568, + 1387115019, + 4205170590, + 3152994338, + 3680361536, + 2166783079, + 3036229024, + 409239715, + 1952179080, + 4184149578, + 4198174941, + 1081520127, + 2641676270, + 2323341993, + 2757595291, + 324949604, + 4122774020, + 3389647551, + 1022118992, + 1682306056, + 2512750295, + 441487210, + 1635276940, + 3959115136, + 981690723, + 1210704508, + 2583834050, + 172226250, + 276547477, + 2795696262, + 4079715306, + 3861098880, + 2731194673, + 393510150, + 1538396311, + 2442056857, + 2645633316, + 3803720244, + 3256992561, + 1360043489, + 3833937163, + 390115611, + 537144169, + 2489693854, + 1838113132, + 1623387268, + 1506430991, + 4278698097, + 437502026, + 477391568, + 3519523037, + 2501236465, + 1651757795, + 3470269357, + 3206705329, + 22767323, + 2029910823, + 2912381989, + 2938212123, + 2602947075, + 2179553790, + 888078198, + 3645244792, + 885268228, + 1528362436, + 714653709, + 4212453261, + 2288875766, + 1450973376, + 1205449574, + 2573486006, + 3787149934, + 828051394, + 816430311, + 1772823515, + 2113560391, + 3211946072, + 2902655182, + 543995169, + 695614882, + 1386588193, + 2813344662, + 2456766260, + 557125774, + 1475052077, + 2573258926, + 2563784479, + 213705877, + 4103878738, + 523033509, + 2762198810, + 46970579, + 582362092, + 215823929, + 2706750743, + 2395734980, + 1245876355, + 4012848530, + 2918549721, + 2691587580, + 3677048323, + 3421477101, + 1353228861, + 1486679090, + 2054788028, + 181210626, + 3275568126, + 4181314140, + 1562041060, + 3765003898, + 3988998845, + 4028347037, + 4116445395, + 98063716, + 827227331, + 2699170719, + 3195329727, + 3151545850, + 1604211281, + 2546772552, + 615359519, + 314520509, + 819880422, + 2045016359, + 2539255488, + 3690899513, + 1229680094, + 286472935, + 1987288039, + 3332556197, + 3395659586, + 4132879778, + 1136936060, + 115051432, + 565714258, + 3474168889, + 84242287, + 1030895335, + 2162471984, + 1877154118, + 846881574, + 1705061394, + 1699216525, + 2538872462, + 2785704098, + 2793695652, + 272449851, + 2288676981, + 3017932372, + 3597866945, + 2756792263, + 2609240526, + 3745089747, + 391101824, + 2517322765, + 3885975596, + 3360134411, + 2221345655, + 608588069, + 1973745252, + 513764758, + 31285859, + 3175023325, + 801332860, + 3213457659, + 919566733, + 3887089601, + 3668948608, + 2239206111, + 1483412930, + 1629780719, + 2232579945, + 2702926613, + 259054579, + 249649985, + 561396278, + 3132422581, + 2179701285, + 2222613461, + 538516147, + 3895354148, + 2630716677, + 1648569711, + 222648903, + 2624543881, + 1911113048, + 1114948679, + 3833044490, + 4215850605, + 929213587, + 3966150967, + 1001938562, + 2192546257, + 732846335, + 1567413585, + 2198780801, + 1010173859, + 634513082, + 1782810517, + 4144199296, + 426961756, + 1684353868, + 857339008, + 2669696369, + 83501775, + 1177548206, + 4252312355, + 1380645586, + 2625733258, + 1308084406, + 2346383215, + 1579896551, + 3277279071, + 11076541, + 3587850412, + 1466957468, + 212911086, + 2096561785, + 895625091, + 1904417911, + 1106651014, + 290285265, + 537873865, + 3266454946, + ]; + + static const List _envieddatapayMobApikey = [ + 2723835071, + 4101614019, + 347849568, + 1256357195, + 3941792737, + 2799531474, + 2581736244, + 202498285, + 3138935772, + 4231646045, + 542674375, + 113527403, + 172516354, + 3120512774, + 1202982630, + 1241649941, + 2735931399, + 650652277, + 2382281940, + 354991614, + 4257628404, + 795138898, + 2575843085, + 1352132586, + 1416295327, + 4069490374, + 2206550748, + 463084212, + 2307849279, + 3606409183, + 1522223751, + 2531038411, + 3983170609, + 4095540731, + 497405512, + 204944076, + 1622558595, + 270361292, + 3336492842, + 1680444581, + 15974932, + 3411295261, + 1309218653, + 561280924, + 2656752310, + 3450113874, + 3053823517, + 3459283814, + 1248989183, + 3801170584, + 3412970826, + 2963678747, + 256166190, + 1154403688, + 2883118110, + 1959264167, + 641593984, + 1055807586, + 2243925039, + 1149183754, + 1710564891, + 2701594124, + 105332501, + 1387115065, + 4205170637, + 3152994331, + 3680361522, + 2166783010, + 3036229090, + 409239748, + 1952179194, + 4184149542, + 4198174867, + 1081520043, + 2641676170, + 2323342028, + 2757595363, + 324949548, + 4122774065, + 3389647567, + 1022118916, + 1682306136, + 2512750257, + 441487197, + 1635276994, + 3959115210, + 981690641, + 1210704394, + 2583834043, + 172226299, + 276547559, + 2795696355, + 4079715248, + 3861098954, + 2731194695, + 393510199, + 1538396355, + 2442056951, + 2645633299, + 3803720270, + 3256992599, + 1360043478, + 3833937277, + 390115663, + 537144096, + 2489693914, + 1838113045, + 1623387379, + 1506431077, + 4278698041, + 437501997, + 477391585, + 3519522974, + 2501236422, + 1651757743, + 3470269384, + 3206705352, + 22767336, + 2029910815, + 2912382061, + 2938212175, + 2602947143, + 2179553671, + 888078136, + 3645244729, + 885268279, + 1528362418, + 714653754, + 4212453337, + 2288875686, + 1450973350, + 1205449474, + 2573486030, + 3787149860, + 828051376, + 816430214, + 1772823459, + 2113560438, + 3211946026, + 2902655161, + 543995249, + 695614927, + 1386588273, + 2813344738, + 2456766329, + 557125828, + 1475052116, + 2573258964, + 2563784558, + 213705950, + 4103878679, + 523033596, + 2762198848, + 46970550, + 582361995, + 215823953, + 2706750822, + 2395735031, + 1245876430, + 4012848615, + 2918549653, + 2691587497, + 3677048433, + 3421477035, + 1353228917, + 1486679041, + 2054788093, + 181210675, + 3275568063, + 4181314107, + 1562041004, + 3765003801, + 3988998901, + 4028347052, + 4116445414, + 98063655, + 827227289, + 2699170726, + 3195329770, + 3151545755, + 1604211211, + 2546772508, + 615359571, + 314520562, + 819880350, + 2045016393, + 2539255479, + 3690899465, + 1229680028, + 286472883, + 1987287939, + 3332556255, + 3395659530, + 4132879850, + 1136935950, + 115051498, + 565714195, + 3474168907, + 84242182, + 1030895252, + 2162472042, + 1877154083, + 846881620, + 1705061447, + 1699216576, + 2538872539, + 2785704183, + 2793695710, + 272449889, + 2288676932, + 3017932310, + 3597866927, + 2756792197, + 2609240491, + 3745089686, + 391101929, + 2517322855, + 3885975652, + 3360134525, + 2221345593, + 608588111, + 1973745213, + 513764826, + 31285773, + 3175023246, + 801332813, + 3213457593, + 919566808, + 3887089544, + 3668948675, + 2239206034, + 1483412906, + 1629780668, + 2232579844, + 2702926661, + 259054491, + 249649920, + 561396231, + 3132422528, + 2179701324, + 2222613427, + 538516219, + 3895354205, + 2630716755, + 1648569630, + 222648844, + 2624543948, + 1911112981, + 1114948623, + 3833044573, + 4215850516, + 929213656, + 3966151035, + 1001938656, + 2192546216, + 732846218, + 1567413528, + 2198780881, + 1010173909, + 634513113, + 1782810589, + 4144199353, + 426961673, + 1684353833, + 857339084, + 2669696322, + 83501753, + 1177548276, + 4252312410, + 1380645526, + 2625733356, + 1308084363, + 2346383116, + 1579896465, + 3277279036, + 11076581, + 3587850462, + 1466957508, + 212910978, + 2096561723, + 895625199, + 1904417813, + 1106651108, + 290285235, + 537873835, + 3266454976, + ]; + + static final String payMobApikey = String.fromCharCodes(List.generate( + _envieddatapayMobApikey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayMobApikey[i] ^ _enviedkeypayMobApikey[i])); + + static const List _enviedkeyintegrationIdPayMobWallet = [ + 1439305676, + 20069714, + 3314915528, + 3149616572, + 232992535, + 4259314667, + 3056382372, + 130542987, + 1830385159, + 4072565990, + 4059811978, + 109080418, + 1973069856, + ]; + + static const List _envieddataintegrationIdPayMobWallet = [ + 1439305724, + 20069728, + 3314915583, + 3149616523, + 232992544, + 4259314648, + 3056382365, + 130543059, + 1830385269, + 4072565950, + 4059812070, + 109080352, + 1973069900, + ]; + + static final String integrationIdPayMobWallet = String.fromCharCodes( + List.generate( + _envieddataintegrationIdPayMobWallet.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataintegrationIdPayMobWallet[i] ^ + _enviedkeyintegrationIdPayMobWallet[i])); + + static const List _enviedkeysmsPasswordEgypt = [ + 1234677663, + 1947025940, + 1673913163, + 3084474715, + 2362922444, + 2262423299, + 2784317743, + 339399304, + 2932637832, + 542066160, + 1471719531, + 1746146554, + 405434186, + 2974027939, + 3134585333, + 3435782243, + ]; + + static const List _envieddatasmsPasswordEgypt = [ + 1234677717, + 1947025981, + 1673913117, + 3084474675, + 2362922481, + 2262423410, + 2784317773, + 339399335, + 2932637896, + 542066109, + 1471719475, + 1746146440, + 405434130, + 2974027983, + 3134585271, + 3435782159, + ]; + + static final String smsPasswordEgypt = String.fromCharCodes( + List.generate( + _envieddatasmsPasswordEgypt.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatasmsPasswordEgypt[i] ^ _enviedkeysmsPasswordEgypt[i])); + + static const List _enviedkeyocpApimSubscriptionKey = [ + 354334352, + 1705674182, + 2926444552, + 1447258396, + 369332433, + 2079467831, + 1460212291, + 1680645957, + 138913, + 4142816813, + 2817308476, + 2479431955, + 2296405907, + 1815850006, + 819495686, + 2901938250, + 3139926811, + 3065176364, + 3220596795, + 1043890259, + 624717790, + 685130063, + 1653975665, + 2821174005, + 2595199409, + 93425964, + 3539385160, + 1037123023, + 918408141, + 2273077326, + 1485860357, + 2046204781, + ]; + + static const List _envieddataocpApimSubscriptionKey = [ + 354334368, + 1705674144, + 2926444605, + 1447258488, + 369332400, + 2079467860, + 1460212256, + 1680645926, + 138949, + 4142816847, + 2817308511, + 2479432054, + 2296405927, + 1815850023, + 819495733, + 2901938299, + 3139926905, + 3065176349, + 3220596826, + 1043890278, + 624717752, + 685130102, + 1653975620, + 2821173959, + 2595199368, + 93425941, + 3539385214, + 1037123068, + 918408189, + 2273077372, + 1485860448, + 2046204766, + ]; + + static final String ocpApimSubscriptionKey = String.fromCharCodes( + List.generate( + _envieddataocpApimSubscriptionKey.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataocpApimSubscriptionKey[i] ^ + _enviedkeyocpApimSubscriptionKey[i])); + + static const List _enviedkeychatGPTkeySeferNew4 = [ + 2481067785, + 638510892, + 3318303535, + 1266058891, + 319655716, + 791143234, + 3288365967, + 1145248350, + 332350821, + 4188612537, + 1077811363, + 3884137570, + 285769662, + 1471433315, + 2775994551, + 808611922, + 271939287, + 1015814827, + 191772075, + 2261750012, + 1704928384, + 1049815213, + 1021881699, + 3169973746, + 3831983109, + 3976443929, + 2946135092, + 1861880840, + 2770931809, + 2484838865, + 3343107459, + 3522991685, + 1306534074, + 935459197, + 2424964680, + 8972001, + 3739319661, + 3120820080, + 3712623184, + 2397707864, + 1760095134, + 814907231, + 1660994983, + 326829538, + 3524376921, + 3567861026, + 3611751842, + 2934298990, + 595111321, + 249174490, + 459183284, + 897963298, + 1830910603, + 1740643656, + 195031506, + 3193229708, + 1770343999, + 3194973287, + 2278862513, + 1070993171, + 3393499184, + 3356970485, + 240619025, + ]; + + static const List _envieddatachatGPTkeySeferNew4 = [ + 2481067891, + 638510923, + 3318303490, + 1266059005, + 319655752, + 791143211, + 3288366058, + 1145248371, + 332350807, + 4188612565, + 1077811346, + 3884137528, + 285769682, + 1471433235, + 2775994575, + 808611899, + 271939258, + 1015814887, + 191772129, + 2261749962, + 1704928503, + 1049815292, + 1021881644, + 3169973636, + 3831983207, + 3976444027, + 2946135040, + 1861880924, + 2770931727, + 2484838802, + 3343107514, + 3522991645, + 1306534088, + 935459077, + 2424964655, + 8971956, + 3739319592, + 3120819977, + 3712623110, + 2397707785, + 1760095191, + 814907178, + 1660994961, + 326829494, + 3524376848, + 3567861094, + 3611751830, + 2934298911, + 595111369, + 249174510, + 459183346, + 897963383, + 1830910686, + 1740643641, + 195031485, + 3193229791, + 1770343946, + 3194973247, + 2278862531, + 1070993227, + 3393499228, + 3356970423, + 240619133, + ]; + + static final String chatGPTkeySeferNew4 = String.fromCharCodes( + List.generate( + _envieddatachatGPTkeySeferNew4.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatachatGPTkeySeferNew4[i] ^ + _enviedkeychatGPTkeySeferNew4[i])); + + static const List _enviedkeyanthropicAIkeySeferNew = [ + 1799300063, + 1392292470, + 864789084, + 3233892298, + 1015532172, + 3492751356, + 3128097799, + 4232623569, + 472702912, + 843118390, + 1027027162, + 540687447, + 3929212946, + 2027150391, + 792172690, + 2470213019, + 2265577324, + 3451135429, + 83672587, + 1156911701, + 1157975609, + 1172014322, + 867529829, + 1358014513, + 918299356, + 3459066696, + 1036998676, + 2094581599, + 3326155205, + 1389362413, + 1409868577, + 4187183000, + 1419331576, + 1316706201, + 2571951872, + 3529522515, + 4058931639, + 1504047966, + 1353296598, + 2107783174, + 2984866335, + 1709152719, + 752344320, + 864838021, + 4178598331, + 3316278549, + 1463981656, + 77060698, + 436601811, + 2067424306, + 65399550, + 1542213616, + 2913065975, + 3657515452, + 4249626054, + 173127949, + 647471168, + 506047490, + 3502688069, + 1475662762, + 4280881961, + 3832964265, + 1551986975, + 1909542734, + 976895300, + 473933085, + 1064782995, + 2034579854, + 2520903062, + 1922665387, + 3364577055, + 1114876927, + 2255904995, + 579372323, + 1576569811, + 4089683122, + 1862449403, + 426002356, + 2075550880, + 1830983289, + 1444762287, + 649722059, + 3943091198, + 853943927, + 3016431179, + 846798301, + 2262605434, + 651883548, + 2850911570, + 2621321078, + 1573428243, + 3882835656, + 2435163576, + 2493637076, + 2302930703, + 3332205940, + 3709100961, + 2789119928, + 4262417208, + 1680641879, + 1699904010, + 1206408370, + 1287725666, + 1317726244, + 3368012532, + 4138461084, + 553037019, + 3648316152, + 2558138993, + 2403297430, + 517761917, + 381444240, + 2490787284, + 1428976904, + 3859126406, + ]; + + static const List _envieddataanthropicAIkeySeferNew = [ + 1799300005, + 1392292369, + 864789105, + 3233892283, + 1015532270, + 3492751263, + 3128097834, + 4232623520, + 472702902, + 843118425, + 1027027177, + 540687470, + 3929212991, + 2027150426, + 792172796, + 2470213039, + 2265577274, + 3451135393, + 83672646, + 1156911620, + 1157975564, + 1172014236, + 867529744, + 1358014587, + 918299321, + 3459066625, + 1036998733, + 2094581559, + 3326155144, + 1389362339, + 1409868565, + 4187183048, + 1419331516, + 1316706240, + 2571951986, + 3529522532, + 4058931654, + 1504047921, + 1353296558, + 2107783221, + 2984866354, + 1709152699, + 752344370, + 864838124, + 4178598282, + 3316278617, + 1463981616, + 77060717, + 436601778, + 2067424380, + 65399466, + 1542213556, + 2913065873, + 3657515493, + 4249625984, + 173127968, + 647471111, + 506047588, + 3502688125, + 1475662813, + 4280881985, + 3832964348, + 1551987029, + 1909542676, + 976895239, + 473933166, + 1064783015, + 2034579897, + 2520903123, + 1922665422, + 3364577146, + 1114876819, + 2255904936, + 579372365, + 1576569835, + 4089683181, + 1862449326, + 426002391, + 2075550925, + 1830983212, + 1444762338, + 649722022, + 3943091095, + 853943844, + 3016431111, + 846798268, + 2262605340, + 651883564, + 2850911495, + 2621321020, + 1573428340, + 3882835704, + 2435163644, + 2493637026, + 2302930778, + 3332205848, + 3709101040, + 2789119946, + 4262417276, + 1680641827, + 1699904039, + 1206408325, + 1287725652, + 1317726311, + 3368012454, + 4138461166, + 553036976, + 3648316073, + 2558138912, + 2403297486, + 517761807, + 381444296, + 2490787256, + 1428976970, + 3859126506, + ]; + + static final String anthropicAIkeySeferNew = String.fromCharCodes( + List.generate( + _envieddataanthropicAIkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataanthropicAIkeySeferNew[i] ^ + _enviedkeyanthropicAIkeySeferNew[i])); + + static const List _enviedkeyllama3Key = [ + 1664970791, + 320481485, + 1305174568, + 298387227, + 3405084341, + 522063534, + 724462339, + 3577816739, + 3234733023, + 3901670063, + 3637162954, + 968226786, + 218708884, + 1537738660, + 2110167300, + 3303228265, + 4009452671, + 2978453822, + 1909550277, + 3488647907, + 804674030, + 4283561573, + 519448186, + 2194642438, + 2370243743, + 1318949981, + 1202417983, + 2242821061, + 4239186519, + 2570882968, + 3252450783, + 632977840, + 3888701722, + 3710448665, + 2574312035, + 4098862598, + 4265795597, + 2597641242, + 3258331470, + 4083946068, + 2518168091, + 1490484205, + 1306007843, + 783994373, + 3493657048, + 974537058, + 935806854, + 43259297, + 2410529635, + 3589460534, + 764362370, + 2529740328, + 604853669, + 580033265, + 3599536822, + 409362759, + 4027283261, + 648576669, + 3246516310, + 3371434852, + 3997448085, + 119229112, + 1131064834, + ]; + + static const List _envieddatallama3Key = [ + 1664970828, + 320481463, + 1305174607, + 298387268, + 3405084352, + 522063610, + 724462427, + 3577816794, + 3234733036, + 3901670090, + 3637162995, + 968226726, + 218708950, + 1537738694, + 2110167367, + 3303228216, + 4009452622, + 2978453880, + 1909550251, + 3488647854, + 804673961, + 4283561480, + 519448066, + 2194642527, + 2370243816, + 1318949897, + 1202418036, + 2242821052, + 4239186468, + 2570883040, + 3252450790, + 632977893, + 3888701769, + 3710448680, + 2574311937, + 4098862707, + 4265795711, + 2597641314, + 3258331396, + 4083946046, + 2518168111, + 1490484107, + 1306007909, + 783994482, + 3493656983, + 974536968, + 935806947, + 43259285, + 2410529583, + 3589460588, + 764362432, + 2529740413, + 604853731, + 580033210, + 3599536892, + 409362708, + 4027283212, + 648576709, + 3246516260, + 3371434812, + 3997448185, + 119229178, + 1131064942, + ]; + + static final String llama3Key = String.fromCharCodes(List.generate( + _envieddatallama3Key.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatallama3Key[i] ^ _enviedkeyllama3Key[i])); + + static const List _enviedkeypayMobOutClientSecrret = [ + 3497701327, + 2917636721, + 2560487287, + 1437799237, + 3665105773, + 2427766774, + 1695333088, + 1145394424, + 2794412968, + 163410850, + 3492824641, + 866005364, + 3422093694, + 2785236678, + 2643462792, + 936794215, + 2764626308, + 1874673334, + 1059281503, + 2258413905, + 2121863440, + 3523493017, + 3023522065, + 3261034121, + 3306490793, + 15610043, + 1015267190, + 1415784519, + 2427293742, + 1812497531, + 1994956056, + 2103912856, + 2521377452, + 3802879567, + 4026906724, + 1630799532, + 2477327574, + 1857724159, + 3853480194, + 3781753905, + 2886603211, + 3239343211, + 1662501971, + 1806767798, + 2537133269, + 1548566712, + 3287911446, + 2044712870, + 1379134318, + 480096939, + 1408514629, + 847831937, + 375218333, + 2112436548, + 4215426338, + 991161828, + 2553581699, + 2258662110, + 2913056981, + 2731374690, + 2584560068, + 14244994, + 3150436646, + 446275894, + 2045931374, + 2140461716, + 1254196401, + 1721603937, + 1912717589, + 2267744997, + 2053805213, + 1639831450, + 3800680703, + 1777443486, + 46606569, + 3436690213, + 3511329907, + 4013620819, + 1832053998, + 536687476, + 2992070007, + 2783564267, + 3271183283, + 3582879846, + 3129164421, + 4286200153, + 1335122516, + 2903415603, + 3101330082, + 4125351248, + 1559187067, + 360399971, + 4102836091, + 1890095429, + 2244132068, + 3752822795, + 1136052588, + 523503548, + 2387698447, + 3409309349, + 940678243, + 1120002443, + 1248064193, + 2331683453, + 1380162150, + 2926383688, + 1843526623, + 3508961724, + 975828479, + 3765044565, + 2421271044, + 1241968679, + 1239167955, + 3163422048, + 1118375755, + 2829874419, + 1163724927, + 923464102, + 4195524101, + 3995843341, + 1733022342, + 4023620456, + 2832897992, + 1260542913, + 3930150752, + 2437356655, + 4091057797, + 2611556368, + 2784129236, + 1620620459, + 2297268988, + 1018579155, + 856963564, + 444650195, + 1076683242, + ]; + + static const List _envieddatapayMobOutClientSecrret = [ + 3497701303, + 2917636616, + 2560487197, + 1437799215, + 3665105727, + 2427766682, + 1695333003, + 1145394329, + 2794412992, + 163410920, + 3492824588, + 866005316, + 3422093606, + 2785236645, + 2643462843, + 936794207, + 2764626387, + 1874673372, + 1059281438, + 2258413857, + 2121863507, + 3523493078, + 3023522169, + 3261034161, + 3306490827, + 15610061, + 1015267089, + 1415784459, + 2427293719, + 1812497416, + 1994956148, + 2103912926, + 2521377500, + 3802879489, + 4026906624, + 1630799585, + 2477327599, + 1857724070, + 3853480295, + 3781753970, + 2886603198, + 3239343186, + 1662501906, + 1806767838, + 2537133209, + 1548566729, + 3287911540, + 2044712905, + 1379134245, + 480096998, + 1408514581, + 847832053, + 375218416, + 2112436503, + 4215426388, + 991161735, + 2553581745, + 2258662032, + 2913057004, + 2731374637, + 2584560112, + 14245110, + 3150436734, + 446275918, + 2045931304, + 2140461784, + 1254196455, + 1721603923, + 1912717663, + 2267744932, + 2053805259, + 1639831468, + 3800680588, + 1777443562, + 46606507, + 3436690294, + 3511329831, + 4013620754, + 1832053929, + 536687410, + 2992069936, + 2783564200, + 3271183333, + 3582879763, + 3129164519, + 4286200094, + 1335122481, + 2903415557, + 3101330159, + 4125351198, + 1559186955, + 360399872, + 4102836044, + 1890095368, + 2244131998, + 3752822849, + 1136052482, + 523503590, + 2387698492, + 3409309430, + 940678154, + 1120002527, + 1248064247, + 2331683386, + 1380162070, + 2926383657, + 1843526569, + 3508961790, + 975828368, + 3765044502, + 2421271112, + 1241968752, + 1239167928, + 3163422005, + 1118375741, + 2829874341, + 1163724829, + 923464130, + 4195524182, + 3995843401, + 1733022439, + 4023620389, + 2832898040, + 1260542907, + 3930150696, + 2437356569, + 4091057904, + 2611556434, + 2784129179, + 1620620531, + 2297268878, + 1018579083, + 856963456, + 444650129, + 1076683142, + ]; + + static final String payMobOutClientSecrret = String.fromCharCodes( + List.generate( + _envieddatapayMobOutClientSecrret.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutClientSecrret[i] ^ + _enviedkeypayMobOutClientSecrret[i])); + + static const List _enviedkeyallowedWallet = [ + 608170278, + 4070172800, + 713894558, + 2290568712, + 2489951646, + 2594012884, + 2032937063, + 115566825, + 2643640708, + 3389227422, + 4088391674, + 3994109634, + ]; + + static const List _envieddataallowedWallet = [ + 608170354, + 4070172914, + 713894647, + 2290568824, + 2489951716, + 2594012803, + 2032936966, + 115566725, + 2643640808, + 3389227515, + 4088391566, + 3994109688, + ]; + + static final String allowedWallet = String.fromCharCodes(List.generate( + _envieddataallowedWallet.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowedWallet[i] ^ _enviedkeyallowedWallet[i])); + + static const List _enviedkeypayMobOutClient_id = [ + 1965273895, + 251112756, + 1021360684, + 1760486580, + 3074877518, + 318875691, + 421715299, + 880136620, + 4152884916, + 4108776113, + 77354292, + 2009417891, + 1363872513, + 1531838405, + 3553893983, + 3430035287, + 517387946, + 2257426273, + 2265627234, + 2574723351, + 1648070365, + 2380605039, + 632456759, + 4186782496, + 146908438, + 2728212071, + 3711711213, + 2228982572, + 2499775539, + 555978191, + 3726204011, + 3941353298, + 45047142, + 1060289778, + 2766523477, + 1304711584, + 1920044190, + 4276220986, + 3040104725, + 1487696085, + 3809105538, + 3528196112, + 2908673502, + 3237884278, + 1472941766, + 2147417982, + 572438709, + ]; + + static const List _envieddatapayMobOutClient_id = [ + 1965273981, + 251112708, + 1021360665, + 1760486593, + 3074877498, + 318875679, + 421715291, + 880136648, + 4152884962, + 4108776154, + 77354335, + 2009417968, + 1363872563, + 1531838370, + 3553893910, + 3430035301, + 517387984, + 2257426180, + 2265627148, + 2574723409, + 1648070299, + 2380604940, + 632456828, + 4186782547, + 146908528, + 2728212003, + 3711711142, + 2228982602, + 2499775611, + 555978126, + 3726203966, + 3941353314, + 45047089, + 1060289719, + 2766523417, + 1304711633, + 1920044245, + 4276220995, + 3040104799, + 1487696101, + 3809105614, + 3528196168, + 2908673452, + 3237884206, + 1472941738, + 2147417916, + 572438745, + ]; + + static final String payMobOutClient_id = String.fromCharCodes( + List.generate( + _envieddatapayMobOutClient_id.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutClient_id[i] ^ _enviedkeypayMobOutClient_id[i])); + + static const List _enviedkeypayMobOutPassword = [ + 3046523764, + 1967164127, + 101592283, + 3121811434, + 2219759894, + 3705657411, + 1464695482, + 3260321893, + 1948702050, + 1980441070, + 4286351675, + 1010027237, + 136257506, + 312904951, + 1706125793, + 3647738103, + 2487968249, + 503480611, + 293396140, + 2236098926, + 1094729191, + 2960231447, + 2217186162, + 1834078797, + 2567075134, + 1792144990, + 1089020808, + 3415115440, + 597412956, + 153238271, + 1956332533, + 1548811449, + ]; + + static const List _envieddatapayMobOutPassword = [ + 3046523696, + 1967164141, + 101592225, + 3121811360, + 2219759952, + 3705657403, + 1464695505, + 3260321824, + 1948702017, + 1980440994, + 4286351733, + 1010027150, + 136257489, + 312904833, + 1706125723, + 3647738052, + 2487968193, + 503480665, + 293396126, + 2236098826, + 1094729150, + 2960231535, + 2217186050, + 1834078723, + 2567075160, + 1792144905, + 1089020880, + 3415115458, + 597412868, + 153238163, + 1956332471, + 1548811477, + ]; + + static final String payMobOutPassword = String.fromCharCodes( + List.generate( + _envieddatapayMobOutPassword.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutPassword[i] ^ _enviedkeypayMobOutPassword[i])); + + static const List _enviedkeypayMobOutUserName = [ + 1517267622, + 3581019719, + 2265541189, + 4199853435, + 733593041, + 3253403280, + 1972789009, + 336582501, + 1920675372, + 940818255, + 907883946, + 3943258064, + 2872577903, + 3630656087, + 1363200141, + 2634387921, + 2418471153, + 3666332815, + 197993275, + 988403987, + 422481299, + 3931397185, + 3433843438, + 1596261089, + ]; + + static const List _envieddatapayMobOutUserName = [ + 1517267676, + 3581019693, + 2265541168, + 4199853329, + 733593021, + 3253403343, + 1972789088, + 336582419, + 1920675395, + 940818192, + 907883980, + 3943258023, + 2872577796, + 3630656061, + 1363200235, + 2634387894, + 2418471067, + 3666332899, + 197993315, + 988404065, + 422481355, + 3931397165, + 3433843372, + 1596261005, + ]; + + static final String payMobOutUserName = String.fromCharCodes( + List.generate( + _envieddatapayMobOutUserName.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutUserName[i] ^ _enviedkeypayMobOutUserName[i])); + + static const List _enviedkeyA = [621552519]; + + static const List _envieddataA = [621552598]; + + static final String A = String.fromCharCodes(List.generate( + _envieddataA.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataA[i] ^ _enviedkeyA[i])); + + static const List _enviedkeyB = [124244880]; + + static const List _envieddataB = [124244936]; + + static final String B = String.fromCharCodes(List.generate( + _envieddataB.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataB[i] ^ _enviedkeyB[i])); + + static const List _enviedkeyC = [930921266]; + + static const List _envieddataC = [930921332]; + + static final String C = String.fromCharCodes(List.generate( + _envieddataC.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataC[i] ^ _enviedkeyC[i])); + + static const List _enviedkeyD = [2250365783]; + + static const List _envieddataD = [2250365710]; + + static final String D = String.fromCharCodes(List.generate( + _envieddataD.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataD[i] ^ _enviedkeyD[i])); + + static const List _enviedkeyE = [1514385852]; + + static const List _envieddataE = [1514385910]; + + static final String E = String.fromCharCodes(List.generate( + _envieddataE.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataE[i] ^ _enviedkeyE[i])); + + static const List _enviedkeyF = [704890003]; + + static const List _envieddataF = [704890054]; + + static final String F = String.fromCharCodes(List.generate( + _envieddataF.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataF[i] ^ _enviedkeyF[i])); + + static const List _enviedkeyG = [3179311896]; + + static const List _envieddataG = [3179311955]; + + static final String G = String.fromCharCodes(List.generate( + _envieddataG.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataG[i] ^ _enviedkeyG[i])); + + static const List _enviedkeyH = [1761336190]; + + static const List _envieddataH = [1761336105]; + + static final String H = String.fromCharCodes(List.generate( + _envieddataH.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataH[i] ^ _enviedkeyH[i])); + + static const List _enviedkeyI = [3781202306]; + + static const List _envieddataI = [3781202381]; + + static final String I = String.fromCharCodes(List.generate( + _envieddataI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataI[i] ^ _enviedkeyI[i])); + + static const List _enviedkeyJ = [1326210442]; + + static const List _envieddataJ = [1326210511]; + + static final String J = String.fromCharCodes(List.generate( + _envieddataJ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataJ[i] ^ _enviedkeyJ[i])); + + static const List _enviedkeyK = [445423807]; + + static const List _envieddataK = [445423864]; + + static final String K = String.fromCharCodes(List.generate( + _envieddataK.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataK[i] ^ _enviedkeyK[i])); + + static const List _enviedkeyL = [1546569440]; + + static const List _envieddataL = [1546569394]; + + static final String L = String.fromCharCodes(List.generate( + _envieddataL.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataL[i] ^ _enviedkeyL[i])); + + static const List _enviedkeyM = [453363201]; + + static const List _envieddataM = [453363279]; + + static final String M = String.fromCharCodes(List.generate( + _envieddataM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataM[i] ^ _enviedkeyM[i])); + + static const List _enviedkeyN = [580459699]; + + static const List _envieddataN = [580459761]; + + static final String N = String.fromCharCodes(List.generate( + _envieddataN.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataN[i] ^ _enviedkeyN[i])); + + static const List _enviedkeyO = [3487169620]; + + static const List _envieddataO = [3487169565]; + + static final String O = String.fromCharCodes(List.generate( + _envieddataO.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataO[i] ^ _enviedkeyO[i])); + + static const List _enviedkeyP = [1776375258]; + + static const List _envieddataP = [1776375180]; + + static final String P = String.fromCharCodes(List.generate( + _envieddataP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataP[i] ^ _enviedkeyP[i])); + + static const List _enviedkeyQ = [1322153939]; + + static const List _envieddataQ = [1322153874]; + + static final String Q = String.fromCharCodes(List.generate( + _envieddataQ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataQ[i] ^ _enviedkeyQ[i])); + + static const List _enviedkeyR = [2924419422]; + + static const List _envieddataR = [2924419346]; + + static final String R = String.fromCharCodes(List.generate( + _envieddataR.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataR[i] ^ _enviedkeyR[i])); + + static const List _enviedkeyS = [451004087]; + + static const List _envieddataS = [451004141]; + + static final String S = String.fromCharCodes(List.generate( + _envieddataS.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataS[i] ^ _enviedkeyS[i])); + + static const List _enviedkeyT = [478852539]; + + static const List _envieddataT = [478852600]; + + static final String T = String.fromCharCodes(List.generate( + _envieddataT.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataT[i] ^ _enviedkeyT[i])); + + static const List _enviedkeyU = [610419110]; + + static const List _envieddataU = [610419182]; + + static final String U = String.fromCharCodes(List.generate( + _envieddataU.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataU[i] ^ _enviedkeyU[i])); + + static const List _enviedkeyV = [2844858273]; + + static const List _envieddataV = [2844858353]; + + static final String V = String.fromCharCodes(List.generate( + _envieddataV.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataV[i] ^ _enviedkeyV[i])); + + static const List _enviedkeyW = [3067383091]; + + static const List _envieddataW = [3067383143]; + + static final String W = String.fromCharCodes(List.generate( + _envieddataW.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataW[i] ^ _enviedkeyW[i])); + + static const List _enviedkeyX = [1619286782]; + + static const List _envieddataX = [1619286714]; + + static final String X = String.fromCharCodes(List.generate( + _envieddataX.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataX[i] ^ _enviedkeyX[i])); + + static const List _enviedkeyY = [2591943762]; + + static const List _envieddataY = [2591943681]; + + static final String Y = String.fromCharCodes(List.generate( + _envieddataY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataY[i] ^ _enviedkeyY[i])); + + static const List _enviedkeyZ = [229310777]; + + static const List _envieddataZ = [229310836]; + + static final String Z = String.fromCharCodes(List.generate( + _envieddataZ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataZ[i] ^ _enviedkeyZ[i])); + + static const List _enviedkeya = [1536770102]; + + static const List _envieddataa = [1536770119]; + + static final String a = String.fromCharCodes(List.generate( + _envieddataa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataa[i] ^ _enviedkeya[i])); + + static const List _enviedkeyb = [3960042836]; + + static const List _envieddatab = [3960042796]; + + static final String b = String.fromCharCodes(List.generate( + _envieddatab.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatab[i] ^ _enviedkeyb[i])); + + static const List _enviedkeyc = [324416982]; + + static const List _envieddatac = [324416944]; + + static final String c = String.fromCharCodes(List.generate( + _envieddatac.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatac[i] ^ _enviedkeyc[i])); + + static const List _enviedkeyd = [427889464]; + + static const List _envieddatad = [427889473]; + + static final String d = String.fromCharCodes(List.generate( + _envieddatad.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatad[i] ^ _enviedkeyd[i])); + + static const List _enviedkeye = [898361344]; + + static const List _envieddatae = [898361450]; + + static final String e = String.fromCharCodes(List.generate( + _envieddatae.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatae[i] ^ _enviedkeye[i])); + + static const List _enviedkeyf = [1202330885]; + + static const List _envieddataf = [1202330992]; + + static final String f = String.fromCharCodes(List.generate( + _envieddataf.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataf[i] ^ _enviedkeyf[i])); + + static const List _enviedkeyg = [1729197249]; + + static const List _envieddatag = [1729197226]; + + static final String g = String.fromCharCodes(List.generate( + _envieddatag.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatag[i] ^ _enviedkeyg[i])); + + static const List _enviedkeyh = [1990312942]; + + static const List _envieddatah = [1990312857]; + + static final String h = String.fromCharCodes(List.generate( + _envieddatah.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatah[i] ^ _enviedkeyh[i])); + + static const List _enviedkeyi = [1932907869]; + + static const List _envieddatai = [1932907826]; + + static final String i = String.fromCharCodes(List.generate( + _envieddatai.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatai[i] ^ _enviedkeyi[i])); + + static const List _enviedkeyj = [1241547470]; + + static const List _envieddataj = [1241547435]; + + static final String j = String.fromCharCodes(List.generate( + _envieddataj.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataj[i] ^ _enviedkeyj[i])); + + static const List _enviedkeyk = [259611394]; + + static const List _envieddatak = [259611493]; + + static final String k = String.fromCharCodes(List.generate( + _envieddatak.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatak[i] ^ _enviedkeyk[i])); + + static const List _enviedkeyl = [151830303]; + + static const List _envieddatal = [151830381]; + + static final String l = String.fromCharCodes(List.generate( + _envieddatal.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatal[i] ^ _enviedkeyl[i])); + + static const List _enviedkeym = [1799738310]; + + static const List _envieddatam = [1799738280]; + + static final String m = String.fromCharCodes(List.generate( + _envieddatam.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatam[i] ^ _enviedkeym[i])); + + static const List _enviedkeyn = [1090460205]; + + static const List _envieddatan = [1090460239]; + + static final String n = String.fromCharCodes(List.generate( + _envieddatan.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatan[i] ^ _enviedkeyn[i])); + + static const List _enviedkeyo = [1789573424]; + + static const List _envieddatao = [1789573465]; + + static final String o = String.fromCharCodes(List.generate( + _envieddatao.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatao[i] ^ _enviedkeyo[i])); + + static const List _enviedkeyp = [1878676969]; + + static const List _envieddatap = [1878676895]; + + static final String p = String.fromCharCodes(List.generate( + _envieddatap.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatap[i] ^ _enviedkeyp[i])); + + static const List _enviedkeyq = [2695059956]; + + static const List _envieddataq = [2695059861]; + + static final String q = String.fromCharCodes(List.generate( + _envieddataq.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataq[i] ^ _enviedkeyq[i])); + + static const List _enviedkeyr = [1939405581]; + + static const List _envieddatar = [1939405665]; + + static final String r = String.fromCharCodes(List.generate( + _envieddatar.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatar[i] ^ _enviedkeyr[i])); + + static const List _enviedkeys = [1180085828]; + + static const List _envieddatas = [1180085822]; + + static final String s = String.fromCharCodes(List.generate( + _envieddatas.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatas[i] ^ _enviedkeys[i])); + + static const List _enviedkeyt = [1580305672]; + + static const List _envieddatat = [1580305771]; + + static final String t = String.fromCharCodes(List.generate( + _envieddatat.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatat[i] ^ _enviedkeyt[i])); + + static const List _enviedkeyu = [2323155548]; + + static const List _envieddatau = [2323155508]; + + static final String u = String.fromCharCodes(List.generate( + _envieddatau.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatau[i] ^ _enviedkeyu[i])); + + static const List _enviedkeyv = [1278629770]; + + static const List _envieddatav = [1278629882]; + + static final String v = String.fromCharCodes(List.generate( + _envieddatav.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatav[i] ^ _enviedkeyv[i])); + + static const List _enviedkeyw = [237199249]; + + static const List _envieddataw = [237199333]; + + static final String w = String.fromCharCodes(List.generate( + _envieddataw.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataw[i] ^ _enviedkeyw[i])); + + static const List _enviedkeyx = [1874377583]; + + static const List _envieddatax = [1874377483]; + + static final String x = String.fromCharCodes(List.generate( + _envieddatax.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatax[i] ^ _enviedkeyx[i])); + + static const List _enviedkeyy = [3787631554]; + + static const List _envieddatay = [3787631537]; + + static final String y = String.fromCharCodes(List.generate( + _envieddatay.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatay[i] ^ _enviedkeyy[i])); + + static const List _enviedkeyz = [3711317403]; + + static const List _envieddataz = [3711317494]; + + static final String z = String.fromCharCodes(List.generate( + _envieddataz.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataz[i] ^ _enviedkeyz[i])); + + static const List _enviedkeykeyOfApp = [ + 552608534, + 3108184057, + 918610805, + 1650458840, + 4088118252, + 2462399260, + 4057715841, + 1487250240, + 1035770947, + 2305263347, + 2850090036, + 3054486205, + 1255162216, + 4170665077, + 3763331735, + 1333575978, + 1335369643, + 249778031, + 1241107597, + 2854534229, + 2563993585, + 744037855, + 344719674, + 3433993396, + 1873779619, + 3261640083, + 746630754, + 3108340333, + 745432909, + 879004739, + 2433384939, + 3726346045, + 1194236542, + 1344318617, + 137789182, + 1572867349, + 936738961, + 3244834692, + ]; + + static const List _envieddatakeyOfApp = [ + 552608628, + 3108183960, + 918610713, + 1650458795, + 4088118153, + 2462399338, + 4057715905, + 1487250295, + 1035770997, + 2305263306, + 2850089986, + 3054486217, + 1255162121, + 4170664983, + 3763331833, + 1333576011, + 1335369674, + 249777941, + 1241107688, + 2854534182, + 2563993500, + 744037818, + 344719698, + 3433993425, + 1873779665, + 3261640182, + 746630661, + 3108340247, + 745432893, + 879004709, + 2433384833, + 3726346066, + 1194236454, + 1344318699, + 137789094, + 1572867431, + 936739027, + 3244834806, + ]; + + static final String keyOfApp = String.fromCharCodes(List.generate( + _envieddatakeyOfApp.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatakeyOfApp[i] ^ _enviedkeykeyOfApp[i])); +} diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart new file mode 100644 index 0000000..6e4abee --- /dev/null +++ b/lib/firebase_options.dart @@ -0,0 +1,70 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64', + appId: '1:1086900987150:android:7f0b54792b737a3d77a35f', + messagingSenderId: '1086900987150', + projectId: 'intaleq-d48a7', + storageBucket: 'intaleq-d48a7.firebasestorage.app', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyAwG09AeehwBfktpKKJwCKQOtEUpHtr-p0', + appId: '1:1086900987150:ios:db95474c7ff8899a77a35f', + messagingSenderId: '1086900987150', + projectId: 'intaleq-d48a7', + storageBucket: 'intaleq-d48a7.firebasestorage.app', + androidClientId: '1086900987150-060srlmdjocdcav377rbur4ka14m90b7.apps.googleusercontent.com', + iosClientId: '1086900987150-n48ncfe3ud1khvncsgcmdbtpkhg2jfce.apps.googleusercontent.com', + iosBundleId: 'com.intaleq.intaleqAdmin', + ); +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..9cf4291 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,69 @@ +import 'dart:io'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:sefer_admin1/views/auth/login_page.dart'; + +import 'controller/firebase/firbase_messge.dart'; +import 'controller/functions/encrypt_decrypt.dart'; +import 'firebase_options.dart'; +import 'models/db_sql.dart'; +import 'views/admin/admin_home_page.dart'; + +final box = GetStorage(); +const storage = FlutterSecureStorage(); +@pragma('vm:entry-point') +Future backgroundMessageHandler(RemoteMessage message) async { + await Firebase.initializeApp(); + if (message.data.isNotEmpty && message.notification != null) { + FirebaseMessagesController().fireBaseTitles(message); + } +} + +DbSql sql = DbSql.instance; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await GetStorage.init(); + await EncryptionHelper.initialize(); + if (Platform.isAndroid || Platform.isIOS) { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + await FirebaseMessagesController().requestFirebaseMessagingPermission(); + + FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); + + List initializationTasks = [ + FirebaseMessagesController().getNotificationSettings(), + FirebaseMessagesController().getToken(), + ]; + + await Future.wait(initializationTasks); + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.portraitDown, + ]); + } // Enable Crashlytics collection + FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; + + runApp(const MainApp()); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + @override + Widget build(BuildContext context) { + return GetMaterialApp( + debugShowCheckedModeBanner: false, + home: AdminLoginPage(), + ); + } +} diff --git a/lib/models/db_sql.dart b/lib/models/db_sql.dart new file mode 100644 index 0000000..7f0bb18 --- /dev/null +++ b/lib/models/db_sql.dart @@ -0,0 +1,116 @@ +import 'package:sqflite/sqflite.dart'; +import 'package:path/path.dart'; + +import '../constant/table_names.dart'; + +class DbSql { + static final DbSql instance = DbSql._(); + + static Database? _database; + + DbSql._(); + + Future get database async { + if (_database != null) return _database!; + _database = await _initDatabase(); + return _database!; + } + + Future _initDatabase() async { + String path = join(await getDatabasesPath(), 'my_database.db'); + return await openDatabase( + path, + version: 1, + onCreate: (db, version) async { + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.carLocations}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + driver_id TEXT, + latitude REAL, + longitude REAL, + created_at TEXT, + updated_at TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.placesFavorite}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL, + longitude REAL, + name TEXT UNIQUE, + rate TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.recentLocations}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL, + longitude REAL, + name TEXT , + rate TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.driverOrdersRefuse}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT UNIQUE, + created_at TEXT, + driver_id TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.rideLocation}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT , + created_at TEXT, + lat TEXT, + lng TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.faceDetectTimes}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + faceDetectTimes INTEGER + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.captainNotification}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + faceDetectTimes INTEGER + ) + '''); + }, + ); + } + + Future>> getAllData(String table) async { + Database db = await instance.database; + return await db.query(table); + } + + Future>> getCustomQuery(String query) async { + Database db = await instance.database; + return await db.rawQuery(query); + } + + Future insertData(Map map, String table) async { + Database db = await instance.database; + return await db.insert(table, map); + } + + Future updateData(Map map, String table, int id) async { + Database db = await instance.database; + + return await db.update(table, map, where: 'id = ?', whereArgs: [id]); + } + + Future deleteData(String table, int id) async { + Database db = await instance.database; + return await db.delete(table, where: 'id = ?', whereArgs: [id]); + } + + Future deleteAllData(String table) async { + Database db = await instance.database; + return await db.delete(table); + } +} diff --git a/lib/models/feedback_qury.sql b/lib/models/feedback_qury.sql new file mode 100644 index 0000000..a05fe96 --- /dev/null +++ b/lib/models/feedback_qury.sql @@ -0,0 +1,40 @@ +-- Frequent Complaint Passengers +SELECT + passengers.id AS passenger_id, + passengers.first_name, + passengers.last_name, + passengers.phone, + COUNT(`feedBack`.id) AS complaint_count +FROM + passengers +JOIN `feedBack` ON passengers.id = `feedBack`.`passengerId` +GROUP BY + passengers.id +ORDER BY + complaint_count +DESC +LIMIT 10; +--========== +-- to get all driver payment to pay to them +SELECT + p.driverID, + COALESCE(SUM(p.amount), 0) AS total_amount, + COALESCE(SUM(p.amount), 0) + COALESCE(pd.total_points, 0) AS diff +FROM + payments p +JOIN ( + SELECT + driverID, + SUM(amount) AS total_points + FROM + paymentsDriverPoints + WHERE + payment_method = 'fromBudgetToPoints' + GROUP BY + driverID +) pd ON p.driverID = pd.driverID +WHERE + p.isGiven = 'waiting' + AND p.payment_method IN ('visa-in', 'visa', 'visaRide', 'TransferFrom', 'payout', 'TransferTo') +GROUP BY + p.driverID; diff --git a/lib/models/model/admin/monthly_ride.dart b/lib/models/model/admin/monthly_ride.dart new file mode 100644 index 0000000..df4d600 --- /dev/null +++ b/lib/models/model/admin/monthly_ride.dart @@ -0,0 +1,21 @@ +class MonthlyDataModel { + final int year; + final int month; + final int day; + final int ridesCount; + + MonthlyDataModel({ + required this.year, + required this.month, + required this.day, + required this.ridesCount, + }); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + year: json['year'] as int, + month: json['month'] as int, + day: json['day'] as int, + ridesCount: json['rides_count'] as int, + ); +} diff --git a/lib/models/model/admin/passenger_model.dart b/lib/models/model/admin/passenger_model.dart new file mode 100644 index 0000000..ed920bb --- /dev/null +++ b/lib/models/model/admin/passenger_model.dart @@ -0,0 +1,79 @@ +class Passenger { + String id; + String phone; + String email; + String gender; + String status; + String birthdate; + String site; + String firstName; + String lastName; + String sosPhone; + String education; + String employmentType; + String maritalStatus; + String createdAt; + String updatedAt; + int countPassenger; + int countFeedback; + double ratingPassenger; + int countDriverRate; + int countPassengerCancel; + double passengerAverageRating; + int countPassengerRate; + int countPassengerRide; + + Passenger({ + required this.id, + required this.phone, + required this.email, + required this.gender, + required this.status, + required this.birthdate, + required this.site, + required this.firstName, + required this.lastName, + required this.sosPhone, + required this.education, + required this.employmentType, + required this.maritalStatus, + required this.createdAt, + required this.updatedAt, + required this.countPassenger, + required this.countFeedback, + required this.ratingPassenger, + required this.countDriverRate, + required this.countPassengerCancel, + required this.passengerAverageRating, + required this.countPassengerRate, + required this.countPassengerRide, + }); + + factory Passenger.fromJson(Map json) { + return Passenger( + id: json['id'], + phone: json['phone'], + email: json['email'], + gender: json['gender'], + status: json['status'], + birthdate: json['birthdate'], + site: json['site'], + firstName: json['first_name'], + lastName: json['last_name'], + sosPhone: json['sosPhone'], + education: json['education'], + employmentType: json['employmentType'], + maritalStatus: json['maritalStatus'], + createdAt: json['created_at'], + updatedAt: json['updated_at'], + countPassenger: json['countPassenger'], + countFeedback: json['countFeedback'], + ratingPassenger: json['ratingPassenger'].toDouble(), + countDriverRate: json['countDriverRate'], + countPassengerCancel: json['countPassengerCancel'], + passengerAverageRating: json['passengerAverageRating'].toDouble(), + countPassengerRate: json['countPassengerRate'], + countPassengerRide: json['countPassengerRide'], + ); + } +} diff --git a/lib/models/model/admin/rides_summary_model.dart b/lib/models/model/admin/rides_summary_model.dart new file mode 100644 index 0000000..b3b1113 --- /dev/null +++ b/lib/models/model/admin/rides_summary_model.dart @@ -0,0 +1,12 @@ +class MonthlyDataModel { + int day; + int totalDuration; + + MonthlyDataModel({required this.day, required this.totalDuration}); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + day: int.parse(json['day'].toString().split('-')[2]), + totalDuration: + int.parse(json['total_duration'].toString().split(':')[0])); +} diff --git a/lib/models/model/locations.dart b/lib/models/model/locations.dart new file mode 100644 index 0000000..3b18b60 --- /dev/null +++ b/lib/models/model/locations.dart @@ -0,0 +1,34 @@ +class CarLocationModel { + String id; + String driverId; + double latitude; + double heading; + double speed; + double longitude; + DateTime createdAt; + DateTime updatedAt; + + CarLocationModel({ + required this.id, + required this.driverId, + required this.latitude, + required this.longitude, + required this.heading, + required this.speed, + required this.createdAt, + required this.updatedAt, + }); + + factory CarLocationModel.fromJson(Map json) { + return CarLocationModel( + id: json['id'], + driverId: json['driver_id'], + latitude: double.parse(json['latitude'].toString()), + longitude: double.parse(json['longitude'].toString()), + heading: double.parse(json['heading'].toString()), + speed: double.parse(json['speed'].toString()), + createdAt: DateTime.parse(json['created_at']), + updatedAt: DateTime.parse(json['updated_at']), + ); + } +} diff --git a/lib/models/model/onboarding_model.dart b/lib/models/model/onboarding_model.dart new file mode 100644 index 0000000..199909f --- /dev/null +++ b/lib/models/model/onboarding_model.dart @@ -0,0 +1,30 @@ +import 'package:get/get.dart'; + +List onBoardingList = [ + OnBoardingModel( + title: 'Welcome to Sefer!'.tr, + image: 'assets/images/on1.png', + body: + 'Sefer is the ride-hailing app that is safe, reliable, and accessible.' + .tr, + ), + OnBoardingModel( + title: 'Get to your destination quickly and easily.'.tr, + image: 'assets/images/on2.png', + body: 'With Sefer, you can get a ride to your destination in minutes.'.tr, + ), + OnBoardingModel( + title: 'Enjoy a safe and comfortable ride.'.tr, + image: 'assets/images/on3.png', + body: + 'Sefer is committed to safety, and all of our captains are carefully screened and background checked.' + .tr, + ), +]; + +class OnBoardingModel { + final String? title; + final String? image; + final String? body; + OnBoardingModel({this.body, this.title, this.image}); +} diff --git a/lib/models/model/passengers_model.dart b/lib/models/model/passengers_model.dart new file mode 100644 index 0000000..c044e56 --- /dev/null +++ b/lib/models/model/passengers_model.dart @@ -0,0 +1,77 @@ +class MonthlyPassengerInstall { + int day; + int totalPassengers; + + MonthlyPassengerInstall({required this.day, required this.totalPassengers}); + + factory MonthlyPassengerInstall.fromJson(Map json) => + MonthlyPassengerInstall( + day: int.parse(json['day'].toString().split('-')[2]), + totalPassengers: + int.parse(json['totalPassengers'].toString().split(':')[0])); +} + +class MonthlyRidesInstall { + int day; + int totalRides; + + MonthlyRidesInstall({required this.day, required this.totalRides}); + + factory MonthlyRidesInstall.fromJson(Map json) => + MonthlyRidesInstall( + day: int.parse(json['day'].toString().split('-')[2]), + totalRides: int.parse(json['totalRides'].toString().split(':')[0])); +} + +class MonthlyEmployeeData { + int day; + int totalEmployees; + String name; + + MonthlyEmployeeData( + {required this.day, required this.totalEmployees, required this.name}); + + factory MonthlyEmployeeData.fromJson(Map json) => + MonthlyEmployeeData( + day: int.parse(json['date'].toString().split('-')[2]), // Extract day + totalEmployees: json['count'], + name: json['NAME'], + ); +} + +class MonthlyDriverInstall { + int day; + int totalDrivers; + int dailyTotalDrivers; + int dailyTotalCallingDrivers; + int dailyMatchingNotes; + int totalMonthlyDrivers; + int totalMonthlyCallingDrivers; + int totalMonthlyMatchingNotes; + + MonthlyDriverInstall({ + required this.day, + required this.totalDrivers, + required this.dailyTotalDrivers, + required this.dailyTotalCallingDrivers, + required this.dailyMatchingNotes, + required this.totalMonthlyDrivers, + required this.totalMonthlyCallingDrivers, + required this.totalMonthlyMatchingNotes, + }); + + factory MonthlyDriverInstall.fromJson(Map json) => + MonthlyDriverInstall( + day: int.parse(json['day'].toString().split('-')[2]), + totalDrivers: int.parse(json['totalDrivers'].toString()), + dailyTotalDrivers: int.parse(json['dailyTotalDrivers'].toString()), + dailyTotalCallingDrivers: + int.parse(json['dailyTotalCallingDrivers'].toString()), + dailyMatchingNotes: int.parse(json['dailyMatchingNotes'].toString()), + totalMonthlyDrivers: int.parse(json['totalMonthlyDrivers'].toString()), + totalMonthlyCallingDrivers: + int.parse(json['totalMonthlyCallingDrivers'].toString()), + totalMonthlyMatchingNotes: + int.parse(json['totalMonthlyMatchingNotes'].toString()), + ); +} diff --git a/lib/print.dart b/lib/print.dart new file mode 100644 index 0000000..ccc2fb5 --- /dev/null +++ b/lib/print.dart @@ -0,0 +1,13 @@ +import 'dart:developer' as developer; + +class Log { + Log._(); + + static void print(String value, {StackTrace? stackTrace}) { + developer.log(value, name: 'LOG', stackTrace: stackTrace); + } + + static Object? inspect(Object? object) { + return developer.inspect(object); + } +} diff --git a/lib/views/admin/admin_home_page.dart b/lib/views/admin/admin_home_page.dart new file mode 100644 index 0000000..ea8bedd --- /dev/null +++ b/lib/views/admin/admin_home_page.dart @@ -0,0 +1,475 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/colors.dart'; +import 'package:sefer_admin1/controller/admin/dashboard_controller.dart'; +import 'package:sefer_admin1/controller/admin/register_captain_controller.dart'; +import 'package:sefer_admin1/controller/admin/static_controller.dart'; +import 'package:sefer_admin1/controller/notification_controller.dart'; +import 'package:sefer_admin1/main.dart'; +import 'package:sefer_admin1/views/admin/captain/drivers_cant_registe.dart'; +import 'package:sefer_admin1/views/widgets/mycircular.dart'; + +// Please make sure all these imports are correct for your project structure +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../controller/functions/crud.dart'; +import '../invoice/invoice_list_page.dart'; +import '../widgets/my_scafold.dart'; +import '../widgets/my_textField.dart'; +import '../invoice/add_invoice_page.dart'; +import 'captain/captain.dart'; +import 'dashboard_widget.dart'; // Assuming DashboardStatCard is here +import 'drivers/driver_the_best.dart'; +import 'employee/employee_page.dart'; +import 'packages.dart'; +import 'passenger/passenger.dart'; +import 'rides/rides.dart'; +import 'static/static.dart'; +import 'wallet/wallet.dart'; + +class AdminHomePage extends StatelessWidget { + AdminHomePage({super.key}); + + // Responsive grid column calculation + int _calculateCrossAxisCount(BuildContext context) { + double screenWidth = MediaQuery.of(context).size.width; + if (screenWidth > 1200) return 5; // Large desktops + if (screenWidth > 900) return 4; // Desktops + if (screenWidth > 600) return 3; // Tablets + return 2; // Phones + } + + // Helper to format currency + String _formatCurrency(dynamic value) { + if (value == null) return '\$0.00'; + final number = double.tryParse(value.toString()); + if (number != null) return '\$${number.toStringAsFixed(2)}'; + return '\$0.00'; + } + + final TextEditingController _messageController = TextEditingController(); + + @override + Widget build(BuildContext context) { + // Make sure DashboardController is initialized + final DashboardController dashboardController = + Get.put(DashboardController()); + + // Action items list with Arabic titles + final List> actionItems = [ + { + 'title': 'الركاب', + 'icon': Icons.people_alt_outlined, + 'onPressed': () => Get.to(() => Passengrs(), + transition: Transition.rightToLeftWithFade) + }, + { + 'title': 'الكباتن', + 'icon': Icons.sports_motorsports_outlined, + 'onPressed': () => + Get.to(() => Captain(), transition: Transition.rightToLeftWithFade) + }, + { + 'title': 'المحفظة', + 'icon': Icons.account_balance_wallet_outlined, + 'onPressed': () => + Get.to(() => Wallet(), transition: Transition.rightToLeftWithFade) + }, + { + 'title': 'الرحلات', + 'icon': Icons.directions_car_filled_outlined, + 'onPressed': () => + Get.to(() => Rides(), transition: Transition.rightToLeftWithFade) + }, + { + 'title': 'الإحصائيات', + 'icon': Icons.bar_chart_outlined, + 'onPressed': () async { + await Get.put(StaticController()).getAll(); + Get.to(() => const StaticDash()); + } + }, + { + 'title': 'إرسال واتساب للسائقين', + 'icon': Icons.message_outlined, + 'iconColor': Colors.green.shade600, + 'onPressed': () => _showWhatsAppDialog(context) + }, + { + 'title': 'إرسال إشعار للسائقين', + 'icon': Icons.notifications_active_outlined, + 'onPressed': () async => + await Get.put(NotificationController()).getTokensDrivers() + }, + { + 'title': 'إرسال إشعار للركاب', + 'icon': Icons.notification_important_outlined, + 'onPressed': () async => + await Get.put(NotificationController()).getTokensPassengers() + }, + { + 'title': 'تسجيل كابتن جديد', + 'icon': Icons.person_add_alt_1_outlined, + 'onPressed': () async { + await Get.put(RegisterCaptainController()) + .getDriverNotCompleteRegistration(); + Get.to(() => const DriversCantRegister()); + } + }, + { + 'title': 'تحديث الباقات', + 'icon': Icons.inventory_2_outlined, + 'onPressed': () => Get.to(() => PackageUpdateScreen()) + }, + { + 'title': 'الموظفون', + 'icon': Icons.badge_outlined, + 'onPressed': () => Get.to(() => EmployeePage()) + }, + { + 'title': 'أفضل السائقين', + 'icon': Icons.star_border_purple500_outlined, + 'onPressed': () => Get.to(() => DriverTheBest()) + }, + { + 'title': 'إضافة فاتورة', + 'icon': Icons.post_add_outlined, + // 'onPressed': () => Get.to(() => AddInvoicePage()) + 'onPressed': () => Get.to(() => InvoiceListPage()) + }, + { + 'title': 'إضافة جهاز كمسؤول', + 'icon': Icons.admin_panel_settings_outlined, + 'onPressed': () async => await CRUD() + .post(link: AppLink.addAdminUser, payload: {'name': 'b'}) + }, + ]; + + return MyScafolld( + title: 'لوحة التحكم الرئيسية', + action: IconButton( + onPressed: () async { + await dashboardController.getDashBoard(); + }, + icon: const Icon(Icons.refresh, color: AppColor.primaryColor, size: 28), + tooltip: 'تحديث', + ), + body: [ + GetBuilder(builder: (controller) { + if (controller.dashbord.isEmpty) { + return const MyCircularProgressIndicator(); + } + + // Main data map for easier access + final data = controller.dashbord[0]; + + // Stat cards list with Arabic titles + final List> statCards = [ + { + 'title': 'رصيد الرسائل', + 'value': controller.creditSMS.toString(), + 'icon': Icons.sms_outlined, + 'color': Colors.lightBlue + }, + { + 'title': 'الركاب', + 'value': data['countPassengers'].toString(), + 'icon': Icons.people_alt_outlined, + 'color': Colors.teal + }, + { + 'title': 'السائقون', + 'value': data['countDriver'].toString(), + 'icon': Icons.sports_motorsports_outlined, + 'color': Colors.orange + }, + { + 'title': 'رحلات الشهر', + 'value': data['countRideThisMonth'].toString(), + 'icon': Icons.calendar_month_outlined, + 'color': Colors.purple + }, + { + 'title': 'متوسط التكلفة', + 'value': _formatCurrency(data['avg_passenger_price']), + 'icon': Icons.monetization_on_outlined, + 'color': Colors.green + }, + { + 'title': 'الرحلات المكتملة', + 'value': data['completed_rides'].toString(), + 'icon': Icons.check_circle_outline, + 'color': AppColor.greenColor + }, + { + 'title': 'الرحلات الملغاة', + 'value': data['cancelled_rides'].toString(), + 'icon': Icons.cancel_outlined, + 'color': AppColor.redColor + }, + { + 'title': 'مدفوعات السائقين', + 'value': _formatCurrency(data['payments']), + 'icon': Icons.payments_outlined, + 'color': Colors.indigo + }, + { + 'title': 'محفظة انطلق', + 'value': _formatCurrency(data['seferWallet']), + 'icon': Icons.account_balance_wallet_outlined, + 'color': Colors.deepOrange + }, + { + 'title': 'عدد التحويلات', + 'value': data['transfer_from_count'].toString(), + 'icon': Icons.swap_horiz_outlined, + 'color': Colors.brown + }, + { + 'title': 'رحلات الصباح', + 'value': data['morning_ride_count'].toString(), + 'icon': Icons.wb_sunny_outlined, + 'color': Colors.amber.shade700 + }, + { + 'title': 'رحلات المساء', + 'value': data['evening_ride_count'].toString(), + 'icon': Icons.brightness_4_outlined, + 'color': Colors.blueGrey + }, + { + 'title': 'رحلات الليل', + 'value': data['night_ride_count'].toString(), + 'icon': Icons.nightlight_round_outlined, + 'color': Colors.black87 + }, + { + 'title': 'نوع كومفورت', + 'value': data['comfort'].toString(), + 'icon': Icons.event_seat_outlined, + 'color': Colors.cyan + }, + { + 'title': 'نوع سبيد', + 'value': data['speed'].toString(), + 'icon': Icons.speed_outlined, + 'color': Colors.red.shade700 + }, + { + 'title': 'نوع ليدي', + 'value': data['lady'].toString(), + 'icon': Icons.woman_2_outlined, + 'color': Colors.pink + }, + ]; + + return AnimationLimiter( + child: ListView( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), + children: [ + // --- Statistics Grid Section --- + AnimationLimiter( + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: _calculateCrossAxisCount(context), + mainAxisSpacing: 12.0, + crossAxisSpacing: 12.0, + childAspectRatio: 1.8, + ), + itemCount: statCards.length, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + final card = statCards[index]; + return AnimationConfiguration.staggeredGrid( + position: index, + duration: const Duration(milliseconds: 375), + columnCount: _calculateCrossAxisCount(context), + child: ScaleAnimation( + child: FadeInAnimation( + child: DashboardStatCard( + title: card['title'] as String, + value: card['value'].toString(), + icon: card['icon'] as IconData, + iconColor: card['color'] as Color, + valueColor: (card['color'] as Color), + ), + ), + ), + ); + }, + ), + ), + + const SizedBox(height: 20), + Text("الإجراءات السريعة", + style: Theme.of(context) + .textTheme + .titleLarge + ?.copyWith(fontWeight: FontWeight.bold)), + const SizedBox(height: 10), + + // --- Admin Actions List Section --- + AnimationLimiter( + child: ListView.builder( + itemCount: actionItems.length, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + final item = actionItems[index]; + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 375), + child: SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: AdminActionTile( + title: item['title'] as String, + icon: item['icon'] as IconData, + onPressed: item['onPressed'] as void Function(), + iconColor: item['iconColor'] as Color?, + ), + ), + ), + ); + }, + ), + ), + ], + ), + ); + }), + ], + isleading: false, + ); + } + + void _showWhatsAppDialog(BuildContext context) { + Get.dialog( + AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)), + title: Text('تأكيد إرسال الرسائل؟'), + content: MyTextForm( + controller: _messageController, + label: 'الرسالة', + hint: 'أدخل نص الرسالة هنا', + type: TextInputType.text, + ), + actions: [ + TextButton( + onPressed: () { + _messageController.clear(); + Get.back(); + }, + child: Text('إلغاء'), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor), + onPressed: () async { + if (_messageController.text.isNotEmpty) { + Get.back(); // Close dialog first + var driverPhones = + box.read(BoxName.tokensDrivers)['message'] as List?; + if (driverPhones == null || driverPhones.isEmpty) { + Get.snackbar('خطأ', 'لم يتم العثور على أرقام هواتف للسائقين.', + snackPosition: SnackPosition.BOTTOM); + return; + } + + for (var driverData in driverPhones) { + if (driverData['phone'] != null) { + await CRUD().sendWhatsAppAuth( + driverData['phone'].toString(), + _messageController.text, + ); + // Random delay to avoid being flagged as spam + await Future.delayed( + Duration(seconds: Random().nextInt(5) + 2)); + } + } + _messageController.clear(); + Get.snackbar( + 'نجاح', + 'تم إرسال الرسائل بنجاح', + snackPosition: SnackPosition.BOTTOM, + backgroundColor: Colors.green.shade100, + colorText: Colors.black, + ); + } + }, + child: Text('إرسال', style: TextStyle(color: Colors.white)), + ), + ], + ), + barrierDismissible: false, + ); + } +} + +// Renamed for clarity and improved design +class AdminActionTile extends StatelessWidget { + const AdminActionTile({ + super.key, + required this.title, + required this.onPressed, + required this.icon, + this.iconColor, + }); + + final String title; + final VoidCallback onPressed; + final IconData icon; + final Color? iconColor; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 6.0), + child: Material( + color: Theme.of(context).cardColor, + borderRadius: BorderRadius.circular(12.0), + child: InkWell( + onTap: onPressed, + borderRadius: BorderRadius.circular(12.0), + child: Container( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 18.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.0), + border: Border.all(color: Colors.grey.withOpacity(0.2))), + child: Row( + children: [ + Icon( + icon, + size: 26, + color: iconColor ?? AppColor.primaryColor, + ), + const SizedBox(width: 16), + Expanded( + child: Text( + title, + style: AppStyle.title.copyWith( + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ), + const Icon( + Icons.arrow_forward_ios, + size: 16, + color: Colors.grey, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/admin/captain/captain.dart b/lib/views/admin/captain/captain.dart new file mode 100644 index 0000000..ba2f269 --- /dev/null +++ b/lib/views/admin/captain/captain.dart @@ -0,0 +1,223 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import '../../../controller/functions/encrypt_decrypt.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; +import '../../widgets/mycircular.dart'; +import 'captain_details.dart'; +import 'form_captain.dart'; + +class Captain extends StatelessWidget { + Captain({super.key}); + final CaptainAdminController captainAdminController = + Get.put(CaptainAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Captain'.tr, + body: [ + GetBuilder( + builder: (captainAdminController) => Column( + children: [ + captainAdminController.isLoading + ? const MyCircularProgressIndicator() + : Column( + children: [ + Padding( + padding: const EdgeInsets.all(5), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + captainAdmin( + captainAdminController, + 'Captains Count', + 'countPassenger', + ), + MyElevatedButton( + title: 'Add Prize to Gold Captains', + onPressed: () { + var date = DateTime.now(); + var day = date.weekday; + + if (day == 6) { + // Saturday is 6 + Get.defaultDialog( + title: + 'Add Prize to Gold Captains', + titleStyle: AppStyle.title, + content: Column( + children: [ + Text( + 'Add Points to their wallet as prize' + .tr, + style: AppStyle.title, + ), + Form( + key: captainAdminController + .formCaptainPrizeKey, + child: MyTextForm( + controller: + captainAdminController + .captainPrizeController, + label: + 'Count of prize' + .tr, + hint: 'Count of prize' + .tr, + type: TextInputType + .number)) + ], + ), + confirm: MyElevatedButton( + title: 'Add', + onPressed: () async { + if (captainAdminController + .formCaptainPrizeKey + .currentState! + .validate()) { + captainAdminController + .addCaptainsPrizeToWalletSecure(); + } + }, + ), + ); + } else { + Get.defaultDialog( + title: + 'This day is not allowed', + titleStyle: AppStyle.title, + middleText: + 'Saturday only Allowed day', + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + Get.back(); + })); + } + }) + ], + ), + ), + const SizedBox( + height: 10, + ), + InkWell( + onTap: () { + //todo search + }, + child: Padding( + padding: const EdgeInsets.all(3), + child: Container( + width: Get.width, + height: 110, + decoration: BoxDecoration( + border: Border.all( + width: 2, + color: AppColor.greenColor)), + child: formSearchCaptain() + // ], + // ), + ), + ), + ), + SizedBox( + height: Get.height * .5, + child: ListView.builder( + itemCount: captainAdminController + .captainData['message'].length, + itemBuilder: (context, index) { + final user = captainAdminController + .captainData['message'][index]; + + return InkWell( + onTap: () { + Get.to(const CaptainsDetailsPage(), + arguments: { + 'data': user, + }); + }, + child: Padding( + padding: const EdgeInsets.all(3), + child: Container( + decoration: BoxDecoration( + border: Border.all(width: 2)), + child: ListTile( + title: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Name : ${(user['first_name'])} ${(user['last_name'])}', + style: AppStyle.title, + ), + Text( + 'Rating : ${user['ratingPassenger']}', + style: AppStyle.title, + ), + ], + ), + subtitle: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Count Trip : ${user['countPassengerRide']}', + style: AppStyle.title, + ), + Text( + 'Count Driver Rate : ${user['countDriverRate']}', + style: AppStyle.title, + ), + ], + ), + ), + ), + ), + ); + }, + ), + ), + ], + ), + ], + )) + ], + isleading: true, + ); + } + + Container captainAdmin(CaptainAdminController captainAdminController, + String title, String jsonField) { + return Container( + height: Get.height * .1, + decoration: BoxDecoration(border: Border.all(width: 2)), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + onTap: () {}, + child: Column( + children: [ + Text( + title.tr, + style: AppStyle.title, + ), + Text( + captainAdminController.captainData['message'][0][jsonField] + .toString(), + style: AppStyle.title, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/admin/captain/captain_details.dart b/lib/views/admin/captain/captain_details.dart new file mode 100644 index 0000000..594e1bf --- /dev/null +++ b/lib/views/admin/captain/captain_details.dart @@ -0,0 +1,167 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import '../../../controller/firebase/firbase_messge.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; + +class CaptainsDetailsPage extends StatelessWidget { + const CaptainsDetailsPage({super.key}); + + @override + Widget build(BuildContext context) { + final arguments = Get.arguments; + final Map data = arguments['data']; + var key = Get.find().formCaptainPrizeKey; + var titleNotify = Get.find().titleNotify; + var bodyNotify = Get.find().bodyNotify; + return MyScafolld( + title: data['first_name'] + ' ' + data['last_name'], + body: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Email is ${data['email']}', + style: AppStyle.title, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Phone is ${data['phone']}', + style: AppStyle.title, + ), + Text( + 'gender is ${data['gender']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'status is ${data['status']}', + style: AppStyle.title, + ), + Text( + 'birthdate is ${data['birthdate']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'site is ${data['site']}', + style: AppStyle.title, + ), + // Text( + // 'sosPhone is ${data['sosPhone']}', + // style: AppStyle.title, + // ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Count Feedback is ${data['countFeedback']}', + style: AppStyle.title, + ), + Text( + 'Count Driver Rate is ${data['countDriverRate']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Count Cancel is ${data['countPassengerCancel']}', + style: AppStyle.title, + ), + Text( + 'Count Ride is ${data['countPassengerRide']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Rating Captain Avarage is ${data['passengerAverageRating']}', + style: AppStyle.title, + ), + Text( + 'Rating is ${data['ratingPassenger']}', + style: AppStyle.title, + ), + ], + ), + Container( + decoration: BoxDecoration( + border: Border.all(width: 3, color: AppColor.yellowColor)), + child: TextButton( + onPressed: () async { + Get.defaultDialog( + title: 'Send Notification'.tr, + titleStyle: AppStyle.title, + content: Form( + key: key, + child: Column( + children: [ + MyTextForm( + controller: titleNotify, + label: 'title'.tr, + hint: 'title notificaton'.tr, + type: TextInputType.name), + const SizedBox( + height: 10, + ), + MyTextForm( + controller: bodyNotify, + label: 'body'.tr, + hint: 'body notificaton'.tr, + type: TextInputType.name) + ], + ), + ), + confirm: MyElevatedButton( + title: 'Send', + onPressed: () { + if (key.currentState!.validate()) { + FirebaseMessagesController() + .sendNotificationToAnyWithoutData( + titleNotify.text, + bodyNotify.text, + data['passengerToken'], + 'order.wav'); + Get.back(); + } + })); + }, + child: Text( + "Send Notificaion to Captains ".tr, + style: AppStyle.title, + ), + ), + ) + ], + ), + ) + ], + isleading: true, + ); + } +} diff --git a/lib/views/admin/captain/drivers_cant_registe.dart b/lib/views/admin/captain/drivers_cant_registe.dart new file mode 100644 index 0000000..580dec6 --- /dev/null +++ b/lib/views/admin/captain/drivers_cant_registe.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/views/admin/captain/register_captain.dart'; +import 'package:sefer_admin1/views/widgets/my_scafold.dart'; + +import '../../../constant/colors.dart'; +import '../../../controller/admin/register_captain_controller.dart'; + +class DriversCantRegister extends StatelessWidget { + const DriversCantRegister({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterCaptainController()); + return MyScafolld( + title: 'drivers cant register'.tr, + body: [ + GetBuilder(builder: (mainController) { + return ListView.builder( + itemCount: mainController.driverNotCompleteRegistration.length, + itemBuilder: (context, index) { + final driver = + mainController.driverNotCompleteRegistration[index]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + Get.to(() => RegisterCaptain(), arguments: { + "phone_number": driver['phone_number'].toString(), + 'driverId': driver['driverId'].toString(), + 'email': driver['email'].toString(), + }); + }, + child: Container( + color: driver['note'] == null + ? AppColor.greenColor + : AppColor.accentColor, + child: Column( + children: [ + Text(driver['phone_number'].toString()), + Text(driver['driverId'].toString()), + Text(driver['email'].toString()), + ], + ), + ), + ), + ); + }, + ); + }), + ], + isleading: true); + } +} diff --git a/lib/views/admin/captain/form_captain.dart b/lib/views/admin/captain/form_captain.dart new file mode 100644 index 0000000..8856434 --- /dev/null +++ b/lib/views/admin/captain/form_captain.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import 'captain_details.dart'; + +GetBuilder formSearchCaptain() { + // DbSql sql = DbSql.instance; + return GetBuilder( + builder: (controller) => Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Container( + decoration: + const BoxDecoration(color: AppColor.secondaryColor), + child: TextField( + decoration: InputDecoration( + border: const OutlineInputBorder( + borderRadius: BorderRadius.only(), + gapPadding: 4, + borderSide: BorderSide( + color: AppColor.redColor, + width: 2, + )), + suffixIcon: InkWell( + onTap: () async { + if (controller.captainController.text.length > 4) { + await controller.getCaptains(); + + Get.defaultDialog( + title: controller.captain['message'][0] + ['email'], + titleStyle: AppStyle.title, + content: Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Name is ${controller.captain['message'][0]['first_name']} ${controller.captain['message'][0]['last_name']}', + style: AppStyle.title, + ), + Text( + 'phone is ${controller.captain['message'][0]['phone']}', + style: AppStyle.title, + ), + ], + ), + confirm: MyElevatedButton( + title: 'Go To Details'.tr, + onPressed: () { + Get.to( + () => const CaptainsDetailsPage(), + arguments: { + 'data': controller + .captain['message'][0], + }); + })); + } + }, + child: const Icon(Icons.search)), + hintText: 'Search for Passenger'.tr, + hintStyle: AppStyle.title, + hintMaxLines: 1, + prefixIcon: IconButton( + onPressed: () async { + controller.captainController.clear(); + // controller.clearPlaces(); + }, + icon: Icon( + Icons.clear, + color: Colors.red[300], + ), + ), + ), + controller: controller.captainController, + ), + ), + ) + ], + )); +} diff --git a/lib/views/admin/captain/register_captain.dart b/lib/views/admin/captain/register_captain.dart new file mode 100644 index 0000000..3a0a3d6 --- /dev/null +++ b/lib/views/admin/captain/register_captain.dart @@ -0,0 +1,982 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/controller/admin/register_captain_controller.dart'; +import '../../../../constant/colors.dart'; +import '../../../../constant/links.dart'; +import '../../../../constant/style.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/mycircular.dart'; + +class RegisterCaptain extends StatelessWidget { + RegisterCaptain({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(RegisterCaptainController()); + // String text = ''; + controller.driveInit(); + return MyScafolld( + title: 'Documents check'.tr, + action: GetBuilder(builder: (controller) { + return IconButton( + onPressed: () { + controller.isLoading = false; + controller.update(); + }, + icon: const Icon(Icons.refresh), + ); + }), + body: [ + GetBuilder(builder: (controller) { + return controller.isLoading + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + (controller.responseIdCardDriverEgyptBack.isNotEmpty && + controller.responseIdCardDriverEgyptFront + .isNotEmpty && + controller.responseIdEgyptFront.isNotEmpty && + controller.responseIdEgyptBack.isNotEmpty && + controller + .responseIdEgyptDriverLicense.isNotEmpty + // && + // controller + // .responseCriminalRecordEgypt.isNotEmpty + ) + ? MyElevatedButton( + title: 'Next'.tr, + onPressed: () { + controller.addDriverAndCarEgypt(); + }) + : const SizedBox(), + SizedBox( + height: + (controller.responseIdCardDriverEgyptBack + .isNotEmpty && + controller.responseIdCardDriverEgyptFront + .isNotEmpty && + controller + .responseIdEgyptFront.isNotEmpty && + controller + .responseIdEgyptBack.isNotEmpty && + controller.responseIdEgyptDriverLicense + .isNotEmpty + // && + // controller.responseCriminalRecordEgypt + // .isNotEmpty + ) + ? Get.height * .7 + : Get.height * .85, + child: ListView( + children: [ + egyptDriverLicense(), + egyptCarLicenceFront(), + egyptCarLicenceBack(), + egyptDriverIDFront(), + egyptDriverIDBack(), + // egyptCriminalRecord(), + ], + ), + ), + ], + ), + ); + }), + ], + isleading: true); + } + + GetBuilder egyptDriverLicense() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdEgyptDriverLicense.isNotEmpty) { + final expiryDate = ai.responseIdEgyptDriverLicense['expiry_date']; + + // Check if the expiry date is before today + final today = DateTime.now(); + + // Try parsing the expiry date. If it fails, set it to null. + final expiryDateTime = DateTime.tryParse(expiryDate); + final isExpired = + expiryDateTime != null && expiryDateTime.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Driver\'s License'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI(""" +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "license_type": "", + "national_number": "", + "name_arabic": "", + "name_english": "", + "firstName": "", + "lastName": "", + "address": "", + "issue_date": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "expiry_date": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "employmentType": "", + "license_categories": [] +} + +Important notes: +1. Ensure all dates are in the format YYYY-MM-DD using Latin (Western) numerals (0-9), not Arabic numerals. +2. The 'license_categories' should be an array, even if there's only one category. +3. Fill in all fields based on the information provided in the Arabic text. +4. If any information is missing, leave the field as an empty string or empty array as appropriate. +""", 'driver_license', ai.driverId); //egypt + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + Text( + '${'License Type'.tr}: ${ai.responseIdEgyptDriverLicense['license_type']}', + style: AppStyle.title, + ), + const SizedBox(height: 8.0), + Text( + '${'National Number'.tr}: ${ai.responseIdEgyptDriverLicense['national_number']}', + style: AppStyle.title.copyWith( + color: ai.responseIdEgyptDriverLicense[ + 'national_number'] == + ai.responseIdEgyptBack['nationalID'] + ? AppColor.greenColor + : AppColor.redColor), + ), + const SizedBox(height: 8.0), + Text( + '${'Name (Arabic)'.tr}: ${ai.responseIdEgyptDriverLicense['name_arabic']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Name (English)'.tr}: ${ai.responseIdEgyptDriverLicense['name_english']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Address'.tr}: ${ai.responseIdEgyptDriverLicense['address']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Issue Date'.tr}: ${ai.responseIdEgyptDriverLicense['issue_date']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Expiry Date'.tr}: ${ai.responseIdEgyptDriverLicense['expiry_date']}', + style: AppStyle.title.copyWith( + color: + !isExpired ? AppColor.greenColor : AppColor.redColor, + ), + ), + const SizedBox(height: 8.0), + Text( + '${'License Categories'.tr}: ${ai.responseIdEgyptDriverLicense['license_categories']}', + ), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI(""" +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "license_type": "", + "national_number": "", + "name_arabic": "", + "name_english": "", + "firstName": "", + "lastName": "", + "address": "", + "issue_date": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "expiry_date": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "employmentType": "", + "license_categories": [] +} + +Important notes: +1. Ensure all dates are in the format YYYY-MM-DD using Latin (Western) numerals (0-9), not Arabic numerals. +2. The 'license_categories' should be an array, even if there's only one category. +3. Fill in all fields based on the information provided in the Arabic text. +4. If any information is missing, leave the field as an empty string or empty array as appropriate. +""", 'driver_license', ai.driverId); //egypt + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/driver_license-${ai.driverId}.jpg', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your Driver License'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptDriverIDBack() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdEgyptBack.isNotEmpty) { + final taxExpiryDate = ai.responseIdEgyptBack['expirationDate']; + + // Check if the tax expiry date is before today + final today = DateTime.now(); + + // Try parsing the tax expiry date. If it fails, set it to null. + final taxExpiryDateTime = DateTime.tryParse(taxExpiryDate); + final isExpired = + taxExpiryDateTime != null && taxExpiryDateTime.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('ID Documents Back'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI(""" + Write a JSON from the following information extracted from the provided Arabic text: +- nationalID(in Latin numerals) +- issueDate (in format YYYY-MM-DD using Latin numerals) +- occupation +- gender +- religion +- maritalStatus +- fullNameMarital (if maritalStatus is "أعزب", set this to "none") +- expirationDate (in format YYYY-MM-DD using Latin numerals) + +Please ensure all date fields use Latin (Western) numerals (0-9) instead of Arabic numerals. For example, use "2023-04-03" instead of "٢٠٢٣-٠٤-٠٣". + """, 'id_back', ai.driverId); //egypt + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + // Assuming these keys exist in ai.responseIdEgyptFront + Text( + '${'National ID'.tr}: ${ai.responseIdEgyptBack['nationalID']}', + style: AppStyle.title.copyWith( + color: ai.responseIdEgyptDriverLicense[ + 'national_number'] == + ai.responseIdEgyptBack['nationalID'] + ? AppColor.greenColor + : AppColor.redColor), + ), + + const SizedBox(height: 8.0), + Text( + '${'Occupation'.tr}: ${ai.responseIdEgyptBack['occupation']}', // Assuming 'occupation' exists + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Issue Date'.tr}: ${ai.responseIdEgyptBack['issueDate']}', // Assuming 'issueDate' exists + ), + Text( + '${'Gender'.tr}: ${ai.responseIdEgyptBack['gender']}', // Assuming 'gender' exists + ), + ], + ), + const SizedBox(height: 8.0), + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // '${'Religion'.tr}: ${ai.responseIdEgyptBack['religion']}', // Assuming 'religion' exists + // ), + // Text( + // '${'Marital Status'.tr}: ${ai.responseIdEgyptBack['maritalStatus']}', // Assuming 'maritalStatus' exists + // ), + // ], + // ), + // const SizedBox(height: 8.0), + // Text( + // '${'Full Name (Marital)'.tr}: ${ai.responseIdEgyptBack['fullNameMaritial']}', // Assuming 'fullNameMaritial' exists + // ), + // const SizedBox(height: 8.0), + Text( + '${'Expiration Date'.tr}: ${ai.responseIdEgyptBack['expirationDate']}', // Assuming 'expirationDate' exists + style: AppStyle.title.copyWith( + color: !isExpired + ? AppColor.greenColor + : AppColor.redColor), + ), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI(''' + Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "nationalID": "",//(in Latin numerals) + "issueDate": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "occupation": "", + "gender": "", + "religion": "", + "maritalStatus": "", + "fullNameMaritial": "", // Set to "none" if maritalStatus is "أعزب" + "expirationDate": "" // Format: YYYY-MM-DD using Latin numerals (0-9) +} + +Important notes: +1. Ensure all dates (issueDate and expirationDate) are in the format YYYY-MM-DD using Latin (Western) numerals (0-9), not Arabic numerals. +2. If maritalStatus is "أعزب" (single), set fullNameMaritial to "none". +3. Fill in all fields based on the information provided in the Arabic text. +4. If any information is missing, leave the field as an empty string. + ''', 'id_back', ai.driverId); //egypt + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/id_back-${ai.driverId}.jpg', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your ID Document Back'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptDriverIDFront() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdEgyptFront.isNotEmpty) { + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('ID Documents Front'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI(''' + Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "first_name": "", // The word next to "بطاقة تحقيق الشخصية" (National Identification Card) + "full_name": "", // The full name on the next line after the first name + "address": "", // The complete address spanning the next two lines + "national_number": "", // The National ID number before the last line (convert Arabic numerals to Latin) + "card_id": "", // The card ID in English on the last line + "dob": "" // Year of birth only, in Latin numerals (YYYY format) +} + +Important notes: +1. For 'first_name', extract the word immediately following "بطاقة تحقيق الشخصية". +2. 'full_name' should be the complete name found on the line after the first name. +3. 'address' should combine information from two consecutive lines. +4. Convert the 'national_number' from Arabic numerals to Latin numerals (0-9). +5. 'card_id' should be extracted as-is from the last line (it's already in English). +6. For 'dob', include only the year of birth in YYYY format using Latin numerals. +7. If any information is missing, leave the field as an empty string. + ''', 'id_front', ai.driverId); //egypt + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + // Removed Make, Model, etc. as they are not available + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'First Name'.tr}: ${ai.responseIdEgyptFront['first_name']}', + ), + Text( + '${'CardID'.tr}: ${ai.responseIdEgyptFront['card_id']}', + ), + ], + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Full Name'.tr}: ${ai.responseIdEgyptFront['full_name']}', + ), + Text( + '${'DOB'.tr}: ${ai.responseIdEgyptFront['dob']}', + ), + ], + ), + const SizedBox(height: 8.0), + Text( + '${'Address'.tr}: ${ai.responseIdEgyptFront['address']}', + ), + const SizedBox(height: 8.0), + // Text( + // '${'National Number'.tr}: ${ai.responseIdEgyptFront['national_number']}', + // ), + // const SizedBox(height: 8.0), + + // Removed Inspection Date as it's not available + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI("""" + Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "first_name": "", // The word next to "بطاقة تحقيق الشخصية" (National Identification Card) + "full_name": "", // The full name on the next line after the first name + "address": "", // The complete address spanning the next two lines + "national_number": "", // The National ID number before the last line (convert Arabic numerals to Latin) + "card_id": "", // The card ID in English on the last line + "dob": "" // Year of birth only, in Latin numerals (YYYY format) +} + +Important notes: +1. For 'first_name', extract the word immediately following "بطاقة تحقيق الشخصية". +2. 'full_name' should be the complete name found on the line after the first name. +3. 'address' should combine information from two consecutive lines. +4. Convert the 'national_number' from Arabic numerals to Latin numerals (0-9). +5. 'card_id' should be extracted as-is from the last line (it's already in English). +6. For 'dob', include only the year of birth in YYYY format using Latin numerals. +7. If any information is missing, leave the field as an empty string. + """, 'id_front', ai.driverId); //egypt + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/id_front-${ai.driverId}.png', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your ID Document front'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptCarLicenceFront() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdCardDriverEgyptFront.isNotEmpty) { + // No need to access ai.responseIdCardDriverEgyptBack anymore + final licenseExpiryDate = DateTime.parse( + ai.responseIdCardDriverEgyptFront['LicenseExpirationDate']); + + // Check if license has expired + final today = DateTime.now(); + final isLicenseExpired = licenseExpiryDate.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text('Vehicle Details Front'.tr, + style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + ai.allMethodForAI(""" + Extract the following details from the provided car license data and format them into a JSON object: + + +License Expiration Date +Car Plate +Owner +Address + +Car License Data: + + +JSON Format: +{ +"LicenseExpirationDate": "YYYY-MM-DD", +"car_plate": "[Car plate number]",//the car plate is line next to line contain 'ادارة مرور' for bot numbers and letters in arabic with partition like| but you remove | +"owner": "[Owner's full name]", +"address": "[Address if available, otherwise 'Not provided']" +} + +Important notes: +1. For the LicenseExpirationDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Replace all occurrences of '|' (pipe character) with a space in all fields. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'car_front', ai.driverId); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + // Removed Make, Model, etc. as they are not available + + Text( + '${'Plate Number'.tr}: ${ai.responseIdCardDriverEgyptFront['car_plate']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Owner Name'.tr}: ${ai.responseIdCardDriverEgyptFront['owner']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Address'.tr}: ${ai.responseIdCardDriverEgyptFront['address']}', + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'License Expiry Date'.tr}: ${licenseExpiryDate.toString().substring(0, 10)}', + style: TextStyle( + color: isLicenseExpired ? Colors.red : Colors.green, + ), + ), + // Removed Fuel as it's not available + ], + ), + // Removed Inspection Date as it's not available + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + ai.allMethodForAI(""" + Extract the following details from the provided car license data and format them into a JSON object: + + +License Expiration Date +Car Plate +Owner +Address + +Car License Data: + + +JSON Format: +{ +"LicenseExpirationDate": "YYYY-MM-DD", +"car_plate": "[Car plate number]",//the car plate is line next to line contain 'ادارة مرور' for bot numbers and letters in arabic with partition like| but you remove | +"owner": "[Owner's full name]", +"address": "[Address if available, otherwise 'Not provided']" +} + +Important notes: +1. For the LicenseExpirationDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Replace all occurrences of '|' (pipe character) with a space in all fields. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'car_front', ai.driverId); + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/car_front-${ai.driverId}.jpg', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your car license front '.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptCarLicenceBack() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdCardDriverEgyptBack.isNotEmpty) { + // Get the tax expiry date from the response + final taxExpiryDate = ai.responseIdCardDriverEgyptBack['tax_expiry']; + // final displacement = ai.responseIdCardDriverEgyptBack['displacement']; + // if (int.parse(displacement) < 1000) {} + // Get the inspection date from the response + final inspectionDate = + ai.responseIdCardDriverEgyptBack['inspection_date']; + final year = int.parse(inspectionDate.split('-')[0]); + +// Set inspectionDateTime to December 31st of the given year + final inspectionDateTime = DateTime(year, 12, 31); + String carBackLicenseExpired = + inspectionDateTime.toString().split(' ')[0]; +// Get the current date + final today = DateTime.now(); + +// Try parsing the tax expiry date. If it fails, set it to null. + final taxExpiryDateTime = DateTime.tryParse(taxExpiryDate ?? ''); + final isExpired = + taxExpiryDateTime != null && taxExpiryDateTime.isBefore(today); +// Check if the inspection date is before today + bool isInspectionExpired = inspectionDateTime.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Vehicle Details Back'.tr, + style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + ai.allMethodForAI(""" +Analyze the extracted car license information and create a JSON object with the following keys: + +{ + "make": "", + "year": "", + "chassis": "", + "model": "", + "engine": "", + "displacement": "", + "cylinders": "", + "fuel": "", + "color": "", + "color_hex": "", + "inspection_date": "", + "assuranceNumber": "", + "tax_expiry": "" +} + +Important notes: +1. For dates (inspection_date and tax_expiry), use the format YYYY-MM-DD with Latin numerals (0-9). +2. Convert the color name to its corresponding hex color code for the 'color_hex' field. +3. Ensure all numeric values (year, displacement, cylinders) are in Latin numerals. +4. If any information is missing, leave the corresponding field as an empty string. +5. Do not include any explanatory text in the JSON fields, only the extracted values. +displacement in the line contain (سم٣ ) +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'car_back', ai.driverId); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Make'.tr}: ${ai.responseIdCardDriverEgyptBack['make']}'), + Text( + '${'Model'.tr}: ${ai.responseIdCardDriverEgyptBack['model']}'), + ], + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Year'.tr}: ${ai.responseIdCardDriverEgyptBack['year']}'), + Text( + '${'Chassis'.tr}: ${ai.responseIdCardDriverEgyptBack['chassis']}'), + ], + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Color'.tr}: ${ai.responseIdCardDriverEgyptBack['color']}'), + Text( + '${'Displacement'.tr}: ${ai.responseIdCardDriverEgyptBack['displacement']} cc'), + ], + ), + const SizedBox(height: 8.0), + Text( + '${'Fuel'.tr}: ${ai.responseIdCardDriverEgyptBack['fuel']}'), + const SizedBox(height: 8.0), + if (taxExpiryDateTime != null) + Text( + '${'Tax Expiry Date'.tr}: $taxExpiryDate', + style: TextStyle( + color: isExpired ? Colors.red : Colors.green, + ), + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Inspection Date'.tr}: $carBackLicenseExpired', + style: TextStyle( + color: + isInspectionExpired ? Colors.red : Colors.green, + ), + ), + ], + ), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + ai.allMethodForAI(""" +Analyze the extracted car license information and create a JSON object with the following keys: + +{ + "make": "", + "year": "", + "chassis": "", + "model": "", + "engine": "", + "displacement": "", + "cylinders": "", + "fuel": "", + "color": "", + "color_hex": "", + "inspection_date": "", + "assuranceNumber": "", + "tax_expiry": "" +} + +Important notes: +1. For dates (inspection_date and tax_expiry), use the format YYYY-MM-DD with Latin numerals (0-9). +2. Convert the color name to its corresponding hex color code for the 'color_hex' field. +3. Ensure all numeric values (year, displacement, cylinders) are in Latin numerals. +4. If any information is missing, leave the corresponding field as an empty string. +5. Do not include any explanatory text in the JSON fields, only the extracted values. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'car_back', ai.driverId); + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/car_back-${ai.driverId}.jpg', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your car license back'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptCriminalRecord() { + return GetBuilder( + builder: (ai) { + if (ai.responseCriminalRecordEgypt.isNotEmpty) { + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Criminal Record'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI(""" +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "InspectionResult": "", + "NationalID": "", + "FullName": "", + "IssueDate": "" // Format: YYYY-MM-DD +} + +Important notes: +1. For the IssueDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Add appropriate spaces in all text fields to ensure readability. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. +5. Convert any Arabic numerals to Latin numerals (0-9) where applicable. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'criminalRecord', ai.driverId); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + Text( + '${'InspectionResult'.tr}: ${ai.responseCriminalRecordEgypt['InspectionResult']}'), + const SizedBox(height: 8.0), + Text( + '${'FullName'.tr}: ${ai.responseCriminalRecordEgypt['FullName']}', + style: AppStyle.title.copyWith( + color: ai.responseCriminalRecordEgypt['FullName'] == + ai.responseIdEgyptDriverLicense['name_arabic'] + ? AppColor.greenColor + : AppColor.redColor), + ), + const SizedBox(height: 8.0), + Text( + '${'NationalID'.tr}: ${ai.responseCriminalRecordEgypt['NationalID']}'), + const SizedBox(height: 8.0), + Text( + '${'IssueDate'.tr}: ${ai.responseCriminalRecordEgypt['IssueDate']}'), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI(""" +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "InspectionResult": "", + "NationalID": "", + "FullName": "", + "IssueDate": "" // Format: YYYY-MM-DD +} + +Important notes: +1. For the IssueDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Add appropriate spaces in all text fields to ensure readability. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. +5. Convert any Arabic numerals to Latin numerals (0-9) where applicable. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'criminalRecord', ai.driverId); + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/6.png', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your Criminal Record'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/views/admin/dashboard_widget.dart b/lib/views/admin/dashboard_widget.dart new file mode 100644 index 0000000..04c8f95 --- /dev/null +++ b/lib/views/admin/dashboard_widget.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; // For Get.width if needed, and .tr +import 'package:sefer_admin1/constant/colors.dart'; // Assuming AppColor is here +import 'package:sefer_admin1/constant/style.dart'; // Assuming AppStyle is here + +class DashboardStatCard extends StatelessWidget { + final String title; + final String value; + final IconData? icon; + final Color? iconColor; + final Color? backgroundColor; + final Color? valueColor; + + const DashboardStatCard({ + Key? key, + required this.title, + required this.value, + this.icon, + this.iconColor, + this.backgroundColor, + this.valueColor, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + // Attempt to use AppStyle.boxDecoration1 properties if it's a BoxDecoration + BoxDecoration? baseDecoration = AppStyle.boxDecoration1; + Color? finalBackgroundColor = + backgroundColor ?? baseDecoration?.color ?? Theme.of(context).cardColor; + BorderRadius? finalBorderRadius = + baseDecoration?.borderRadius?.resolve(Directionality.of(context)) ?? + BorderRadius.circular(12.0); + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 14.0, vertical: 12.0), + decoration: BoxDecoration( + color: finalBackgroundColor, + borderRadius: finalBorderRadius, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 1, + blurRadius: 6, + offset: const Offset(0, 2), + ), + ], + // If AppStyle.boxDecoration1 includes a border, you might want to add it here too + // border: baseDecoration?.border, + ), + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, // Center content vertically + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + child: Text( + title.tr, + style: AppStyle.title.copyWith( + fontSize: 13, + fontWeight: FontWeight.w500, + color: Theme.of(context).textTheme.bodySmall?.color, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + if (icon != null) + Icon( + icon, + size: 24, + color: iconColor ?? AppColor.primaryColor.withOpacity(0.7), + ), + ], + ), + const SizedBox(height: 6), + Text( + value, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: valueColor ?? AppColor.primaryColor, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ); + } +} diff --git a/lib/views/admin/drivers/alexandria.dart b/lib/views/admin/drivers/alexandria.dart new file mode 100644 index 0000000..d01bf2e --- /dev/null +++ b/lib/views/admin/drivers/alexandria.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/controller/functions/crud.dart'; +import 'package:sefer_admin1/controller/functions/wallet.dart'; +import 'package:sefer_admin1/views/widgets/my_scafold.dart'; + +import '../../../controller/drivers/driverthebest.dart'; + +class DriverTheBestAlexandria extends StatelessWidget { + const DriverTheBestAlexandria({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverTheBestAlexandriaController(), permanent: true); + return MyScafolld( + title: 'Alexandria'.tr, + body: [ + GetBuilder(builder: (driverthebest) { + return driverthebest.driver.isNotEmpty + ? ListView.builder( + itemCount: driverthebest.driver.length, + itemBuilder: (context, index) { + final driver = driverthebest.driver[index]; + return ListTile( + leading: CircleAvatar( + child: Text( + ((driver['driver_count'] * 5) / 3600) + .toStringAsFixed(0), + ), + ), + title: Text(driver['name_arabic'] ?? 'Unknown Name'), + subtitle: Text('Phone: ${driver['phone'] ?? 'N/A'}'), + trailing: IconButton( + onPressed: () async { + Get.defaultDialog( + title: + 'are you sure to pay to this driver gift'.tr, + middleText: '', + onConfirm: () async { + final wallet = Get.put(WalletController()); + await wallet.addPaymentToDriver('100', + driver['id'].toString(), driver['token']); + await wallet.addSeferWallet( + '100', driver['id'].toString()); + await CRUD().post( + link: AppLink.deleteRecord, + payload: { + 'driver_id': driver['id'].toString() + }); + driverthebest.driver.removeAt(index); + driverthebest.update(); + }, + onCancel: () => Get.back()); + }, + icon: const Icon(Icons.wallet_giftcard_rounded), + ), + ); + }, + ) + : const Center( + child: Text('No drivers available.'), + ); + }) + ], + isleading: true, + ); + } +} diff --git a/lib/views/admin/drivers/driver_the_best.dart b/lib/views/admin/drivers/driver_the_best.dart new file mode 100644 index 0000000..0b57142 --- /dev/null +++ b/lib/views/admin/drivers/driver_the_best.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/controller/functions/crud.dart'; +import 'package:sefer_admin1/controller/functions/encrypt_decrypt.dart'; +import 'package:sefer_admin1/controller/functions/wallet.dart'; +import 'package:sefer_admin1/views/widgets/elevated_btn.dart'; +import 'package:sefer_admin1/views/widgets/my_scafold.dart'; + +import '../../../controller/drivers/driverthebest.dart'; +import 'alexandria.dart'; +import 'giza.dart'; + +class DriverTheBest extends StatelessWidget { + const DriverTheBest({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(Driverthebest(), permanent: true); + return MyScafolld( + title: 'Best Drivers'.tr, + body: [ + GetBuilder(builder: (driverthebest) { + return driverthebest.driver.isNotEmpty + ? Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Giza', + onPressed: () { + Get.to(() => DriverTheBestGiza()); + }), + MyElevatedButton( + title: 'Alexandria', + onPressed: () { + Get.to(() => DriverTheBestAlexandria()); + }), + ], + ), + SizedBox( + height: Get.height * .7, + child: ListView.builder( + itemCount: driverthebest.driver.length, + itemBuilder: (context, index) { + final driver = driverthebest.driver[index]; + return ListTile( + leading: CircleAvatar( + child: Text( + (int.parse(driver['driver_count']) * 5 / 3600) + .toStringAsFixed( + 0), // Perform division first, then convert to string + ), + ), + title: + Text((driver['name_arabic']) ?? 'Unknown Name'), + subtitle: + Text('Phone: ${(driver['phone']) ?? 'N/A'}'), + trailing: IconButton( + onPressed: () async { + Get.defaultDialog( + title: + 'are you sure to pay to this driver gift' + .tr, + middleText: '', + onConfirm: () async { + final wallet = + Get.put(WalletController()); + await wallet.addPaymentToDriver( + '200', + driver['id'].toString(), + driver['token']); + await wallet.addSeferWallet( + '200', driver['id'].toString()); + await CRUD().post( + link: AppLink.deleteRecord, + payload: { + 'driver_id': driver['id'].toString() + }); + driverthebest.driver.removeAt(index); + driverthebest.update(); + Get.back(); + }, + onCancel: () => Get.back()); + }, + icon: const Icon(Icons.wallet_giftcard_rounded), + ), + ); + }, + ), + ), + ], + ) + : const Center( + child: Text('No drivers available.'), + ); + }) + ], + isleading: true, + ); + } +} diff --git a/lib/views/admin/drivers/giza.dart b/lib/views/admin/drivers/giza.dart new file mode 100644 index 0000000..bfb7338 --- /dev/null +++ b/lib/views/admin/drivers/giza.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/controller/functions/crud.dart'; +import 'package:sefer_admin1/controller/functions/wallet.dart'; +import 'package:sefer_admin1/views/widgets/my_scafold.dart'; + +import '../../../controller/drivers/driverthebest.dart'; + +class DriverTheBestGiza extends StatelessWidget { + const DriverTheBestGiza({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverTheBestGizaController(), permanent: true); + return MyScafolld( + title: 'Giza'.tr, + body: [ + GetBuilder(builder: (driverthebest) { + return driverthebest.driver.isNotEmpty + ? ListView.builder( + itemCount: driverthebest.driver.length, + itemBuilder: (context, index) { + final driver = driverthebest.driver[index]; + return ListTile( + leading: CircleAvatar( + child: Text( + ((driver['driver_count'] * 5) / 3600) + .toStringAsFixed(0), + ), + ), + title: Text(driver['name_arabic'] ?? 'Unknown Name'), + subtitle: Text('Phone: ${driver['phone'] ?? 'N/A'}'), + trailing: IconButton( + onPressed: () async { + Get.defaultDialog( + title: + 'are you sure to pay to this driver gift'.tr, + middleText: '', + onConfirm: () async { + final wallet = Get.put(WalletController()); + await wallet.addPaymentToDriver('100', + driver['id'].toString(), driver['token']); + await wallet.addSeferWallet( + '100', driver['id'].toString()); + await CRUD().post( + link: AppLink.deleteRecord, + payload: { + 'driver_id': driver['id'].toString() + }); + driverthebest.driver.removeAt(index); + driverthebest.update(); + }, + onCancel: () => Get.back()); + }, + icon: const Icon(Icons.wallet_giftcard_rounded), + ), + ); + }, + ) + : const Center( + child: Text('No drivers available.'), + ); + }) + ], + isleading: true, + ); + } +} diff --git a/lib/views/admin/employee/employee_page.dart b/lib/views/admin/employee/employee_page.dart new file mode 100644 index 0000000..d9732f4 --- /dev/null +++ b/lib/views/admin/employee/employee_page.dart @@ -0,0 +1,186 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/colors.dart'; +import 'package:sefer_admin1/constant/style.dart'; +import 'package:sefer_admin1/controller/employee_controller/employee_controller.dart'; +import 'package:sefer_admin1/controller/functions/launch.dart'; +import 'package:sefer_admin1/views/widgets/elevated_btn.dart'; +import 'package:sefer_admin1/views/widgets/my_scafold.dart'; +import 'package:sefer_admin1/views/widgets/my_textField.dart'; + +import '../../../constant/links.dart'; +import '../../../controller/functions/upload_image copy.dart'; + +class EmployeePage extends StatelessWidget { + const EmployeePage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(EmployeeController()); + return GetBuilder(builder: (employeeController) { + return Scaffold( + appBar: AppBar( + title: Text('Employee Page'.tr), + ), + body: ListView.builder( + itemCount: employeeController + .employee.length, // Set the item count based on the employee list + itemBuilder: (context, index) { + // Get the employee data for the current index + var employee = employeeController.employee[index]; + + // Return a widget to display the employee information + return Padding( + padding: const EdgeInsets.all(3.0), + child: Container( + decoration: AppStyle.boxDecoration1, + child: ListTile( + trailing: IconButton( + onPressed: () { + Get.to(() => EmployeeDetails( + index: index, + )); + }, + icon: Icon( + Icons.shop_two, + color: employee['status'].toString().contains('ممتاز') + ? AppColor.greenColor + : AppColor.accentColor, + ), + ), + title: Column( + children: [ + Text(employee['name']), + Text( + 'Phone: ${employee['phone']}\nEducation: ${employee['education']}'), + Text('Status: ${employee['status']}'), + ], + ), // Display employee name + onTap: () { + // Add any action you want when the employee is tapped + }, + leading: IconButton( + onPressed: () { + makePhoneCall(employee['phone'].toString()); + // launchCommunication( + // 'phone', employee['phone'].toString(), ''); + }, + icon: const Icon(Icons.phone), + ), + ), + ), + ); + }, + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + employeeController.id = employeeController.generateRandomId(8); + Get.to( + employeeFields(employeeController), + ); + }, // Icon to display + backgroundColor: Colors.blue, // Button color (optional) + tooltip: 'Add Employee', + child: const Icon(Icons.add), // Tooltip text when long-pressed + ), + ); + }); + } + + Scaffold employeeFields(EmployeeController employeeController) { + return Scaffold( + appBar: AppBar(), + body: Form( + key: employeeController.formKey, + child: SizedBox( + height: 500, + child: ListView( + children: [ + MyElevatedButton( + title: 'front id', + onPressed: () async { + await ImageController().choosImage(AppLink.uploadEgypt, + 'idFrontEmployee', employeeController.id); + }), + MyElevatedButton( + title: 'back id', + onPressed: () async { + await ImageController().choosImage(AppLink.uploadEgypt, + 'idbackEmployee', employeeController.id); + }), + MyTextForm( + controller: employeeController.name, + label: 'name', + hint: 'name', + type: TextInputType.name), + MyTextForm( + controller: employeeController.education, + label: 'education', + hint: 'education', + type: TextInputType.name), + MyTextForm( + controller: employeeController.site, + label: 'site', + hint: 'site', + type: TextInputType.name), + MyTextForm( + controller: employeeController.phone, + label: 'phone', + hint: 'phone', + type: TextInputType.phone), + MyTextForm( + controller: employeeController.status, + label: 'status', + hint: 'status', + type: TextInputType.name), + ], + ), + ), + ), + bottomNavigationBar: MyElevatedButton( + title: 'upload', + onPressed: () async { + if (employeeController.formKey.currentState!.validate()) { + await employeeController.addEmployee(); + } + }, + ), + ); + } +} + +class EmployeeDetails extends StatelessWidget { + const EmployeeDetails({super.key, required this.index}); + final int index; + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Details', + isleading: true, + body: [ + GetBuilder(builder: (employeeController) { + return Column( + children: [ + SizedBox( + height: 200, + width: 400, + child: Image.network( + // https: //server.sefer.click/sefer.click/sefer/card_image/idFrontEmployee-GC15188P.jpg + 'https://server.sefer.click/sefer.click/sefer/card_image/idFrontEmployee-${employeeController.employee[index]['id']}.jpg'), + ), + const SizedBox( + height: 10, + ), + SizedBox( + height: 200, + width: 400, + child: Image.network( + 'https://server.sefer.click/sefer.click/sefer/card_image/idFrontEmployee-${employeeController.employee[index]['id']}.jpg'), + ) + ], + ); + }) + ], + ); + } +} diff --git a/lib/views/admin/packages.dart b/lib/views/admin/packages.dart new file mode 100644 index 0000000..c695b8e --- /dev/null +++ b/lib/views/admin/packages.dart @@ -0,0 +1,107 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/controller/functions/crud.dart'; +import 'package:sefer_admin1/views/widgets/my_textField.dart'; + +import '../../print.dart'; + +class PackageUpdateScreen extends StatelessWidget { + final PackageController packageController = Get.put(PackageController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Package Update'), + ), + body: GetBuilder(builder: (packageController) { + return Center( + child: ListView.builder( + itemCount: packageController.packages.length, + itemBuilder: (context, index) { + var package = packageController.packages[index]; + return ListTile( + title: Text(package['appName']), + subtitle: Text( + 'Platform: ${package['platform']} \nVersion: ${package['version']}'), + trailing: const Icon(Icons.update), + onTap: () { + Get.defaultDialog( + title: 'Update', + middleText: '', + content: Column( + children: [ + Text(package['appName']), + Text(package['platform']), + Text(package['version']), + MyTextForm( + controller: packageController.versionController, + label: package['version'].toString(), + hint: package['version'].toString(), + type: const TextInputType.numberWithOptions( + decimal: true), + ), + ], + ), + onConfirm: () async { + await packageController.updatePackages( + package['id'].toString(), + packageController.versionController.text.toString(), + ); + }, + onCancel: () {}, + ); + }, + ); + }, + ), + ); + }), + ); + } +} + +class PackageController extends GetxController { + List packages = []; // Observable list to hold package info + var isLoading = false.obs; + final versionController = TextEditingController(); + final formKey = GlobalKey(); + + @override + void onInit() { + super.onInit(); + fetchPackages(); + } + + // Method to fetch package data from API + fetchPackages() async { + var response = await CRUD().get(link: AppLink.getPackages, payload: {}); + + if (response != 'failure') { + var jsonData = jsonDecode(response); + packages = jsonData['message']; + update(); + Log.print('jsonData: ${jsonData}'); + } + } + + updatePackages(String id, version) async { + var response = await CRUD().post( + link: AppLink.updatePackages, + payload: { + "id": id, + "version": version, + }, + ); + Log.print('response: ${response}'); + if (response != 'failure') { + Get.back(); + fetchPackages(); + } else { + Get.snackbar('error', 'message'); + } + } +} diff --git a/lib/views/admin/passenger/form_passenger.dart b/lib/views/admin/passenger/form_passenger.dart new file mode 100644 index 0000000..886a320 --- /dev/null +++ b/lib/views/admin/passenger/form_passenger.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import 'passenger_details_page.dart'; + +GetBuilder formSearchPassengers() { + // DbSql sql = DbSql.instance; + return GetBuilder( + builder: (controller) => Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Container( + decoration: + const BoxDecoration(color: AppColor.secondaryColor), + child: TextField( + decoration: InputDecoration( + border: const OutlineInputBorder( + borderRadius: BorderRadius.only(), + gapPadding: 4, + borderSide: BorderSide( + color: AppColor.redColor, + width: 2, + )), + suffixIcon: InkWell( + onTap: () async { + if (controller.passengerController.text.length > + 4) { + await controller.getPassengers(); + + Get.defaultDialog( + title: controller.passengers['message'][0] + ['email'], + titleStyle: AppStyle.title, + content: Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Name is ${controller.passengers['message'][0]['first_name']} ${controller.passengers['message'][0]['last_name']}', + style: AppStyle.title, + ), + Text( + 'phone is ${controller.passengers['message'][0]['phone']}', + style: AppStyle.title, + ), + ], + ), + confirm: MyElevatedButton( + title: 'Go To Details'.tr, + onPressed: () { + Get.to( + () => const PassengerDetailsPage(), + arguments: { + 'data': controller + .passengers['message'][0], + }); + })); + } + }, + child: const Icon(Icons.search)), + hintText: 'Search for Passenger'.tr, + hintStyle: AppStyle.title, + hintMaxLines: 1, + prefixIcon: IconButton( + onPressed: () async { + controller.passengerController.clear(); + controller.clearPlaces(); + }, + icon: Icon( + Icons.clear, + color: Colors.red[300], + ), + ), + ), + controller: controller.passengerController, + ), + ), + ) + ], + )); +} diff --git a/lib/views/admin/passenger/passenger.dart b/lib/views/admin/passenger/passenger.dart new file mode 100644 index 0000000..460268f --- /dev/null +++ b/lib/views/admin/passenger/passenger.dart @@ -0,0 +1,205 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/controller/functions/encrypt_decrypt.dart'; + +import '../../../constant/style.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; +import '../../widgets/mycircular.dart'; +import 'form_passenger.dart'; +import 'passenger_details_page.dart'; + +class Passengrs extends StatelessWidget { + Passengrs({super.key}); + final PassengerAdminController passengerAdminController = + Get.put(PassengerAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Passengrs'.tr, + isleading: true, + body: [ + GetBuilder( + builder: (passengerAdminController) => Column( + children: [ + passengerAdminController.isLoading + ? const MyCircularProgressIndicator() + : Column( + children: [ + Padding( + padding: const EdgeInsets.all(5), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + passengerAdmin( + passengerAdminController, + 'Passengers Count', + 'countPassenger', + ), + MyElevatedButton( + title: 'Add Prize to Gold Passengers', + onPressed: () { + var date = DateTime.now(); + var day = date.weekday; + + if (day == 6) { + // Saturday is 6 + Get.defaultDialog( + title: + 'Add Prize to Gold Passengers', + titleStyle: AppStyle.title, + content: Column( + children: [ + Text( + 'Add Points to their wallet as prize' + .tr, + style: AppStyle.title, + ), + Form( + key: + passengerAdminController + .formPrizeKey, + child: MyTextForm( + controller: + passengerAdminController + .passengerPrizeController, + label: + 'Count of prize' + .tr, + hint: 'Count of prize' + .tr, + type: TextInputType + .number)) + ], + ), + confirm: MyElevatedButton( + title: 'Add', + onPressed: () async { + if (passengerAdminController + .formPrizeKey + .currentState! + .validate()) { + passengerAdminController + .addPassengerPrizeToWalletSecure(); + } + }, + ), + ); + } else { + Get.defaultDialog( + title: + 'This day is not allowed', + titleStyle: AppStyle.title, + middleText: + 'Saturday only Allowed day', + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + Get.back(); + })); + } + }) + ], + ), + ), + const SizedBox( + height: 10, + ), + formSearchPassengers(), + SizedBox( + height: Get.height * .5, + child: ListView.builder( + itemCount: passengerAdminController + .passengersData['message'].length, + itemBuilder: (context, index) { + final user = passengerAdminController + .passengersData['message'][index]; + + return InkWell( + onTap: () { + Get.to(const PassengerDetailsPage(), + arguments: { + 'data': user, + }); + }, + child: Padding( + padding: const EdgeInsets.all(3), + child: Container( + decoration: BoxDecoration( + border: Border.all(width: 2)), + child: ListTile( + title: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Name : ${(user['first_name'])} ${(user['last_name'])}', + style: AppStyle.title, + ), + Text( + 'Rating : ${user['ratingPassenger']}', + style: AppStyle.title, + ), + ], + ), + subtitle: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Count Trip : ${user['countPassengerRide']}', + style: AppStyle.title, + ), + Text( + 'Count Driver Rate : ${user['countDriverRate']}', + style: AppStyle.title, + ), + ], + ), + ), + ), + ), + ); + }, + ), + ), + ], + ), + ], + )) + ], + ); + } + + Container passengerAdmin(PassengerAdminController passengerAdminController, + String title, String jsonField) { + return Container( + height: Get.height * .1, + decoration: BoxDecoration(border: Border.all(width: 2)), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + onTap: () {}, + child: Column( + children: [ + Text( + title.tr, + style: AppStyle.title, + ), + Text( + passengerAdminController.passengersData['message'][0][jsonField] + .toString(), + style: AppStyle.title, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/admin/passenger/passenger_details_page.dart b/lib/views/admin/passenger/passenger_details_page.dart new file mode 100644 index 0000000..7919774 --- /dev/null +++ b/lib/views/admin/passenger/passenger_details_page.dart @@ -0,0 +1,167 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../../controller/firebase/firbase_messge.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; + +class PassengerDetailsPage extends StatelessWidget { + const PassengerDetailsPage({super.key}); + + @override + Widget build(BuildContext context) { + final arguments = Get.arguments; + final Map data = arguments['data']; + var key = Get.find().formPrizeKey; + var titleNotify = Get.find().titleNotify; + var bodyNotify = Get.find().bodyNotify; + return MyScafolld( + title: data['first_name'], + body: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Email is ${data['email']}', + style: AppStyle.title, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Phone is ${data['phone']}', + style: AppStyle.title, + ), + Text( + 'gender is ${data['gender']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'status is ${data['status']}', + style: AppStyle.title, + ), + Text( + 'birthdate is ${data['birthdate']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'site is ${data['site']}', + style: AppStyle.title, + ), + Text( + 'sosPhone is ${data['sosPhone']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Count Feedback is ${data['countFeedback']}', + style: AppStyle.title, + ), + Text( + 'Count Driver Rate is ${data['countDriverRate']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Count Cancel is ${data['countPassengerCancel']}', + style: AppStyle.title, + ), + Text( + 'Count Ride is ${data['countPassengerRide']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Rating Captain Avarage is ${data['passengerAverageRating']}', + style: AppStyle.title, + ), + Text( + 'Rating is ${data['ratingPassenger']}', + style: AppStyle.title, + ), + ], + ), + Container( + decoration: BoxDecoration( + border: Border.all(width: 3, color: AppColor.yellowColor)), + child: TextButton( + onPressed: () async { + Get.defaultDialog( + title: 'Send Notification'.tr, + titleStyle: AppStyle.title, + content: Form( + key: key, + child: Column( + children: [ + MyTextForm( + controller: titleNotify, + label: 'title'.tr, + hint: 'title notificaton'.tr, + type: TextInputType.name), + const SizedBox( + height: 10, + ), + MyTextForm( + controller: bodyNotify, + label: 'body'.tr, + hint: 'body notificaton'.tr, + type: TextInputType.name) + ], + ), + ), + confirm: MyElevatedButton( + title: 'Send', + onPressed: () { + if (key.currentState!.validate()) { + FirebaseMessagesController() + .sendNotificationToAnyWithoutData( + titleNotify.text, + bodyNotify.text, + data['passengerToken'], + 'order.wav'); + Get.back(); + } + })); + }, + child: Text( + "Send Notificaion to Passenger ".tr, + style: AppStyle.title, + ), + ), + ) + ], + ), + ) + ], + isleading: true, + ); + } +} diff --git a/lib/views/admin/rides/rides.dart b/lib/views/admin/rides/rides.dart new file mode 100644 index 0000000..2ef76da --- /dev/null +++ b/lib/views/admin/rides/rides.dart @@ -0,0 +1,236 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/ride_admin_controller.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/mycircular.dart'; + +class Rides extends StatelessWidget { + Rides({super.key}); + RideAdminController rideAdminController = Get.put(RideAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld(title: 'Rides'.tr, isleading: true, body: [ + GetBuilder( + builder: (rideAdminController) => rideAdminController.isLoading + ? const Center(child: MyCircularProgressIndicator()) + : Column( + children: [ + SizedBox( + height: Get.height * .4, + child: LineChart( + duration: const Duration(milliseconds: 150), + curve: Curves.ease, + LineChartData( + lineBarsData: [ + LineChartBarData( + spots: rideAdminController.chartData, + isCurved: true, + color: Colors.deepPurpleAccent, // Custom color + barWidth: 3, // Thinner line + dotData: const FlDotData( + show: true), // Show dots on each point + belowBarData: BarAreaData( + // Add gradient fill below the line + show: true, + color: AppColor.deepPurpleAccent, + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: AppColor.yellowColor, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: Text( + 'Days', + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Total Trips on month'.tr, + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of Trips on month'.tr, + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + ), + gridData: const FlGridData( + show: true, + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide(color: AppColor.accentColor), + left: BorderSide(color: AppColor.accentColor), + ), + ), + ), + ), + ), + // SizedBox( + // height: Get.height * .4, + // child: PieChart( + // PieChartData( + // sectionsSpace: 4, // Adjust spacing between sections + // centerSpaceRadius: + // 40, // Adjust radius of center space + // sections: [ + // for (final rideData in rideAdminController.rideData) + // PieChartSectionData( + // value: rideData.ridesCount.toDouble(), + // title: '${rideData.day}', showTitle: true, + // titleStyle: + // AppStyle.subtitle, // Display day as title + // radius: 60, // Adjust radius of each section + // color: + // AppColor.deepPurpleAccent, // Custom color + // ), + // ], + // ), + // ), + // ), + + // SizedBox( + // // height: 400, + // child: SfCartesianChart( + // legend: const Legend( + // isVisible: true, + // position: LegendPosition.bottom, + // overflowMode: LegendItemOverflowMode.wrap, + // textStyle: TextStyle( + // color: Colors.white, + // fontSize: 12, + // fontWeight: FontWeight.bold, + // ), + // ), + // borderWidth: 2, + // borderColor: AppColor.blueColor, + // plotAreaBorderColor: AppColor.deepPurpleAccent, + // enableAxisAnimation: true, + // primaryXAxis: CategoryAxis( + // borderColor: AppColor.accentColor, borderWidth: 2, + // title: AxisTitle( + // text: 'Total Trips on month'.tr, + // textStyle: AppStyle.title, + // ), + // // labelRotation: 45, + // majorGridLines: const MajorGridLines(width: 0), + // ), + // primaryYAxis: const NumericAxis(isVisible: false), + // series: >[ + // LineSeries( + // dataSource: rideAdminController.chartDatasync, + // xValueMapper: (ChartDataS data, _) => '${data.day}', + // yValueMapper: (ChartDataS data, _) => + // data.ridesCount, + // dataLabelSettings: + // const DataLabelSettings(isVisible: true), + // ), + // ], + // ), + // ), + + const SizedBox( + height: 20, + ), + Card( + elevation: 4, + color: AppColor.deepPurpleAccent, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Total Trips on this Month is ${rideAdminController.jsonResponse['message'][0]['current_month_rides_count']}', + style: AppStyle.title, + ), + ), + ), + const SizedBox( + height: 20, + ), + Card( + elevation: 4, + color: AppColor.yellowColor, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Driver Average Duration: ${rideAdminController.ridesDetails[0]['driver_avg_duration']}', + style: AppStyle.subtitle, + ), + Text( + 'Number of Drivers: ${rideAdminController.ridesDetails[0]['num_Driver']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Rides: ${rideAdminController.ridesDetails[0]['total_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Ongoing Rides: ${rideAdminController.ridesDetails[0]['ongoing_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Completed Rides: ${rideAdminController.ridesDetails[0]['completed_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Cancelled Rides: ${rideAdminController.ridesDetails[0]['cancelled_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Longest Duration: ${rideAdminController.ridesDetails[0]['longest_duration']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Distance: ${rideAdminController.ridesDetails[0]['total_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Average Distance: ${rideAdminController.ridesDetails[0]['average_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Longest Distance: ${rideAdminController.ridesDetails[0]['longest_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Total Driver Earnings: \$${rideAdminController.ridesDetails[0]['total_driver_earnings']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Company Earnings: \$${rideAdminController.ridesDetails[0]['total_company_earnings']}', + style: AppStyle.subtitle, + ), + Text( + 'Company Percentage: ${rideAdminController.ridesDetails[0]['companyPercent']} %', + style: AppStyle.subtitle, + ), + ], + ), + ), + ) + ], + )) + ]); + } +} diff --git a/lib/views/admin/static/static.dart b/lib/views/admin/static/static.dart new file mode 100644 index 0000000..f7212db --- /dev/null +++ b/lib/views/admin/static/static.dart @@ -0,0 +1,575 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/style.dart'; +import 'package:sefer_admin1/controller/admin/static_controller.dart'; +import 'package:sefer_admin1/views/widgets/mycircular.dart'; + +import '../../../constant/colors.dart'; +import '../../widgets/my_scafold.dart'; + +class StaticDash extends StatelessWidget { + const StaticDash({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(StaticController()); + return MyScafolld( + title: 'Static Dash'.tr, + action: IconButton( + onPressed: () async { + await Get.put(StaticController()).getAll(); + }, + icon: const Icon( + Icons.replay_circle_filled_rounded, + color: AppColor.greenColor, + ), + ), + body: [ + GetBuilder(builder: (staticController) { + return staticController.isLoading + ? const MyCircularProgressIndicator() + : ListView( + children: [ + SizedBox( + height: Get.height * .3, + width: double.maxFinite, + // decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(6), + child: Container( + decoration: AppStyle.boxDecoration1, + height: MediaQuery.of(context).size.height * 0.4, + child: LineChart( + LineChartData( + lineBarsData: [ + LineChartBarData( + isStepLineChart: true, + spots: + staticController.chartDataPassengers, + isCurved: true, + color: Colors.blue, // Custom color + barWidth: 3, // Thinner line + dotData: const FlDotData( + show: + true), // Show dots on each point + belowBarData: BarAreaData( + show: true, + color: Colors.deepPurpleAccent + .withOpacity( + 0.3), // Custom gradient color + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: Colors.yellow, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: Text( + 'Days'.tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + ), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Total passengers on month ${staticController.totalMonthlyPassengers}' + .tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of Passengers on days'.tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + ), + gridData: const FlGridData(show: true), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: + BorderSide(color: Colors.blueAccent), + left: + BorderSide(color: Colors.blueAccent), + ), + ), + ), + ), + ), + )), + const SizedBox( + height: 5, + ), + SizedBox( + height: Get.height * .3, + width: double.maxFinite, + // decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(6), + child: Container( + decoration: AppStyle.boxDecoration1, + height: MediaQuery.of(context).size.height * 0.4, + child: LineChart( + LineChartData( + lineBarsData: [ + LineChartBarData( + isStepLineChart: true, + spots: staticController.chartDataDrivers, + isCurved: true, + color: Colors.blue, // Custom color + barWidth: 3, // Thinner line + dotData: const FlDotData( + show: + true), // Show dots on each point + belowBarData: BarAreaData( + show: true, + color: Colors.deepPurpleAccent + .withOpacity( + 0.3), // Custom gradient color + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: Colors.yellow, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: Text( + 'Days'.tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + ), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Total Drivers on month ${staticController.totalMonthlyDrivers}' + .tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of Drivers on days'.tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + ), + gridData: const FlGridData(show: true), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: + BorderSide(color: Colors.blueAccent), + left: + BorderSide(color: Colors.blueAccent), + ), + ), + ), + ), + ), + )), + const SizedBox( + height: 5, + ), + SizedBox( + height: Get.height * .3, + width: double.maxFinite, + // decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(6), + child: Container( + decoration: AppStyle.boxDecoration1, + height: MediaQuery.of(context).size.height * 0.4, + child: LineChart( + LineChartData( + lineBarsData: [ + LineChartBarData( + isStepLineChart: true, + spots: staticController.chartDataRides, + isCurved: true, + color: const Color.fromARGB( + 255, 84, 181, 182), // Custom color + barWidth: 3, // Thinner line + dotData: const FlDotData( + show: + true), // Show dots on each point + belowBarData: BarAreaData( + show: true, + color: const Color.fromARGB( + 255, 65, 144, 86) + .withOpacity( + 0.3), // Custom gradient color + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: Colors.yellow, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: Text( + 'Days'.tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + ), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Total Rides on month ${staticController.totalMonthlyRides}' + .tr, + style: AppStyle.subtitle, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of Rides on days'.tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + ), + gridData: const FlGridData(show: true), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: + BorderSide(color: Colors.blueAccent), + left: + BorderSide(color: Colors.blueAccent), + ), + ), + ), + ), + ), + )), + const SizedBox( + height: 5, + ), + SizedBox( + height: Get.height * .3, + width: double.maxFinite, + child: Padding( + padding: const EdgeInsets.all(6), + child: Container( + decoration: AppStyle.boxDecoration1, + height: MediaQuery.of(context).size.height * 0.4, + child: LineChart( + LineChartData( + lineBarsData: [ + LineChartBarData( + spots: staticController + .chartDataEmployeeMaryam, + isCurved: true, + color: + Colors.blue, // Custom color for Maryam + barWidth: 3, + dotData: const FlDotData(show: true), + belowBarData: BarAreaData( + show: true, + color: Colors.blue.withOpacity(0.3)), + ), + LineChartBarData( + spots: + staticController.chartDataEmployeeRawda, + isCurved: true, + color: Colors.red, // Custom color for Rawda + barWidth: 3, + dotData: const FlDotData(show: true), + belowBarData: BarAreaData( + show: true, + color: Colors.red.withOpacity(0.3)), + ), + LineChartBarData( + spots: + staticController.chartDataEmployeeMena, + isCurved: true, + color: + Colors.green, // Custom color for Mena + barWidth: 3, + dotData: const FlDotData(show: true), + belowBarData: BarAreaData( + show: true, + color: Colors.green.withOpacity(0.3)), + ), + LineChartBarData( + spots: staticController + .chartDataEmployeeSefer4, + isCurved: true, + color: + Colors.yellow, // Custom color for Mena + barWidth: 3, + dotData: const FlDotData(show: true), + belowBarData: BarAreaData( + show: true, + color: Colors.yellow.withOpacity(0.3)), + ), + ], + titlesData: const FlTitlesData( + bottomTitles: AxisTitles( + sideTitles: SideTitles(showTitles: true), + ), + leftTitles: AxisTitles( + sideTitles: SideTitles(showTitles: true), + ), + ), + gridData: const FlGridData(show: true), + borderData: FlBorderData(show: true), + ), + ), + ), + ), + ), + // SizedBox( + // height: Get.height * .3, + // width: double.maxFinite, + // // decoration: AppStyle.boxDecoration1, + // child: Padding( + // padding: const EdgeInsets.all(6), + // child: Container( + // decoration: AppStyle.boxDecoration1, + // height: MediaQuery.of(context).size.height * 0.4, + // child: LineChart( + // LineChartData( + // lineBarsData: [ + // LineChartBarData( + // isStepLineChart: true, + // spots: staticController + // .chartDataDriversCalling, + // isCurved: true, + // color: Colors + // .deepPurpleAccent, // Custom color + // barWidth: 3, // Thinner line + // dotData: const FlDotData( + // show: + // true), // Show dots on each point + // belowBarData: BarAreaData( + // show: true, + // color: Colors.deepPurpleAccent + // .withOpacity( + // 0.3), // Custom gradient color + // ), + // isStrokeJoinRound: true, + // shadow: const BoxShadow( + // color: Colors.yellow, + // blurRadius: 4, + // offset: Offset(2, 2), + // ), + // ), + // ], + // showingTooltipIndicators: const [], + // titlesData: FlTitlesData( + // show: true, + // topTitles: AxisTitles( + // axisNameWidget: Text( + // 'Days'.tr, + // style: const TextStyle( + // fontSize: 14, + // fontWeight: FontWeight.bold), + // ), + // axisNameSize: 30, + // ), + // bottomTitles: AxisTitles( + // axisNameWidget: Text( + // 'Total Drivers on month are Calliing ${staticController.staticList[0]['totalMonthlyCallingDrivers']}' + // .tr, + // style: AppStyle.subtitle, + // ), + // axisNameSize: 30, + // sideTitles: const SideTitles( + // reservedSize: 30, + // showTitles: true, + // ), + // ), + // leftTitles: AxisTitles( + // axisNameWidget: Text( + // 'Counts of Drivers on days'.tr, + // style: const TextStyle( + // fontSize: 14, + // fontWeight: FontWeight.bold), + // ), + // axisNameSize: 30, + // sideTitles: const SideTitles( + // reservedSize: 30, + // showTitles: true, + // ), + // ), + // ), + // gridData: const FlGridData(show: true), + // borderData: FlBorderData( + // show: true, + // border: const Border( + // bottom: + // BorderSide(color: Colors.blueAccent), + // left: + // BorderSide(color: Colors.blueAccent), + // ), + // ), + // ), + // ), + // ), + // )), + // const SizedBox( + // height: 5, + // ), + SizedBox( + height: Get.height * .3, + width: double.maxFinite, + // decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(6), + child: Container( + decoration: AppStyle.boxDecoration1, + height: MediaQuery.of(context).size.height * 0.4, + child: LineChart( + LineChartData( + lineBarsData: [ + LineChartBarData( + isStepLineChart: true, + spots: staticController + .chartDataDriversMatchingNotes, + isCurved: true, + color: Colors + .deepPurpleAccent, // Custom color + barWidth: 3, // Thinner line + dotData: const FlDotData( + show: + true), // Show dots on each point + belowBarData: BarAreaData( + show: true, + color: Colors.deepPurpleAccent + .withOpacity( + 0.3), // Custom gradient color + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: Colors.yellow, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: Text( + 'Days'.tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + ), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Total Drivers on month are register after calling ${staticController.staticList[0]['totalMonthlyMatchingNotes']}' + .tr, + style: AppStyle.subtitle, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of Drivers on days'.tr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold), + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, + showTitles: true, + ), + ), + ), + gridData: const FlGridData(show: true), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: + BorderSide(color: Colors.blueAccent), + left: + BorderSide(color: Colors.blueAccent), + ), + ), + ), + ), + ), + )), + const SizedBox( + height: 5, + ), + ], + ); + }) + ], + isleading: true); + } +} diff --git a/lib/views/admin/wallet/wallet.dart b/lib/views/admin/wallet/wallet.dart new file mode 100644 index 0000000..ca46975 --- /dev/null +++ b/lib/views/admin/wallet/wallet.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/constant/style.dart'; +import 'package:sefer_admin1/views/widgets/elevated_btn.dart'; +import 'package:sefer_admin1/views/widgets/mycircular.dart'; + +import '../../../controller/admin/wallet_admin_controller.dart'; +import '../../widgets/my_scafold.dart'; + +class Wallet extends StatelessWidget { + Wallet({super.key}); + WalletAdminController walletAdminController = + Get.put(WalletAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Wallet'.tr, + body: [ + GetBuilder(builder: (walletAdminController) { + return Center( + child: walletAdminController.isLoading + ? const MyCircularProgressIndicator() + : Column( + children: [ + MyElevatedButton( + title: 'Pay to them to banks'.tr, + onPressed: () async { + await walletAdminController.payToBankDriverAll(); + }), + SizedBox( + height: Get.height * .8, + child: ListView.builder( + itemCount: + walletAdminController.driversWalletPoints.length, + itemBuilder: (BuildContext context, int index) { + var res = walletAdminController + .driversWalletPoints[index]; + + if (res != null && res['name_arabic'] != null) { + return Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'driver name: ${res['name_arabic'].toString()}'), + Text( + 'Amount: ${res['total_amount'].toString()}'), + ], + ), + ), + ), + ); + } else { + return Container(); // Return an empty container if the data is null + } + }, + ), + ) + ], + ), + ); + }) + ], + isleading: true, + action: IconButton( + onPressed: () async { + walletAdminController.getWalletForEachDriverToPay(); + }, + icon: const Icon( + Icons.refresh, + color: Colors.black, + ), + ), + ); + } +} diff --git a/lib/views/auth/login_page.dart b/lib/views/auth/login_page.dart new file mode 100644 index 0000000..957526e --- /dev/null +++ b/lib/views/auth/login_page.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:sefer_admin1/env/env.dart'; + +import '../../controller/auth/login_controller.dart'; +import '../../controller/auth/otp_helper.dart'; + +class AdminLoginPage extends StatefulWidget { + const AdminLoginPage({super.key}); + @override + State createState() => _AdminLoginPageState(); +} + +class _AdminLoginPageState extends State { + final _phoneController = TextEditingController(); + final _formKey = GlobalKey(); + bool _isLoading = false; + Future _submit() async { + final allowedPhones = Env.ALLOWED_ADMIN_PHONES; + allowedPhones.toString().split(','); + + final phone = _phoneController.text.trim(); + + if (!allowedPhones.contains(phone)) { + Get.snackbar('رفض الدخول', 'رقم الهاتف غير مخوّل بالدخول إلى الإدارة'); + return; + } + + setState(() => _isLoading = true); + + final otpSent = await OtpHelper.sendOtp(phone); + if (otpSent) { + Get.to(() => OtpVerificationAdmin(phone: phone)); + } + + setState(() => _isLoading = false); + } + + @override + Widget build(BuildContext context) { + Get.put(OtpHelper()); + + return Scaffold( + appBar: AppBar(title: const Text('دخول الإدارة')), + body: Padding( + padding: const EdgeInsets.all(20.0), + child: Form( + key: _formKey, + child: Column( + children: [ + // IntlPhoneField( + // initialCountryCode: 'SY', + // decoration: const InputDecoration(labelText: 'رقم الهاتف'), + // onChanged: (phone) { + // _phoneController.text = phone.completeNumber; + // }, + // validator: (phone) { + // if (phone == null || phone.completeNumber.isEmpty) { + // return 'الرجاء إدخال رقم الهاتف'; + // } + // return null; + // }, + // ), + TextFormField( + controller: _phoneController, + keyboardType: TextInputType.phone, + decoration: const InputDecoration(labelText: 'رقم الهاتف'), + validator: (value) { + if (value == null || value.isEmpty) { + return 'الرجاء إدخال رقم الهاتف'; + } + return null; + }, + ), + const SizedBox(height: 20), + _isLoading + ? const CircularProgressIndicator() + : ElevatedButton( + onPressed: _submit, + child: const Text('إرسال رمز التحقق'), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/invoice/add_invoice_page.dart b/lib/views/invoice/add_invoice_page.dart new file mode 100644 index 0000000..4fdf5d4 --- /dev/null +++ b/lib/views/invoice/add_invoice_page.dart @@ -0,0 +1,187 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:image_picker/image_picker.dart'; +import 'package:sefer_admin1/constant/colors.dart'; +import 'package:sefer_admin1/constant/links.dart'; +import 'package:sefer_admin1/views/widgets/my_scafold.dart'; +import 'package:sefer_admin1/views/widgets/my_textField.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/info.dart'; +import '../../controller/functions/encrypt_decrypt.dart'; +import '../../main.dart'; + +class AddInvoicePage extends StatefulWidget { + const AddInvoicePage({super.key}); + + @override + State createState() => _AddInvoicePageState(); +} + +class _AddInvoicePageState extends State { + final GlobalKey _formKey = GlobalKey(); + final TextEditingController _itemNameController = TextEditingController(); + final TextEditingController _amountController = TextEditingController(); + File? _imageFile; + bool _isLoading = false; + + String generateInvoiceNumber() { + final now = DateTime.now(); + return "INV-${now.year}${now.month.toString().padLeft(2, '0')}${now.day.toString().padLeft(2, '0')}-${now.microsecond}"; + } + + Future uploadInvoice() async { + if (!_formKey.currentState!.validate()) return; + + final driverID = '123'; // ← عدّله حسب نظامك + final invoiceNumber = generateInvoiceNumber(); + final amount = _amountController.text.trim(); + final date = DateTime.now().toIso8601String().split('T').first; + + setState(() => _isLoading = true); + + try { + final headers = { + 'Authorization': + 'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}', + 'X-HMAC-Auth': '${box.read(BoxName.hmac)}', + }; + final uri = Uri.parse(AppLink.addInvoice); + final request = http.MultipartRequest('POST', uri) + ..fields['driverID'] = driverID + ..fields['invoiceNumber'] = invoiceNumber + ..fields['amount'] = amount + ..fields['date'] = date + ..headers.addAll(headers); + + if (_imageFile != null) { + final imageName = _imageFile!.path.split('/').last; + final imageStream = http.ByteStream(_imageFile!.openRead()); + final imageLength = await _imageFile!.length(); + + request.files.add(http.MultipartFile( + 'image', + imageStream, + imageLength, + filename: imageName, + )); + } else {} + + final response = await request.send(); + final respStr = await response.stream.bytesToString(); + + final data = jsonDecode(respStr); + + if (data['status'] == 'success') { + Get.snackbar('تم الحفظ', 'تم حفظ الفاتورة بنجاح', + backgroundColor: Colors.green.shade100); + + _itemNameController.clear(); + _amountController.clear(); + setState(() => _imageFile = null); + Get.back(); // العودة للصفحة السابقة + } else { + Get.snackbar('خطأ', data['message'], + backgroundColor: Colors.red.shade100); + } + } catch (e, stacktrace) { + Get.snackbar('فشل الإرسال', e.toString(), + backgroundColor: Colors.red.shade100); + } finally { + setState(() => _isLoading = false); + } + } + + Future pickInvoiceImage() async { + final picker = ImagePicker(); + final picked = await picker.pickImage(source: ImageSource.gallery); + if (picked != null) { + setState(() => _imageFile = File(picked.path)); + } + } + + @override + void dispose() { + _itemNameController.dispose(); + _amountController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'إضافة فاتورة جديدة', + body: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Form( + key: _formKey, + child: ListView( + children: [ + MyTextForm( + controller: _itemNameController, + label: 'اسم البضاعة', + hint: 'مثال: قطع غيار', + type: TextInputType.text, + // validator: (val) => + // val!.isEmpty ? 'الرجاء إدخال اسم البضاعة' : null, + ), + const SizedBox(height: 16), + MyTextForm( + controller: _amountController, + label: 'قيمة الفاتورة', + hint: 'مثال: 150.75', + type: TextInputType.numberWithOptions(decimal: true), + // validator: (val) => + // val!.isEmpty ? 'الرجاء إدخال المبلغ' : null, + ), + const SizedBox(height: 20), + Text('صورة الفاتورة (اختياري)', + style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 10), + Container( + height: 180, + decoration: BoxDecoration( + color: Colors.grey.shade200, + border: Border.all(color: Colors.grey.shade400), + borderRadius: BorderRadius.circular(10), + ), + child: _imageFile != null + ? ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.file(_imageFile!, fit: BoxFit.cover), + ) + : const Center(child: Text('لم يتم اختيار صورة')), + ), + const SizedBox(height: 12), + ElevatedButton.icon( + onPressed: pickInvoiceImage, + icon: const Icon(Icons.image), + label: const Text('اختيار صورة'), + ), + const SizedBox(height: 30), + ElevatedButton( + onPressed: _isLoading ? null : uploadInvoice, + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 16), + backgroundColor: AppColor.primaryColor, + ), + child: _isLoading + ? const CircularProgressIndicator(color: Colors.white) + : const Text( + 'حفظ الفاتورة', + style: TextStyle(color: Colors.white), + ), + ), + ], + ), + ), + ), + ], + isleading: true, + ); + } +} diff --git a/lib/views/invoice/invoice_list_page.dart b/lib/views/invoice/invoice_list_page.dart new file mode 100644 index 0000000..84a8a8e --- /dev/null +++ b/lib/views/invoice/invoice_list_page.dart @@ -0,0 +1,280 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import '../../constant/links.dart'; +import '../../controller/admin/get_all_invoice_controller.dart'; +import '../../controller/functions/crud.dart'; +import '../../print.dart'; +import 'add_invoice_page.dart'; + +class InvoiceListPage extends StatefulWidget { + @override + _InvoiceListPageState createState() => _InvoiceListPageState(); +} + +class _InvoiceListPageState extends State { + List invoices = []; + int totalCount = 0; + double totalAmount = 0.0; + bool isLoading = true; + + @override + void initState() { + super.initState(); + fetchInvoices(); + } + + Future fetchInvoices() async { + // لإظهار مؤشر التحديث بشكل جيد + if (!isLoading) { + setState(() {}); + } + + final response = await CRUD().post(link: AppLink.getInvoices, payload: {}); + final data = (response); + Log.print('data: $data'); + + if (mounted) { + if (data != 'failure' && data['status'] == 'success') { + setState(() { + invoices = List.from(data['data']) + .map((item) => InvoiceModel.fromJson(item)) + .toList(); + totalCount = data['summary']['count']; + totalAmount = + double.tryParse(data['summary']['total'].toString()) ?? 0.0; + isLoading = false; + }); + } else { + setState(() { + isLoading = false; + }); + Get.snackbar("خطأ", "فشل في تحميل الفواتير. حاول التحديث مرة أخرى.", + backgroundColor: Colors.red.withOpacity(0.8), + colorText: Colors.white); + } + } + } + + // --- دالة لعرض الصورة في نافذة منبثقة --- + void _showImageDialog(BuildContext context, String imageUrl) { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: GestureDetector( + // لإغلاق الصورة عند الضغط عليها + onTap: () => Navigator.of(context).pop(), + child: Container( + padding: EdgeInsets.all(12), + child: InteractiveViewer( + // لإتاحة التكبير والتصغير + panEnabled: true, + minScale: 0.5, + maxScale: 4, + child: Image.network( + imageUrl, + fit: BoxFit.contain, + // إظهار مؤشر تحميل أثناء جلب الصورة + loadingBuilder: (BuildContext context, Widget child, + ImageChunkEvent? loadingProgress) { + if (loadingProgress == null) return child; + return Center( + child: CircularProgressIndicator( + value: loadingProgress.expectedTotalBytes != null + ? loadingProgress.cumulativeBytesLoaded / + loadingProgress.expectedTotalBytes! + : null, + ), + ); + }, + // إظهار أيقونة خطأ في حال فشل تحميل الصورة + errorBuilder: (context, error, stackTrace) { + return Icon(Icons.broken_image, + size: 100, color: Colors.red); + }, + ), + ), + ), + ), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("قائمة الفواتير"), + centerTitle: true, + elevation: 2, + actions: [ + IconButton( + icon: Icon(Icons.add_a_photo), + onPressed: () { + // يمكنك إضافة إجراء الطباعة هنا + + Get.to(() => AddInvoicePage()); + }, + ), + ], + ), + body: isLoading + ? Center(child: CircularProgressIndicator()) + : RefreshIndicator( + onRefresh: fetchInvoices, // خاصية السحب للتحديث + child: Column( + children: [ + Expanded( + child: ListView.builder( + padding: + EdgeInsets.symmetric(vertical: 8.0, horizontal: 12.0), + itemCount: invoices.length, + itemBuilder: (context, index) { + final invoice = invoices[index]; + return Card( + elevation: 4, + margin: EdgeInsets.symmetric(vertical: 8.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15.0), + ), + child: InkWell( + borderRadius: BorderRadius.circular(15.0), + onTap: () { + // التحقق من وجود رابط للصورة قبل محاولة عرضه + if (invoice.imageLink != null && + invoice.imageLink!.isNotEmpty) { + _showImageDialog(context, invoice.imageLink!); + } else { + Get.snackbar("لا توجد صورة", + "هذه الفاتورة لا تحتوي على صورة مرفقة."); + } + }, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + children: [ + // أيقونة الفاتورة الرئيسية + Icon(Icons.receipt_long, + color: Theme.of(context).primaryColor, + size: 40), + SizedBox(width: 16), + // تفاصيل الفاتورة + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + "فاتورة رقم: ${invoice.invoiceNumber}", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ), + SizedBox(height: 8), + Text( + "الاسم: ${invoice.name}", + style: TextStyle( + color: Colors.green.shade700, + fontWeight: FontWeight.w500, + ), + ), + SizedBox(height: 8), + Text( + "المبلغ: ${invoice.amount} د.أ", + style: TextStyle( + color: Colors.green.shade700, + fontWeight: FontWeight.w500, + ), + ), + SizedBox(height: 4), + Text( + "التاريخ: ${invoice.date}", + style: TextStyle( + color: Colors.grey.shade600, + fontSize: 12, + ), + ), + ], + ), + ), + // أيقونة توضح وجود صورة + if (invoice.imageLink != null && + invoice.imageLink!.isNotEmpty) + Icon(Icons.image_outlined, + color: Colors.blueAccent, size: 30), + ], + ), + ), + ), + ); + }, + ), + ), + _buildSummaryCard(), // بطاقة الملخص السفلية + ], + ), + ), + ); + } + + Widget _buildSummaryCard() { + return Card( + margin: EdgeInsets.all(0), + elevation: 8, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ), + ), + child: Container( + padding: EdgeInsets.symmetric(vertical: 20, horizontal: 25), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "إجمالي الفواتير", + style: TextStyle(color: Colors.grey.shade600, fontSize: 14), + ), + Text( + "$totalCount", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + "المبلغ الإجمالي", + style: TextStyle(color: Colors.grey.shade600, fontSize: 14), + ), + Text( + "${totalAmount.toStringAsFixed(2)} د.أ", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20, + color: Colors.green.shade800, + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/circle_container.dart b/lib/views/widgets/circle_container.dart new file mode 100644 index 0000000..9702b34 --- /dev/null +++ b/lib/views/widgets/circle_container.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +class MyCircleContainer extends StatelessWidget { + final Widget child; + final Color backgroundColor; + final Color borderColor; + + MyCircleContainer({ + Key? key, + required this.child, + this.backgroundColor = AppColor.secondaryColor, + this.borderColor = AppColor.accentColor, + }) : super(key: key); + + final controller = Get.put(CircleController()); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: ((controller) => GestureDetector( + onTap: () { + controller.changeColor(); + }, + child: AnimatedContainer( + onEnd: () { + controller.onEnd(); + }, + duration: const Duration(milliseconds: 300), + width: controller.size, + height: controller.size, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: controller.backgroundColor, + border: Border.all( + color: borderColor, + width: 1, + ), + ), + child: Center(child: child), + ), + ))); + } +} + +class CircleController extends GetxController { + Color backgroundColor = AppColor.secondaryColor; + double size = 40; + void changeColor() { + backgroundColor = backgroundColor == AppColor.secondaryColor + ? AppColor.accentColor + : AppColor.secondaryColor; + size = 60; + update(); + } + + void onEnd() { + size = 40; + update(); + } +} diff --git a/lib/views/widgets/elevated_btn.dart b/lib/views/widgets/elevated_btn.dart new file mode 100644 index 0000000..8ca37b5 --- /dev/null +++ b/lib/views/widgets/elevated_btn.dart @@ -0,0 +1,47 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyElevatedButton extends StatelessWidget { + final String title; + final VoidCallback onPressed; + final Color kolor; + final int vibrateDuration; + const MyElevatedButton({ + Key? key, + required this.title, + required this.onPressed, + this.kolor = AppColor.primaryColor, + this.vibrateDuration = 100, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(kolor), + ), + onPressed: () async { + // Handle haptic feedback for both iOS and Android + if (Platform.isIOS) { + HapticFeedback.selectionClick(); + } else { + // Vibration.vibrate(duration: 100); + // Vibrate.vibrateWithPauses(pauses); + } + + // Ensure the onPressed callback is called after haptic feedback + onPressed(); + }, + child: Text( + title, + textAlign: TextAlign.center, + style: AppStyle.title.copyWith(color: AppColor.secondaryColor), + ), + ); + } +} diff --git a/lib/views/widgets/icon_widget_menu.dart b/lib/views/widgets/icon_widget_menu.dart new file mode 100644 index 0000000..604aa40 --- /dev/null +++ b/lib/views/widgets/icon_widget_menu.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class IconWidgetMenu extends StatelessWidget { + const IconWidgetMenu({ + Key? key, + required this.onpressed, + required this.icon, + required this.title, + }) : super(key: key); + + final VoidCallback onpressed; + final IconData icon; + final String title; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onpressed, + child: Padding( + padding: const EdgeInsets.only(top: 25), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 50, + decoration: const BoxDecoration( + color: AppColor.secondaryColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: AppColor.secondaryColor, + offset: Offset(-2, -2), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + BoxShadow( + color: AppColor.accentColor, + offset: Offset(3, 3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + ], + ), + child: Center( + child: Icon( + icon, + size: 30, + color: AppColor.primaryColor, + ), + ), + ), + Text( + title, + style: AppStyle.subtitle, + ) + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/my_scafold.dart b/lib/views/widgets/my_scafold.dart new file mode 100644 index 0000000..fe50446 --- /dev/null +++ b/lib/views/widgets/my_scafold.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyScafolld extends StatelessWidget { + const MyScafolld({ + super.key, + required this.title, + required this.body, + this.action = const Icon( + Icons.clear, + color: AppColor.secondaryColor, + ), + required this.isleading, + }); + + final String title; + final List body; + final Widget action; + final bool isleading; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.secondaryColor, + appBar: AppBar( + backgroundColor: AppColor.secondaryColor, + elevation: 0, + leading: isleading + ? IconButton( + onPressed: () { + Get.back(); + }, + icon: const Icon( + Icons.arrow_back_ios_new, + color: AppColor.primaryColor, + ), + ) + : const SizedBox(), + actions: [action], + title: Text( + title, + style: AppStyle.title.copyWith(fontSize: 30), + ), + ), + body: SafeArea(child: Stack(children: body))); + } +} diff --git a/lib/views/widgets/my_textField.dart b/lib/views/widgets/my_textField.dart new file mode 100644 index 0000000..2d4168b --- /dev/null +++ b/lib/views/widgets/my_textField.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import '../../constant/colors.dart'; + +class MyTextForm extends StatelessWidget { + const MyTextForm({ + super.key, + required this.controller, + required this.label, + required this.hint, + required this.type, + }); + final TextEditingController controller; + final String label, hint; + final TextInputType type; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: SizedBox( + width: Get.width * .8, + child: TextFormField( + keyboardType: type, + cursorColor: AppColor.accentColor, + controller: controller, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(12))), + labelText: label.tr, + hintText: hint.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter $label.'.tr; + } + + if (type == TextInputType.emailAddress) { + if (!value.contains('@')) { + return 'Please enter a valid email.'.tr; + } + } else if (type == TextInputType.phone) { + if (value.length != 11) { + return 'Please enter a valid phone number.'.tr; + } + } + + return null; + }, + ), + ), + ); + } +} diff --git a/lib/views/widgets/mycircular.dart b/lib/views/widgets/mycircular.dart new file mode 100644 index 0000000..366d81a --- /dev/null +++ b/lib/views/widgets/mycircular.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class MyCircularProgressIndicator extends StatelessWidget { + final Color backgroundColor; + + const MyCircularProgressIndicator({ + super.key, + this.backgroundColor = Colors.transparent, + }); + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + width: 110, + height: 110, + decoration: BoxDecoration( + color: backgroundColor, + shape: BoxShape.circle, + ), + child: Stack( + children: [ + const Center(child: CircularProgressIndicator()), + Column( + children: [ + Align( + alignment: Alignment.center, + child: Image.asset('assets/images/logo.png'), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/mydialoug.dart b/lib/views/widgets/mydialoug.dart new file mode 100755 index 0000000..50cd848 --- /dev/null +++ b/lib/views/widgets/mydialoug.dart @@ -0,0 +1,243 @@ +import 'dart:ui'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class DialogConfig { + static const Duration animationDuration = Duration(milliseconds: 200); + static const double blurStrength = 8.0; + static const double cornerRadius = 14.0; + static final BoxDecoration decoration = BoxDecoration( + borderRadius: BorderRadius.circular(cornerRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(38), // 0.15 opacity + blurRadius: 16, + offset: const Offset(0, 8), + ), + ], + ); +} + +class MyDialog extends GetxController { + void getDialog(String title, String? midTitle, VoidCallback onPressed) { + HapticFeedback.mediumImpact(); + + Get.dialog( + TweenAnimationBuilder( + duration: DialogConfig.animationDuration, + tween: Tween(begin: 0.0, end: 1.0), + builder: (context, value, child) { + return Transform.scale( + scale: 0.95 + (0.05 * value), + child: Opacity(opacity: value, child: child), + ); + }, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: DialogConfig.blurStrength, + sigmaY: DialogConfig.blurStrength, + ), + child: Theme( + data: ThemeData.light().copyWith( + dialogBackgroundColor: CupertinoColors.systemBackground, + ), + child: CupertinoAlertDialog( + title: Column( + children: [ + Text( + title, + style: AppStyle.title.copyWith( + fontSize: 20, + fontWeight: FontWeight.w700, + letterSpacing: -0.5, + color: AppColor.primaryColor, + ), + ), + const SizedBox(height: 8), + ], + ), + content: Column( + children: [ + CupertinoButton( + padding: const EdgeInsets.all(8), + onPressed: () async { + HapticFeedback.selectionClick(); + // await textToSpeechController.speakText(title); + // await textToSpeechController.speakText(midTitle!); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: + AppColor.primaryColor.withAlpha(26), // 0.1 opacity + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + CupertinoIcons.speaker_2_fill, + color: AppColor.primaryColor, + size: 24, + ), + ), + ), + const SizedBox(height: 8), + Text( + midTitle!, + style: AppStyle.title.copyWith( + fontSize: 16, + height: 1.3, + color: Colors.black87, + ), + textAlign: TextAlign.center, + ), + ], + ), + actions: [ + CupertinoDialogAction( + onPressed: () { + HapticFeedback.lightImpact(); + Get.back(); + }, + child: Text( + 'Cancel'.tr, + style: TextStyle( + color: AppColor.redColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + CupertinoDialogAction( + onPressed: () { + HapticFeedback.mediumImpact(); + onPressed(); + }, + child: Text( + 'OK'.tr, + style: TextStyle( + color: AppColor.greenColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + ], + ), + ), + ), + ), + barrierDismissible: true, + barrierColor: Colors.black.withAlpha(102), // 0.4 opacity + ); + } +} + +class MyDialogContent extends GetxController { + void getDialog(String title, Widget? content, VoidCallback onPressed) { + // final textToSpeechController = Get.put(TextToSpeechController()); + + HapticFeedback.mediumImpact(); + + Get.dialog( + TweenAnimationBuilder( + duration: DialogConfig.animationDuration, + tween: Tween(begin: 0.0, end: 1.0), + builder: (context, value, child) { + return Transform.scale( + scale: 0.95 + (0.05 * value), + child: Opacity(opacity: value, child: child), + ); + }, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: DialogConfig.blurStrength, + sigmaY: DialogConfig.blurStrength, + ), + child: Theme( + data: ThemeData.light().copyWith( + dialogBackgroundColor: CupertinoColors.systemBackground, + ), + child: CupertinoAlertDialog( + title: Column( + children: [ + Text( + title, + style: AppStyle.title.copyWith( + fontSize: 20, + fontWeight: FontWeight.w700, + letterSpacing: -0.5, + color: AppColor.primaryColor, + ), + ), + const SizedBox(height: 8), + ], + ), + content: Column( + children: [ + CupertinoButton( + padding: const EdgeInsets.all(8), + onPressed: () async { + HapticFeedback.selectionClick(); + // await textToSpeechController.speakText(title); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: + AppColor.primaryColor.withAlpha(26), // 0.1 opacity + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + CupertinoIcons.headphones, + color: AppColor.primaryColor, + size: 24, + ), + ), + ), + const SizedBox(height: 12), + content!, + ], + ), + actions: [ + CupertinoDialogAction( + onPressed: () { + HapticFeedback.lightImpact(); + Get.back(); + }, + child: Text( + 'Cancel', + style: TextStyle( + color: AppColor.redColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + CupertinoDialogAction( + onPressed: () { + HapticFeedback.mediumImpact(); + onPressed(); + }, + child: Text( + 'OK'.tr, + style: TextStyle( + color: AppColor.greenColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + ], + ), + ), + ), + ), + barrierDismissible: true, + barrierColor: Colors.black.withAlpha(102), // 0.4 opacity + ); + } +} diff --git a/lib/views/widgets/snackbar.dart b/lib/views/widgets/snackbar.dart new file mode 100644 index 0000000..0a129e4 --- /dev/null +++ b/lib/views/widgets/snackbar.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +class SnackbarConfig { + static const duration = Duration(seconds: 3); + static const animationDuration = Duration(milliseconds: 300); + static const margin = EdgeInsets.symmetric(horizontal: 16, vertical: 10); + static const borderRadius = 12.0; + static const elevation = 6.0; + + static final BoxShadow shadow = BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 2), + ); +} + +SnackbarController mySnackeBarError(String message) { + // Trigger error haptic feedback + HapticFeedback.mediumImpact(); + + return Get.snackbar( + 'Error'.tr, + message, + backgroundColor: AppColor.redColor.withOpacity(0.95), + colorText: AppColor.secondaryColor, + icon: const Icon( + Icons.error_outline_rounded, + color: AppColor.secondaryColor, + size: 28, + ), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: SnackbarConfig.margin, + borderRadius: SnackbarConfig.borderRadius, + duration: SnackbarConfig.duration, + animationDuration: SnackbarConfig.animationDuration, + forwardAnimationCurve: Curves.easeOutCirc, + reverseAnimationCurve: Curves.easeInCirc, + boxShadows: [SnackbarConfig.shadow], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + titleText: Text( + 'Error'.tr, + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 16, + letterSpacing: 0.2, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.95), + fontSize: 14, + height: 1.3, + ), + ), + onTap: (_) { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + isDismissible: true, + dismissDirection: DismissDirection.horizontal, + overlayBlur: 0.8, + overlayColor: Colors.black12, + ); +} + +SnackbarController mySnackbarSuccess(String message) { + // Trigger success haptic feedback + HapticFeedback.lightImpact(); + + return Get.snackbar( + 'Success'.tr, + message, + backgroundColor: AppColor.greenColor.withOpacity(0.95), + colorText: AppColor.secondaryColor, + icon: const Icon( + Icons.check_circle_outline_rounded, + color: AppColor.secondaryColor, + size: 28, + ), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: SnackbarConfig.margin, + borderRadius: SnackbarConfig.borderRadius, + duration: SnackbarConfig.duration, + animationDuration: SnackbarConfig.animationDuration, + forwardAnimationCurve: Curves.easeOutCirc, + reverseAnimationCurve: Curves.easeInCirc, + boxShadows: [SnackbarConfig.shadow], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + titleText: Text( + 'Success'.tr, + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 16, + letterSpacing: 0.2, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.95), + fontSize: 14, + height: 1.3, + ), + ), + onTap: (_) { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + isDismissible: true, + dismissDirection: DismissDirection.horizontal, + overlayBlur: 0.8, + overlayColor: Colors.black12, + ); +} diff --git a/macos/.gitignore b/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..13947f7 --- /dev/null +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,34 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import device_info_plus +import file_selector_macos +import firebase_core +import firebase_crashlytics +import firebase_messaging +import flutter_image_compress_macos +import flutter_secure_storage_macos +import google_sign_in_ios +import local_auth_darwin +import path_provider_foundation +import sqflite_darwin +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseCrashlyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCrashlyticsPlugin")) + FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) + FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 0000000..29c8eb3 --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..fbd37d1 --- /dev/null +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* intaleq_admin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "intaleq_admin.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* intaleq_admin.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* intaleq_admin.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_admin.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_admin"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_admin.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_admin"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_admin.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_admin"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..567a41a --- /dev/null +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..b3c1761 --- /dev/null +++ b/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..96d3fee --- /dev/null +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "info": { + "version": 1, + "author": "xcode" + }, + "images": [ + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_16.png", + "scale": "1x" + }, + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "2x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "1x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_64.png", + "scale": "2x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_128.png", + "scale": "1x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "2x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "1x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "2x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "1x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_1024.png", + "scale": "2x" + } + ] +} \ No newline at end of file diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..c424645 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..6e5933f Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..4c01f50 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..353b935 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..7fe5fea Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..d5bf6f5 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..39777d2 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..ef91d25 --- /dev/null +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = intaleq_admin + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 com.intaleq. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/macos/RunnerTests/RunnerTests.swift b/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..8f6a750 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,1385 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f + url: "https://pub.dev" + source: hosted + version: "85.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: ff0a84a2734d9e1089f8aedd5c0af0061b82fb94e95260d943404e0ef2134b11 + url: "https://pub.dev" + source: hosted + version: "1.3.59" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d" + url: "https://pub.dev" + source: hosted + version: "7.7.1" + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" + url: "https://pub.dev" + source: hosted + version: "1.6.5" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: "51dc711996cbf609b90cbe5b335bbce83143875a9d58e4b5c6d3c4f684d3dda7" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + url: "https://pub.dev" + source: hosted + version: "4.0.4" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: ee4257b3f20c0c90e72ed2b57ad637f694ccba48839a821e87db762548c22a62 + url: "https://pub.dev" + source: hosted + version: "2.5.4" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "382a4d649addbfb7ba71a3631df0ec6a45d5ab9b098638144faf27f02778eb53" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "85fbbb1036d576d966332a3f5ce83f2ce66a40bea1a94ad2d5fc29a19a0d3792" + url: "https://pub.dev" + source: hosted + version: "9.1.2" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "0b1b12a0a549605e5f04476031cd0bc91ead1d7c8e830773a18ee54179b3cb62" + url: "https://pub.dev" + source: hosted + version: "8.11.0" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + url: "https://pub.dev" + source: hosted + version: "4.10.1" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + url: "https://pub.dev" + source: hosted + version: "11.5.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + dio: + dependency: "direct main" + description: + name: dio + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" + url: "https://pub.dev" + source: hosted + version: "5.8.0+1" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + encrypt: + dependency: "direct main" + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + envied: + dependency: "direct main" + description: + name: envied + sha256: a4e2b1d0caa479b5d61332ae516518c175a6d09328a35a0bc0a53894cc5d7e4d + url: "https://pub.dev" + source: hosted + version: "1.1.1" + envied_generator: + dependency: "direct dev" + description: + name: envied_generator + sha256: "894f6c5eb624c60a1ce6f642b6fd7ec68bc3440aa6f1881837aa9acbbeade0c8" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + equatable: + dependency: transitive + description: + name: equatable + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" + url: "https://pub.dev" + source: hosted + version: "2.0.7" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.dev" + source: hosted + version: "0.9.3+2" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" + url: "https://pub.dev" + source: hosted + version: "0.9.4+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.dev" + source: hosted + version: "0.9.3+4" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "7be63a3f841fc9663342f7f3a011a42aef6a61066943c90b1c434d79d5c995c5" + url: "https://pub.dev" + source: hosted + version: "3.15.2" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "5dbc900677dcbe5873d22ad7fbd64b047750124f1f9b7ebe2a33b9ddccc838eb" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: "0ed0dc292e8f9ac50992e2394e9d336a0275b6ae400d64163fdf0a8a8b556c37" + url: "https://pub.dev" + source: hosted + version: "2.24.1" + firebase_crashlytics: + dependency: "direct main" + description: + name: firebase_crashlytics + sha256: "662ae6443da91bca1fb0be8aeeac026fa2975e8b7ddfca36e4d90ebafa35dde1" + url: "https://pub.dev" + source: hosted + version: "4.3.10" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + sha256: "7222a8a40077c79f6b8b3f3439241c9f2b34e9ddfde8381ffc512f7b2e61f7eb" + url: "https://pub.dev" + source: hosted + version: "3.8.10" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: "60be38574f8b5658e2f22b7e311ff2064bea835c248424a383783464e8e02fcc" + url: "https://pub.dev" + source: hosted + version: "15.2.10" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "685e1771b3d1f9c8502771ccc9f91485b376ffe16d553533f335b9183ea99754" + url: "https://pub.dev" + source: hosted + version: "4.6.10" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: "0d1be17bc89ed3ff5001789c92df678b2e963a51b6fa2bdb467532cc9dbed390" + url: "https://pub.dev" + source: hosted + version: "3.10.10" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + fl_chart: + dependency: "direct main" + description: + name: fl_chart + sha256: "5276944c6ffc975ae796569a826c38a62d2abcf264e26b88fa6f482e107f4237" + url: "https://pub.dev" + source: hosted + version: "0.70.2" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_image_compress: + dependency: "direct main" + description: + name: flutter_image_compress + sha256: "51d23be39efc2185e72e290042a0da41aed70b14ef97db362a6b5368d0523b27" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + flutter_image_compress_common: + dependency: transitive + description: + name: flutter_image_compress_common + sha256: c5c5d50c15e97dd7dc72ff96bd7077b9f791932f2076c5c5b6c43f2c88607bfb + url: "https://pub.dev" + source: hosted + version: "1.0.6" + flutter_image_compress_macos: + dependency: transitive + description: + name: flutter_image_compress_macos + sha256: "20019719b71b743aba0ef874ed29c50747461e5e8438980dfa5c2031898f7337" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + flutter_image_compress_ohos: + dependency: transitive + description: + name: flutter_image_compress_ohos + sha256: e76b92bbc830ee08f5b05962fc78a532011fcd2041f620b5400a593e96da3f51 + url: "https://pub.dev" + source: hosted + version: "0.0.3" + flutter_image_compress_platform_interface: + dependency: transitive + description: + name: flutter_image_compress_platform_interface + sha256: "579cb3947fd4309103afe6442a01ca01e1e6f93dc53bb4cbd090e8ce34a41889" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + flutter_image_compress_web: + dependency: transitive + description: + name: flutter_image_compress_web + sha256: b9b141ac7c686a2ce7bb9a98176321e1182c9074650e47bb140741a44b6f5a96 + url: "https://pub.dev" + source: hosted + version: "0.1.5" + flutter_launcher_icons: + dependency: "direct main" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + url: "https://pub.dev" + source: hosted + version: "2.0.28" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_staggered_animations: + dependency: "direct main" + description: + name: flutter_staggered_animations + sha256: "81d3c816c9bb0dca9e8a5d5454610e21ffb068aedb2bde49d2f8d04f75538351" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 + url: "https://pub.dev" + source: hosted + version: "4.7.2" + get_storage: + dependency: "direct main" + description: + name: get_storage + sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: d0a2c3bcb06e607bb11e4daca48bd4b6120f0bbc4015ccebbe757d24ea60ed2a + url: "https://pub.dev" + source: hosted + version: "6.3.0" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: d5e23c56a4b84b6427552f1cf3f98f716db3b1d1a647f16b96dbb5b93afa2805 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: "102005f498ce18442e7158f6791033bbc15ad2dcc0afa4cf4752e2722a516c96" + url: "https://pub.dev" + source: hosted + version: "5.9.0" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "5f6f79cf139c197261adb6ac024577518ae48fdff8e53205c5373b5f6430a8aa" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: "460547beb4962b7623ac0fb8122d6b8268c951cf0b646dd150d60498430e4ded" + url: "https://pub.dev" + source: hosted + version: "0.12.4+4" + googleapis_auth: + dependency: "direct main" + description: + name: googleapis_auth + sha256: befd71383a955535060acde8792e7efc11d2fccd03dd1d3ec434e85b68775938 + url: "https://pub.dev" + source: hosted + version: "1.6.0" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + http: + dependency: "direct main" + description: + name: http + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + url: "https://pub.dev" + source: hosted + version: "4.5.4" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: "266760ed426d7121f0ada02c672bfe5c1b5c714e908328716aee756f045709dc" + url: "https://pub.dev" + source: hosted + version: "8.1.0" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: fd81ebe36f636576094377aab32673c4e5d1609b32dec16fad98d2b71f1250a9 + url: "https://pub.dev" + source: hosted + version: "6.1.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: "6ca6b81769abff9a4dcc3bbd3d75f5dfa9de6b870ae9613c8cd237333a4283af" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "6fae381e6af2bbe0365a5e4ce1db3959462fa0c4d234facf070746024bb80c8d" + url: "https://pub.dev" + source: hosted + version: "0.8.12+24" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + url: "https://pub.dev" + source: hosted + version: "0.8.12+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + url: "https://pub.dev" + source: hosted + version: "2.10.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + jailbreak_root_detection: + dependency: "direct main" + description: + name: jailbreak_root_detection + sha256: c611229940a09785bd686364e92a40b07724926d2496c931527805101eb3da86 + url: "https://pub.dev" + source: hosted + version: "1.1.6" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + jwt_decoder: + dependency: "direct main" + description: + name: jwt_decoder + sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + url: "https://pub.dev" + source: hosted + version: "10.0.9" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + local_auth: + dependency: "direct main" + description: + name: local_auth + sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: "82b2bdeee2199a510d3b7716121e96a6609da86693bb0863edd8566355406b79" + url: "https://pub.dev" + source: hosted + version: "1.0.50" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: "25163ce60a5a6c468cf7a0e3dc8a165f824cabc2aa9e39a5e9fc5c2311b7686f" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + url: "https://pub.dev" + source: hosted + version: "1.0.11" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + url: "https://pub.dev" + source: hosted + version: "2.2.17" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + posix: + dependency: transitive + description: + name: posix + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" + url: "https://pub.dev" + source: hosted + version: "6.0.3" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + secure_string_operations: + dependency: "direct main" + description: + path: secure_string_operations + relative: true + source: path + version: "1.0.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" + url: "https://pub.dev" + source: hosted + version: "2.5.5" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.dev" + source: hosted + version: "3.4.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" + source: hosted + version: "0.7.4" + timing: + dependency: transitive + description: + name: timing + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" + url: "https://pub.dev" + source: hosted + version: "6.3.16" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" + url: "https://pub.dev" + source: hosted + version: "6.3.3" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" + source: hosted + version: "15.0.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + win32: + dependency: transitive + description: + name: win32 + sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" + url: "https://pub.dev" + source: hosted + version: "5.14.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.29.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..38ba416 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,103 @@ +name: sefer_admin1 +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ">=3.3.2 <4.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + # agora_rtc_engine: ^6.3.0 + # device_info_plus: ^10.1.0 + secure_string_operations: + path: ./secure_string_operations + dio: ^5.4.3+1 + envied: ^1.0.0 + firebase_core: ^3.9.0 + firebase_messaging: ^15.1.6 + fl_chart: ^0.70.0 + flutter: + sdk: flutter + flutter_launcher_icons: ^0.14.2 + # flutter_local_notifications: ^17.1.1 + # flutter_paypal: ^0.2.0 + flutter_secure_storage: ^9.0.0 + # flutter_stripe: ^10.1.1 + get: ^4.6.6 + get_storage: ^2.1.1 + google_fonts: ^6.2.1 + # google_maps_flutter: ^2.6.1 + google_sign_in: ^6.2.1 + http: ^1.0.0 + # image: ^4.1.7 + image_cropper: ^8.0.2 + image_picker: ^1.1.1 + intl: ^0.19.0 + local_auth: ^2.2.0 + # location: ^6.0.1 + path: ^1.9.0 + sqflite: ^2.3.3+1 + url_launcher: ^6.2.6 + # webview_flutter: ^4.7.0 + googleapis_auth: ^1.6.0 + firebase_crashlytics: ^4.2.0 + flutter_image_compress: ^2.3.0 + jwt_decoder: ^2.0.1 + encrypt: ^5.0.3 + device_info_plus: ^11.5.0 + flutter_staggered_animations: ^1.1.1 + jailbreak_root_detection: ^1.1.5 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + envied_generator: ^1.0.0 + build_runner: ^2.4.6 + +flutter_launcher_icons: + android: "ic_launcher" # Changed to ic_launcher + ios: true + image_path: "assets/images/logo.png" + min_sdk_android: 21 + adaptive_icon_background: "#ffffff" # Optional: for adaptive icons on Android + adaptive_icon_foreground: "assets/images/logo.png" # Optional: for adaptive icons + web: + generate: true + image_path: "assets/images/logo.png" + background_color: "#ffffff" + theme_color: "#000000" + windows: + generate: true + image_path: "assets/images/logo.png" + icon_size: 48 + macos: + generate: true + image_path: "assets/images/logo.png" + +flutter: + uses-material-design: true + assets: + - assets/ + - assets/images/ diff --git a/secure_string_operations/lib/secure_string_operations.dart b/secure_string_operations/lib/secure_string_operations.dart new file mode 100644 index 0000000..d428ac3 --- /dev/null +++ b/secure_string_operations/lib/secure_string_operations.dart @@ -0,0 +1,47 @@ +// File: lib/secure_string_operations.dart + +library secure_string_operations; + +class X { + static String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + static String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/secure_string_operations/pubspec.lock b/secure_string_operations/pubspec.lock new file mode 100644 index 0000000..fce7ef1 --- /dev/null +++ b/secure_string_operations/pubspec.lock @@ -0,0 +1,5 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: {} +sdks: + dart: ">=2.12.0 <4.0.0" diff --git a/secure_string_operations/pubspec.yaml b/secure_string_operations/pubspec.yaml new file mode 100644 index 0000000..b910400 --- /dev/null +++ b/secure_string_operations/pubspec.yaml @@ -0,0 +1,6 @@ +name: secure_string_operations +description: A package for secure string operations +version: 1.0.0 + +environment: + sdk: ">=2.12.0 <3.0.0" diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..464cfb5 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,29 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:sefer_admin1/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MainApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000..4c01f50 Binary files /dev/null and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000..d5bf6f5 Binary files /dev/null and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/web/icons/Icon-maskable-192.png differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d5bf6f5 Binary files /dev/null and b/web/icons/Icon-maskable-512.png differ diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..2ba9792 --- /dev/null +++ b/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + intaleq_admin + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..2bdf774 --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "intaleq_admin", + "short_name": "intaleq_admin", + "start_url": ".", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#000000", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} \ No newline at end of file diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt new file mode 100644 index 0000000..53d19f7 --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(intaleq_admin LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "intaleq_admin") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..c1ddf6d --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,26 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + LocalAuthPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LocalAuthPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..93dbf81 --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,28 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows + firebase_core + flutter_secure_storage_windows + local_auth_windows + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc new file mode 100644 index 0000000..ebea961 --- /dev/null +++ b/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.intaleq" "\0" + VALUE "FileDescription", "intaleq_admin" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "intaleq_admin" "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.intaleq. All rights reserved." "\0" + VALUE "OriginalFilename", "intaleq_admin.exe" "\0" + VALUE "ProductName", "intaleq_admin" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp new file mode 100644 index 0000000..3026319 --- /dev/null +++ b/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"intaleq_admin", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..1c7a91d Binary files /dev/null and b/windows/runner/resources/app_icon.ico differ diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..153653e --- /dev/null +++ b/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_