From ccbe5ad80158b189602face3407bf8ce2c07da3e Mon Sep 17 00:00:00 2001 From: Sam DEPARDIEU Date: Wed, 22 Apr 2026 23:30:31 +0200 Subject: [PATCH] =?UTF-8?q?Premi=C3=A8re=20grosse=20version=20fonctionnel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 3 + .idea/CESIZen.iml | 46 + .idea/caches/deviceStreaming.xml | 1634 ++++ .idea/deploymentTargetSelector.xml | 11 + .idea/markdown.xml | 8 + .idea/misc.xml | 5 + .idea/modules.xml | 8 + .../Launch_All__Mobile___Wear_.xml | 7 + .idea/runConfigurations/Mobile_App.xml | 7 + .idea/runConfigurations/Wear_App.xml | 68 + .idea/vcs.xml | 6 + README.md | 85 + WEB/.editorconfig | 18 + WEB/.env.example | 65 + WEB/.gitattributes | 11 + WEB/.gitignore | 24 + WEB/README.md | 59 + .../Http/Controllers/Api/AuthController.php | 117 + .../Controllers/Api/EmotionController.php | 42 + .../Api/StressDiagnosticController.php | 22 + WEB/app/Http/Controllers/Controller.php | 8 + .../Http/Controllers/DashboardController.php | 25 + .../Http/Controllers/Web/AuthController.php | 66 + .../Controllers/Web/DiagnosticController.php | 30 + .../Controllers/Web/EmotionController.php | 35 + .../Controllers/Web/ProfileController.php | 71 + .../Controllers/Web/RelaxationController.php | 38 + WEB/app/Models/Activite.php | 10 + WEB/app/Models/Categorie.php | 10 + WEB/app/Models/DetailResultat.php | 10 + WEB/app/Models/EmotionRecord.php | 15 + WEB/app/Models/EvenementStress.php | 10 + WEB/app/Models/Favorite.php | 10 + WEB/app/Models/RelaxationActivity.php | 15 + WEB/app/Models/ResultatDiag.php | 10 + WEB/app/Models/Role.php | 10 + WEB/app/Models/StressEvent.php | 10 + WEB/app/Models/User.php | 61 + WEB/app/Providers/AppServiceProvider.php | 24 + WEB/artisan | 18 + WEB/bootstrap/app.php | 19 + WEB/bootstrap/cache/.gitignore | 2 + WEB/bootstrap/providers.php | 7 + WEB/composer.json | 89 + WEB/composer.lock | 8612 +++++++++++++++++ WEB/config/app.php | 126 + WEB/config/auth.php | 117 + WEB/config/cache.php | 117 + WEB/config/database.php | 184 + WEB/config/filesystems.php | 80 + WEB/config/logging.php | 132 + WEB/config/mail.php | 118 + WEB/config/queue.php | 129 + WEB/config/sanctum.php | 84 + WEB/config/services.php | 38 + WEB/config/session.php | 217 + WEB/database/.gitignore | 1 + WEB/database/factories/UserFactory.php | 45 + ...0_04_21_202934_create_categories_table.php | 28 + .../0000_04_21_202934_create_roles_table.php | 28 + ...00_04_21_202936_create_activites_table.php | 32 + .../0001_01_01_000000_create_users_table.php | 51 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + ...47_create_personal_access_tokens_table.php | 33 + ...4_16_195232_create_stress_events_table.php | 29 + ...21_180932_create_emotion_records_table.php | 31 + ...26_04_21_180932_create_favorites_table.php | 35 + ...932_create_relaxation_activities_table.php | 32 + ...026_04_21_202935_create_emotions_table.php | 29 + ...1_202935_create_evenement_stress_table.php | 29 + ..._21_202935_create_exercice_respi_table.php | 31 + ...21_202936_create_journal_entrees_table.php | 30 + ..._21_202936_create_resultat_diags_table.php | 31 + ...4_21_202936_create_users_table_cesizen.php | 27 + ...4_21_202937_create_contenu_infos_table.php | 31 + ...1_202937_create_detail_resultats_table.php | 28 + ...02937_create_emotions_ressenties_table.php | 29 + ...2026_04_21_202937_create_favoris_table.php | 27 + ...1_203243_create_historique_respi_table.php | 27 + WEB/database/seeders/DatabaseSeeder.php | 35 + WEB/database/seeders/RoleSeeder.php | 24 + WEB/database/seeders/StressEventSeeder.php | 62 + WEB/package-lock.json | 2424 +++++ WEB/package.json | 17 + WEB/phpunit.xml | 36 + WEB/public/.htaccess | 25 + WEB/public/favicon.ico | 0 WEB/public/img/CesiZen logo.png | Bin 0 -> 6852 bytes WEB/public/img/CesiZen nom.png | Bin 0 -> 6912 bytes WEB/public/img/CesiZen.png | Bin 0 -> 13917 bytes WEB/public/img/ministere.jpeg | Bin 0 -> 55294 bytes WEB/public/img/ministere.png | Bin 0 -> 65639 bytes WEB/public/index.php | 20 + WEB/public/robots.txt | 2 + WEB/resources/css/app.css | 11 + WEB/resources/js/app.js | 1 + WEB/resources/js/bootstrap.js | 4 + WEB/resources/views/auth/login.blade.php | 75 + WEB/resources/views/auth/register.blade.php | 94 + .../views/diagnostics/index.blade.php | 54 + WEB/resources/views/emotions/index.blade.php | 84 + WEB/resources/views/layouts/app.blade.php | 37 + WEB/resources/views/layouts/footer.blade.php | 21 + WEB/resources/views/layouts/header.blade.php | 41 + WEB/resources/views/layouts/sidebar.blade.php | 67 + WEB/resources/views/profile/index.blade.php | 121 + .../views/relaxation/index.blade.php | 214 + WEB/resources/views/welcome.blade.php | 169 + WEB/routes/api.php | 28 + WEB/routes/console.php | 8 + WEB/routes/web.php | 41 + WEB/storage/app/.gitignore | 4 + WEB/storage/app/private/.gitignore | 2 + WEB/storage/app/public/.gitignore | 2 + WEB/storage/framework/.gitignore | 9 + WEB/storage/framework/cache/.gitignore | 3 + WEB/storage/framework/cache/data/.gitignore | 2 + WEB/storage/framework/sessions/.gitignore | 2 + WEB/storage/framework/testing/.gitignore | 2 + WEB/storage/framework/views/.gitignore | 2 + WEB/storage/logs/.gitignore | 2 + WEB/tests/Feature/ExampleTest.php | 19 + WEB/tests/TestCase.php | 10 + WEB/tests/Unit/ExampleTest.php | 16 + WEB/vite.config.js | 18 + Wear/.gitignore | 15 + Wear/.idea/.gitignore | 3 + Wear/.idea/.name | 1 + Wear/.idea/AndroidProjectSystem.xml | 6 + Wear/.idea/compiler.xml | 6 + Wear/.idea/deploymentTargetSelector.xml | 18 + Wear/.idea/gradle.xml | 18 + Wear/.idea/misc.xml | 10 + Wear/.idea/runConfigurations.xml | 17 + Wear/.idea/vcs.xml | 6 + Wear/app/.gitignore | 1 + Wear/app/build.gradle.kts | 58 + Wear/app/lint.xml | 8 + Wear/app/proguard-rules.pro | 21 + Wear/app/src/main/AndroidManifest.xml | 46 + .../main/java/com/cesizen/app/MainActivity.kt | 261 + .../cesizen/app/presentation/theme/Theme.kt | 13 + .../res/drawable/ic_launcher_background.xml | 170 + .../res/drawable/ic_launcher_foreground.xml | 30 + .../app/src/main/res/drawable/splash_icon.xml | 27 + .../main/res/mipmap-anydpi/ic_launcher.xml | 6 + .../res/mipmap-anydpi/ic_launcher_round.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes Wear/app/src/main/res/values/strings.xml | 4 + Wear/app/src/main/res/values/styles.xml | 8 + .../src/main/res/xml/wearable_app_values.xml | 4 + Wear/build.gradle.kts | 5 + Wear/gradle.properties | 15 + Wear/gradle/gradle-daemon-jvm.properties | 12 + Wear/gradle/libs.versions.toml | 32 + Wear/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 45457 bytes Wear/gradle/wrapper/gradle-wrapper.properties | 9 + Wear/gradlew | 251 + Wear/gradlew.bat | 94 + Wear/settings.gradle.kts | 27 + composer.json | 6 + composer.lock | 3109 ++++++ mobile/.gitignore | 45 + mobile/.metadata | 45 + mobile/README.md | 84 + mobile/analysis_options.yaml | 28 + mobile/android/.gitignore | 14 + mobile/android/app/build.gradle.kts | 47 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 55 + .../kotlin/com/cesizen/app/MainActivity.kt | 108 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 6852 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 6852 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6852 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6852 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6852 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../src/main/res/xml/wearable_app_values.xml | 4 + .../app/src/profile/AndroidManifest.xml | 7 + mobile/android/build.gradle.kts | 24 + mobile/android/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.properties | 5 + mobile/android/settings.gradle.kts | 26 + mobile/assets/images/CesiZen logo.png | Bin 0 -> 6852 bytes mobile/assets/images/CesiZen nom.png | Bin 0 -> 6912 bytes mobile/assets/images/CesiZen.png | Bin 0 -> 13917 bytes mobile/assets/images/ministere.jpeg | Bin 0 -> 55294 bytes mobile/assets/images/ministere.png | Bin 0 -> 65639 bytes mobile/ios/.gitignore | 34 + mobile/ios/Flutter/AppFrameworkInfo.plist | 24 + mobile/ios/Flutter/Debug.xcconfig | 1 + mobile/ios/Flutter/Release.xcconfig | 1 + mobile/ios/Runner.xcodeproj/project.pbxproj | 620 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 101 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + mobile/ios/Runner/AppDelegate.swift | 16 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + mobile/ios/Runner/Base.lproj/Main.storyboard | 26 + mobile/ios/Runner/Info.plist | 70 + mobile/ios/Runner/Runner-Bridging-Header.h | 1 + mobile/ios/Runner/SceneDelegate.swift | 6 + mobile/ios/RunnerTests/RunnerTests.swift | 12 + mobile/lib/core/network/dio_client.dart | 44 + mobile/lib/features/auth/models/user.dart | 27 + .../auth/providers/auth_provider.dart | 127 + .../features/auth/screens/login_screen.dart | 124 + .../features/auth/screens/profile_screen.dart | 267 + .../auth/screens/register_screen.dart | 132 + .../features/auth/services/auth_service.dart | 130 + .../features/diagnostics/models/question.dart | 13 + .../providers/diagnostic_provider.dart | 65 + .../screens/diagnostic_screen.dart | 122 + .../services/diagnostic_service.dart | 30 + .../exercises/screens/breathing_screen.dart | 307 + .../features/relaxation/models/activity.dart | 28 + .../providers/relaxation_provider.dart | 31 + .../relaxation/screens/relaxation_screen.dart | 131 + .../services/relaxation_service.dart | 21 + .../tracker/models/emotion_entry.dart | 29 + .../tracker/providers/emotion_provider.dart | 39 + .../tracker/screens/tracker_screen.dart | 168 + .../tracker/services/emotion_service.dart | 69 + .../lib/features/wear/wear_sync_service.dart | 74 + mobile/lib/main.dart | 375 + mobile/linux/.gitignore | 1 + mobile/linux/CMakeLists.txt | 128 + mobile/linux/flutter/CMakeLists.txt | 88 + .../flutter/generated_plugin_registrant.cc | 15 + .../flutter/generated_plugin_registrant.h | 15 + mobile/linux/flutter/generated_plugins.cmake | 25 + mobile/linux/runner/CMakeLists.txt | 26 + mobile/linux/runner/main.cc | 6 + mobile/linux/runner/my_application.cc | 148 + mobile/linux/runner/my_application.h | 21 + mobile/macos/.gitignore | 7 + mobile/macos/Flutter/Flutter-Debug.xcconfig | 1 + mobile/macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 12 + mobile/macos/Runner.xcodeproj/project.pbxproj | 705 ++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 99 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + mobile/macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes mobile/macos/Runner/Base.lproj/MainMenu.xib | 343 + mobile/macos/Runner/Configs/AppInfo.xcconfig | 14 + mobile/macos/Runner/Configs/Debug.xcconfig | 2 + mobile/macos/Runner/Configs/Release.xcconfig | 2 + mobile/macos/Runner/Configs/Warnings.xcconfig | 13 + mobile/macos/Runner/DebugProfile.entitlements | 12 + mobile/macos/Runner/Info.plist | 32 + mobile/macos/Runner/MainFlutterWindow.swift | 15 + mobile/macos/Runner/Release.entitlements | 8 + mobile/macos/RunnerTests/RunnerTests.swift | 12 + mobile/pubspec.lock | 602 ++ mobile/pubspec.yaml | 97 + mobile/test/widget_test.dart | 30 + mobile/web/favicon.png | Bin 0 -> 917 bytes mobile/web/icons/Icon-192.png | Bin 0 -> 5292 bytes mobile/web/icons/Icon-512.png | Bin 0 -> 8252 bytes mobile/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes mobile/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes mobile/web/index.html | 46 + mobile/web/manifest.json | 35 + mobile/windows/.gitignore | 17 + mobile/windows/CMakeLists.txt | 108 + mobile/windows/flutter/CMakeLists.txt | 109 + .../flutter/generated_plugin_registrant.cc | 17 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 26 + mobile/windows/runner/CMakeLists.txt | 40 + mobile/windows/runner/Runner.rc | 121 + mobile/windows/runner/flutter_window.cpp | 71 + mobile/windows/runner/flutter_window.h | 33 + mobile/windows/runner/main.cpp | 43 + mobile/windows/runner/resource.h | 16 + mobile/windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes mobile/windows/runner/runner.exe.manifest | 14 + mobile/windows/runner/utils.cpp | 65 + mobile/windows/runner/utils.h | 19 + mobile/windows/runner/win32_window.cpp | 288 + mobile/windows/runner/win32_window.h | 102 + 329 files changed, 29518 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/CESIZen.iml create mode 100644 .idea/caches/deviceStreaming.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/markdown.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations/Launch_All__Mobile___Wear_.xml create mode 100644 .idea/runConfigurations/Mobile_App.xml create mode 100644 .idea/runConfigurations/Wear_App.xml create mode 100644 .idea/vcs.xml create mode 100644 README.md create mode 100644 WEB/.editorconfig create mode 100644 WEB/.env.example create mode 100644 WEB/.gitattributes create mode 100644 WEB/.gitignore create mode 100644 WEB/README.md create mode 100644 WEB/app/Http/Controllers/Api/AuthController.php create mode 100644 WEB/app/Http/Controllers/Api/EmotionController.php create mode 100644 WEB/app/Http/Controllers/Api/StressDiagnosticController.php create mode 100644 WEB/app/Http/Controllers/Controller.php create mode 100644 WEB/app/Http/Controllers/DashboardController.php create mode 100644 WEB/app/Http/Controllers/Web/AuthController.php create mode 100644 WEB/app/Http/Controllers/Web/DiagnosticController.php create mode 100644 WEB/app/Http/Controllers/Web/EmotionController.php create mode 100644 WEB/app/Http/Controllers/Web/ProfileController.php create mode 100644 WEB/app/Http/Controllers/Web/RelaxationController.php create mode 100644 WEB/app/Models/Activite.php create mode 100644 WEB/app/Models/Categorie.php create mode 100644 WEB/app/Models/DetailResultat.php create mode 100644 WEB/app/Models/EmotionRecord.php create mode 100644 WEB/app/Models/EvenementStress.php create mode 100644 WEB/app/Models/Favorite.php create mode 100644 WEB/app/Models/RelaxationActivity.php create mode 100644 WEB/app/Models/ResultatDiag.php create mode 100644 WEB/app/Models/Role.php create mode 100644 WEB/app/Models/StressEvent.php create mode 100644 WEB/app/Models/User.php create mode 100644 WEB/app/Providers/AppServiceProvider.php create mode 100644 WEB/artisan create mode 100644 WEB/bootstrap/app.php create mode 100644 WEB/bootstrap/cache/.gitignore create mode 100644 WEB/bootstrap/providers.php create mode 100644 WEB/composer.json create mode 100644 WEB/composer.lock create mode 100644 WEB/config/app.php create mode 100644 WEB/config/auth.php create mode 100644 WEB/config/cache.php create mode 100644 WEB/config/database.php create mode 100644 WEB/config/filesystems.php create mode 100644 WEB/config/logging.php create mode 100644 WEB/config/mail.php create mode 100644 WEB/config/queue.php create mode 100644 WEB/config/sanctum.php create mode 100644 WEB/config/services.php create mode 100644 WEB/config/session.php create mode 100644 WEB/database/.gitignore create mode 100644 WEB/database/factories/UserFactory.php create mode 100644 WEB/database/migrations/0000_04_21_202934_create_categories_table.php create mode 100644 WEB/database/migrations/0000_04_21_202934_create_roles_table.php create mode 100644 WEB/database/migrations/0000_04_21_202936_create_activites_table.php create mode 100644 WEB/database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 WEB/database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 WEB/database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 WEB/database/migrations/2026_04_15_193747_create_personal_access_tokens_table.php create mode 100644 WEB/database/migrations/2026_04_16_195232_create_stress_events_table.php create mode 100644 WEB/database/migrations/2026_04_21_180932_create_emotion_records_table.php create mode 100644 WEB/database/migrations/2026_04_21_180932_create_favorites_table.php create mode 100644 WEB/database/migrations/2026_04_21_180932_create_relaxation_activities_table.php create mode 100644 WEB/database/migrations/2026_04_21_202935_create_emotions_table.php create mode 100644 WEB/database/migrations/2026_04_21_202935_create_evenement_stress_table.php create mode 100644 WEB/database/migrations/2026_04_21_202935_create_exercice_respi_table.php create mode 100644 WEB/database/migrations/2026_04_21_202936_create_journal_entrees_table.php create mode 100644 WEB/database/migrations/2026_04_21_202936_create_resultat_diags_table.php create mode 100644 WEB/database/migrations/2026_04_21_202936_create_users_table_cesizen.php create mode 100644 WEB/database/migrations/2026_04_21_202937_create_contenu_infos_table.php create mode 100644 WEB/database/migrations/2026_04_21_202937_create_detail_resultats_table.php create mode 100644 WEB/database/migrations/2026_04_21_202937_create_emotions_ressenties_table.php create mode 100644 WEB/database/migrations/2026_04_21_202937_create_favoris_table.php create mode 100644 WEB/database/migrations/2026_04_21_203243_create_historique_respi_table.php create mode 100644 WEB/database/seeders/DatabaseSeeder.php create mode 100644 WEB/database/seeders/RoleSeeder.php create mode 100644 WEB/database/seeders/StressEventSeeder.php create mode 100644 WEB/package-lock.json create mode 100644 WEB/package.json create mode 100644 WEB/phpunit.xml create mode 100644 WEB/public/.htaccess create mode 100644 WEB/public/favicon.ico create mode 100644 WEB/public/img/CesiZen logo.png create mode 100644 WEB/public/img/CesiZen nom.png create mode 100644 WEB/public/img/CesiZen.png create mode 100644 WEB/public/img/ministere.jpeg create mode 100644 WEB/public/img/ministere.png create mode 100644 WEB/public/index.php create mode 100644 WEB/public/robots.txt create mode 100644 WEB/resources/css/app.css create mode 100644 WEB/resources/js/app.js create mode 100644 WEB/resources/js/bootstrap.js create mode 100644 WEB/resources/views/auth/login.blade.php create mode 100644 WEB/resources/views/auth/register.blade.php create mode 100644 WEB/resources/views/diagnostics/index.blade.php create mode 100644 WEB/resources/views/emotions/index.blade.php create mode 100644 WEB/resources/views/layouts/app.blade.php create mode 100644 WEB/resources/views/layouts/footer.blade.php create mode 100644 WEB/resources/views/layouts/header.blade.php create mode 100644 WEB/resources/views/layouts/sidebar.blade.php create mode 100644 WEB/resources/views/profile/index.blade.php create mode 100644 WEB/resources/views/relaxation/index.blade.php create mode 100644 WEB/resources/views/welcome.blade.php create mode 100644 WEB/routes/api.php create mode 100644 WEB/routes/console.php create mode 100644 WEB/routes/web.php create mode 100644 WEB/storage/app/.gitignore create mode 100644 WEB/storage/app/private/.gitignore create mode 100644 WEB/storage/app/public/.gitignore create mode 100644 WEB/storage/framework/.gitignore create mode 100644 WEB/storage/framework/cache/.gitignore create mode 100644 WEB/storage/framework/cache/data/.gitignore create mode 100644 WEB/storage/framework/sessions/.gitignore create mode 100644 WEB/storage/framework/testing/.gitignore create mode 100644 WEB/storage/framework/views/.gitignore create mode 100644 WEB/storage/logs/.gitignore create mode 100644 WEB/tests/Feature/ExampleTest.php create mode 100644 WEB/tests/TestCase.php create mode 100644 WEB/tests/Unit/ExampleTest.php create mode 100644 WEB/vite.config.js create mode 100644 Wear/.gitignore create mode 100644 Wear/.idea/.gitignore create mode 100644 Wear/.idea/.name create mode 100644 Wear/.idea/AndroidProjectSystem.xml create mode 100644 Wear/.idea/compiler.xml create mode 100644 Wear/.idea/deploymentTargetSelector.xml create mode 100644 Wear/.idea/gradle.xml create mode 100644 Wear/.idea/misc.xml create mode 100644 Wear/.idea/runConfigurations.xml create mode 100644 Wear/.idea/vcs.xml create mode 100644 Wear/app/.gitignore create mode 100644 Wear/app/build.gradle.kts create mode 100644 Wear/app/lint.xml create mode 100644 Wear/app/proguard-rules.pro create mode 100644 Wear/app/src/main/AndroidManifest.xml create mode 100644 Wear/app/src/main/java/com/cesizen/app/MainActivity.kt create mode 100644 Wear/app/src/main/java/com/cesizen/app/presentation/theme/Theme.kt create mode 100644 Wear/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 Wear/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 Wear/app/src/main/res/drawable/splash_icon.xml create mode 100644 Wear/app/src/main/res/mipmap-anydpi/ic_launcher.xml create mode 100644 Wear/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml create mode 100644 Wear/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 Wear/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 Wear/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 Wear/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 Wear/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 Wear/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 Wear/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 Wear/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 Wear/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 Wear/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 Wear/app/src/main/res/values/strings.xml create mode 100644 Wear/app/src/main/res/values/styles.xml create mode 100644 Wear/app/src/main/res/xml/wearable_app_values.xml create mode 100644 Wear/build.gradle.kts create mode 100644 Wear/gradle.properties create mode 100644 Wear/gradle/gradle-daemon-jvm.properties create mode 100644 Wear/gradle/libs.versions.toml create mode 100644 Wear/gradle/wrapper/gradle-wrapper.jar create mode 100644 Wear/gradle/wrapper/gradle-wrapper.properties create mode 100644 Wear/gradlew create mode 100644 Wear/gradlew.bat create mode 100644 Wear/settings.gradle.kts create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 mobile/.gitignore create mode 100644 mobile/.metadata create mode 100644 mobile/README.md create mode 100644 mobile/analysis_options.yaml create mode 100644 mobile/android/.gitignore create mode 100644 mobile/android/app/build.gradle.kts create mode 100644 mobile/android/app/src/debug/AndroidManifest.xml create mode 100644 mobile/android/app/src/main/AndroidManifest.xml create mode 100644 mobile/android/app/src/main/kotlin/com/cesizen/app/MainActivity.kt create mode 100644 mobile/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 mobile/android/app/src/main/res/drawable/launch_background.xml create mode 100644 mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/values-night/styles.xml create mode 100644 mobile/android/app/src/main/res/values/styles.xml create mode 100644 mobile/android/app/src/main/res/xml/wearable_app_values.xml create mode 100644 mobile/android/app/src/profile/AndroidManifest.xml create mode 100644 mobile/android/build.gradle.kts create mode 100644 mobile/android/gradle.properties create mode 100644 mobile/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mobile/android/settings.gradle.kts create mode 100644 mobile/assets/images/CesiZen logo.png create mode 100644 mobile/assets/images/CesiZen nom.png create mode 100644 mobile/assets/images/CesiZen.png create mode 100644 mobile/assets/images/ministere.jpeg create mode 100644 mobile/assets/images/ministere.png create mode 100644 mobile/ios/.gitignore create mode 100644 mobile/ios/Flutter/AppFrameworkInfo.plist create mode 100644 mobile/ios/Flutter/Debug.xcconfig create mode 100644 mobile/ios/Flutter/Release.xcconfig create mode 100644 mobile/ios/Runner.xcodeproj/project.pbxproj create mode 100644 mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mobile/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mobile/ios/Runner/AppDelegate.swift create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 mobile/ios/Runner/Base.lproj/Main.storyboard create mode 100644 mobile/ios/Runner/Info.plist create mode 100644 mobile/ios/Runner/Runner-Bridging-Header.h create mode 100644 mobile/ios/Runner/SceneDelegate.swift create mode 100644 mobile/ios/RunnerTests/RunnerTests.swift create mode 100644 mobile/lib/core/network/dio_client.dart create mode 100644 mobile/lib/features/auth/models/user.dart create mode 100644 mobile/lib/features/auth/providers/auth_provider.dart create mode 100644 mobile/lib/features/auth/screens/login_screen.dart create mode 100644 mobile/lib/features/auth/screens/profile_screen.dart create mode 100644 mobile/lib/features/auth/screens/register_screen.dart create mode 100644 mobile/lib/features/auth/services/auth_service.dart create mode 100644 mobile/lib/features/diagnostics/models/question.dart create mode 100644 mobile/lib/features/diagnostics/providers/diagnostic_provider.dart create mode 100644 mobile/lib/features/diagnostics/screens/diagnostic_screen.dart create mode 100644 mobile/lib/features/diagnostics/services/diagnostic_service.dart create mode 100644 mobile/lib/features/exercises/screens/breathing_screen.dart create mode 100644 mobile/lib/features/relaxation/models/activity.dart create mode 100644 mobile/lib/features/relaxation/providers/relaxation_provider.dart create mode 100644 mobile/lib/features/relaxation/screens/relaxation_screen.dart create mode 100644 mobile/lib/features/relaxation/services/relaxation_service.dart create mode 100644 mobile/lib/features/tracker/models/emotion_entry.dart create mode 100644 mobile/lib/features/tracker/providers/emotion_provider.dart create mode 100644 mobile/lib/features/tracker/screens/tracker_screen.dart create mode 100644 mobile/lib/features/tracker/services/emotion_service.dart create mode 100644 mobile/lib/features/wear/wear_sync_service.dart create mode 100644 mobile/lib/main.dart create mode 100644 mobile/linux/.gitignore create mode 100644 mobile/linux/CMakeLists.txt create mode 100644 mobile/linux/flutter/CMakeLists.txt create mode 100644 mobile/linux/flutter/generated_plugin_registrant.cc create mode 100644 mobile/linux/flutter/generated_plugin_registrant.h create mode 100644 mobile/linux/flutter/generated_plugins.cmake create mode 100644 mobile/linux/runner/CMakeLists.txt create mode 100644 mobile/linux/runner/main.cc create mode 100644 mobile/linux/runner/my_application.cc create mode 100644 mobile/linux/runner/my_application.h create mode 100644 mobile/macos/.gitignore create mode 100644 mobile/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 mobile/macos/Flutter/Flutter-Release.xcconfig create mode 100644 mobile/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 mobile/macos/Runner.xcodeproj/project.pbxproj create mode 100644 mobile/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mobile/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mobile/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mobile/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mobile/macos/Runner/AppDelegate.swift create mode 100644 mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 mobile/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 mobile/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 mobile/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 mobile/macos/Runner/Configs/Debug.xcconfig create mode 100644 mobile/macos/Runner/Configs/Release.xcconfig create mode 100644 mobile/macos/Runner/Configs/Warnings.xcconfig create mode 100644 mobile/macos/Runner/DebugProfile.entitlements create mode 100644 mobile/macos/Runner/Info.plist create mode 100644 mobile/macos/Runner/MainFlutterWindow.swift create mode 100644 mobile/macos/Runner/Release.entitlements create mode 100644 mobile/macos/RunnerTests/RunnerTests.swift create mode 100644 mobile/pubspec.lock create mode 100644 mobile/pubspec.yaml create mode 100644 mobile/test/widget_test.dart create mode 100644 mobile/web/favicon.png create mode 100644 mobile/web/icons/Icon-192.png create mode 100644 mobile/web/icons/Icon-512.png create mode 100644 mobile/web/icons/Icon-maskable-192.png create mode 100644 mobile/web/icons/Icon-maskable-512.png create mode 100644 mobile/web/index.html create mode 100644 mobile/web/manifest.json create mode 100644 mobile/windows/.gitignore create mode 100644 mobile/windows/CMakeLists.txt create mode 100644 mobile/windows/flutter/CMakeLists.txt create mode 100644 mobile/windows/flutter/generated_plugin_registrant.cc create mode 100644 mobile/windows/flutter/generated_plugin_registrant.h create mode 100644 mobile/windows/flutter/generated_plugins.cmake create mode 100644 mobile/windows/runner/CMakeLists.txt create mode 100644 mobile/windows/runner/Runner.rc create mode 100644 mobile/windows/runner/flutter_window.cpp create mode 100644 mobile/windows/runner/flutter_window.h create mode 100644 mobile/windows/runner/main.cpp create mode 100644 mobile/windows/runner/resource.h create mode 100644 mobile/windows/runner/resources/app_icon.ico create mode 100644 mobile/windows/runner/runner.exe.manifest create mode 100644 mobile/windows/runner/utils.cpp create mode 100644 mobile/windows/runner/utils.h create mode 100644 mobile/windows/runner/win32_window.cpp create mode 100644 mobile/windows/runner/win32_window.h diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/CESIZen.iml b/.idea/CESIZen.iml new file mode 100644 index 0000000..7480012 --- /dev/null +++ b/.idea/CESIZen.iml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/caches/deviceStreaming.xml b/.idea/caches/deviceStreaming.xml new file mode 100644 index 0000000..e8ac6cc --- /dev/null +++ b/.idea/caches/deviceStreaming.xml @@ -0,0 +1,1634 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..ddc03ec --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/markdown.xml b/.idea/markdown.xml new file mode 100644 index 0000000..c61ea33 --- /dev/null +++ b/.idea/markdown.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c08a2df --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..56b3355 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Launch_All__Mobile___Wear_.xml b/.idea/runConfigurations/Launch_All__Mobile___Wear_.xml new file mode 100644 index 0000000..017afb3 --- /dev/null +++ b/.idea/runConfigurations/Launch_All__Mobile___Wear_.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.idea/runConfigurations/Mobile_App.xml b/.idea/runConfigurations/Mobile_App.xml new file mode 100644 index 0000000..3ed23f4 --- /dev/null +++ b/.idea/runConfigurations/Mobile_App.xml @@ -0,0 +1,7 @@ + + + + diff --git a/.idea/runConfigurations/Wear_App.xml b/.idea/runConfigurations/Wear_App.xml new file mode 100644 index 0000000..31ac647 --- /dev/null +++ b/.idea/runConfigurations/Wear_App.xml @@ -0,0 +1,68 @@ + + + + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1460b7b --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +# 🌿 CESIZen - Écosystème de Bien-être Unifié + +CESIZen est une solution complète de gestion du stress et du bien-être, composée d'une plateforme web, d'une application mobile et d'une application pour montre connectée (Wear OS). + +## 🚀 Structure du Projet + +- **/WEB** : API et interface d'administration/diagnostic (Laravel 10, DSFR, Alpine.js). +- **/mobile** : Application compagnon pour le suivi et les exercices (Flutter). +- **/Wear** : Application de montre pour le tracking rapide de l'humeur (Android Wear OS, Kotlin/Compose). + +--- + +## 🛠 Installation & Configuration + +### 1. Backend & Web (Laravel) +Le serveur central gère l'authentification (Sanctum) et la persistance des données. + +```bash +cd WEB +composer install +npm install +cp .env.example .env # Configurez votre base de données et l'URL du serveur +php artisan key:generate +php artisan migrate --seed +php artisan serve +``` +*Note : Assurez-vous que l'IP de votre serveur est accessible par votre téléphone/émulateur pour la synchronisation.* + +### 2. Application Mobile (Flutter) +L'application mobile se connecte à l'API Laravel. + +```bash +cd mobile +flutter pub get +# Modifiez l'URL de l'API dans lib/features/auth/services/auth_service.dart si nécessaire +flutter run +``` + +### 3. Application Montre (Wear OS) +La montre communique avec le téléphone via le **Google Wearable Data Layer**. + +1. Ouvrez le dossier `/Wear` dans **Android Studio**. +2. Compilez et installez l'APK sur une montre (ou émulateur) Wear OS. +3. Assurez-vous que le téléphone appairé possède également l'application mobile CESIZen installée. + +--- + +## 📱 Utilisation & Fonctionnalités + +### 🖥️ Plateforme Web +- **Tableau de bord** : Visualisation des statistiques de stress. +- **Détente interactive** : Module de respiration guidée (méthode DSFR) avec 3 modes (Sommeil, Cohérence, Anxiété). +- **Diagnostics** : Historique détaillé des relevés émotionnels. + +### 🤳 Application Mobile +- **Authentification** : Connexion sécurisée avec persistance de session. +- **Tracker** : Enregistrement quotidien de l'état émotionnel. +- **Exercices** : Respiration guidée avec animation synchronisée du logo CESIZen. +- **Sync Montre** : Envoi automatique de la date et réception des humeurs capturées sur la montre. + +### ⌚ Application Wear OS +- **Quick Mood** : Sélectionnez votre humeur en un clic parmi 5 niveaux. +- **Smart Reset** : L'humeur est automatiquement réinitialisée à minuit chaque jour grâce à la synchronisation bidirectionnelle avec le mobile. +- **Indicateur visuel** : Confirmation visuelle immédiate de l'enregistrement. + +--- + +## 🔗 Synchronisation Bidirectionnelle +- **Mobile -> Montre** : Envoie la `date du jour` pour synchroniser le cycle quotidien. +- **Montre -> Mobile** : Envoie l'émotion sélectionnée via le `Data Layer` (`/daily_mood`). +- **Mobile -> Web** : Synchronise les données finales vers la base de données Laravel pour analyse. + +--- + +## 🎨 Identité Visuelle +L'ensemble de l'écosystème utilise la charte graphique **CesiZen** : +- **Couleur Primaire** : Bleu Marine (`#000080`) +- **Couleur Accent** : Orange (`#FFCC80`) +- **Typographie** : Marianne (standard DSFR) +- **Logo** : Point central de l'animation de respiration. + +--- + +## 📄 Licence +Projet réalisé dans le cadre de la formation CDA CESI. diff --git a/WEB/.editorconfig b/WEB/.editorconfig new file mode 100644 index 0000000..a186cd2 --- /dev/null +++ b/WEB/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[compose.yaml] +indent_size = 4 diff --git a/WEB/.env.example b/WEB/.env.example new file mode 100644 index 0000000..c0660ea --- /dev/null +++ b/WEB/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +# PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=sqlite +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_DATABASE=laravel +# DB_USERNAME=root +# DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/WEB/.gitattributes b/WEB/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/WEB/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/WEB/.gitignore b/WEB/.gitignore new file mode 100644 index 0000000..b71b1ea --- /dev/null +++ b/WEB/.gitignore @@ -0,0 +1,24 @@ +*.log +.DS_Store +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +/.fleet +/.idea +/.nova +/.phpunit.cache +/.vscode +/.zed +/auth.json +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +Homestead.json +Homestead.yaml +Thumbs.db diff --git a/WEB/README.md b/WEB/README.md new file mode 100644 index 0000000..0165a77 --- /dev/null +++ b/WEB/README.md @@ -0,0 +1,59 @@ +

Laravel Logo

+ +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Redberry](https://redberry.international/laravel-development)** +- **[Active Logic](https://activelogic.com)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/WEB/app/Http/Controllers/Api/AuthController.php b/WEB/app/Http/Controllers/Api/AuthController.php new file mode 100644 index 0000000..8c49ff3 --- /dev/null +++ b/WEB/app/Http/Controllers/Api/AuthController.php @@ -0,0 +1,117 @@ +validate([ + 'email' => 'required|string|email', + 'password' => 'required|string' + ]); + + // Log::info('Tentative de connexion', $request->all()); + + $user = User::where('email', $fields['email'])->first(); + + // Vérification du mot de passe haché (Sécurité) + if(!$user || !Hash::check($fields['password'], $user->password)) { + return response([ + 'status' => 'error', + 'message' => 'Identifiants invalides' + ], 401); + } + + // Log::info('Email reçu: ' . $request->email); + // Log::info('Password saisi: ' . $request->password); + // Log::info('Hachage en BDD: ' . $user->password); + + // Création du Token pour le mobile + $token = $user->createToken('android_token')->plainTextToken; + + return response([ + 'status' => 'success', + 'user' => $user, + 'token' => $token + ], 200); + } + + public function register(Request $request) + { + // 1. Validation des données (Standard Qualité) + $validator = Validator::make($request->all(), [ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users', + 'password' => 'required|string|min:8|confirmed', + ]); + + + Log::info('Tentative de création', $request->all()); + + if ($validator->fails()) { + Log::info( $validator->errors()); + return response()->json([ + 'status' => 'error', + 'errors' => $validator->errors() + ], 422); + } + + // 2. Création de l'utilisateur (Respect du MCD) + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), // Chiffrement obligatoire + ]); + + // 3. Génération du token pour le mobile + $token = $user->createToken('android_token')->plainTextToken; + + return response()->json([ + 'status' => 'success', + 'message' => 'Compte créé avec succès', + 'user' => $user, + 'token' => $token + ], 201); + } + + public function updateProfile(Request $request) + { + $user = $request->user(); + + $request->validate([ + 'current_password' => 'required', + 'email' => [ + 'sometimes', + 'email', + Rule::unique('users')->ignore($user->id) // Empêche les doublons en BDD + ], + ]); + + // 2. Vérification de sécurité (RGPD/Confidentialité) + if (!Hash::check($request->current_password, $user->password)) { + return response()->json([ + 'status' => 'error', + 'message' => 'Le mot de passe actuel est incorrect' + ], 403); + } + + // 3. Mise à jour dynamique (Evolutivité) + $data = $request->except(['current_password', 'password', 'id']); + $user->fill($data); + $user->save(); + + return response()->json([ + 'status' => 'success', + 'user' => $user + ]); + } +} \ No newline at end of file diff --git a/WEB/app/Http/Controllers/Api/EmotionController.php b/WEB/app/Http/Controllers/Api/EmotionController.php new file mode 100644 index 0000000..35b3f74 --- /dev/null +++ b/WEB/app/Http/Controllers/Api/EmotionController.php @@ -0,0 +1,42 @@ +user()->emotionRecords()->latest()->get(); + } + + public function store(Request $request) + { + Log::info('Tentative d\'enregistrement d\'émotion', [ + 'user' => $request->user()->id, + 'data' => $request->all() + ]); + + try { + $validated = $request->validate([ + 'emotion_name' => 'required|string', + 'note' => 'nullable|string', + ]); + + $record = $request->user()->emotionRecords()->create([ + 'emotion' => $validated['emotion_name'], + 'intensity' => 3, + 'note' => $validated['note'] ?? 'Saisie depuis CESIZen', + ]); + + return response()->json($record, 201); + } catch (\Exception $e) { + Log::error('Erreur enregistrement émotion : ' . $e->getMessage()); + return response()->json(['error' => 'Erreur serveur'], 500); + } + } +} diff --git a/WEB/app/Http/Controllers/Api/StressDiagnosticController.php b/WEB/app/Http/Controllers/Api/StressDiagnosticController.php new file mode 100644 index 0000000..272970d --- /dev/null +++ b/WEB/app/Http/Controllers/Api/StressDiagnosticController.php @@ -0,0 +1,22 @@ +json(StressEvent::all(), 200); + } + + public function getEvents() + { + // Retourne la liste des événements pour le module Diagnostic + return response()->json(StressEvent::all()); + } +} diff --git a/WEB/app/Http/Controllers/Controller.php b/WEB/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..8677cd5 --- /dev/null +++ b/WEB/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ + '45 min', + 'stress_status' => 'Stable', + 'last_diagnostic' => 'il y a 3 jours' + ]; + + return view('welcome', compact('user', 'stats')); + } +} diff --git a/WEB/app/Http/Controllers/Web/AuthController.php b/WEB/app/Http/Controllers/Web/AuthController.php new file mode 100644 index 0000000..e7b653f --- /dev/null +++ b/WEB/app/Http/Controllers/Web/AuthController.php @@ -0,0 +1,66 @@ +validate([ + 'email' => ['required', 'email'], + 'password' => ['required'], + ]); + + if (Auth::attempt($credentials)) { + $request->session()->regenerate(); + return redirect()->intended('/'); + } + + return back()->withErrors([ + 'email' => 'Les identifiants fournis ne correspondent pas à nos enregistrements.', + ])->onlyInput('email'); + } + + public function showRegister() + { + return view('auth.register'); + } + + public function register(Request $request) + { + $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => ['required', 'string', 'min:8', 'confirmed'], + ]); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + ]); + + Auth::login($user); + + return redirect('/'); + } + + public function logout(Request $request) + { + Auth::logout(); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + return redirect('/login'); + } +} diff --git a/WEB/app/Http/Controllers/Web/DiagnosticController.php b/WEB/app/Http/Controllers/Web/DiagnosticController.php new file mode 100644 index 0000000..ca3c660 --- /dev/null +++ b/WEB/app/Http/Controllers/Web/DiagnosticController.php @@ -0,0 +1,30 @@ +has('events')) { + $totalPoints = StressEvent::whereIn('id', $request->events)->sum('points'); + } + + // Ici on pourrait enregistrer le résultat dans une table 'diagnostic_results' + // Pour l'instant on redirige avec le score + return redirect()->back()->with('score', $totalPoints); + } +} diff --git a/WEB/app/Http/Controllers/Web/EmotionController.php b/WEB/app/Http/Controllers/Web/EmotionController.php new file mode 100644 index 0000000..29f338a --- /dev/null +++ b/WEB/app/Http/Controllers/Web/EmotionController.php @@ -0,0 +1,35 @@ +latest()->get(); + return view('emotions.index', compact('records')); + } + + public function store(Request $request) + { + $request->validate([ + 'emotion' => 'required|string', + 'intensity' => 'required|integer|min:1|max:5', + 'note' => 'nullable|string' + ]); + + EmotionRecord::create([ + 'user_id' => Auth::id(), + 'emotion' => $request->emotion, + 'intensity' => $request->intensity, + 'note' => $request->note + ]); + + return redirect()->back()->with('success', 'Émotion enregistrée'); + } +} diff --git a/WEB/app/Http/Controllers/Web/ProfileController.php b/WEB/app/Http/Controllers/Web/ProfileController.php new file mode 100644 index 0000000..8a4d817 --- /dev/null +++ b/WEB/app/Http/Controllers/Web/ProfileController.php @@ -0,0 +1,71 @@ + Auth::user(), + ]); + } + + public function update(Request $request) + { + $user = Auth::user(); + + $validated = $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . $user->id], + ]); + + $user->fill($validated); + + if ($user->isDirty('email')) { + $user->email_verified_at = null; + } + + $user->save(); + + return redirect()->route('profile.index')->with('status', 'profile-updated'); + } + + public function updatePassword(Request $request) + { + $validated = $request->validateWithBag('updatePassword', [ + 'current_password' => ['required', 'current_password'], + 'password' => ['required', Password::defaults(), 'confirmed'], + ]); + + $request->user()->update([ + 'password' => Hash::make($validated['password']), + ]); + + return redirect()->route('profile.index')->with('status', 'password-updated'); + } + + public function destroy(Request $request) + { + $request->validateWithBag('userDeletion', [ + 'password' => ['required', 'current_password'], + ]); + + $user = $request->user(); + + Auth::logout(); + + $user->delete(); + + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/WEB/app/Http/Controllers/Web/RelaxationController.php b/WEB/app/Http/Controllers/Web/RelaxationController.php new file mode 100644 index 0000000..670c55c --- /dev/null +++ b/WEB/app/Http/Controllers/Web/RelaxationController.php @@ -0,0 +1,38 @@ +favoritedBy->pluck('id')->toArray() : []; + return view('relaxation.index', compact('activities', 'favorites')); + } + + public function toggleFavorite($id) + { + $userId = Auth::id(); + $favorite = Favorite::where('user_id', $userId) + ->where('relaxation_activity_id', $id) + ->first(); + + if ($favorite) { + $favorite->delete(); + return response()->json(['status' => 'removed']); + } else { + Favorite::create([ + 'user_id' => $userId, + 'relaxation_activity_id' => $id + ]); + return response()->json(['status' => 'added']); + } + } +} diff --git a/WEB/app/Models/Activite.php b/WEB/app/Models/Activite.php new file mode 100644 index 0000000..2723f8a --- /dev/null +++ b/WEB/app/Models/Activite.php @@ -0,0 +1,10 @@ +belongsTo(User::class); + } +} diff --git a/WEB/app/Models/EvenementStress.php b/WEB/app/Models/EvenementStress.php new file mode 100644 index 0000000..0f9341d --- /dev/null +++ b/WEB/app/Models/EvenementStress.php @@ -0,0 +1,10 @@ +belongsToMany(User::class, 'favorites', 'id_activite', 'id_user'); + } +} diff --git a/WEB/app/Models/ResultatDiag.php b/WEB/app/Models/ResultatDiag.php new file mode 100644 index 0000000..9a265c1 --- /dev/null +++ b/WEB/app/Models/ResultatDiag.php @@ -0,0 +1,10 @@ + */ + use HasFactory, Notifiable; + use HasApiTokens, HasFactory, Notifiable; + + /** + * The attributes that are mass assignable. + * + * @var list + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var list + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + } + + public function emotionRecords() + { + return $this->hasMany(EmotionRecord::class); + } + + public function favoritedBy() + { + return $this->belongsToMany(RelaxationActivity::class, 'favorites', 'id_user', 'id_activite'); + } +} diff --git a/WEB/app/Providers/AppServiceProvider.php b/WEB/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..452e6b6 --- /dev/null +++ b/WEB/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ +handleCommand(new ArgvInput); + +exit($status); diff --git a/WEB/bootstrap/app.php b/WEB/bootstrap/app.php new file mode 100644 index 0000000..c3928c5 --- /dev/null +++ b/WEB/bootstrap/app.php @@ -0,0 +1,19 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', + commands: __DIR__.'/../routes/console.php', + health: '/up', + ) + ->withMiddleware(function (Middleware $middleware): void { + // + }) + ->withExceptions(function (Exceptions $exceptions): void { + // + })->create(); diff --git a/WEB/bootstrap/cache/.gitignore b/WEB/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/WEB/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/WEB/bootstrap/providers.php b/WEB/bootstrap/providers.php new file mode 100644 index 0000000..fc94ae6 --- /dev/null +++ b/WEB/bootstrap/providers.php @@ -0,0 +1,7 @@ +=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "shasum": "" + }, + "require": { + "php": "^8.2|^8.3|^8.4|^8.5" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-12-03T09:33:47+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:43:20+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.9.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2026-03-10T16:41:02+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:27:06+00:00" + }, + { + "name": "laravel/framework", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "dac16d424b59debb2273910dde88eb7050a2a709" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/dac16d424b59debb2273910dde88eb7050a2a709", + "reference": "dac16d424b59debb2273910dde88eb7050a2a709", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12|^0.13|^0.14", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.8.1", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/reflection": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^10.9.0", + "pda/pheanstalk": "^5.0.6|^7.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.1.41", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0|^1.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-26T14:51:54+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.16", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/11e7d5f93803a2190b00e145142cb00a33d17ad2", + "reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0|^8.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.16" + }, + "time": "2026-03-23T14:35:33+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v4.3.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76", + "reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^11.0|^12.0|^13.0", + "illuminate/contracts": "^11.0|^12.0|^13.0", + "illuminate/database": "^11.0|^12.0|^13.0", + "illuminate/support": "^11.0|^12.0|^13.0", + "php": "^8.2", + "symfony/console": "^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "orchestra/testbench": "^9.15|^10.8|^11.0", + "phpstan/phpstan": "^1.10" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2026-02-07T17:19:31+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.12", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "a6abb4e54f6fcd3138120b9ad497f0bd146f9919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/a6abb4e54f6fcd3138120b9ad497f0bd146f9919", + "reference": "a6abb4e54f6fcd3138120b9ad497f0bd146f9919", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2026-04-14T13:33:34+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.11.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.11.1" + }, + "time": "2026-02-06T14:12:35+00:00" + }, + { + "name": "league/commonmark", + "version": "2.8.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.9-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2026-03-19T13:16:38+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.33.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "570b8871e0ce693764434b29154c54b434905350" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/570b8871e0ce693764434b29154c54b434905350", + "reference": "570b8871e0ce693764434b29154c54b434905350", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.33.0" + }, + "time": "2026-03-25T07:59:30+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.31.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" + }, + "time": "2026-01-23T15:30:45+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/uri", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-15T20:22:25+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-08T20:05:35+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.10.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8 || ^2.0", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2026-01-02T08:56:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.11.4", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbonphp.github.io/carbon/", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2026-04-07T09:57:54+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.5", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.5" + }, + "require-dev": { + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.5" + }, + "time": "2026-02-23T03:47:12+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.3" + }, + "time": "2026-02-13T03:05:33+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.4.4 || ^8.0.4" + }, + "require-dev": { + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5 || ^8.0.4", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "It's like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2026-02-16T23:10:27+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.5", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:41:33+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.22", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3be75d5b9244936dd4ac62ade2bfb004d13acf0f", + "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.22" + }, + "time": "2026-03-22T23:03:24+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "8429c78ca35a09f27565311b98101e2826affde0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.2" + }, + "time": "2025-12-14T04:43:48+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T13:54:39+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "b055f228a4178a1d6774909903905e3475f3eac8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b055f228a4178a1d6774909903905e3475f3eac8", + "reference": "b055f228a4178a1d6774909903905e3475f3eac8", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "f57b899fa736fd71121168ef268f23c206083f0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f57b899fa736fd71121168ef268f23c206083f0a", + "reference": "f57b899fa736fd71121168ef268f23c206083f0a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T13:54:39+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e0be088d22278583a82da281886e8c3592fbf149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", + "reference": "e0be088d22278583a82da281886e8c3592fbf149", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "9381209597ec66c25be154cbf2289076e64d1eab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9381209597ec66c25be154cbf2289076e64d1eab", + "reference": "9381209597ec66c25be154cbf2289076e64d1eab", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "017e76ad089bac281553389269e259e155935e1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/017e76ad089bac281553389269e259e155935e1a", + "reference": "017e76ad089bac281553389269e259e155935e1a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-31T20:57:01+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/f6ea532250b476bfc1b56699b388a1bdbf168f62", + "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/6df02f99998081032da3407a8d6c4e1dcb5d4379", + "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T14:11:46+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/ad1b7b9092976d6c948b8a187cec9faaea9ec1df", + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T17:25:58+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T17:25:58+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T18:47:49+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "2c408a6bb0313e6001a83628dc5506100474254e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/2c408a6bb0313e6001a83628dc5506100474254e", + "reference": "2c408a6bb0313e6001a83628dc5506100474254e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:50:15+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/process", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "60f19cd3badc8de688421e21e4305eba50f8089a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a", + "reference": "60f19cd3badc8de688421e21e4305eba50f8089a", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", + "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "114ac57257d75df748eda23dd003878080b8e688" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/114ac57257d75df748eda23dd003878080b8e688", + "reference": "114ac57257d75df748eda23dd003878080b8e688", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "33600f8489485425bfcddd0d983391038d3422e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/33600f8489485425bfcddd0d983391038d3422e7", + "reference": "33600f8489485425bfcddd0d983391038d3422e7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/6883ebdf7bf6a12b37519dbc0df62b0222401b56", + "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T13:44:50+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0" + }, + "time": "2025-12-02T11:56:42+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.3", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "955e7815d677a3eaa7075231212f2110983adecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc", + "reference": "955e7815d677a3eaa7075231212f2110983adecc", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.4", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:49:13+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0|^13.0", + "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0", + "illuminate/log": "^10.24|^11.0|^12.0|^13.0", + "illuminate/process": "^10.24|^11.0|^12.0|^13.0", + "illuminate/support": "^10.24|^11.0|^12.0|^13.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0|^13.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0", + "pestphp/pest": "^2.20|^3.0|^4.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0|^8.0", + "symfony/yaml": "^6.3|^7.0|^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2026-02-09T13:44:54+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/bdec963f53172c5e36330f3a400604c69bf02d39", + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.94.2", + "illuminate/view": "^12.54.1", + "larastan/larastan": "^3.9.3", + "laravel-zero/framework": "^12.0.5", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest": "^3.8.6", + "shipfastlabs/agent-detector": "^1.1.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "dev", + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2026-03-12T15:51:39+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.57.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "fa8d057b6e9310380ccbc3a209ed7f927d54f648" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/fa8d057b6e9310380ccbc3a209ed7f927d54f648", + "reference": "fa8d057b6e9310380ccbc3a209ed7f927d54f648", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", + "phpstan/phpstan": "^2.0" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2026-04-14T13:32:04+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.9.3", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "b0d8ab95b29c3189aeeb902d81215231df4c1b64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b0d8ab95b29c3189aeeb902d81215231df4c1b64", + "reference": "b0d8ab95b29c3189aeeb902d81215231df4c1b64", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", + "php": "^8.2.0", + "symfony/console": "^7.4.8 || ^8.0.4" + }, + "conflict": { + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.9.3", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.2.0", + "laravel/pint": "^1.29.0", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.0.0", + "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2026-04-06T19:25:53+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.12", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.1", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.3.1" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.46" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-12-24T07:01:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-02-02T13:52:54+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.55", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00", + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.12", + "phpunit/php-file-iterator": "^5.1.1", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.3", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.2", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/recursion-context": "^6.0.3", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.55" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2026-02-18T12:37:06+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-01-24T09:26:40+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-05-21T11:55:47+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:12:51+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:42:22+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:55:48+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "c58fdf7b3d6c2995368264c49e4e8b05bcff2883" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c58fdf7b3d6c2995368264c49e4e8b05bcff2883", + "reference": "c58fdf7b3d6c2995368264c49e4e8b05bcff2883", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2" + }, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/WEB/config/app.php b/WEB/config/app.php new file mode 100644 index 0000000..423eed5 --- /dev/null +++ b/WEB/config/app.php @@ -0,0 +1,126 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'UTC', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + +]; diff --git a/WEB/config/auth.php b/WEB/config/auth.php new file mode 100644 index 0000000..d7568ff --- /dev/null +++ b/WEB/config/auth.php @@ -0,0 +1,117 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/WEB/config/cache.php b/WEB/config/cache.php new file mode 100644 index 0000000..b32aead --- /dev/null +++ b/WEB/config/cache.php @@ -0,0 +1,117 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", + | "failover", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + 'failover' => [ + 'driver' => 'failover', + 'stores' => [ + 'database', + 'array', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + +]; diff --git a/WEB/config/database.php b/WEB/config/database.php new file mode 100644 index 0000000..64709ce --- /dev/null +++ b/WEB/config/database.php @@ -0,0 +1,184 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + 'transaction_mode' => 'DEFERRED', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + (PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + (PHP_VERSION_ID >= 80500 ? Mysql::ATTR_SSL_CA : PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => env('DB_SSLMODE', 'prefer'), + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + ], + +]; diff --git a/WEB/config/filesystems.php b/WEB/config/filesystems.php new file mode 100644 index 0000000..37d8fca --- /dev/null +++ b/WEB/config/filesystems.php @@ -0,0 +1,80 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => rtrim(env('APP_URL', 'http://localhost'), '/').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/WEB/config/logging.php b/WEB/config/logging.php new file mode 100644 index 0000000..b09cb25 --- /dev/null +++ b/WEB/config/logging.php @@ -0,0 +1,132 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => env('LOG_DEPRECATIONS_TRACE', false), + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Laravel + | utilizes the Monolog PHP logging library, which includes a variety + | of powerful log handlers and formatters that you're free to use. + | + | Available drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", "custom", "stack" + | + */ + + 'channels' => [ + + 'stack' => [ + 'driver' => 'stack', + 'channels' => explode(',', (string) env('LOG_STACK', 'single')), + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => env('LOG_DAILY_DAYS', 14), + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => env('LOG_SLACK_USERNAME', env('APP_NAME', 'Laravel')), + 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'handler_with' => [ + 'stream' => 'php://stderr', + ], + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => env('LOG_SYSLOG_FACILITY', LOG_USER), + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + + ], + +]; diff --git a/WEB/config/mail.php b/WEB/config/mail.php new file mode 100644 index 0000000..e32e88d --- /dev/null +++ b/WEB/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', env('APP_NAME', 'Laravel')), + ], + +]; diff --git a/WEB/config/queue.php b/WEB/config/queue.php new file mode 100644 index 0000000..79c2c0a --- /dev/null +++ b/WEB/config/queue.php @@ -0,0 +1,129 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", + | "deferred", "background", "failover", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + 'deferred' => [ + 'driver' => 'deferred', + ], + + 'background' => [ + 'driver' => 'background', + ], + + 'failover' => [ + 'driver' => 'failover', + 'connections' => [ + 'database', + 'deferred', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/WEB/config/sanctum.php b/WEB/config/sanctum.php new file mode 100644 index 0000000..44527d6 --- /dev/null +++ b/WEB/config/sanctum.php @@ -0,0 +1,84 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort(), + // Sanctum::currentRequestHost(), + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. This will override any values set in the token's + | "expires_at" attribute, but first-party sessions are not affected. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Token Prefix + |-------------------------------------------------------------------------- + | + | Sanctum can prefix new tokens in order to take advantage of numerous + | security scanning initiatives maintained by open source platforms + | that notify developers if they commit tokens into repositories. + | + | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning + | + */ + + 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''), + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, + 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, + 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + ], + +]; diff --git a/WEB/config/services.php b/WEB/config/services.php new file mode 100644 index 0000000..6a90eb8 --- /dev/null +++ b/WEB/config/services.php @@ -0,0 +1,38 @@ + [ + 'key' => env('POSTMARK_API_KEY'), + ], + + 'resend' => [ + 'key' => env('RESEND_API_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/WEB/config/session.php b/WEB/config/session.php new file mode 100644 index 0000000..5b541b7 --- /dev/null +++ b/WEB/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug((string) env('APP_NAME', 'laravel')).'-session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain without subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/WEB/database/.gitignore b/WEB/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/WEB/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/WEB/database/factories/UserFactory.php b/WEB/database/factories/UserFactory.php new file mode 100644 index 0000000..c4ceb07 --- /dev/null +++ b/WEB/database/factories/UserFactory.php @@ -0,0 +1,45 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/WEB/database/migrations/0000_04_21_202934_create_categories_table.php b/WEB/database/migrations/0000_04_21_202934_create_categories_table.php new file mode 100644 index 0000000..caa09a7 --- /dev/null +++ b/WEB/database/migrations/0000_04_21_202934_create_categories_table.php @@ -0,0 +1,28 @@ +id(); // id_categorie + $table->string('libelle'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('categories'); + } +}; diff --git a/WEB/database/migrations/0000_04_21_202934_create_roles_table.php b/WEB/database/migrations/0000_04_21_202934_create_roles_table.php new file mode 100644 index 0000000..4e60936 --- /dev/null +++ b/WEB/database/migrations/0000_04_21_202934_create_roles_table.php @@ -0,0 +1,28 @@ +id(); // id_role [cite: 210] + $table->string('libelle'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('roles'); + } +}; diff --git a/WEB/database/migrations/0000_04_21_202936_create_activites_table.php b/WEB/database/migrations/0000_04_21_202936_create_activites_table.php new file mode 100644 index 0000000..3a8a6de --- /dev/null +++ b/WEB/database/migrations/0000_04_21_202936_create_activites_table.php @@ -0,0 +1,32 @@ +id(); // id_activite + $table->string('titre'); + $table->text('description'); + $table->string('url_media'); + $table->boolean('est_active')->default(true); + $table->foreignId('id_categorie')->constrained('categories'); // Asso_4 + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('activites'); + } +}; diff --git a/WEB/database/migrations/0001_01_01_000000_create_users_table.php b/WEB/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..17cdebc --- /dev/null +++ b/WEB/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,51 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->foreignId('id_role')->constrained('roles'); // Asso_1 + $table->string('password'); + $table->timestamp('date_inscription')->useCurrent(); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/WEB/database/migrations/0001_01_01_000001_create_cache_table.php b/WEB/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..ed758bd --- /dev/null +++ b/WEB/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration')->index(); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/WEB/database/migrations/0001_01_01_000002_create_jobs_table.php b/WEB/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..425e705 --- /dev/null +++ b/WEB/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/WEB/database/migrations/2026_04_15_193747_create_personal_access_tokens_table.php b/WEB/database/migrations/2026_04_15_193747_create_personal_access_tokens_table.php new file mode 100644 index 0000000..40ff706 --- /dev/null +++ b/WEB/database/migrations/2026_04_15_193747_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->text('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable()->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/WEB/database/migrations/2026_04_16_195232_create_stress_events_table.php b/WEB/database/migrations/2026_04_16_195232_create_stress_events_table.php new file mode 100644 index 0000000..4d8ea4d --- /dev/null +++ b/WEB/database/migrations/2026_04_16_195232_create_stress_events_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('event_name'); // Nom de l'événement (ex: Mariage, Licenciement) + $table->integer('points'); // Valeur selon l'échelle de Holmes et Rahe + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('stress_events'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_180932_create_emotion_records_table.php b/WEB/database/migrations/2026_04_21_180932_create_emotion_records_table.php new file mode 100644 index 0000000..39ad328 --- /dev/null +++ b/WEB/database/migrations/2026_04_21_180932_create_emotion_records_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->string('emotion'); // joy, sad, angry, etc. + $table->integer('intensity'); // 1 to 5 + $table->text('note')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('emotion_records'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_180932_create_favorites_table.php b/WEB/database/migrations/2026_04_21_180932_create_favorites_table.php new file mode 100644 index 0000000..ed961ec --- /dev/null +++ b/WEB/database/migrations/2026_04_21_180932_create_favorites_table.php @@ -0,0 +1,35 @@ +foreignId('id_user')->constrained('users')->onDelete('cascade'); + + // id_activite fait référence à la table activites + // C'est ici que l'erreur se produit si le nom ne correspond pas exactement + $table->foreignId('id_activite')->constrained('activites')->onDelete('cascade'); + + $table->timestamp('date_ajout')->useCurrent(); + + // Clé primaire composée pour éviter les doublons (RGPD/Qualité) + $table->primary(['id_user', 'id_activite']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('favorites'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_180932_create_relaxation_activities_table.php b/WEB/database/migrations/2026_04_21_180932_create_relaxation_activities_table.php new file mode 100644 index 0000000..81564cc --- /dev/null +++ b/WEB/database/migrations/2026_04_21_180932_create_relaxation_activities_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('title'); + $table->string('type'); // audio, video, article + $table->string('duration')->nullable(); + $table->string('url')->nullable(); + $table->text('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('relaxation_activities'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202935_create_emotions_table.php b/WEB/database/migrations/2026_04_21_202935_create_emotions_table.php new file mode 100644 index 0000000..b2e3187 --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202935_create_emotions_table.php @@ -0,0 +1,29 @@ +id(); // id_emotion + $table->string('libelle'); + $table->foreignId('id_parent')->nullable()->constrained('emotions'); // Asso_7 + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('emotions'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202935_create_evenement_stress_table.php b/WEB/database/migrations/2026_04_21_202935_create_evenement_stress_table.php new file mode 100644 index 0000000..c8cbb0f --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202935_create_evenement_stress_table.php @@ -0,0 +1,29 @@ +id(); // id_event + $table->string('libelle'); + $table->integer('points'); // Points associés à l'échelle [cite: 126] + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('evenement_stress'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202935_create_exercice_respi_table.php b/WEB/database/migrations/2026_04_21_202935_create_exercice_respi_table.php new file mode 100644 index 0000000..a06302c --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202935_create_exercice_respi_table.php @@ -0,0 +1,31 @@ +id(); // id_respi + $table->string('nom'); + $table->integer('duree_inspi'); // Cohérence cardiaque [cite: 133] + $table->integer('duree_apnee'); // [cite: 134] + $table->integer('duree_expi'); // [cite: 135] + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('exercice_respi'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202936_create_journal_entrees_table.php b/WEB/database/migrations/2026_04_21_202936_create_journal_entrees_table.php new file mode 100644 index 0000000..55baa44 --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202936_create_journal_entrees_table.php @@ -0,0 +1,30 @@ +id(); // id_entree + $table->foreignId('id_user')->constrained('users'); // Asso_8 [cite: 98] + $table->timestamp('date_heure')->useCurrent(); + $table->text('commentaire')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('journal_entrees'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202936_create_resultat_diags_table.php b/WEB/database/migrations/2026_04_21_202936_create_resultat_diags_table.php new file mode 100644 index 0000000..5064486 --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202936_create_resultat_diags_table.php @@ -0,0 +1,31 @@ +id(); // id_resultat + $table->foreignId('id_user')->constrained('users'); // Asso_3 + $table->timestamp('date_passage')->useCurrent(); + $table->integer('score_total'); + $table->string('niveau_stress'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('resultat_diags'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202936_create_users_table_cesizen.php b/WEB/database/migrations/2026_04_21_202936_create_users_table_cesizen.php new file mode 100644 index 0000000..858f867 --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202936_create_users_table_cesizen.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users_table_cesizen'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202937_create_contenu_infos_table.php b/WEB/database/migrations/2026_04_21_202937_create_contenu_infos_table.php new file mode 100644 index 0000000..c5030e5 --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202937_create_contenu_infos_table.php @@ -0,0 +1,31 @@ +id(); // id_contenu + $table->string('titre'); + $table->text('texte_contenu'); + $table->timestamp('date_publication')->useCurrent(); + $table->foreignId('id_auteur')->constrained('users'); // Asso_2 + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('contenu_infos'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202937_create_detail_resultats_table.php b/WEB/database/migrations/2026_04_21_202937_create_detail_resultats_table.php new file mode 100644 index 0000000..fd6d35a --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202937_create_detail_resultats_table.php @@ -0,0 +1,28 @@ +foreignId('id_resultat')->constrained('resultat_diags')->onDelete('cascade'); + $table->foreignId('id_event')->constrained('evenement_stress'); + $table->primary(['id_resultat', 'id_event']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('detail_resultats'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202937_create_emotions_ressenties_table.php b/WEB/database/migrations/2026_04_21_202937_create_emotions_ressenties_table.php new file mode 100644 index 0000000..c4c93ec --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202937_create_emotions_ressenties_table.php @@ -0,0 +1,29 @@ +foreignId('id_entree')->constrained('journal_entrees')->onDelete('cascade'); + $table->foreignId('id_emotion')->constrained('emotions'); + $table->integer('intensite'); + $table->primary(['id_entree', 'id_emotion']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('emotions_ressenties'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_202937_create_favoris_table.php b/WEB/database/migrations/2026_04_21_202937_create_favoris_table.php new file mode 100644 index 0000000..79aeb2f --- /dev/null +++ b/WEB/database/migrations/2026_04_21_202937_create_favoris_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('favoris'); + } +}; diff --git a/WEB/database/migrations/2026_04_21_203243_create_historique_respi_table.php b/WEB/database/migrations/2026_04_21_203243_create_historique_respi_table.php new file mode 100644 index 0000000..aa68a79 --- /dev/null +++ b/WEB/database/migrations/2026_04_21_203243_create_historique_respi_table.php @@ -0,0 +1,27 @@ +id(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('historique_respi'); + } +}; diff --git a/WEB/database/seeders/DatabaseSeeder.php b/WEB/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..7eee086 --- /dev/null +++ b/WEB/database/seeders/DatabaseSeeder.php @@ -0,0 +1,35 @@ +create(); + $this->call([ + RoleSeeder::class, + StressEventSeeder::class, + ]); + + $adminRole = Role::where('libelle', 'Admin')->first(); + + User::create([ + 'name' => 'AdminCESI', + 'email' => 'admin@cesizen.fr', + 'password' => Hash::make('okokokok'), // Toujours hacher ! + 'id_role' => $adminRole->id, + ]); + } +} diff --git a/WEB/database/seeders/RoleSeeder.php b/WEB/database/seeders/RoleSeeder.php new file mode 100644 index 0000000..cb48f07 --- /dev/null +++ b/WEB/database/seeders/RoleSeeder.php @@ -0,0 +1,24 @@ + 'Admin'], + ['libelle' => 'Utilisateur'], + ]; + + foreach ($roles as $role) { + \App\Models\Role::create($role); + } + } +} diff --git a/WEB/database/seeders/StressEventSeeder.php b/WEB/database/seeders/StressEventSeeder.php new file mode 100644 index 0000000..8eef590 --- /dev/null +++ b/WEB/database/seeders/StressEventSeeder.php @@ -0,0 +1,62 @@ + 'Décès du conjoint', 'points' => 100], + ['event_name' => 'Divorce', 'points' => 73], + ['event_name' => 'Séparation conjugale', 'points' => 65], + ['event_name' => 'Emprisonnement', 'points' => 63], + ['event_name' => 'Décès d’un proche parent', 'points' => 63], + ['event_name' => 'Blessure ou maladie grave', 'points' => 53], + ['event_name' => 'Mariage', 'points' => 50], + ['event_name' => 'Perte d’emploi', 'points' => 47], + ['event_name' => 'Réconciliation conjugale', 'points' => 45], + ['event_name' => 'Retraite', 'points' => 45], + ['event_name' => 'Changement de santé d’un membre de la famille', 'points' => 44], + ['event_name' => 'Grossesse', 'points' => 40], + ['event_name' => 'Difficultés sexuelles', 'points' => 39], + ['event_name' => 'Arrivée d’un nouveau membre dans la famille', 'points' => 39], + ['event_name' => 'Réorganisation professionnelle', 'points' => 39], + ['event_name' => 'Changement de situation financière', 'points' => 38], + ['event_name' => 'Décès d’un ami proche', 'points' => 37], + ['event_name' => 'Changement de métier', 'points' => 36], + ['event_name' => 'Augmentation de disputes conjugales', 'points' => 35], + ['event_name' => 'Hypothèque importante', 'points' => 31], + ['event_name' => 'Saisie de biens', 'points' => 30], + ['event_name' => 'Changement de responsabilités professionnelles', 'points' => 29], + ['event_name' => 'Départ d’un enfant du foyer', 'points' => 29], + ['event_name' => 'Problèmes avec la belle-famille', 'points' => 29], + ['event_name' => 'Succès personnel remarquable', 'points' => 28], + ['event_name' => 'Conjoint commence ou arrête de travailler', 'points' => 26], + ['event_name' => 'Début ou fin d’études', 'points' => 26], + ['event_name' => 'Changement de conditions de vie', 'points' => 25], + ['event_name' => 'Révision d’habitudes personnelles', 'points' => 24], + ['event_name' => 'Problèmes avec le supérieur hiérarchique', 'points' => 23], + ['event_name' => 'Changement d’horaires ou de conditions de travail', 'points' => 20], + ['event_name' => 'Déménagement', 'points' => 20], + ['event_name' => 'Changement d’école', 'points' => 20], + ['event_name' => 'Changement d’activités sociales', 'points' => 18], + ['event_name' => 'Petit prêt ou hypothèque', 'points' => 17], + ['event_name' => 'Changement d’habitudes de sommeil', 'points' => 16], + ['event_name' => 'Changement d’habitudes alimentaires', 'points' => 15], + ['event_name' => 'Vacances', 'points' => 13], + ['event_name' => 'Fêtes de fin d’année', 'points' => 12], + ['event_name' => 'Petites infractions à la loi', 'points' => 11], + ]; + + foreach ($events as $event) { + \App\Models\StressEvent::create($event); + } + } +} diff --git a/WEB/package-lock.json b/WEB/package-lock.json new file mode 100644 index 0000000..f729de6 --- /dev/null +++ b/WEB/package-lock.json @@ -0,0 +1,2424 @@ +{ + "name": "WEB", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "tailwindcss": "^4.0.0", + "vite": "^7.0.7" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz", + "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.4" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz", + "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-x64": "4.2.4", + "@tailwindcss/oxide-freebsd-x64": "4.2.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-x64-musl": "4.2.4", + "@tailwindcss/oxide-wasm32-wasi": "4.2.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz", + "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz", + "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz", + "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz", + "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz", + "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz", + "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz", + "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz", + "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz", + "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz", + "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", + "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz", + "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.4.tgz", + "integrity": "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.4", + "@tailwindcss/oxide": "4.2.4", + "tailwindcss": "4.2.4" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.1.tgz", + "integrity": "sha512-WOG+Jj8ZOvR0a3rAn+Tuf1UQJRxw5venr6DgdbJzngJE3qG7X0kL83CZGpdHMxEm+ZK3seAbvFsw4FfOfP9vxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/laravel-vite-plugin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-2.1.0.tgz", + "integrity": "sha512-z+ck2BSV6KWtYcoIzk9Y5+p4NEjqM+Y4i8/H+VZRLq0OgNjW2DqyADquwYu5j8qRvaXwzNmfCWl1KrMlV1zpsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.1.0" + }, + "bin": { + "clean-orphaned-assets": "bin/clean.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^7.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.2", + "@rollup/rollup-android-arm64": "4.60.2", + "@rollup/rollup-darwin-arm64": "4.60.2", + "@rollup/rollup-darwin-x64": "4.60.2", + "@rollup/rollup-freebsd-arm64": "4.60.2", + "@rollup/rollup-freebsd-x64": "4.60.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", + "@rollup/rollup-linux-arm64-gnu": "4.60.2", + "@rollup/rollup-linux-arm64-musl": "4.60.2", + "@rollup/rollup-linux-loong64-gnu": "4.60.2", + "@rollup/rollup-linux-loong64-musl": "4.60.2", + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", + "@rollup/rollup-linux-ppc64-musl": "4.60.2", + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", + "@rollup/rollup-linux-riscv64-musl": "4.60.2", + "@rollup/rollup-linux-s390x-gnu": "4.60.2", + "@rollup/rollup-linux-x64-gnu": "4.60.2", + "@rollup/rollup-linux-x64-musl": "4.60.2", + "@rollup/rollup-openbsd-x64": "4.60.2", + "@rollup/rollup-openharmony-arm64": "4.60.2", + "@rollup/rollup-win32-arm64-msvc": "4.60.2", + "@rollup/rollup-win32-ia32-msvc": "4.60.2", + "@rollup/rollup-win32-x64-gnu": "4.60.2", + "@rollup/rollup-win32-x64-msvc": "4.60.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", + "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/vite": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-full-reload": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", + "integrity": "sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + } + }, + "node_modules/vite-plugin-full-reload/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/WEB/package.json b/WEB/package.json new file mode 100644 index 0000000..7686b29 --- /dev/null +++ b/WEB/package.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://www.schemastore.org/package.json", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "tailwindcss": "^4.0.0", + "vite": "^7.0.7" + } +} diff --git a/WEB/phpunit.xml b/WEB/phpunit.xml new file mode 100644 index 0000000..e7f0a48 --- /dev/null +++ b/WEB/phpunit.xml @@ -0,0 +1,36 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + + diff --git a/WEB/public/.htaccess b/WEB/public/.htaccess new file mode 100644 index 0000000..b574a59 --- /dev/null +++ b/WEB/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/WEB/public/favicon.ico b/WEB/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/WEB/public/img/CesiZen logo.png b/WEB/public/img/CesiZen logo.png new file mode 100644 index 0000000000000000000000000000000000000000..67288c11f32c7c8e02b012b442f9af0e660f82d3 GIT binary patch literal 6852 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 literal 0 HcmV?d00001 diff --git a/WEB/public/img/CesiZen nom.png b/WEB/public/img/CesiZen nom.png new file mode 100644 index 0000000000000000000000000000000000000000..d0eab94a09bebaea963f457e33ab43ebcfdb0b98 GIT binary patch literal 6912 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 literal 0 HcmV?d00001 diff --git a/WEB/public/img/CesiZen.png b/WEB/public/img/CesiZen.png new file mode 100644 index 0000000000000000000000000000000000000000..78878ce646895b74d462541e79b37648e325986b GIT binary patch literal 13917 zcmXYYRajh2(=F~A+ye>jKDa}0hu{!w@WEXN2~Kd=0E26ACqQt5JA+G*L4)V;{@=OS za9VjjW3CYqYl=Avg9)xpMKO&v%Ln$Kaa10b(Su_@%cdy>}R(BUh1jK{SVd{k= zR#q^+Yt*pVSci|HO-okqOj(`@dq{XGbZqf6@h#{?qjX5YC;Px?@r)nXCs=3eS9?1< z_8aOTDbziel>Iege1M`FMZe;8lg;};gTcQMLP$5?-_eSmyMOomV157zY zk?PU{kS}y22fsz~{hHO?NzCD&y@3S09M_a~EvtxuAC>`xIG-JnumfxekQAVw5 zY(#rn6Cb5ps$db+FNHR_fllD=)pvi2`yTN3LuPtw6teSDMnQPs5A>uE2{RYq($0m8 zf~wrc#bRFN%6BDuPOp2zvgV9|`g#EC4f}~1Jv+fmI=E1=XHpUNG_T9W;K2IKex~|- zZGQ07HGv`O^0ffh@NxhK>`d%$?CMl(Y7&lQZ_%`K;g+~#N9P>GZn%bKA7#O6AjfQQ zK5~0}Z7lXE&+lz;o<)Q3pW35l7yDD!Hyq)Y$XC}fGhuyFhmUau-|y^(>B;k)1phh^?(CTDnKDt>~VqAa>0(y*r;EEZL!PM59t z{0NCwymJ*}lwhSGMEQbXl62x=9L8)ODVGz^H8F>?Gp!eHUn0|T`nx(t)A6Xe#U}~C zr4xRA%MHNvc~q|zsz1^Lw^sRqwzUa`<#tj!NT2<*P6SnAILeSn+zwBaGd34N-P)<) zJBusO*OyW1FKw3)N&fT(a_?MiIECe5Y;3$2PBRPz`BfSf3BD9rNd)J)iDn1kReOwr zi`RwoXA5x~J$-y%*19P|r8fL5x1W&|%qifTm6uKjK`y+i7}W{UkQvue!;|b%er+dm z(rJEpbVEdF<9Z$1_zT9DUVr)?q~K7_k$=j8m;_(xpgsZ5(cd6E36fdQeQ1RfRmSZp z8oM*+h_y?U8ABJ{rWr~vo?V03Mfkw?2xb(VQNQ<9OpW`}1^&a;cmO+*5$O56D@zR* zG1nxqd&Y)ao!7!o?y9>r;BD+Vm;U)&$UPz=*BM?pmjmB>2MS6T(K=Ge96u4AW)asL zAN0K-Y_(P`==5ofxZK9(p(m3yp#?cqr*PjtJN?dfUXcInyv^2cDUd7wQy-W*qFIuj@qWxL3 zPKu4Zs-ONr)Zl4<0QE55JEczPR&Az3$zA9Cp71tJ4gYb#W6*UBX#M-Dt-(T+I#D6-)eI&BqMyi)n}UNe({2+t#fxsYv>8duObx z5F?+H)jXLoc4HJQFe0`BtRbs2l@Go zkiiM}neR+|tj6Zz4I0w}5l-lgP3E&zLkh-WhiLHST#Uj0AE8m@htDU_|tP+^sfLdomXLxZn;5#Cm|G4m`%ygmS zDy1-{i!fJ5=mxYXFU%be4$_*8>q;D2p9(6to`l$OwSxpv%h%jNISZ+_M|^yC+j&`V zm2;L-o+m;Yc>%=y^3NA@p;~=(Dt9}?N(qv!6(jD%<$El6bLFXvR_ROGrS4R@-8OSC zX7lC0f|+y4rqA*B*Edtz5Q0)Za>1F937M#@6+g*I?7ok)%acfZ$fvUdf56B!VF25k z_DdlhmXc&w1~U)_$TGH!f1B z(zhkY6x%}x{9W3vC|-*{`w~uoK2@hkD(&?YL3Jj~p`N+7m5ow*W@su?4`^66B_jd3 z&HDjJbus})w6c7MEF5lN+15R&D9sDEbhM!1`38fvYLc8~AAGT#cH{&B8#vvg+zW_R z`j^UDtY396M9xo3=~Q6uETiqnOy761h)$Axac5{LL@YXFn$S}|a-F&BI~)W?gP5Wr z8j;iW@*!nR=l6hKd?Do5pdhNZxwQ|R9AM};Z+1%Q+>pTw;`9?}!mu>LC~WJ5U-j#} zzT{2ZwRNGp&5j?T@bh?R-Vk5SoO-WBB!^WfP^cKaI4MSDPcp4a4Csv>k+c4KuZ~(t zEhqa+N^`}6@C50^ecqH%=oYAai(=1g-=mWbz`w;h;hx_rlg>)UO?YD_nH)zPeZci zwa@TBLRKv@1E_55bwpR79{W^Z7}XWqRC0-4pAgaOxAsu*oNCZyajjpQfK7TA6yc8$ z7k>Wa>X?09r;1oY>UM+MOlEz~;{~vHxmT;?GF1$x8 zloGKK7`x-CM;{9Y#nslY91iwqNK-MD78NBoy>Qh2BHhhjUrBtsU>rQ7<%dD|n}u>9 z)FFEDkHNrW)BX-1@~u=#@f6{At>UA8WKd;bKt`cb={4O_R2;Bpp3t(B_wP7Rpu)~b zos5I+tG_*)=*PtvR<9a)W1T>CRm%Kd(3(xB)zZR03mJg6ea;7mlN>M`o>E`Fky{dY z4jWq}=6B_X&j4ywqSoJ-7&ysk$2`j*Zj7jtl632(P%rTO4av*1zCrB&1 zV3)ItD}D7xJ6+h6>K|!OT-KDSfpZjVtdI#f#jMyef9FU zdR@i^Qo|pC95`e>cJ^?M)6>45w(iR(6~$sb_r%?)P@Av? z@>S7ANG905zQBFHHv4l|v=rExu#}#iRot;jWHxkFRzuEEv8Zn=PqRM5Tfq%%<|p`2 zYJLBUsVyXyZG2j*#tQ8Ih@386F0)V!G0l7|qc5B)hWNa~#mvevwfpefquXM@On~B=n#Sts>qyznX zc4JBR`j05R4lL{>xrDhL{M$rmqZ^}-U>5quFJ_!C7=+@jPt%$qM-#FcN`^!E5Zda7 zo50mHn8$(5XCuEjB6uJ2;t%g~Q~O@+M>Bi~7z}@W29^nzvTIV)Y{cnVX4n|%eq0xq ztzoC{k;v;@xFD{QfNU(+6l0J*5s4Nf5e_8sfS`cUf{zmLpo zb_cP%Z4YY6>|(U4evP5n7Y!yw{hb8KpI`NrUCK`q+?6SB5+fSO__WF|LM(9AFh3Cz zN}X{sJFMeFu?p3c1?w+KrD9s|EI;rTmo?zL=+Mfh1*(4G*M~zbPsXiWVWWg7Cr|v- zpui?%`1|MAmr@pb9wbxdgS@ScQkwwDp)4s2oF~E3b3yM!ED#H;8@%WdHHgQXB&{(> znLN!kE9bG~o$RsD`$1a=YuT+;K6enyzQiAV;4>2iJX@>6d!t_|+ZCsigwcma9^OvT z%No^LIO2sCY*O9Toue0~Up^q^V&%_gq)dhvCx1dU;hK7sMR%4G5-I%As;%jh00b$C z^GPv@(Wy%2?kyW7dDiEnmADHaIz2oPZ*)Vu3>g5*o#gF9$DL3s*nCR{TpD|mJr@Eb zdF`*113w}4b9ywK%b`I#YfLi-%OyLyquL|Ku!C zW}k0Wn$hs8FY1Y@vPq*sp*IE~o&sCe^LajY5_8{65)egAx3=X^j1NOK8V%2P-)`ay zwF_0LQ4d2}-+N9Q=v^VNSC~vyt1lRw)bbF^HPs?+mxV{*d2Gu7HgZ+jN88lrWcrJY z>@; zGb9gPSzD5yLZU-k$JG0V$9Q3OGCV(j5Vg%(M~#nqe2>yv5^{`~0fsLrC15>?PQ}J& zjYOOLA^HtKVLfR%k5?fQK zo2~_aptu^QJ?K7|({}R~arB*8FF@6Tm~mqLc{|6jm{lF*H%%8o2F$9HYlsfYiT<5i z2w-4Dk3q_e9+FOtU>%ge27S&qHa>hx;fbmV`D$Kl`m9SeZV5=_z<{{`!{KoyO!gH+)cPD z6=S_Ye#j%y4)fyvecRzm>V%N*lhA(+lq6EWRl1CgQO%mi@11Ycu-+l_k*+R;8m!Su zk!M-li33`nLiwqZYFTZK>`xjV3<4XI7euAswrllan0%pV&W{LiibI>r(qxG&L?zi^ z@I^Fkdb4((j%apue7k?1pH0KF;Ew+nv9btJXgMbI=ApUDv`LZb>)+4~i7qdR_+WI% zuC7>5c@-9UsVEyK3Jt90sA`me)mH3ekLy6ubQH%{dy5$<;`&UbbMT7=UBlG~J6A zRVCE;=_w2^ib88UI?fyV#NC7%(8{MRcE%3DclS4G1V&XQrc_VD*)s~(f7hz~*(u;h zY-GtN*W6G(SdpK7*1bXgNU1<8FRn&TFx6kd#b@_=)xE0EX_xP(Kg)Cfo#Wf!T&HUM zLW;Y@7ds|5Z4KbJS>j6}@4kaonK(vawz_58g#mmcP1*JXIf?ErCr$6w;i^k^QEW%`=0dGm~(@2ri#o21D z;H{&}$??qWT|s3m@RcOTo72*fPdDTDvN?|0P@%yuwsG1m(|4i^l=-IJ>dk?~6b<1* zTij7W1!*v3voC2eCXEc^Y-a?23JXTpRp{Hp82c1`W0!`etTpY)KWuY+%Nba?F2ebw z_QN67&wkdko7qeJ4@~V)(coRMvI!<`p|zj)4u(LP@2{W^0hXwsDk7i#B&}HP1S$9S zz!VyidCqsHq3S}S-Pr_fJwyzoIj8=syFHz4S*e4L#`#72TCy&1Nx1UOv7PjUqi6 z-j62tN|E}k`CPjEOiMRWMHO+>UUarI^5b%5+iH!+>^Ol>gD-e|g&L7|FHxKb+G8`M z=JB<>7G~45@>ZFB!%+*(M#I9MtcUNJQr=cHseWR-cJu8)za2}i`+nwGPeN=-`sD0~ zlfZA&c0-9J2%3FJ3ifbXac!WyQYp+RA{(%2R&H;Fr_AM$yv`K^%Bw`K*=dm89>kH7 z=NH7&mMOqM zzvt(H<;DC+_DI1)mKHSy7J$LrPG?k@O*q=5ty_zl5uaH!Ois9GQNr`toMYllkD;{o zcbnx{x~5xTf-H!RPZ>%rG7}(di>Y&xV<7DusNQL#)(_tadk!0%tNP2|+C;vXPDM~s z!xt%~m-bD}9EIClD|_~8XE2EaC6uspX^=8Ekm&PDo-Pa?Ar%94xji}2kI6eznX^^$ z-eyndv)*%iX+&=EAGhzJ+Mnzhfj#yF+3MCVWU0M+E5pye;5uVqWBUH+jSje4J%3Vs!3(vriuuea|Ztq-eN7Ga95XnV;URM3I!|d_m;*!hp)^Z=AZ%tD9#Z;OE6{B7`l@k(lrI z?6da)1Ji;avsTa$H0y7JiBHhRFLw3+8l(wlD2-nRAM9pb)SHJS_b7xN>WIL)5Vw7+ zFGZsmNk~x3aiyBTh3&Hkck5I$&5+?4mVVwD6w!n$h(mZlIw~JS^ZfjLL_B!H2 z-(dmK3c{rSb#XQ`aSn;xS_?gpn05&%KKHBBJLmE_cqcl7gFY=nkkNl!=J>xc|CQn$ zQ7>FURS&F^RHcuMv}GD_7s|CefW5I7P!B}D3WKwk(JDvjYYUpNGCAExV%nb!qB2m9 z@I!X0~Rd)rsxw?XcIX{G@BoFE0@7AbsKHJRmWu{&iNjSMI@VWRw44`}` zUUn-MIBNf`?NaKNF6vf%&S1;lqPe@wsi;rQ-dBk}?fZIR6z3QtE?LAqjW#wvmYE6f z*TRRCiDz=q12q8KrbO~ujuc>L+DHU7rVyjhOApu|hYQj!j+gZ;7K$ zk5}tU?TUwVOhVXu%F6<&gGRG-3OSJ=fg=jF@S7PZ>z7&nT`)&dotXf<#BDLu^Evqa zrL>BtHI3fMP+RRTc~b*P6z#e9lH|v$5$SZHY1~&Mj*w!_c&Qi& zkgf&8$?g7}_J)%CI^o|I?lTX}MedXFQkZgzohZWyz4S(uX0WJdXN}cn_}qYoCY1Zv za4{pr2!ZNE*IjT^NZ~`g;%?Y@l%?8uxqcU-6lt+|Dmda4*1Yf?*GECjyu!=hpU?@_ zLHFdop0u}_aRW9YuAYGo&18@!!8TZd2+86*3 z=#dOix?5|QfKo1Xh5(?sH3B8ypiO%}Ldk^rM8^|43GxRvSCQJdr>OZPz&IuOGTLgw zTE~1LVgC>a#g9?M&P2JGve$^upP=7$Y6pIw<8P3}u=%r6jS_))f)51_v&?73_Lrb< z2O}?9&HEgf@gHg*r5R%`B)&lo>81=B?I46_ju2s``_1q5n?xxou?Tq~4Ck=yJO9mK z4vO5idR7udzEjEWx~>z=_)h#>u^^PG*Vn0(sRt3&4%as>2vhW*zUwN3XmAKDpy@O` z8Mmt*w`g>XsRku%;IrFPaj^_#_Eb7Axlvu@<^e_jascLu^E{1aiH3S1f<`}tM1!*k zXpg*tqPLu_H~8^Xgr*%9A7dHwv7im8SmvuoOjCepX8 zm&hWwU)T&`nn#~MgmgpxYEo#r6s8v+l#~@S6z5BcMLvq01kIa3ax?{@o?WY~*5w@F zxgF;$lDSnQ-5;qWn&S~2PSPkU}70dmAk4~-}L?Z&r+Og%(? zZHFqhfK}Wyi)()hNU>|yY5(SuQ#O@jR1QpdKI-NNu?NNi!+v} znOl3$lS-${g~c|BjXha+QRX@$*aipNHdt~hq&P3sBOS_(Uw_wvSb?>S;}y63F$C-|gSv zzll1mM}3dLPo^^dB%Oe3e2d=|a zeM|{n5ZE{^5a+^8_#0p;_asiz?i^qnlBhDyGOATuM=+a~e zei~lIL_m-+PUu616Z<9l6rmVIR=dyYIZaFbQVnI zfcU{CkaN`VUmY7x$;1n-9sTIh^EnG7_^Fy zoM;%}W1e5;$aq;OXWoSjQ*5t^_&Kg;L^u{}%>RBbzL-PYpF0oJT4`g-K<)oS1 zx6ItoAHWy5Sf{A_zOm)-9p4{`zM8C2?+aGcH}FHHWY-DFJ+Y5Gh45LStheb#Ybjna zgO9G?F7%K*2S$lCNpkhq75K=*mm_f@$fPX4s>yE%DO20(siVxT4Qn!H3kT}S?7R7X zyQ^G+mD=n4MYKKmip*GnxZU1ynwk2M<_keKFMjqL_4sBAhN?*%sZ<(;R5?`91$@C6 z{f2yCOm+42S$K!e?^)-%zip0Mb6IeTK|TW*Af`EwL0e&&VA*p6ag zhh_N!?e5%^=e$20-P$vmz3~(fz_h*RV0;wgv)5FH(tE!}7G9c<7 z=Le%CuOY!(kJLlY1xZs|r-Ca@{>a5- zXYD$aV6O}-Zln_VBInEBQLn_u_hF^G8`c6j{I@73il&Es*HvKqKnLH>29cieUu7_- zq*~<=kG!DaQ04~+@Emtdcr31PsaC<}(IT3yPS=|#_k^~f)GJ;mS!naJlI>uZ@`4+* znV223y1863H{5(M7}X{gRI`WnMwp_$QFR#q#+KpU!1?|yt*!8JO0T*p zda#-S;y;yOiu?&bT!y^>xL6E{2&XjiuZ}%%X^+HihE5qhyFr{A%RTOnTu05neG+JN zNBZ7s|l<{cLJh$Kaiz4Ps51rJ85*}`m+uk z16-RQ288@bvggA?#oBiFkijfw@JCK}(*h1%BFR?mM=tw`WRw?xRwU=RJlw6AY>t1=-?J{aVsaA> z0l3a$t)#DEho3kzA0LL6fuy!WXHKi|y^Ix-d+>1Oh^iiVeB8;D;kAx%1= zRcqS)vC!KT2P~vwzj5QUcvSR(`SNpa@Wh0avdTV)i1eO@Zqq_2e*+o1xq{yPrF-VK zCQ^}AzI&WoZQZn=*z;bY=d;&gueie|{H89*xqh7O-~vmlrKt-H zwd#wrV-7j?^>_XAAiPd0*jvC)=Gd#GfPUL*digIn3x*+@+e4jB7zjV=L|;1)k!SfP z6^reVNbbR>?Iz_=NHRexZAwbToP&yUrO5fwINyTZ#lv>v52I)#5tM{H18irul~BdC*VLh z$oV!0J^#MXCEzb|TB8`^W!Xx}%GVdiCA^+A7LeAf_6~Y-l(i#t*FTHiXI5MvbjU&S zoi=dfGB!Me7H|3z%W#$0JX7K1D7FmzimTeAtB;VYOy&G;4pxK}Tz(D3;>w=1FWN&} zPir$qSg;x~C!>8i&5AA*7NI8kN*?Qn^N-Tgk5XCsLi_&X^9tPM#mY2t%#Qd|F5iP+%dcb|j;5q%`6FQOu;^9&Js3le(nf3^Q6NfnTe zr;3zYVx*>Y!_UQ}iZs{P9$VI@;CHi z_#PQ%KAiI(|F=l$BeQR}Y?gtBN}ddDdbGN)b)YwQ;+g#iSrlEC%KTI4{mRptc98`+x_MD)w{x5$i#1w-J!4k>}MK9h`Ncz z5DlCd1UtUQtMJr>CK5TBAA(9oLXAoX%AqaMT1r!vkY44`*8eYVIJ<@tuI+gilWSNr z`JriPG%%4j-_oDJVW_hC;NGU+#IZ?FN=FodZV}H-w#^`@ntzMVWnU;g#ZFkFJVD37b3dzfHQhK{M=(+R#o%rpa);PQ&uDFtks097i`Z$V9 zA;v_h*C)hO^%EcdqJq@YU!K3YtkVY{nuAa@K;g5|k?ZNa=4$30j0WcXTYQ5Gv3ka7 zJ@i!yj&mPBt?hQ2v?X~f7tp@9DOR&0zocCL1^Z1gd#NIu>q| zA&`rWlh?XO1r($NPu?QTUx50zgy3>LBL(=K%(6-?v6+&4&!Z<)L2y#ZzctZ;RDLYw zjnjfF>uVLii*=v54GnkQS_WG!ZDR1`Fi&~>*L;lDToJgWln5|Nnl{0C{M?}0?o2kN z#DWjVZ9JEcZ-A#1YZ}An@OIsqsJ_WdP8mmsP?tmA>{}MdR+!6Exe4Xp6OIQ=0Fm<* z_a~js?g6vD2b#m|Uwn`i?@{F~oNQFQ% z5E5f+@_>H-Lk~}cR_Ggshru4nqWQJuu!LPa#R!1xW?1@RCrGt>AE|Z{lK`L{sCcm1xXr0BojD65%uI`Y5I9HR# zN0p(-5vWo`c9RQu!^wxts0+3=YTB(B_KP5p8;AvcN}|*FzzDD^1fuhqw`^=RSSgO; zj@Ua7Cl9RRgioQbvh~&p)wrU6{t!s@{IyJa!Scm>4bOPjh~CVk@gCu_thogSfEMu`f2^5i!894jD%cX9^!-O2pVD z+oU`)hQ#__gdU_tLYJ-#FvkxPv>}%Lu@{<=Qk~`bpFrnACpYwW);` z>FNp1w)KogsOOke+Pb>^xe zD^CH0LHQrp@ff=I!!rnao@my^kmjcR1~i^CTldzz<#|^E9@~Ogt*B(w&TR0 za{Ai0bGxI>SIaZG+v!=3_2wX44u(X%McypU>#_gBnj(szS+dgn0<`QnDkFt^q#0qq zQ3YjVvj88F3LmjUvVZiHpYVUNPVV^yhVoSuvMNmE+>|=}zHcDutI%(tLn8lkIurN> z@u5}=_Jr)Ui4!P6ZmNFZ+<-HMkQkB@T8$@lXQ7J~S1wPnsz0Qq?!RdL@9aLS0pu|I z&ZqqzFV}u5%swzyEQwn~@a~9jo4x&gDs^b*rT?+JtONhNn%&{sm|GPQM4Ypobk-N3 z-zE?d4&V5&D(LgKy0DaY(0F#1qYAl&2gr$BpTF>0-%_ojOOtng;wA%Xom_V&$!UVg zw+~xeMs-?~zqUkx;|ifg66Lk7BYNF+=x%R0iGSfarOMO`+H2}FibD`v3kb7u3kc?4 zMzi{HiklZqu{m_+Q(TM0B-4iuM4kaA?%nY$YZ3K#EX1a8pE>P585N}%U;^wrDB})g zs9@t8YjK~IzXdytc&qPV&>%CCEWy6Tu+i)OghKK7&&4$S)uI{R1+IY_e?e~7<}v-D z{i*z4$nnAENx-2MCkCEx$lkSy1=HCM8tt}0`gvM<`BpEB@btOr{Z7xffou2CcR4Pf z>8^m?bIMRotYQ%hhf)+b;mXwYsiq(V!Y&FQmH986Nd1#EjvO3;$>3dN zLVQ|^CxhjD>{m+DCk+s>7j}>w_}^$!T3UA-Ta7L=qJ877h>|0GDw#1!0<o1OF)* z-iO_|JO(@Ydb{fyJHR_u#D$Q(`Q&9>Jji<%RYaulavT8S^88=n1Kn z1|?guS=in?w~xK^tF(-Fn)}f(U|hMEu(gn_;P+5P0=}NS1N6(kz!R2CZBWPq zJ9;{H{+aKwz}J>f-O}jA*O<5iFU)m=`@iS#3N61M{L-q_4X+}QD8+g9DKLGDm3c*Z zGAXg+M$nI*3sZ>r(RXl z(Z`aOZM9H|U&h9!DCP9}T%Aqi;*e;Ycz$Q$Rt=1>o1EF@a@UtKQIrAiFSh+I+WI^i zGXeQ;*lQAm)dqc=p=regeY>Z!XP!+sxUsgvAHNhJmeGxUt{Qmu1=U{w**$mff=WWt z(m?!Jmz%Ti!=d27lkT^qP0jwmY-3|_l&PLBsgrx^g>=-;6~eJyt`Gk#^}YZepF3fW zi+Y(R^)#j&uUMNk7^sy>;(*@({|QG+05)wuC@ctY3~-Y9_z?hbG<`zW#n;zMRYu0sN7}&= z{@6(x3ipr+bnudqmA)+lP}dCfa)82|e6Kxra(49u39ZyO30-q_1PMWahPMs9w47XA z?;#ORW=JD*C=v!$aTLNBB=i^Js?7GU$1+0K{(|BQ z0}0*v#r4`F!-vgDSS_q_ItqQhgjpD##=DeV88g@@PQ$o_BD^>>Jd zhW}?&5076u_zPJdUsI?5l=pv2*vCA`%Sp!6$p`L-fI2bJg?|n9Qq@8@Irzd6=5VgVC)>HF8Qj{iCK&OaRc z%OE_wn4Gnp5U&1Cj=BiA$F;xATGjO*%cArT>HWu8$A2t~@;@9a!xTp5*Sr0@cm3B# zOauDW{G0JIfBen-ojjQ~k6;@2(K6t|UrZL@_=&lQjvWyJF965>2FIDLAv&@zLi}JB!fAaz?=YBhT`pk)wr+x{_1OT)1Z@tHu(w;u^+o`jc z0LM<8WD0fi)VXt)PXBiD4B%JSDP|wr+3S~O*{`tN5vmGMF>#Qq+I3uE?%f{sV zi^+-07nnl+67kq^wiB`^uU|fO`i{w&RR`~+Jl8euhuef5) z0R$^5l{HU4zWYr0XaaEl1aqEjC)fa*fXq*So9e$C|JK02HSli@{96P6*1*3t@NW(L zMFSVoXD%E8hHR_`@x6yr+`(Q_dc}p)*dD~3iG_`|jzy4M$IV zfkqT2=pcDKz0ZaI2+>f@A4==WQ(nATZ4gLx%(%Q(G>2A(A_$j(qPzD)6PiE;nwNaS z8=UJ8Oc@p166nInQ03+5#mPhC(;q?TLm3KMcDzdjtq<8LtGl@?&Z`irVwldb=lOdiqHH!csDt2*=J0-W(C z^l!5YI|7s~5eydP8LtkSx3hce!C^XI-~8CDSTlfS^6g+()k~TkLdtM@Us(s}u?OQ1fg}k{w#vImt9=%Y{}&h?tupg^KqGkCJ|u zj@rD|_5~v1EE(y)^Nl4>><=6!DY5>|ZT%5W#RUe)h+u}Z*j@HPVomJTk-%7yZ zbnD7A50U)XaMgk)_Vp%$=+lj~iZHbe1Ow-{R~MvpI2vZ1v_tuO6ycvrPxb@msVm0y z`R_Do0aQF3tvUB`qK1x%UelD=8_-Dbhqr~H>^AUnJZ*BB+fCgOAkI2ub#4SO8&e=&9~}y*5yrc@~bv_J-?xNIoy)|uk$V^ z3HzTHKt^|6TZ%cn|9UtLcoLS6=APY&^5TJVMN5kG?xQCo!##)OKPlZTe4;yX80@sytp zueR=D+Qjppr#BVXZ)Y@B5b8VTP-J$H^TmtV>i&Usnm@N>t{-5>`7_8R1}Ss+VzR|F zz8@`T+mM?qkT-V@r2@6yHOAjI)>YfU-9i zyxx{*vMp|!0M+*_uh^yFlP(AIdDZYaZru1ur!{g_B8Wb$MUHEV50DA9fQzP$G07}E z6K8KGp;hN|UecR|Kc>8v0AuE7;Ciwhqs?YtxxOU96yR{Rh(PL%I!oUQ%YF))n-W!w zH^Hp;T<_qg7Wzb|GbZzocgk??Ro?+i%oX4z!7>&W8u}c4$f4Hagl;O>UI}dWgKw+V zTD^6a46#O8z$o+sr9FvB@;J5Lx)d)EoZRYAMW~1{fP=|yRju-OMc%JLO@|jQ$KmGX2Sj5&>O4Qj!EL4jRBxI ziAS;UIGX}gK&;MhG6Czu+-SnGevMp1)VFtm%hTDVQ>6w)CiqedlV*?n8soL(W=B+3 z;!h!=%?+84?ID>2UT)e}M37}aIw|a|=B(zBU3D2bC@ zDnD&}l8`>lR)2u}7@wFr`oC;7PHA4;3w7(^0>^j=gpTp2uSkwWpsfSI8~6L*2=<%b91YP@2h# zwD~@SQH*0P1qmFDOsT4n{n;1$T#$7m#N_7Tl+8U_Xu`v#`>0v`X~Fgj-d6IelUk1* zY7Cq@r%Fn#-^i(=li5GJ@SXyqABhP^wlfA~+v9;fI_p&&Q`c7XJOd)(Quy(!a~16* zJX!_nU0G>JztXa!_0h*Q4d(ECB26~+H zmDC05$)@Im*O3s&_~N{1N>tpC-tpdD{Wwg)jAJPtJ3o(vJMVy3ltc+~U8(i8U4tlu zlT1cQYM-v9oo)!K*KFN)gDf~c<#5-HNM^zl7bfAMj%B;H@H68{8e|^#Ro?6;UacYtDScHD>gauNPbq1TC zRK$#|@8^sYIBVQP)~J61j$MQYC5OAEjc8$%NoGY0&Xcw3zB@XZo_jW|x%p*w@mZ;u zv9}dH5+jy{kC8k31ye%eesnSV;f{|rL{bsi6dP-7-CMT^x_8jOb#J-Ph34*KTdb0z z0$TJhA0Jo@xV=C{&DQ8Ew5jI|+9F476|}!^KxhyDud`%-qntk1D$np(cW3Aj-f)y9 zrH0R{$Ln1maXW#Djt3%@*2_30>u=O zRclos1vuhcg|f1>JowzrE;eH<0!gtcoT*HOnEZkFxT)2oVjEUlw8I)YKClOym%Od2 zib=~Q7sepkt~_iXOIxF^x4s@7QETp|t*b{a^Ce5I){jqn6USS_BvV~SdKYi<`m}f? zt)`B86e7Bc69-^}p>U95dObP$JKtEvnw^|CLuy8(w?i)g(=dj6?evLu+j`zAzQat) zVPm@Ll6vcijePQ8>^z>!hS@lM!a*WvHQpvbzZq3VP4gq{##n%H5}+(C68 zt@P2WP^UwiKbgq?8sKqZyaPfj*R$eUjkdkX}v~&)RM{^`(sVvWqcA?QKcGL+A zDQ|;RO5n>p19z^Tn9Ah<5r6p?W9S&);pDoyN3)xDA4}k=io#QKK2U8-uFlL3+J$i< zH7KOUlbhTTC;0m)Qq8-nZ5`U4`0#@`PJK>FjUalU3whA@t$o>g#Ir42N$h+x8|eP!(SW_| zcGB{a#D#(-D&dj?owC!5QN|nnLte)(7c{8cJB-bixhp+LsS0mYvMyfP5wx&FN zLb2VXL#Pz|?2SP_*>u?!?tYYfvuL(o-RLHBt+wzB-@G`ZD)e$i4$&h2)qMi~>V4wp zV5!JI`uh@>c3(L@8lmVJKU^^IJC{gM{koW)q|ejHQXIP=5Hlqmtp0?rQAt0UVz1dO zy1yGcVeg2dA{ts(RETNY-3&!UnwsgxCZe{xqL1k6-NySpS%!x{vM;ml(=VevO;I}= zdJB1O3vIuC%5@1ea+q5)@3ah?7IZacu1rl@b-2f~FItN->oflv8~;Uhbkt8nYRS%R zYk#JO%Ma*RGG3;*ne{C4Y6-#Iz`z~l2FnnEjs!VGx$;EwUC=gvyuAU+#)npvjf1MX zeA4I=HC2fywhEZipHwA12Z%U1Lj=-aq^Dwj0jE7D1N93awmD zqpHz>3K-uR{urS$hoo~JpuF*WUyL$@^YWm=a67cbAZFKmJ5r^W&Ns4bUBCA$kC<%UY6d5s=24}D{NWe=dC4u+>VY0~LLw91K)jaN$J z2^4Y80F(8zkwTm1^Vp$7dzURusosv&inaW6(n;Z?)1ks0M}S1nRfd|6CbhnH{{l4` zRJ4}jkeIkv~cj;Ml_!gYW(c?GNqc7#RBbjJn@P!3Ka6pS& zA!{Ai^RsmEjc^+8JV^fiva_uG5n#QKH#W1VF$Xsq`gE&qNs4U7I}w838kJSw?7>!u#{*+75vuM*tcznLHTzZ8><{VH;j_I7;rrH?jBZqo;Z^vyJ;= z_hH3H0Ah^{A$vXmv{bsUG@`K;+Ov&@&uks~9`J;Pgi~zcha`L`O;8KJ;uJaESjMPW zhJT@li`LNd=LhMOBLL50_!g~e#buYjFIZBObu*Tb=@TZJwgYO)(A3S$6x<%QJ_6Ku z+6U|XRgBQ3y|gv;sSeuy&s~N6?IS>I-PA!nVsAnt(udr2u_Y9`;ygL^diKy5K4-Z{ zyjZR&we8(~VB0R0n=lRG6Fr~bq~n)UL4vuJT=451HPPe3qTFshBHT#iKoZndGl!S# zXmp!=rHJJKfuhlubsJsk#wk1Ydv_Qx0{_Tty?nyNtSp&S?{BmE8MyP!a!Png>4^VG)SYr;tvI^ZP=I9MPDWNmm9LUMf#wL zAxINw6SNTe246WxCCpXReq3g zQeED;7_I5(?gCUodjXkX+h2f5FcH4>BqHxBMvUsA1JbhE7KO$w1q)4Rv;t9ufyJ>%KVxgt?eXc+g{N(+hSRy#@A~pb zti!p+Dq5q;?>uh5CB5P%O2*5iUCB4I2K5$kgVxF>LC=4wewJAL8x z+~n@(BY=o)J%8%745WBuWP!yh|IUq-#l`QNE^R6yGz$!#Kkf9?p88r_ZSo}rvszNm zo*1X=Y-J@?Z2r|as3 z?ZL#l90!AO2FU*y1_jjOyt&;55iO$ z1~9iux?Q@vQ7Xd0KdSFG7F&{>&L%a?n&6XeF9z7&`^F>(`IMw28 zBuj@4I9fT&=yE8RR0fbMOCk<@saNaTK|iglX6ulvmnWv8s@ygkg!=hRu0v5Lw1iL> zlhEvIX?m(C$=)K?qNa!Xb2Q6uR!lKwR5{wiSc({% z(yQl(p0hN5+rqU&job8#*Dw}wl-=$0$JX5_@-g8U$l^(4uT>B#T!GR;a|@N9x2E+L zj$58CubQTCceUOOR*n5%!-IQ-88KG#i)=^5_WZHRa^Tu zuA(L|xySSBD0Ih@(ywv^;CGuzL4BpG#bixCcCM_U0L4mv8YV{pWq9(#&uH zi~-(WaguqqdYyWJ#Zy^^-O^wcMhtqQ>GEs~bk}i1u2w>>x6y{&Aw6?ypS9E4$WY%~NRuL`;XKt_)l5reXS(gGB`HVK1tDz~vK?U3S&Q(2+|`Ke&@g;$O5 zxPN2Q>Rxs>*Box{q-Cl{51T4FL)z4`LLD)3IM}W|Q|v6J*rO|?-|x{$K2r^-@r?HM zkO0_n(bOLlS+{*OhL=+-jwD^lijAVU!9?!CZpJGFTQP*x^38SZ(23Hw(x>F5A-qZ# zcdP>|CPgbrG^8%%`eCp{{}JFZDhAS>Wd7)&s9Kl3wu*eQ zYP0&zX$Wo$gn7n@n0ePV!b9}vH85mR2z(V%b8s7v-x;78w*@nnKPdK$)yMB+d)08O6pp@~W2NQ$cUO=E zxlNRvT>aP2MDx~1o)=-x`Go}`#@fLqCVbI9Ugf5nxLhy&XT=&;7~{>ZWY7v7`Ysgn z!|r$Nt zzCHS-cQM-$fX{by+D>i##WmYNU+t3zYnh$rUN$|&D|J46-|iTWuR8oeA7v2j4{-j{ zLXK+2hgaRh$-He7@jO@3Oa?_fT9aa&?p-c4QpX2N4zOl&fQU3FeoG;k1zsTqF#x{qBK*6az(1+kCD4{dZ z_4zWy+-$&O$&x#EWywNN0u*^OE2gnLOF0f%%`!hM8u?utQGvnod78ThO#QYWy^W`T zI0C%IzJ5D&rcQJt+S52yZK^8?@mSJTQS8&Q{zfFdelFJO2yhi^)$6TNVG&JcmR|HW-rz3WP;-!AFw+fSMP z(JAT<(<{n|h2;k}^ImRJ^-)bcpQ;Z!c!*(|KB104=_t%c@|7}+a!sLL0?(+h$-*0- z^!Rfk6}0d|6)vnypg?n*;wBqG3qWqzJN4pkN7D!mY;BkBdJYUK|VG6A@(wQ$fbferiOI zb6#S?;6!2JY;3Da%89G9`vNSlhXK34|FeAK39AE&Mzlci{uouztv2~j>`JxLfPAxk zM$ri>2FhkC#wb*S=3yo{OQt6x1vXWW0EpqQuo?cwB#k(t+$Q|Kb$05|{D=(&o}`Ba z1*>APd0G}iH@H}zr;|$4Vb(V5#Fs7h(}^__Num*kkQ+%vzffwaTwNAA1Jc2}z-xFJ zWTGDOdZ;r$cHFvJZq2v~F0m6@ExQ7pQqLRaelb=h^5FhNQTQ>x)GXvJq}tbboAj8% zM9s>3Rs|^7+o4y_wq6|pP^z$19RJQ;cJaE^`B!K6D4OrM&V`>qz~6n8ecOHn@PQqC zox`nEH|^Oi*=V=>XYSt~I|4K)#a7)=5Cc^n0ZNK9t3NW`N+j@+(#mcBmczIE_Fq)` z3%vW>CL6rUOk1i7Tpur*gnmlxv)Y-AF~Y?U3X{ZTjsT|yHo@z%tdCw*`ztM5+Yjriy;GMJ10b*Q!L}xz3LiGNZHN<7`{S#zH?Kj(P z%`b~pm^$8!lDYCU6A!#u`}l`~d~~zTHWj5SUPTKAb8v8F%!F1efLj%J8em*%RR!}gL%d+8pVazUwRxCPa{*th};`SiJ7_=W8_ew4UN z{hf5IULx(!!OnOag`Q1Y@aQXEa}h_x9yncYZ^Wxoz-IWjh|MT>09JE7ddP> zUZ8U4g-LaV!jS3Eo({0}C1ylp&MAY$ug)6R9rdB>1hY*p0}U@!8;;f8hCs6#(r?Qe;DQ_QeZ!x!dPcz6e& z(*FAtDkO#6pg;aDI2M)0iL+Sh3Kg+EC19z;s!lJDC!p`Y>Q6K=5Y($um9f~|jR2Rz zcNmP|{cSnpEstadV93af)I^QFz7yMgzRz_X>S{qFJoOx_=>l;Y*t1Hq>v-hWSm#A$ z@akWYoFDCG_*rajlhGNhUp%7Irs4u*G+=b5JeW?gzM*<0(Sdqn>t#NXp`~s=+pXca z$FbO#;;yEYCxuS7ay^$ZH{NW<<);ur%s$N)FF2Fw41b$Bj`|-PX%d{H%MDsLE<0AA zH%d)iH0m(xq~@pQZk}bYlX*TdC5JRI2{9e81 zFX}9%E5R4svqB^s7boUR9(h6@wCA9o)d@7}KN^3(J#6;tWWU?WQ4zkg#XvH(Y`^7~ z#yIO&kW^EDtWVn32N9Wac|AMOrshWKvd#5cdlC=wmd0H5EHP_nx5@FDKx562JT474 zw(YwHyp?qJpXMEbII{eF*<4c(%47@sI*_HY9vUjl$GJ1{Ny92nmcvscqaaI5;Evd)Oh#JdHVlz%w_EZL3Je^(WfOofupf3u={z$WPq zh`O~JuMmwDJw&^o@AgYj`MFIX-)ouDA+X%Ee99HfkUQFfnIOvY1uvv5yjG+iN3$65 zucMNZPMety!X8Yhy17ieK`D>O_Sm8jO3C|aRg`eYW>>t$K<`G=ToM?$d4M2F^uHbkTZn2?*AN?Dqka$v z@vL3(wgrJZpK00Ng>@cA67I_RpWuT+?a6${gFzl3^~?90_PX4c?^#9veA%BB`urX2 zo1)Y5>jNQT!YqohPECIt&0`qlr4}E0eSdj}G9KP4K9~W{&B!{8CLh}$bP&9G*V9Ya z$2n!09b38-?cn~Vn)K|C+8BjIyso`}QPeZi9RtB}1CVwv^YFbmh{5Hz445oBjXkL+ zZrgfFWjx;UNW+zPKG_R>_EXO|u+ql$2|NX}{lxukXB!ZiwPC*f@Hd^kPyEler`mco zX7}f&Y3xO?Ov8m-xJ|Al8X;@he4@Mav(ok83*j$ApC^ z`uwQrq01sIG0Bk@UHbM0rLy(liL2=1t$N)%mi#4@2Q$X^4GqkMkuskPnvMyTTvbHL zq#Xh9LE$U5E&E!Za!}a^PMX^R;ZrIYnn(EI^t2{{bE<00S5Nx5NEow@Gb7a|nBf-w z*7FI1Etdh`Sk5D7^sW-Z>-=(~-M?1_CfS>TBWL_Eu%7b!QEuA4a&@VN@wz23Ay$|S zlhBjt;KzddxO&e+ht%gs02#?}yrIjR2Wz&$;d;|IdIy}it+$5yGx<+k zT4mV92=@|dgVd)j0Wr^BuQyn=%Kn+LmlG(7m(|k-LiK&Dh6*%aMA_6i<_`9;c)!e! z{T6w@1$gGrcB~1JHXuycsJR+QX*)e5N!g10qL3groM-d#eF;d*!62%CXW&%f{aaa^ zjo1;*uGz)GZURW$g#5?9Y;U;8+#AX^!~bJ%2;t1Qbb@y$Zs+=X{_K>>4rc+2?}pyK z_n`gDz?IHR>BD~0{g>Dot>L$%IS)_IOo`ovUXMGR9o>uWv!C(^-y)3FzJ5#7+;%8q zUWSJYy4`az4R$>O*jj6PXdTL4aI1gLaRl&}?VGp~{v*{_w|cL^pVqqfZgo_7pf>^? z?M|_Ce}0GR6J)u>t#ifm-p6>bQSq~?sD+@$ld!l0j&4`UA@j_nA1OD_yqkHi>*QF_ zTE3*(SU&oWQWaMO^yT6?YkSI2y&o5Cf8~t@UgMM&%RA%0KXm^1Z@3k0?*kf-boit< zD~wYDmV~PrKIsK^rc-FCR!L6%oh#=1DaA&`xzLd4drf45bBbMK#W4HzkDgPFtE1|* zY%i_+IQT>J!(DB{6e77k`P?)&HgU{{k2N#*fL;9BCO~!GE73RHjZXs$^z{<(`3+~g zq^UgB{H$RuYX`!)qD8s2j@uC$3#oNoRKs%zPVy313>q{4IPS7;8}HSq4L!9UDqJUf zjDZXealhc?(`VtnQ&tz@q9IMDjfZvj+<4vb`(8$tHnwu&aU4=ne?k0xo64)kOI6GE zPdTntei-|))3leIe7HHO`9+=O-h$?c*%2Tz;DDZ5GQx}=%L43s{T_R^k=lswLXeg4 z!@HB-J0tl!r)Qn7pKF|$+~^4QT#xGN*f+L&=)TvJ)E`)>6Ez8Q`j8hab1BCt&gmr% zA;G4a<+~=&AuKq^GZmg?R-Svm*4vCJ=Iqv3OHjI5 zZMU$@A)Pu7(K8z36#D@U!QIaV+Y!t@I`J;fGG=VM`cn6qK2N+nDrB3oqvaCbqHa&U zb-^2A!Ov!u+z>aB5oq0x`*|mCtty+MBvJxoANpqcm74QaUf*PJ#Ja!OSklWvNHr@( zolVmwhK-jO`J*|(Zb{HTbH>bJ(4RhKDR-yPe>ixSGNNTEde5EP16tSN2B~j;Ys*jJ zLGqe>e?8(XZmIp|zifu!$C#<_OL%VoA2K&LGH*&g>QQtK92i|Npw)90Wo!%$4-EMI zyb|Av3T8v@nq2vu3*3dO?a?J#nB`4rO?;1ET$(K&G~3hGD*$t`6Q2pOZ1qyR`MuWW zRtdKU$6;Lw=5?k21ZKw9tLxk&s!w4*b~uzpg#DtzKg%5)8wpM`UR?g&t>_4#PYb?0 zGeLBoSST8=)<~4^FLtV{LhEPg|IFm;-$`w9Y!k}=^udh?**Zqk%iGdDQ(ZO1om1vq zH?RV4oKDW|mb;&mQ)iX$VJJz?3y%Jg&>_qgf^(}v24;O!c#g;gD33V5g6^HU*mYa7 zJaRctB8@0P;|5lYXb8I0OnzV%H0;WifJ^k&O`~FS^Np;mr+L_m_4yO*+>Mq90~t=I zoCfHo@9;<}v)~cLOkV2qN*b?g%oGRcF)J%sS^GBzSV>p@I3pKqw;Gu_et{zq(PX6N zZ0|?qFl=Hg_BdQ~-m<#iVXaWKZY};Zm3a|jB6_$TlX*;mFCikduJ$=`D^jz@TL~;( znmxWw%0C#ZRQkyF!Y4^Kzl3F0dnLx|7eD}lZeXr6=ji6bMA!_$-Qq4udJ=zH;?B6uHjav#LV@8$oxo>#)|>g z=>gMbEdxWH2YnDjJzk;wSPU*PE(=&V90JL@u2*_GFNk$)v6@S)`ViWvWX$upy*eUX z6388)r59%}*3o$oVih>r9itcMyV!5;qIlONFC%f8>7>!b zdM?n!-ibFdjn2V}bf0#4>wzaKQgRlyIG_v`n>o~sa5UNN$nj|?asx6e2--K_dT2d# zb3do;MhedZdc=7bdt-|g6x9U+=-<|EpY>p@odt_cJH__A5 zVb9z`NC<1w35!1%_1N@AX|O5k+lk?ltUSDlg*8@qbI5N^pVh_|+~`7etLhk575CHG z1`M1a5SM$6f^!1c?QjTe#t~q}9h(nc+Xx++H@rroH9kukzN6*-F?z_v`ePJ}G7{Sm zcXtTNI}8RRg+fFGzF&>*wqscf&%AmQSgc}JVq0F?t-C~=)pYfkptwAe_Q+34yt!FD z5f#M0JJbhH>@{Co9K`(&9NtypPY(xjHwnn$8XX7D%uo7z?+-oM5A1B*iMiG(AiVXQ z#%K=Bh14mxWZRcigZ#2e+RVcJ^@Hn$nU_pk6u#}I#dv7z&xV}0ms7&{uG(|(us)kp zwo@s;o!(+Qt9S&c8$$)V)mkF3kmC4@uGOS#p}+@r<)VtZK|kU;X5F&#?FtHVc@V7! zB-FRA3eWw&@(Z^2 zD*ZIFa^0`cLR>tNH@1rddZ^l$rKa3`-Xn6O2YuE7ow3$)KJI=i9v4GHh$E5WPcd%r zfHM`t{MsDvLM#h&u(`pGxtM6RPD+y4)y5};SdV@V%&<{G;Sc6&%S2p^vQkP^6_{%! z>_qjI0a=&TtYs8g(yBs1V5{-GsI0{GQ8Qx>YxKASEPcgtxHFR*f_dk51laK0Qx0=2 z4^yMshn~&3*k8Xiy_46my^R|aeP$|E4FzxUFTtac>6$lfaMx=^ zZVW4|o3^hw7u6b`*!?O`>|e4swl}`>fvECNJJSAlqrq?4d(DJR{uZKPSERaj7xeJm z&Uv!-vPzsHSC9&`p-JNVYstsUnKb-RKxT|&r843Pct|NB67EY_xc zh65L+?n;_WAW;0cU*_vmk|m=k(E~=EZmILd{Y9t<6-PZF3L*LobBoRDK(_eIP9n3O z5W~4LIg4!BMQ@KhTgV6mzZVJ-Ptn1LA1E)Lj~xix%7@!N4alqT$neW_@x=sl?+asU z24*LT7tstf`e$z*VX8fzD19 z7|3Tz?S`IE&VBN$%(GHFB21~z?Y#RXwc^U;m&G$bV_fXJvt{;OYrw?R}4Fsl_peopXj;3_~w(YIzWf*=T_|+PYvBG`fyqU(e#$H zSKJ#Hu&%p_GI!d_5Q!nlsi9;H)Wk5b>FT=`s#mFTd?PCD8Ejy#4{WuRK7wCv(Amby z#>gt~GvaNY!D(WpKQ_2_*6*MF{xNmWnuAyTMocNN&mAU{!aNSF6iy#t)YQW62rcx5&d|3;_RY9pBL?gZRQI+hT=Ap@`Bi~ z{V~QTb$k+wVd+mVWel%GgLUGEP1dF&WGx;m45(D5oOX(DAxEx@t z1r9m$$iNw9O;YW5Q}mSWkq1cS;ERAtM9i1T?=a{3H*pQ8*W60i>-i zpl`VZeBfhuSqd>ThS@%?_Q6JbC|i`5Pp<4Z^^jjljYK&Qn``EOF64vtYjCU{7m{YQ z`m(6BlR0KthQR9>D(4JSTnzH1{0MIjO^GaT%&@ES6#b)anNqM$QZj)Vv~v5`4o-@T z(?zX99+Hbjv!EAvyfcLhiU0-b*Qz$A)o{EcdRE>n zWkR7iqGZqOYoVxeI5_V+uA@VeJ7eqxBpid(|>)KS#@Z+NRTz+{D=>PN_HGEOi z(F46q&$0bC&k;3ae9GMHu7rIa@ME~#o2Ioq(%$>NN16{{cMqMo!zqUKjNAW@75T@1 zS+6ZcB3}#rb#9IgPISTht#T_KE;YDy#hY5*j4SWa=a`LB9r?tl$+npvFc!xIihulg z8QBzKaCZP~KA`#164{uf*SdLl#hM_A$YPe@>JGF(4!Hf~M*AlZx~?}ljR!aq1&rTO zfr(1zlZ9*bVn-m5QHy)!eI_RAm7XE7amx^uUN9KU^Jc1zu!53%tawgZBFalsq;)Ob zGl_*SSl~mul=(Yz1@oeN)6af;oCgy|DFS&$s@T}rvo4grA7Oo`mF}SI4>Q)?3)OIN zt07(c5ZAtQ&FS-Lqp``^ZSg9>elY6=)BkRi`G-z8;r>&*fL5{L>bqjfx{C{*7 zy9Yq}ZCv9*N*1CTOU#We*^|4!>TGm?-8Ijugk$lfR$GS-l8!v3RZ)bev9VeGO{hma z?Ey8SjtHJv-F!C)>{;w*>zUu!F44*o4p?~^rpE`_>CT+F-=gwc)Yd!Nrt31a%Pmaa zuKJ~JR(2*Y!M^F`Ms<>%lb)5um3yHXn^!ve4{Meh4*5YW`W(05-zG*gGppv9`8wCe zy<|*Gq<=HR-&AGmadPkKjm>F1xp<8~aR<^VKsSvciF#9wj>zL8afMoY&=(>+ccZo-W5HUTm z=VsxSE`~77Rg^cqJH)oRww{w9d^Pj9kPzSSE@>j!#cL{_c;=xKP~!2#KC%-dwN9F! zoUKac6){dlS0^sK!gQ#=NfPy4bIW?_83_n7aGuR)4WxHqAH*RKvQZ{O)GOZN61P@1 zGF+vH3SQ6OgE=I=-i+g#R@HuT2>`ILUb(a0q(nOCD5r5j{Lmn$udvXPj#toooA;gS zNb|1C0jdo7Z{?jo$GOt>?xkizO62(FN>?5mLMOXy+|gR=TuxK69^jWV7r&OJ%X7si zrT+A(Gc&zo2?iP3ngdxQu4ZFi7r~$qP$v}vK3%*o>kP`r_yR;aq%ig`zY(vU4-$l;f9JadvLZA9yh%kv7tqASKe ztiBiFyZpycBv67XwP(88ayn*yJSFPUi0Wd)>(z~To&5ZOVfT`|juMOge2|I#s1}v$ z88EChtjNZ$dcIw?Jc;nzy5=j8ygT_-(vJx>s6UVnh`U;qt6Xr zc}6lC3)%b}9K*csV2zOB-sGIbl*r(%!_P+;s})%~5n}Eyct)?qD`C?VSQ;hR$FP)P zc0~4zfZSa%JcS;BWd0|S{y>(_decymeb$}P=0otGpNn5o=L8B>oLc#Rwqo}49tg$y zQvxLY^Q9x=s@91q-Z4;1qR~$weGWp{S37bO_`<8#P4gbGzP<@&VK2FIDztl38@boN zm0G%$IX0npvdnXVFfK4zZnI3E#4O2U z#Vz9>EU-x!Q#qlPla?dCwrhoP>-M)^n6xTq24aHhHZ&3@tJFyilub1_TkAS9`rK_d zw}^+02c8l5AzGrRJ0!Tx0lOQ`N^S?f(a9 z?;X|D8f}ka!HyiH2?!i10-*^QkP=YoA|NG1YLu#>Nr%uZ2c-xI2uKT3(Z)n_uV`0X5Z|K{8613KrzNU=ksD>ikzs?{D`djBqT|N0!|ZcB52Nt;Yx&YR=B zEmC8$It);LJC-E?VFbYkMe%&b!A4j0Kb2l}CL{N6fSlCw%tw=f-p-oZZ=h#Q02gRY z?Ss3b*~g?G>(}{jf+vE`qUiAFaeH{bF+#U{rS`QS-XFU~%mSR;wS6`>55u@(7?|Al z!VV<^Hn**lf^)ZwVD7HWxq9#Um61pDZ6Iu^QW%3ZCN1 zRg|=e97E&HW`Unai6m{kzzh}@m3Fw`G%QFmB40Ftx#sdO3AbMqOP966tZ4a?<24+i z$69nTn)~q6^%1sR|3Bffpd6=Ei{=we=hV8VrI)xo6Ex??)aN;tdSD~@Ic?rGkRPwEA?!*FotLG6T5$C4*>ttPcK8K*zScrhEVnDvwlaq6!mJy; zcjaTd=)ymQ%eIu>C8-U$ef=RDl^|L~voo0myh`K6te5H6wWYP{?=5MY9+6JEa;fVb zS8l;qA!b=~s4x6?}i9&DToNkB}Hx_9z|2F0B}gLGo0nx^{kv<0>Y< zC(XG|8kzm2D~sg<&J_ET^JrY@M{GX|3)5eLC8r^HhY`n~lfq6#cK zNYJQe>&^c#&i&VKbB5PC_1blZrrpY+!ftG^2m3Z1YTcLIE`JkL{=^nE)1S@opkb12 z%)fCFvC*w=iNB3&`_3a}l3>5HhE%e!aEV7getf4TViyDipT26AAfz|^QC9lL8+*$1 z@tL~#+8PQ|Uc$awXoTDL&Kqxyd#u_^4N zzZrTC7xosxxH|i~6RI@yM)O)VWz})FZ<-9h<=fUcbnIu{M%#8T(&sv z8-@0Fbr%u+)v%eJC2X($!;1Ph|C6K@s=I#Ci}?_~cW)f*tA`%v^~$p9^ebjB-mYIN z84=R^w6?qny;H6GbfFp|v2~)(=1J;>tYMD~R>v!&?9!oGV=2DVwMMWx#d$L$;iPBO zU4l~1S#sC;Ez1*!Znd}`aPXA8 z+FEuabF2__=Fuq;21mhaDGB{uyNW8yv%M3lrVn2ZF(avuH!{4Jqvq&?z3y=;OCMAKAFAE#Zc!&~b>K#+&p6HqT&>>uFgI({Mnq&x7fT(cInI>I(efqz@`HKpA+Q23E&Q~Q`!YFR23lmu zfy+uX=pX+;qm(I1>LtE5j5jwu=nBLayb9{$;hvU56UID7#q9F&+BeT zU*3S)pcu2$Yp7e)1h_Pp88; z;Y5|dzC*O;6r_%N@2g{WGxa`Afpg>3w|XEc($Pd_efgD5aVX&1vpO>m1rKVysma*R z?;dmdQW;`ww9M_w{@KAd3VPvHOrMQ4^26-wvZk`$p@Q!GJTt|C&PcF(Vkj}2zJk+( z-kJ2~{~BfJ0U!)pfw){KHTJ~{Lf3vnH(RH0ug$-A@@mRjX*u?!Am%Wyku~KW$YH&I zr`GG^2I~DBl9e+Ook%;j^S#zyn#s9&4cBY<+4evmuTW|4%U#unuo%6v_Fz& zqO8tXp{H~n+rU)#<-I6s_h;Y11;5iQD={(5Hp@Srrt_%(l2)M0m^d2qF^9q5{Jeu{+h-8;p7Sj!esg zi{vhSOF+6D7Ehbe3&L8(#b|U7+53`lZ5c*u-_Uk;P))M}R0(y%lP8WlZm+&hFh=}% z!Ej6Xg)Gbdp6#v_iG0$v@D56`*SAY{hPYrj*IKO36>&G5$9xj{;&y=j5h zv*k=Cp)E*(HUv{-x=c1wy%96baG^4={)D4;|DdQ{wJ$&vfAwuZmta9a&2Q`IO!$k& zjUZP0X}_QbA&j;pgt2to7mdo#HWW~tcs6TWjT9)>*x`!&0r&`x=lso}YNh@+!!M7M z7UyR%e)yx`z8&K{%-6}>HD7NwIh4pV265CXu;)2=np#P*8*DY6cNUg2UqJ4QKp$e} z$9t>2^nOiT^i+s@Qs5wE5;g3UH5jMZ5|buI1UiQ)}srGA!mC{w0X)t zc(kkPtU#_ts6IZP^tT^ey{EvX)Uh<_h0(wkq`(?2&m#_UJpsUrY?6xho%Gs%4;V01 zi2Rr`JN3rhOp9XQ&)114*6@jkLTqp*LInS?{T*wW3Z3OD8_BMKo7TNDAc!N zH42~~u&C9f8;5_@AzXMb~(kRJ&hN zOnXo93TABy^4%(bU16Ee`nuX=)YDRrj46&J44LklY81d3Jq1dFCA|`UBLtY%5uSDt z${~Qz8)Ao(ZNJbqIojsDLtzyyG3_5SYqu-37c+D&C_ux&_VHOoiML^(=3b}~>BsDo z59b35zB(Gl?>%qW;t{$*XfM87+qRfu3g#rsM&jZmzn8C|__=XKQsE?2M#xzML3h+% z-QA?2h|Sse&l)MM&@Y{LfS$5P-E1HuYwowwha!e+4jBjsv*HF;wrZoC>y5-r7hZCO z{OT!G_UN>x?-0@ZsJvQUwavZ=-?Gk%GwPFl+~OE{5V~iY;orsfzZ>9z~p&} zy?mYmmsIhTmlp4*H@e$k$?RknWokp)YV2jj>ShBy<8C3}jDXMmp-js;P)%$TO=pFt z7Q$K#^O+4M*2^G$BPMi`YRR# z;umz@^>A!|onhZ*7k@pHId18R4JcE(2EC)SdG7dv<*{RRYC20>&A9Jig`e}_`r%U3WF0vhy<=ij03FWTj$vWbrJN5Xy6 zf5D|HR+}Ub)7)A*U&9tQc$8Yq5Y6 z$VO`_35pD*rr$SYpGW=BFns(s1G7XZ;b-fW#{`Q*3&aZd*HuxxpnaK797HJcS+0f` zUvoJWAQ;j$4H+Lm-uw@bng9B2^{ClVr{|u6Z;wlRQ}fB}d-kqYd`I^61=~ubItDmx2!ytJa#bkW!c)D<7#; z3!R9=Z|p4ToqrUnrCiIu&1iQV)LiGw)%S6!+3)@7^McUWuY0s#c|6m5$Qos@?n;2{ z^W&ts^~Bnx;jZ{DkuWUjhkTMs4oDeNs>vYa-zVx{+iD3f=_f+l!XtWF`|>_N>F7BV zHr{k^BDBTr(pJ0HN{tna7+e0`>Roe~#T`KZ2}+9&mdpO2(EZPiErOSNW{cEkN3N@B zsr}o6ZvN*5aaB^>#}8;9o23Fa)sR$INvBfhU|8zNx?B~YeB zB#?ev;PO7Zzn_qvhQD^3y3hBnr&eRoG{v!~i3T0fBG*9Yc56h6Ya4F#jxNV@FHZ+j zt{HdjfdtB-)O`z!yY7H;VokqImD_V&cy3XSep2~I0z)(6rFR}7>BxXpj*K-ET&P01{bAOARmj^|U&YM;M~iVXJa7CA!t4jD%=GLUvxEgq*QN}V-Jj(56Gp`o zl*{j!zpNomCXNVinTWp5ym_{D|#|Zq_{YxnCBa{(r!%_ zB6B{QYs8za1^aku_s?><1|AX~4=;ul`!LzJpKJ!j#K5FeCbY#T)`oAFS1RAz)9Uk! zq-Z(SOYBa4F;HG+QHa|Y^eB{M-P z?XTOejBt;pH^^1Cel%YegqJ4i(y-@pokKW&H`lFzOoIE5TD$=my!rs$>ALaO(uk&;p_;{X+ zfBMqda^pCkw!&nts~Qknva_F&g4IN5Mw6qTjZ3iP_Q|3DiuG%l(L0}a#J77`=esx+ za~tam$&VkY-FD7v7a5PvMS+HA34_Ex^YdIyK?{#Z5uz`g%&ILHxA8%oxRDD}SJZB3 z-|8iaJ&SJyiQ7lF#5kwU0W=%ZmB=@+iyd{oYE_T6a)Qh}oQ=%4P%0C$deP0sR=Mpi zgRKHTtTL%a#!9KB`C?zoP$kb-766mo1p^Ew-oF5pX=s@d zHCQU%D7=|C=&U@*qibC&8Nc%vLP?6bI;Fqjv7Ymh_BU1IEvU(?%+zmEVW+R_#-pqv^4~ zqFk*5IUaRnH|qm#bRQUtNieft^Vqz=nb6eBU+1@~k)WNOtmh-s8Uo5Qfi<;%&51}N zs%3trUnj>|Dp(m0xz!2;k{QD!tDk@d+h4z@hjk(rqpWs z$JNxgog$Ud_OGr&a^Nc+e=~5@IVL~bwq&>ZGT81=FScUuau-U{WiKg*au4E)vo3!t zc{6~ApB!ef{NZ<=v3M*g_Vdj>%dSwcVQ6dobXz0p- zso`Ip?+HW-Y4n&t?T_*tB)5%S`FIgOT6s+==aK{a?quNZSLz>Q=BC9KmmPGDqm1|s zWzjbH{vPx5sckCkPrS>>GBQdeoryt_oJN!EGcaoR_}6ttsAm;ayZK0<*+ivOtFB?p zZ_S2ox-%$neCJ+H?+F**MqL^`VRMi7Wb|Ivp)6!NRAE(QmZp4E_DVA~HHx2Li_Cdu zTS@TkvnfeOw!7E#l~Cj2phiZG*9x2|OvciE zI7LpV{{Ajo=im^C0KG~%?*(Bm@$sx)83KuD;o^H~ zyHwh2?opbxm%PWKzDuAP*Bh;Y*4-pMhi?^jB}47=&!`&%>hPxrIIG5O{LRKKxoo24 zf_sYSXzPRju!jH5KWfr}g3hQt!JCtu5LmWAu+O={-9zS`;ZS?`l{dSG{Qu|b?aAX6 z5k>CNmh?qwt#Tm*4)-^M74y9x>gSC59}ipLdv7fYniSK2ZUhE1AG)ZOD$pPNzg?YH z5F)y?DoRBZ+j|Rjxp6=Nsl(U9@Gon~6zr2%XzYeAMVvsNLf`~|!?&{(>fpZe_Czo2 zEKb0z9!L61m*?lg6p(X0P_8^1fCrqutqt96QD z{DCUktJW3;9D}{YPCL*{ z;24p6AP$GCGgo@M_J)Ch*~WtKjCU?I|Go`&sBJL^hNiPW(1hv9)qWmm7C-da0x!)k zpJ+V&CsjH#os^Ga1{o^fh6P7LmL`a*=%*@b-mZT$EccwYO_I+I$2`k-M{)6pt5qU$ z5>CIIYq>bTZtvSPSIjuU+r+?6uKct3k1Z`< zOLcalqmM*@$}rUW!K!tk@9-baLA{42`)VE(HLn$(Vr;3>GFC#(hi_7Xxi~&v5lxry zJV3=&cFX~tU7wY=m!j5dE_TuMJ>TJdw_z#w<@I$-iX*(n4t$bI=dC|?>fliRlHZ{{ z5A`{9MnBh+J+)bll)x4Pwu=w%(G-{TZ#TL={OcuzF|y}*>d^UoSIPJMxt@w!kdS-j z>^E@uMU)>ssFVop27F9XdB-K864$j1O>Rk>u0#j+;`>*2py%l98mu`&Spv$ojgP-PB3ro@SETK|N=KeK3LIg* zb-))_QfI#>tzo!=d%GIk3#4Ia^&|06Q)XB8Tj2{h#Ug`3Pk(^teRA%XB=p`Dz~%D3 z)!aYJ$6-%is~H)dU&5d7Na2~9w~HHBTRL|jsjqS+IyLKa^@OA|DjI6I`gZ1D_tC%Y zsDHb9dlZ99ataW@#=v$~=bU@ndsRzC`Kz5ioYyv#djWJVfSA zCg5XM{?D)Nxyls7egKDIv@HiAYQgez&&=*)ja8_B6}eGU??y1JT`si=XktHDvfz99 znzrcSkWFc4diAJ=gjE3ma{#4)IalEgR&%_iDbhYW=mWIWgfw#$F}H@NQq zI5kprNM#e3iwTy5s{Ux5WPIZOY|bt|ah$!#T~qUskujuLXhfkskukM3lw>2#X`X{F zAAJP`Di8v3$5Z}(cBFzhYEjXM1rv$OXCM2Up#^->tkZFkN3fZsM2TXL6@&TKkeNmChU= zZ-3aQHFwsLH#>Nd5IpkLw$_8jrH`nW3rc#1xf`NGnQ^UX^{jfbE@8UYrg4IZ*s3-v z#6;z)I%s$a8h%2UKFQ!Lj`YtyWb63|BQg8ejO=h;6E3qxxEi;AweL)N{A%)S^$p5J z4X7>JMDdb{Z8=YZa;;{}H0#_*(!-~%LhqUpK0Zw)o4*0#{`dZa3CzGIba~3b8hsq; zrGAh*%D=|5e(F= z2It5gmsVB-02bC+HYyq_ab$SiWoHZaWEX;e9g9=M(ITTZvQyHbZrC#5sK8>;IcQW- zk*{%|aY>))K+BxHN7L_Z#V$`kt)Q`j`(`RR&YU&^lRcPiIoY#scl%>nk@3(u_3Ajl2rKJFmsWd8Iky zMH0*X$D0e;C-}{ZOg#yauT%hHJ5ToU*{koUoX!rX{m!Hj@fm`7vFQeMRO&TE=tF)| zUWAZw)7%EomjQr;JhoBQa0Z5lut`?Z#2SU?Ew#)BLDk2UI;|?d!U?_QE5w!UYzyAX zK>Emi{t(QeURtCdNCmQ(Kmk)-ekOfW3>p3iRNmgxR*mAV3t+`a?+m41^>Vc67p@@2 z_ghH@FgEqWSo<4sF(00dy?Ijky}4Gh%C};^zRIMlAR~q9+mcc-E>b5FsT7E_L1ixN zrqyAcxt=CIM(H?hg?7{ZM6X2D!_5X)a$#r_x_-@{?p>k3YX3}|G6RFB>xxf^ca)Z@vC0>m3V@#Wa_f% z;(&=h4-^_#O$(d&D5G+V0+N^>;DIwvjQ+533wA&{Y8LxOqb7qJik}!tms!%DR`^>j z99qmd6BO|?Lju|RStWQt=>i5uiDoHcVd_vxb}J6c8x7EFF_BuJIS$~tK-pD*O^laR zyxv-8Mcvio-8u-U9nX(J4ZX_6;xITYCb4Bulg+5wW)DcbxWjR{7uMa!;oIs5*}#^# z3Tz2^lM#xEXLj@WxxbRF`pwsPw4^mNEHeYDt=5LZMQ?|3iNFkndUIXf$uQ|hU7`tq zXJ%vjsZkSAxg+R$e(AgIELwZa+Q;4jJ?4U@Ex&Rxr^K6>$S*?|z!3mBDqYNzTVd}- zbpx_@yy0b8l2;5f;-4gXxcdmZmIilH|=pmYiI(ao%E5utZtK6H`1lI&I`7*Tv)`XyWp++~1_$&(KYTH3xB^r~qYdx7EB-q|g@Lrwx*Z1xo09iu@8p9%>2x6*x0Q z8Be=6rDVPi_RYnVufc7;kYyjlZgo2@FKj6)?W_=$KK-Tmx=nJkWMx$pJb%X;1+&c2 zEn+i!MpMxJ7S^?uGv^?yQ;4W(z@ZKDp~Ip7;dD9s{B)UvxkiR5tg}^qfj@C(W61pb zhY_I`>fRO6g&-dV;lw{J2En%qHQm$NXJ<0>ZKIF&=JB{JDpx0g0K$r{WHn3TnV!fh ziQTO8#hCm8+z2-$r$CXXJPVooq~+6|%%dMyzKe`|(jw#!`-h|$X+bGuikEsXq2`H= zxYM@jw-yaN#rIzi!xY$0t4Rd} z-a2{QVqsqq{~DvIX?XHob=7%yb#$n-QYerwya1_d0iXh+7~+F?W`T#^lc%K-O<)O6#Sx+O5cK^OEVfd0@I=YZ-KOk@Z3LSLaD`bXT ztZ4@FG01B{z{dqzN_m=JM|U%ho>+RngBbdG{fWUPISP`fqb8m6fr&~d9^oaTJ)fk5 z`2D$?f9get-rTR$cNq;1f3mmp$=HiTSG5Z@tqgbe>-6YniIy*8`dBq_>|Dtb~ zd*9Q!$}1opPn`XSRM1FHbi|%iG!k6sDR2|F5Ba8?w#Zv^kn-NuDnXzcUWR&J(CjxM zC#*r%l~T4A3?hI3y{O26ylnKNxmT&0d+9J+2Pe$&+b)GYO1ing+)>&WT{o);;gxLW zCH1u=7!URgHjR7(3M4XLtDvVM4xkaZau2T?nwV&h=460PeQp>-AHEqIXMAD^B!O|8 z`{n=Q&nf`#7fvYs`QIj; z4F8AOC-r|D6n%jnQJA`&JV;lR6vXY_Mt`!$Aa+bmi6%&;n~_zRr8j(H-`-_m+QQA1 zS&%t=1D-yIL^ftingdWzRQ@_*ReO2`3z-p}jj9cmn~jujMusD^F~<7ZY<-dxh-O@Gd6!KJxSS^xn8 z1&I=`Kz=eH5=h#;l3kfUu_0q<;VE$|Dvxu8O-;sYgWiD3hkoT&zHZ`7^&`-$AhE>= z`X_B!ojHKHge<^s>&~EukbtCV;kaiFD?Jhs^u&SA-GzwU`g?L;byjm>ZRVFAk+E1a7k17tI^ z^(d_FgQ7y~cdnL~&Er0RwOCqG@$!`-(}Z#%6GccQB|9IO1=gxO(8eU?Lf*bQy;C4u`S%?rk1}1KG^YA-nAdeliDY+li zWDnsyr&*ZjO*V!z=b3|&PX#x`_Y$55m%ozx7cZ*P_;~b#ZC%7GJB*p*&E`a#CZb6p zAynJ+W_12h!|}^mQa3fag_>4+w;ggPG>>XpnE@;1NV+LCxQciF_CZMp5qCo~rgE@A zDgtUT?Dn2Pwn6zqxajMag^r z321m?^KS;tj}VeeX=wSE@u|qXs`PN0iANq#W*7ZzFtPypfvT(hNTVm9g==+ItJJqK z)*Hv`7s?!;Wt?*M!)5S!6)4iXQk2Hh(!x7m#aIM7kNtW$=3=#59(hzSv$m#x)cjee zb+KFxz4Cfi3>2lr{n7~zX0?YxJ&kpW!q}m(8UJFF3}_UITHbx9dKWpfT?zwQVJ|Qp z*pj`rD6;EkdmrjsZu~OBA8_qdxGz{joHESXPUEjllAdL(vN>DHHz*Ytn6Lrq#Z_og z)0v(D$`g={*a`17O{@Ff53V8Slle+Qo_XZ>Z#Kx-sZP78xGmeqW2xImyiilUwM17# z>N1Wc{>O?UhEa*#`$!?`XeK{NGnr}3DyW^WSy8FN*-<+RwzGl?TV;R3$3LKmn?Aj@ zrN%wK$Wf*(TmrUpwT$Aav|h}Pp0LlZ(&djQMZ=nBjmf1t8T3)KhOgE#<^G4T0cB-h zCwi+}y$=|uBIm(~IYdQd?~}t6Ba%C#S87+ZVHos}E6#qTvF>W?mW(Wdtp9wiizM}n zl{>rqKB0|XK!hr88b64bDU9YD&Oso#!^6FxmE)E7Gu@~8FWp~mA|PI7)lS`~%WV_F zQ^OM#!M$dLbx^fxD@W-o7F^wMj>(h)%MHL3E9YcqigVot03!Gu?x`1#|(g>OfDCx4_*9rIKimp{<^38gejK_&x$)fqNR*w77Q?T_9q zwM!}Z;+-?}cKXFdgC2CG|_G*^3(-gk>D^LP)@Y6=uyF&2l$%?l{#CDXLa+EN)aLA-mI69LcxR$n3A~$dpnGFa1*pgoeS2K@FHS+ivqdlH4ZbNOw1OR4&?%IA&U>E$bU18{a6WodPTni zA>fkn4scJBPIij`rW)h|ripxDifh*_>aADdhImGpEpDFvWD{EPkRB6G+s9zOg%-Sv z7qwr)F50^ycHr-Ef3k4w0fnm|33NO^5ENnNbQ{a;t-Z`N4!>6!nnV?3Q4E>3!evb> zTn%7tUBS#?ssKuVehzD8S6v}=ay5Na{0Xz+4Guqw&Vgc4vQ=lv~O;EHJKf|4! zEBJ;e$*mwMa35&E%3XmnZkWyN4GdPR$n=xYec2ci)eup`VMRONwQu{ zXP&P}pQ~UoQDL{Btut@b*EbX7CuCNVg%m7ZI(I;ZPl^yenp<^kJNupLSE?E~T3xF1 zWnvufk9$e^)65@gdwsY1N;EgpgtI!mGb-D{BB*h z*E&VA@8esJ8kNTA082eNErvO+ku{AS+|E}+wkYCg9U~eE#}3HapN_q4-A6 z8QNw~Iv9;2p8FHT9JX*VZz&IW@WsQ(dq>I`YGQ{ye(-}C{7EP`(| z?wJPowW&UFMZK^%xZ3ih&c|}|i60xL>7}gmiS+{LGR|3?>)vPieC?cDyXBa9!^Z;L zjjRUu7@%_NtiiHYJts9EL)i*1NV6!weeITfW|P-R!N-nO-02sNA2TqJMS^0pEi=^K z8lO}f=>0S!kE|{~o>J?I5!qe6rfE6l{ovB|quKjO3YxW5(DXh{wg5Nn$a%AxxoCt? zpXC~T=Z6uX0S8ECE+QgItBQlzqW#QhYh(0{8EW!qX`6rUw$^ct zxII+1{6vNQ)e@IM#0CJms$xH3+Pl5^BfULLw@lJfp0GSBk!SM5uiV)xpKwCrGiYYw z$vAIAds|R2EX(88;>6wzk$3OPtUK7lUjS458-W9#wqwFNf?_Jif*qQ=#g9p<&zv0e z*h2~mAATMTC15)=daX9=Jeq|FM|@1}&T@sjOSy5D=VZrxN(U+YvztbaZxPQ8!@2`m zS8mI2Xr}>y(YZRHyJZy|pyh+Z*rjq8S_Yp9{siHQMOW{sMl^vtuLR&g9cD3;`oH=nuA#6)8EZ=pU zOowc6bt!u_Nd^6`vT)t=pJaEi&gA`WE_JCHtw{%$$?xM{z%fe`Ln1%(20tOFbV@?P zc#lG`*13Gw39|Y_s2;4^_hc}nV$CyhR-8;OFAgNSYLw#nN`7}0$F-3D+E%=A)o#DJ zxq~%QC3rx^WAHUeLd0Mgd$YOBOGDv0_eOhlb1sZwU>8Pz3lel z8;_q?0>phoTdok3HxBn{9)H=he?{4a5B86F1feDY@N6|WSg`LINNge6Xp^K+{x7^B z^(&q02ZeigkB=+rW*di&s|NJ6#|`F(M61E2iYe}MYJZlV3~5G~-)${Hs-R9_0Wp)3 z*3e%+NEzj_5J7X6Xl=k6Lj?Y?!06t&M`guGlaF=1>s5Mw`4Hz_m8;3}AM7tnxSEEg z=%ZWJ10vK`bx_%PlhA&#NCjb9#5T|Vi@ZworLDls0wUtd?t(>qs4)qamx7Q_U*9kDKn?gd=(9w$*xtKi?@FIK=+Z#LsT+WP=i0UFFs1 z_Sx_XwhcD=9Hm`@ZYZBG_L4O6AdQlioMRMZj+pOz&1(N#UMrQUK>7ucKn2NSw?h+y zCG1YK{w$jte&#A-+$$FErkIjtiIfEQG zO`I?VxiK1v-#dlnh8Iit!U2-lii7!W0OE_8p9I|DkNpXNl8-w|w1$-`8BGW@+q86` z7SNVUcdzT|#n;^Kbcgnh75NnBw@9&V9%jNZY?r-?Qfk7tHMo5WHYjc@MZm7fEmlPzT@PgliQL78I$LR>_o(7QxHHfas> z*;2a5+2mKbzE;1%`gwZ9jeUZ)m}huHtgl}6mWOt{@#a-mdzyqXs(n-nu z-S%4jz53+#zWX%bV~^`7xl%UK&R^nVCid#pB>AL{hic|WH$M*>R`(t#dns%T@gB%N znz{4frT@YyUHT+BbmeS(2H-t&!Zhv%z!OqD*sqCD zeeGa(>+_*QQdZ}0Dc_xyzg0uXJij&~Br{+^`CdRLWt(bi9i~~3DiYZ_e<8cCs;II8 zmEZ_a35pfau13uc8!A^PhtIs?kxBP@x#;aHnysOellP8pJUnZw@QWoJWolU9g)3(+ zi{4$2-))?7oj4H8uhzrgUCK@To56l**>&^bjbdOho1Ok|vysX7%ifFp)7A>DrjDSz z#d^1MFM^wcM`?W3EiYKzpcd8t70ZngN`*w zP00E~u3q-!;HMjORJO(xYSI2V-M(!ikz+JT+&;V3+{qhknkb>E5ie%M&lbHpALM4b zsm%qA86z!dRV~)l&|6UktBRJ4l`4ZUq1KYTI3Y|4e3_rkkH>xmrHTmXHNs&~zT!3! zy)EuP!_WDCI(%Bixc%d=AnfHZ%Tw>-M;s~{4_{b=m< z;?Rk4!++q2qKk}8L$Gt8SBO88wx0|&OBf4&-L2-#E^onLmjQQEr=3@`$=hfCIt5YG zT6kGHUY}SNl&_J=_pcL5p3^zyOOnObb|dxdR=BuvC8dN^dGTHxzL&G-qA~-ciRz|8 zzi=lrrOI#fagXgLtIwXJ>PH*JkfX)PCg-=O{YnQcFENyeZ1b_VPWpDV2OxK*Gn zpeW$-a!%VvodX9YEu*iyAG(JhnS43O%i6`)iMb8Do_gKMT?(7|TB^?m)?HY_jN;lN zj_aT$jKJVU(p*9`pf%nbQUV(@S=shL14seorp-H%l*^yL=2S2h4!wmBl%J%SiC`wO?nC zqI^GM^VF5_wX|lFKh$am(F6N#ayJQ72SJhkZ(H8{k1!P87d7&O!ddrrd&ftp7Eh;< zNxytsN|CX$;8sni{9w~UC%~7b%UPxHUy9IIdr70+ikdA?y6#bM|ioCNQM_iW`0t|j-!YhI7Pw~ImlF^W{alSO!HJkWHA zzz47M6}VupZ7R3zRs%}LxEMoR{rrC>IQOLqFPdG?)j0=rbS~z4K$^yEC6QI54masc2a>C1 ztKG%B_Jxsf=xVT~%Bf985O%0XhSmA!e!%ZSORo>~LjPaIudkBjdUuAR*j%$fV+LtlJ>& zYZ@4s4Wc=SQnXD{$Sz+Cgc^04E@6n*K=r5lCo$gW+f@lZ-BmtW9z>wn2IS}qYO%KR z+{!#&SJj`zR9WPIh!jn`cd8}y1&1l3M?dS&evC^i`NN7@*qxC^aZkFbcKfwE{B^03 z?w+*U>RbX@GtQ3PSb_4=CT7DWdMo!cB&6O948!?ocHkWY(%^rOz$CvZjH&=vPy%S;zbN_( z6u=dCtRkO@v5gFb6D;C+Jku*9ryvW!l0Ac^<2%*5pnR^J ze)9qlQ2NJtc%;0{sccEj1Es=HI|qxG!^K*F>_yrp!}PlE`Jj{e7(Qvy8pI-3=Q}d> zh&8hOQ`hEDN#ydRQ@(Bg)e6E`A3(6h|R} ze~ro^xo=$=0W5Ji<57S&!Ofc&Yv)fBbjoQi z(PQF}d0r_PKWSHK+^DI27SgsS^tyhqglGlCV~F?wlfmBl;cdlV`wFfH2*8-OD4}$( z5C4lf-I8;^5h!kk$6GN#?}==A@iFyDhy>c&Dzzg)?i~&&Ut6eam9q+^eIZfjlq0c|$@ zOhigICb!P{4MOkYKUEQ1tqt3$%!LOmd9tFV`k|%No*~P8yV2z(9J`Wf4_QXV4wIM2 z%T@sAsK#%2D+$&;_@z3lvPI@4>{kO0bPnTU@!_~SjxgUS=Z@!`` z?B#?MH|Azc!Ul@#>35!LO@;+Gl&UIhCZyLsY!k-UEQeUVP~g_HE|Q8DPQH(}gM1)H zdmfva{%%BLw)Trx4d9m!CCFCrGN-<>~+Q{ zniWb&?Utxs?)eC7I$J8tUep-sLgtvdYH(&q#IdX3v6p zYRs5SYLuhC9t`H@%G8vdny<^{9<`xMCI4Z5d@rGfj*)%j=4dY8A&juMC$QR*w-`FhnC2q(AqU z$FIL#hzp+O&!Qy5r%L!|!DYZyly-gBwY>+_;J_NN>vYv=Gr1BWzQ7t3tO9n;t+t%g zeV+I{qc~E-xtFtT0ViGmfxQ~uXS&XG(9v@$G@DrkJceI2CVP`KpVp%3F|!^@LU5n` zVS~e*Tjhe;1zTSbC)rq-SA(R1N{vx8-yDu27imhAxoJ;SFL1xIVYXFy(Ja-fm%2sT z8D9U=+uCPld$VDtpa`n5sgYVZP_n4uN%}Axo%X0-~ZB6E{#uxT+i(_y$K$2IgaH4(}5dJe1h)>u}*X_V*4-?luA&1tK7L!b0 zr9Ff5sC?HB_BuhGoR!wlME+mxy;oFI>HGK1jAI3K6ai`CP(-OB1f(j`K|o4~bfuG! z&}%5845)zwLFo{rLqdWCLP%&TCG?(zj`SLk-jsRrTmSdq_r53Zb287tvnFSIt*m?R zb?v+C`@XL4=Sw4vIqY2vPS4l5x#A(u<+&y2>BlZk3I9=oR8FL%nQ5fQ{UbuhDc!>H*RrVFr&d2ak3Kg?fr{^83sGu{Bv!B;Pz6K~8 z%|&%k8};pr>=$W<=Tp;odNJxly?s(#g}(L!Lh4RuTn%l$p>e!QmrXXh4!leipzWbD z4ck^l{dHrDsA1A^N6M|%9WX;l$r3x&AX-F`(^LEAeX1WSI`8|zn0@NEV_}ublMd(8 zdv@`mmueI*FLs2k)dOxHH+$Z}XTY-BaeT7MP_n*Q&CyypO&SxY8mDtOwLGyeqQbw= z0+8j!8k+6a!{7YPcHcJUCo=kE+mWCkMar!o=)GyX13}tDNBDD}jo!nxz8|#lx5E|F z!r~Ur%4pxj2dOPldITI1!^?P=_iH@nDlyt~uAzHrveb$Zv@r~^g>u~mTCe@gciqtj z>e_MTq4~IGAanl2D8ftAD;l8<@R?}&F!nY`m$=?)c`_wY5SO;TCJnrlqLhhm6pDx-J*GMFXEx61r%1!4u?cZ6jU zRFX@^vDmBa!zDgxT?@Mvj>Sd8?o^iYGoLG4I3{>Hwe;*aslxS!UCejwC7#w(`6s=S zB>OSZFDwmH^J&h6K`so!0Utk-Yr7Oa-p0qR9tqy&@abBE)%YOLUc&Pp6~#V?<2EUQ zAv)Rcc{#w`9LO@j2!HyuWbVIHQ1m+)zvRtjoeVeaJN(U7ddVm_G~@b|nNX3y*Xp12088z1MOu4Zm3uqa!Yqh zClJrtud#q&m0hx4+Xd+H$DBzW4g~>YEI*FIR-7#41@DL#a&J?fz$dBeK3QJbsMd)y>FI&#H6fge@l+v&fR`?{W7lc`DC51s^CizD0_ChN zAMfr|vU(*yiyoC`A>w&E);Q--GtJcRlzS*5MK1u8`!`!%>+S>Jii0NUQ@|v0?u!6q zbZq>>MCRIq;S;HwF;a|^n=}WvZa+%u(Z_OlQ}%Vw-CZJYCg-zq7`xQ-)W*( z(>wY9|3@@zs#)-rC+tbbK5m|o1-j;b47mG%jZ1f_7uZSPT&9tX##>X>BZUQ0u;1pl z9w`PK%jOg`WpR+UW*2@AD8Bsf%l^U3ll|yT3GXSu1{B)3XWi6+%M!4h^s0Ck6lv|? zWMjr1B(jGb)Dlf00C)#!-_1WxU46u9>wks7fNEN9aCAj(MgfMF?3|u!qMp=AMQKIk z2iYy({Uh(CHNVmF3!mf*H~J7QEPs^4Jqu3-OJugkV1)MYgN@g7^y@uvOr;@q>C=tPEyT~lC*zs-KE&O(<7BLyT>x74K(`|b->1UxnXRqz`;i*Bo*vHdNb&eIjvG; zD_!?{1-KE_m}1X3Cfm}$n6S+FZ%u6ctU`rk39r6xv$KD*EwjEsrA=;~k_gIPbe0<6 z;x`1&u{2&=;r;P)RiJqxpIXrap|8CU=-Pn;_Q20U(2X41Wq&n2IW3bwFsYSWDp|ag zRRmdMp8AOGb8krS#O$=+goo3teLfXN=1#K#(d{b@pdp#@YI7L;+fSVY)f{t2L|ciD zla@69&`(~|f$5$&yTdL2(`BzSyAEpl(Mo(ibFEz`d4+s+U!wZ5#h62%wtwce3F;jr zx{+H`ym^na(AuET*!_hv1kSb{!)?n5A9>d3y0tR%{q4Da1RHD5f4Esfwkf?od8P6D zz6Yg5#Ym@99z?SmP%66vb}5h9TQ&S6qtP(WrBP~VU?75x##mlwO(T6?(fr#^jXEr3 z_kUe#8>m?t1nV&0QiUpGHaP)pMiI&$Ylzm0X8&MU&??ECRt}5reK*YLVm}q7sj6UN z4DMSd{cJe2>zcq&v;199Bc}_UmDq6Gb>6IQOA{IKCVFGECI5XrB0s@kN$xcec;{ro zi^W&ER_jlOAAZS`|0yFIxo((Y=2jGFVJ`sNL$e$~4>UTH!k4h-yd@yXmno0f+HM+s zuR~0<=C$A^&;vC>L;9~wK$^nbt2sk56kC=Oft@{lQAGo+*LOc?xzXzQ&H0OS6|kt^ z{UnrXy`z-2>V$^K4fIJs@lw)ge&)rcnqgzXLCcQCq@Dn4gJ&BEbn3@`_m6Dy3ds{( zv%K<*0-} z9>4}%Tche;%bIOPVeL~ZQWxv61ITSVzq|VsaFV$1%=AJ`muKi{d{w_a^v)&d18rZb z+$x~3n)bn8$DppJd5{bxpFf?yvj)?N7`^2ITxFdwYlN5SrL)R` zx~ijhywXn9CZZ{~-#z^AOBS-+KJp-3&C4$_2om`>TiJK%%<;-SlU{*FVFyqu!+J>9 z?pI0qK`oIZSF?o1ONs(bcYb+wvQy*ptBU@o)nMwa&?*GeB+<^$SlcGue&y!sXqjgw z?v*k{i7ne6CP;VaP{KH!!Zw{2W&%qJsaY?0u!C(-*KPmEsc`P=pQg-evrew z+#PJ>PS$6kaSH>&cURwF`#qI@eR{?|Vw(wS-k1;J^axy#l?iQM-4j!`jgX<&F@YJM zs9`~BtI0YgR(oi-;=~dsecj{2PmrDe_W-^!5XcnzG2+&g$Sb!I_s-*Qwlj5>zMD0B zPbq3>TCY)K(!+Cd*ZELc{ksP}8Q%VyF%Y*DxemGNK?&1j zi^d`ibkfSudf6;8iX13lcjuQ1naZ&M(#_owvg7!8y>?3g^L_Skk)vHYXs}1zEz;P< z+fWQMYMT?001lP-Y;w+V1u26$+``EtRSLg{3;C4atFfx$`HCwK478FdFHOb=BJm)} zu%(PmN9>CKhu}YN8Dm`i;{ zAQTA3uq01tjYlg&VPm{CamBsgf9BvHK;vflPJi($teYX5uPfVL$6g4kWncL z$<&vy+GTZ2;XD5u-#Gs_|K;+V$%))KhJaH={XGbL*&|ukJMpJ$5xZRgCVfL-{Jx}`)i1d8eT73+h>214U2_a9ol$RB_xTfC5 zQBq3^2JpIib@`YeD^^XNi9T#Oa;02FuJlvnTJe3}h0Hpa!A25Chgcq_1_zb89dVO* zcg;C2SfmlKeUzSKnO|aMWr3RbPv{>wwv3EiF8E3iN~#WE4YtqncQi^Qx;FupcDN7M zSLdBI!{1Jfj38LbVay>WUjp%RhMuM72(uR!9?dLJtXbE9r?ebxWe*Nmb*@3b-k1+G zO-AR7TN_NPajO!6>TFAo{^>U?c*YBYgp&aKK)h0;nqexW9Fy|AOMZ31s<5ocB^hW4 z#Dnui(@`vlZs4!Hlkea!wwg255;N5aBQ`jK% ze3>^fp|~&=eJ4wFqSe2_X)(au^8Q8a%mY(#+?HU-ub;P$y)8Lg%Kpe}tL%I*C}}Hc zAh3YCGlKpL%+F69HQ!I)@N0hp(RUv`C)DwCujMYrKTA_sI|y55_v?uXK*PC9=C_1G z4A|=axjxf__BZojjW=4@im;fw4$|Kw3th)rw`{f6} zn2BbW@e^@L%ZN97%L}>|sOhO68FPKSTNJ^jB)bZ}!E_ousHob3VAlgERvk+%$r!K{ z*B)Cz(<^|Gt3a;Sh)bH~@B@Rs;*xn?r7kF~tA8IGh3s=Qg*9e+98>|+hC_887U90^D#WWdf zqI;$R1I}hrmfZ~k1BRv4sin!O2cw^()YiRGqcwinRmp${KLL&@gT9k@S2qs$>vq&@ z>i*i5Z*YUMhaVqw&g+qpR$y%QFt8wdzjAS-VF4rv5P!AM>FtzMUqpC8hfn`8`aCn~ zcFhESIl1fl?y!6-$6YfqbT8Vv1nA+!y_$bHZOPg1N=A0-pt{ubj}`_!$0@3{eMvT*CU_))1!j(VF+U(*6A7?vKbM>kBtye z_WiSWAbveIEoET?w)LCM|^Pdg60o&=ebsR5{K&sjIJ{;3F<5%WO+3)QEdAaAax8drs;@o~aAY3X z3%fDR6*_%}7$+K5WhO2}-vTGSAD`Css+Et}^{)Ne*#UNcYhm4LIqzKQs$bcLnx1XC z$=a5vtpuD2+RD0EFj)VPIajhk+RQ4#?On4;lPfRS&+H7Qcr^8hDJCSjgH^%}O)*V; z&0jUm`29_vhNyoH6Ka<_fJQHnAjggM_oEC;|M!3L=eq6Gah;k2+O+*TH-Gr_ zSK7<+U>zT7zoY94IgFJJ2mRiq0R%tQ840iJ5K^;k;NDiTFnB05^2z&3w$O}PXfT;k z3&l$dKWT<`9trps<-Hyocgu?zb0!Ycj;wt^XY*6|1b~z3H0WxMxvJdN8rXUSf~pqH zf<9ht4kcsl61J7oM|H7I5L=C~1eS*X(x?e5-3J(4fEK)cN5EhZNgGDi?ei{R@wX0J z5v>Kl@qj8ib3-_M*0OR+c&_2oE{T6_0aMytG0LfAQX61on~4CwHt|LEaE*+mX`b&U zSc5cK)yNuMG@y_o*Cn$nXa4aOWY%WU((Zya`3vD|7UCC%RVzLauXkVc3F86z1bq;SCku0F=*;cC5-?6Y(_Cq`CJGccqD%CWlG6^lB9zJEybW zTvlf4@(ymruRDIbD0o#Ge8R0+0I(&x^ry!WBiH>V8PwJjK z`RP%SRLkRWOc``o*{ID}%yU!0HD#3^xLVoN@0hfs()0P$6ztfYCVRyQfa*oJ zDd(a>KsUM8CRKF0LGC*tqH%ay)N3BnLmKWj zz`52^2OAWj@xsk1^I5(V1BmknTmD=s0KyLNumB?-74nh#_ziPzH^49ZjjhFl~iR_Z_D5@&7rlpg4ch#ycTo)rk6F=6D?ziuxJQ|VTh zd60q7hGxc_eg8Td64^@-!*AnsH|6kpk5jlM=>>Pat|=+yV3rJM86EQl9%ujQC5Y9& z1|KYVMCumF#P^jztWi*LULekUP$Dt@8FtaB(&=#o8~pSCfv5PNTlhL;5PW+czH+UT zdoh{w;%nulXmEQ4M`2k-kowKws=n1bbD1GOJS3b%xub;jp8|4)BQ=MJ{&1nH%ye30 zua&>W_*`DSvD7?Ra(7$*@e<2Td>Q@Q@Qa66NmS26l`zd8JzmIrUEE(*^nIxJPJ$fdupf&N$~D5z@HR!jfQ9#SSo40dzgS-aoL3H#H<)C&-L#^^ zWr5Z#$AeEk)6kEta)iZeWB9ACJV&C2o~bnM#*j{`zWF7BUU!Z?hNfes8%WZsS#R>O z2gnH!WSGRQOT`X*bUyPB>k(IkkO!GI3W1UkO7RO#UsVz(Tie}b9t_hCu%Z>=dTXDWz z#<#<#1xWWWlnj20qd>D)u6m@6FV=2Nmh5O~Bcf}p1tYbrtV-SvKLk{^wfa{KKa!Vw zl|9``-or?R#8HOGy#yK!fG_^+?@b@o_q4~SYL>3W;x9<9x&`p!oW z&tMt0x+}3WrGYB;^;gEtX>%E^ih<0UzN`_P914?}inGuk)-oW;fu1I8OH{WmtYWX_ z>8V3ym-sZbJ7r?OPF>hqsV7eJ+fE+nM@+-`o;+~B5=Sw+AhQSZ7_#m#cThML(Ymg| zzri9AW79eSLK@>vb-g7v>6_k(rFz450?6?!DKnn!r6^9(U<76)bS)%U(4G z!Kbf7x7*$x&&sh5+QbC}7R*#aTbl(;lIx<@OSje*pAkss8NsWnSsS3}h`V$hk_~R4 z&*mvT+I^oo@3C*{6?7xy^UaNL785>rb!4Q3k9b+vEPt1l%vYng*6HGw89igtRyNRY zvn-Q@d)yvx#xZ0pom^=%fZL1a<900oo=jahNjYgdwlr*Mn+|*ki9i1xt7(d^Nq+KG ze~4Zf37VBkt}(hW!ScE&Nzpue^J*o2E^_;jF+MF>LYMvQkJ5p*uQ7wy-(PJh8(rt& zA8#=&&Ce%0Nc?nH?M&w)Eo#lJ$7m9lYFDN$M|g{)?Q^t zJIR)L-ESr|$GN1eFh&FyWN%u$@^oKxl*3=eaya81?r1Jf<22$N|SNm2CLnEZNVqr7tkRX;?>+6TD^5OAxd*kp24~Y z4=$@PFTYqZVNZI-$T%oJoAB{7RAFFPUp;h6H#}M8S{{$v+dZpySj#V!CX#?Yq&0HV zPay(~H}$JB-bDVPb7EaO%EPZZA<`iu7<|NXq|5)ZZdUx(`ax>S7DXJw{R}aUz)T^` z-+lY1$IjJ~gRGDZGq2gG{F!s5AkYR3zF3p(*z+Rxr=$d79J8`e3KofQHC!tyjEy=A zLFfLOobbIFuH@UqKKt|aqkeE_$kckRcjzv;9t3arjiwx!x5womv`#cX63Z-dP@}!c zg`|Yf$m3e7x=CI+-)~HmYcZ`E?Tx zX+RAL0u@XE#!{{b9dJcb#jT!3i8W)N=dj+BE9%oBM&8Ztb0(A}xHSq@fCF?r=-|1e z7MYnEA|jQwCSYQ^Vy-Gxzbz6L!Ty!QtZx0TTGT#yVsenIpEl?k*+uR^oap_LW-W2F zms%iO0&+>OQM-iA(bsh^${=#-^XE&Y@4<5h{`$@_z%0QMeLV34dt^;`Kz`cu*>pF@ znfdZ3Wyk|Q*g+>RaLA%_dh_kz9nt()psL0e*^UM@R=u^{7o27|Z|+A8+NtotN-9_Q zdiU<6G8iT^)<66wZPcHtl^Ya z8)ND$|5I&4XcH`ZAA`1i2+R4&XAaUZ>aQ#lA#d#6*Fj%E8qNrjHaR_PE*~}dMpx6T zD5|;l7B_;t@ndo?f$n)<<&RSvwmXMUzqsoUM<0QB5)L*%-O^GoHL6wqNMB~3BxXDm zmfr6P`O}6u)N1+TM*GIoK|7r9lQzjh|EEJVUCY&+fr!$nvVpGyuYWveR)v32^Z%B4 zK102M+Cmt*F*0?U_l6 zYBfUTO8`wb_e{?e63;2z6e{0KsX-6K&Y2raGYj*JOcTIe3c1oK;3^(Ife%Ol0)a+q z5B}kC^UGHy?O^Ti5pOARc7g)p{X}^cg28HWWlcfv6xO;^;(lKDb{IueFrHD8_(=3c z^@-Mj?!?6A@Z=XIVFkc#-D*X<^voC~JrDlt*DPO#uC3&5!C=MHT4rdOT46wFfe4s_SI zb>3#x4Y*Ae9jJ&d*ZK^0xi{lc&pi(E-k8$)-YiSpmU8e($Xv);@3}WtOXxz_%U&a& z78B45W?Dcyv3sn<#O@WBdA*V~sE&@|;C(RTQ*d8>&zOhjTDXAtc^*;?u@84W>#vRXE>XeEIL7&=@}@B#X(a0@=)(D*WPMs?bO;x{GFM8BA*+OV+2 zhc@(_Y#*6u(ED^@ZFiPF7PdjFFQ-Zj+2y?|+T2ktOzs=BF^{-0{&D?OC;0go`5{E@ z;OuUbnDs%uQsfdp#s5lD*hC7EJFHqsS$_}}_F^A{2nV}c4p9w%4I69E(~|?jr*Nw0 z0`@1F2fi~mYlzxa2b`c=q}Sj5n-NwX$pgCJsu8~@U~$xVq6@vR~4&)a_yhU8W;RHpC-N`nAG52cX^?53knsglpdK^c|z!2i(F;$_b8@a zs*4D^FD`0d#;Jf_YNLf0Bz;^(+w6NSPK%rrPph>4xr2yFJUnZv=F?g!fI|<-z`~Go zYg+3hRVmxvKDXlJd_(Zfv0|e{54=B%ldtPFsGy(n^CMAqj+ydde`83wBPd6jz~Xe~ zybcOXL#+O&NhOo`@M&YQD*#s#-;dKFxzUIyoGB7=Hbwv*ydOEgSlG1kW2iP)LF&j& znD3hKa&y65FlO=VR`{xc#U*2+5&b?NWOaFVwNp3sAziZr57axlc9G-yKRm?#)BF%s z^F(VlqJQ2xbMfZc_U@*5!J>g`4&n^_p&%l4!EF6rkNSX;Eq{fiR3_0903?VyQn8K< zRx;+x2+t||_MAc+H*+?W$0TVD7jk>F2dB7lTLYg@u^4rw^ejQFc^K9h%dd?< zP#C&FT{YsC=b6U`+oRdpQ(4-`Onu^hOZUOe_hl7@}}gqwrlvq~6RW*7FWg%-*R&l13J_(w2X|)Ft?NJ01nJ zZK`nA(N&RYScP#RH+BC8r1w-=ug*>z-ucJnr)n(H85`RkB-ciW(}mej$p6+}Xv-hw zSlKGpPTK}->i846C$EC?ch5LR*3>Bb{(O%O))=atN}(#IcGoPBBu(IMRLKnUv+e+a zXO(6m`k-gi7lG@@H4&9{9skP4G=uwHzs=uHA3c%t@nS}Q^7Nlf`nX6O+7NV4q#K=_ zHCg5D)8~BBXlA)4hEkTStN^yY6P5*yOiQwyRb^owZP$EMP{!7O zvx#ePQ>M9!(IB~^Z~%6Is}=O+D)1=>CzIBAMDA3FD^9B?5A$5sT;Z54Hmv=EwN53I zf7H$`29&{U1WHOH)i0xS+sk8<0G$}TlT<|M%DK+Y|AgV6`Z*`6kQLl#sJ|aw?1&$l zvtE7TKId0CXuQvzmR2=vy8>!`c!U@gN&K75^8(|9l=b>;w%-hWWV#-;5d6yx}QMJ3VqXXJ-b=^ueZp<~)WaOIGF0j{*ZFRdRgeqzL?;k76dd*|-v`w6&m>w#&sCRl`<8 zg%%oo5*VaCW=XzmMz8F^C)jk^W=T2d3Um_QngD-Or=0Y=oosbR56n>elYh4yM{1ZG zzRr5kLVh0;Ub^fh5pLPDmV{j}LoR~Lhgm8UwQfzf?^TF2j(C0dk;_uJ;1sbNGQg=N zA-Y4Jk~SP_WM%BU4@6C}JAZuZxoWjB})`Q-3VeoD|C#>5aLh_q^%+&6t@i5#<`L~QdzUf1L&M) zc!K{l$QRB%Zg0^4eb`5!xBBB)9imB8k0eA7Mf4LeIFCr3-$vPe6I4pr)UE?AcoTZGGZze39{e1m|7fSX($c2r>X|mDEd_1FZ!c>IK{D1b~~9P zYvXS325;|9ywl)b(+G518Ti!mMQd7-yb!U<@9FI)U-ijLZ|Dblx(3 zR~>U3v6eLIn|VnIXku0UiR>VxX!YS84rnW)(~8j1mnzhwXl=psJVp}LP8R(X;>db7 zFv3>a%j(?DE4M2S)c#UbGO|t2;G89<>~X1lA^=Jdh%{`@mV??rcxZf!D_7};;<`vRtpvtmWs6r(tW^v-;|f2lU2BLB-Lj2_TIYJ_okJXSku z$|8I1G#U)8UJIp~?Ta^>??|8plQ+`ZyIM6!e*RhqClZ`QjVJLMk(b$#jc7E}$%HFn z$|(H7r17JaOGrr39&@!KJnz=YMAGzeR#L->uW=l$Nwx0reit-NkP)hTU6yQLCA5~^ z+fwk6_*9o}lu_oikPHNey)fd{)Cc5Ph3ZGasdaX@Mn-b4)jfv@blTNiQQOI~vcVa< z>WMdTR03O$O3Hv%dOAc?SIm-}nYemRgev0xrvFaG6Y$i8I)nT@6=NTNV$IlEKxFIhVX693n?LZ63AQ@IH|q&nTWo z<1ZZrr}Vi`fVa=$Ssm!&V544nPlOTumY?x_rk&w2Q)X6){$@sn079bGGw;wsBvw1v~v?+O8QCKTAt@~8Mf$>OYY3~q#&2V_z~ zNfQN>fmy#P!M*Z0>NTxvUz3R&&W#{rNqOL#T}XDkq7b&Zaadj8TU^iRNeuG%t-MJL zF*S6P_n2}VpPjlE^yG9%ym6E%8$z(8SV6Me4(mFH{V{-2RH}(y^=U@W1KS~r03cB};wV!q2O#(_@MhsYL7A0w2e@dJdplM%+f+9RbSf)%` z9sB2DrW)Q;q2S9iM}dr!xb1<%-NOy`7j_A}t{WpUYC(#TAJDNEV zgVW{b$eYT9^RV^}W0_J9Fttx->SBcJT*6G;FxU~i`S_+{Us2BR(2-+OdqVgT(6)>* zh(Mpcao(4CwsjRfQSI;v7bfe4*xJq+Fmy_`-PpAnb!)SBXk2eUrV#Ujq_G-i2Q9Wf zlEkZ5x$-4V&b#^Y)|l~}_`NughG>md@M8D2FWlKYc_>L1UlYfYEDVmkmapYiYH?~v z-#0p_xfEKE*u4-=bi~Zu+O0hrEBQ;%ecp6%A*yN^T@?+@A};QPkA!3)O;$0JmhYY% zt&KyVmQ$Tdy+?v5Yl$3NOrP@mS>$=sfY$^c_LIN1dD-VfL?ya6R5baVOQ>AGSG#&a zKG{P9Y24g0sA8odN*QL!s+}Rt)w&2i+;h76vG?dOmm0E#S!=l@#QHY(Yuik;cHUE^ zOkb&ddcV&>pdjcunmyDFvAH$z<dfK;~ZqqS2K%XAyi)t=~{SL0tCbh*7*xOA9w($(WrCe z<8R~M;ON!wHZr0>%#W{o8Vjg{17&1h({`pMgoe_G;%P57-H4rKh-B3>@wL|vpECB0 z{(8(?&=aiZvlzJ>*P+06%R?{8=0`mgAa+qMmwCESd)a>HXuJZNI$WOI=zdD=9g11O z!cG?LfWi7!+#zXr1Q+2mhXw9J&JE2DMM}_m;b*p-LUC3xvrg~@*jR+PP`~^%g?tNO zJQgoUJQgnHIqtX=3`{gu@Om{A51<7B>D5mXwjB%a_W zOeF80@2a1}pmjJn=XkuDvmf$gAf+Nl^7S`p4GA%QMGc8p>Y|MA4>|fBxU2YpSf^r* z)QZX^XTDilBT*}9`qK)A1OtMGHxWp#AUD4&jLUnJt$9S_jJ#y-R|?P2HQ9M<9oTQ* zHuYyA0NP0L#F@OHZE!+5etJFd$?I(cYH5{XZhL0kSEYk`lI$C^Mey?vhpKbG|>|* z;*CV_mm~W5;T|5b3ss$)J%Qk;MJ&@4%MzJKLS;omJJdTN`u^lqdwX9r95RI<``y1Axu<|}#I zB{>Eq4WM9!UfExEBR2s3Kr@>UkWSbf1<%Grh`0;>S$j$oB-;a`)Z-zj;U05+9z-L`;N5&^p4Cn zKt%N$%T;h81}mPsxEOB(MYC)8vP-q;x*HN#Y|>yL@1zr}Pk`t)pOG#7|AZhA$i9;l zc|{%3L$qd#a2|-y5xlQYcxug#atcldo}bf`VI>`l`K$83d8~1hZO#39(kragAnz@r zdH>1QC3Vlvc}LHe@7VM_lEIH#iLAZ}7gBeG14#T&o>q`BV1~EF)lU5aQT1TkzvT+l zD{imd;-1nZo8J4r#r8Uis=@oR!p@^sL(m$-wmd)(zQ#M@^DKBEsnuOnWve#vfA&Du zOpgXM&(S5>j&Do5_5kycZ;hKrtC-p@^2(xj-}uIvzuCGQoym>_RM?~x+Qizn+VQI!Zgx45lYNXNhr!z_3kK<*;zLO(oDQogN5|Jrqxx-F*_b**n&@aRMxONzF)s5=h;&8*vo;A&; zsk5iq;mO0URfn)Uk%OKk&`^4lWgFYoZC8o-g3o<9z<`BoUN0e}R~2vnenifkolGy|*Xk?CeaAh=>^H_i!!Z z?BYU^C1^LDU+^Bj}|#LGBVxud~cI3 z;Uk!wmiB8qx9%jvs`V=KA~drSgWQE!&Hk-5q`u+5Sg65M%gAF@blQd0(uk-Wu3Di8 zBpy!e>OH$DHk6HBDkOTieo)$ki|ZqeIz6uLx<_Mtn~Biwapu19a_31z(X8>i z=SRY4l0{VS93Z=J?w+Oe|7^plEmmwut4`)9&nrB9g@tASBSvV^Kt8wgn7Lt3@kN!u zawTR^X6%K!lM_!{Z6nM3;+}lDh-?D0zz&wL0Z)iaFV!rj+>Xn!=b9yy@t^7cyBiFc z5d%d=Q@=Y7rivE!)b?J&5fkl>tLX@|4Y*O!(4&9!e8$o0`w+h4wuy(&!Va3RCrh%v zyu4(Uya_Cf37FdxT|V+ciYvKDjUaJT3AaPF`0x4TSM?=Dzwll1odG)pO84$QLttv=isHML<)^i#?z8>=u%j-&`HY-{0RwE8}{*P7LLK7b?{F1Sc6p;WK%ve0H_i+N_{ zNPC0sCHw@nL?#u!eO68R-+B)`5=}s*qh>J@Udqky5WaO{iVH){t3o>W*;vT^^+jcq z`P-)eapk;P+#bxk^^1zj5Qkhac3uz>66|gII$t-{Zi=_j%zaGoV?I@Nkc$e{;Ilgd z{1nYp?bh6RPl!}sR9tV(ZG6u0YfmZKApsj#(Cqfp^nKGwage~hVr!+(Bc=GD>i`&07a#r=pU z5osq?)6&MTpzDWfuXBxVgAEA|imn$Uu~(-qHiZ#YNOKlhflM==Ht>MpuJIO*ov$i^ zyq|h!C=7M*nk0&hxBlf;Z$E+|UxwyN@+6UVUp}A!6WBCP!|_$f`#F**s`FsY)XHes z?;m$iB1L`gro8vuTb}NH9;Fa~SdodpU*IJ&xbptfnzap7}TR1X<>I$*PEpsQ@1)#&%p+%wh?Bd zkLy=yC449Y6MPbWk_JAZZ`djIwRd+jCMn~&U}E(R!rDotZpbvGny@HC_9H?Xw+wH8 z+i|@3)0pyFE@yfY+A4`gc~mUyQhNyghu#5yi6+EtOdYkpRy#%lX0>CVwwQ@FwB5Qq z-;Hur7-pkbVJ~;$B$CUmcb)z+d@f*5=L_I_6z0PgtYrUreR3`OCfYAh3xeBGM25OV{3Brsoq0WC72y48S%fIVO+rK zSpGaXONX52fwaE#`{2q|92HIbd4fhw$p@Q--S;i0y9ZOvlX%1uu9(Z-N4B2p-$l58 zEnz^$SK@OFvQgs2tENiYYy9*#W;wBai_bbrjJ43I@m7x2beEscCtYYt?CBtG{DCo| zS1liT=`H~Oo;)xkfKg<~v7C0+Q5i^HmG;XCW9!R&xh%BIPGrHrr9*^g2U-B+t&8IJ*{`v)quypeM5`iY2AFr&>#7->bKEgn?Yh^6^+{v{;F0*F0pez6aNAc2;qR9B^247Y1N|jxY%qXyV&WRh?QxZri$* zUXY}E3Ah=mlQ9)4{#8=u0A)bjb{X95_yqdO} z4sc_NY@rWrev{7uF!Vo3hPsmmx_q)t=(D{Rg*^-AxN6M$^_zOl#L;y;17`aU4tTBGFizFJ#;Y)s9x5t9X}1 zi52@|4bA}gkZXB1<`4x6^3EVl%I zi$I0D8PfRygKr0Ae;v4Y{KVAoK)a)bSl`DBwWxZzUs5tTe6an7LOl6;w7}Q%@*?kx z&R(ly%krmpq>zCe4wz{{AnDOM;p^^rcvDCBmLUGC^+7&)Z{E z#}xsC{;N4(L?Xew5lJdow*~i(myPP4IScwl!%D>ldFLCx4^6*o@(qSX9$H#RBgtGEEeAH`Bw8z_xG^!yhQRz8v|HVv-a-597&hqag!UL8T zw>;TCr+dqTdTCDvIc;>9=sUn$DN3o~)j1MGzk7DXbDwOO+*yo)Z2M*%Ih(DrkH~X= z=NozF+uek{jh|FQww@hYU<>Ky9b#v~PO$JLr4ECLZkoA_mv*}fb zc<}64c^mz(s^=R==VFV%JV9_lI;TzbB+fIo)E3ru%^bFJz zX;^qjr6QP*+6H9_uXJAcFCZ0}2#Wa#H}f(w(vD#U(krmiGh%FTo**^`RN+<)|G}D;mmpP>Ed|;jV`i ztCzFZv(3f(WyS0VCfhFaZ8!Z2!^FlkPiP2TRlQXb>bZ5^pju1$hb>OqJY185L0)MB zLfLAj7L0_sqsE+{sGHnt@PQ^P_AeEfjNt~$P+_|y*`(byd-T(`MqhNZP@RACvr z$L&_@HV~dHSM8cKG zdU;??xWGUx&*pCk{$dCPZ1%%I64Vmv;MU!9nu}1=)Fh^1! zdmCQ8+2shXh|8g#a}wXC&qX0|Q?=lB=iO$?M$o}$t_}YuJUr;24gNSeW9TXP;&i!} zkib6=1Kt>ViQhB}NF-J(C?_*v#22QITi3Jw9b^AUcD+&r>d^F3pVr*>Kl9am+{0?B zwr6s$xquNyclXhw>U~tmClIXU1$>*Kx`98Yw$e1U6WS%E`jU~lJQ^NO7OmjzHcnAc|c5UFo01k=R z0q0RDV5Kr=9k`Q`oYG;_=r(#!rTTZT%&d^3mltQ> zw*N5quSZ0}(nUM#zG7m(7eT+Ka_+a_+ zZ`#i|B0lLq6X^RKc?-Uca|X@(4uL)))+ zWsZX@9Z6`FJH#Vb(KRNhEed~qLm?oPw~1+R$82h=E5mX2z@+svDZT@=gV{W_ThSJY ze9~k6x#QQNP~#RKJj(fi##<*1UmcOQb0KHN4U|<>dv~sO`KJ0t>W<3ZZ%k1b-I>Bd zR$f-(U$%q*s%4eWP3NC>G>D(tqQ#dA-%`0HCe7ucB+cQ&%7wmm%Xxt!IS!9pyPp`5 z@AHg2@%i^P$Bnxmv8zk-2j&U6MM()G1Nw6mV;k?P1w=yOj~Y)bq$k{`I`q49G5Te` z_kRvQvOnRK5L+_nTUj(h{_!b)MQC|={emCjxc^k`g0I5#|9v2dj>k23m8hG7Qf(sL z7o(?IwU;8*-zxl3{Ts{0Nz`s5+Me6JdF#UV!{lW|w0nV8n!NbPm!a7Juw@~>3Tw8b zF01&Q59cdF0vlfP!%9p)8J;-(>irPA5}R18g86&Lxke91B6k&aKL}8q@{-&F_g@~< zMqT$SXAMzw_-BQf4?s?KNT=eaD^IX0| za>UvqRAj$N>cMyW4Y$qo^N!eC{5L+kRwDSCjDK}{%A%#}>Dd~aUYl=J#5PsLU3`|z znW6-$J)>fLJCxDb6iEm%Oo_BVNouJ{F$yn)HD$;~%7_bB5C`nm`watop31PZ@KlT* z0$8^jTH$;do~b`c{Zms55opg&d6z8lg$stlrkM0!3^w0mbK zXSXZMar+&mJ!sUVrUkRU0bj*zDze5+6d#@)DNcNYal;hiLVm}Sq=gZ~x6t(k5%0zc zc?rBcS_L;BFr_aH^Uw0=#_$%bQgNkjolZa|fI;4K@5l>(9D349yd?51FLH)wD#j_p z?&E>Bevwx~qCR*XGiO|o3GrjN?#a^jB0p~qurx*ytlzsDz~PD=aklrerswhjZ1-rh zE8?-&q1U{ZI~$UA2~UDJW*wgD&WIvF$<*&j0D0tnoaKq(LqgV6!p-Aqh9{$~5l+Tk zyba8oXbO9BqPF?Jf{|z&^<|SzS0Dm=VMx^)X>yG;BZIH4b;dxQ_mp8Y`{I1I=r=7fbZ0UH&c8F(iNjzr+0t4d>_kI zNzX7-Y}k7hlKw8SxK2t;OchFW3GYXgj0H1Jc}^7sQOYwE``qJAKK2Alx8L`HH_fvg z30=|>ki#Ls<(zy|b5^?}NlS2UcEA4`Y8QMJd?8p`<%fGhfG-_H>?`het}Ekqt}oWH zxX4}P?DhRyBa0_fh*&GC>5LdYFByG*m5n{(WKi&akmx`0UW5mcXdyRre>w?wE5AwM zBj6+8IWb=xP9ASav7-B7UA&_lz{_E-4dIWsBK+Z@%vo%u{63wLJJy`Emp`&p>PNe> z1K*XIcSfnud#+-p3`!I4gyB~Anbj)Wg(waOt?uG|r0X{LA0Nv#i1eD={fw4Uj?lC# zb=$k|E@vJRKRGaqTg)tW{LrZ8u&nVvs=^nCaT94!T$q-uUTwmuuXgkNeQ<_*?u)d1 zTaci+^+Sj5GRD3^*8BG&$o^T!`$^Fr)y#QsSM1HKz5DGa=ugAexn<7Qt!2($xUSJ0 z^V9HRY+T)y4aHZRIWfb2MvB?d16jI1Qr^M05TL|CFI}szTds{jkaq(<=@$e>%>@X35{cD(5XeYy<~7Z5byq9Ltq? z?RSUiF7&L9*}?a5M>Q%73x94qCoj8H+oJxQk_4Y+#lQqN8%8#*b4 z;%I~_1D*h!nc-=D1{BbW5me1D{vX!bWkf1W@}JYE-fGJr)XCp|8MSD64u zf6-{4^3#MN&uf>&v3-S9>z{BzBNul3*|0fuZ zwB(Gpe^4nHIL(umue@VbQCZ#BxYA@t)^gsL>Uc3&xl!<$Gg#1WQMz2C^48`tfK=>1 zv58y2FcW#N6*g+}{Uck5k&#ip$z-mCa#&oa&yA@2+3I-Ot;nHfi&(AH3i^wF{S$Hb_=R_ zS-2CA2W4lIb1WBGN;n~@W`6zpb@B1;m(lex6`nzE>&)A&bxE+I;)aDG zlE%f(n|mpr|1$8uLj*XOi**kUE&aKDt=l8YuidACxsW6L>Wi1_v$g6{jXK9IJ)Stp zy?i-j-8{c*)MdXLJ;&#}y~_#{Wm1uw#4kI8T zA#p4^W2alQZgIO6&)|7d$;J$E@#?gXMU7Xrxl7l4rRkxWqj0%KF6`J-YuF3te*#&e zp}5H^=neI7N`@W9z%`i@UvhU$ZT}I?{~9;9KQ2y+7vgRU`WL6 z@BrU}y!epp*xau|j#p7&`8ZVMu%$?nU=(&?QpSFM0u6YFxh0c98%wFDB zi76g5FMlVHYH2lFL9*=saMCfGM~+N9d`oOUj_*kO3WqU1>Q>J-t=VRdbLnVua?&HR z$w!#e*pJ{L0Rx3hLxa1~J>U6QKs?^Qm-maMS`j?nz=7Zpes4QUV1Y8USRO0rDgurZ6#%2MPj8!wf>3l zS;w#2+5xAsiQDx~z^Z#Km*>fJY%Ub}j1fSVQFVN{Td|Z5w|N22USB31iU@@+^aStP zs#-Rq-{7ZWP*`^MF&xf(G6+Y38RIePL+GN^jll3RHkLU`18<=o2qv#_X*V!i2J>Yd z|MvUtLmy8nfW~K&18Sj9S&YK`jzY- zxa`qcRiIC+@TkHbw&Xh@Vu847!YB~eecwY9w>6S7DnM~fngwU|k>L&820Xf$zRnoC zKkK>F^}I>bwQ88&g(H(xX#Q!(FO}QNQLYO~oSHTr0>CFK-kl@+t)bYsR1Td>KU4vE z_aTf)n>!!l>{L#@H(IAqKzPL#322U&Ko8XKKOJGK-kzn+CNJA$l!fs->%6%gpb3=C zwH#-xPc!gmp|uGP1RBBOuQT}XRke%iXw&Za;Z>)xYvDEIXe4EM#;4YuEHxK44$z4Afx6}We-k4QJLodtuKn;J#klz7NREil3t>*L%s@#3_bAPV!qTF38c zrB;UdZP-AYg}Sefy@=x>6&v}Kvd7wJW|rDrzIWt&((kv}sRACIbRM{>h}^_~M!-A? zGxqmmOJQVWWMn?-TncIq`bVGH&)4(@?Zj-m)RhtHGyq2S(&tq=+z;ecp@_{B47vNY zx6l-~&skV}e%gMv8M{DYl|k5lzuvZ;s1$6xGXP*~m)Mzn`0e$*NsO%7VsjuWC<>?v zL0DcNm~Q=*v!9Bc^^^Mdl0!FQ&^Hns2u@gcM2sjLM$%LhJ@lHHT+`N9i08{;CE6{8j*iHg6s!OOGiX&isBG6r2 zgu?T<5x*zzn<`T~+`NrxEWpSTkJU6iLoOe&#%XJb4I~{Xkc+-mX3C~5?D6FmBS~}W zQX4VS_A^eYww2S;>%KSb?k8}kwqi#L>%FKtnzp7bv*1>e_}Y3_vBKveXm0BgvoYxo zUpnDen*jwv2>2X9CepaJP|Vj7cHLJ?cul|oLV4$WD_23I9@9-M6bk9+5a(;zt$um- zA>nuM&#jY+RptQIA#&>~o4?kj??&<|Kegp6=hvpCYjiD>r5-}YzDq~_qN1oMQ(j?C zz-Mz6*yMhqt#CA38Oxo(NCSqbw8WCv(Kek;O1;qk^^OLobL?)cx{YO(!YL)Z5!men zcXV4EX_|?@&5CVk5G0hT#s z86Br>N8H0h1f^nG2X8`wUIm02A7B}18K+MXSd3|RZtD%v$(n6jWqVr@k|u;!J?S9R zmZ@K8)|nZ0^3H$0e+jn8y%SQMYS~Ww9Afw$)94#ais|j1)XT8ZTXLqDs8^{#*c<|< zoZ4o2THpp=<$<$|BcGD#XTrTtZSG}gN-0Sbq=jM+?rhRY)yQJ0zy;YdZKZL_Yf~jY z|1+tVJM4H9%(Qd{sRY~AjtnpWt-LP7&A|T)29Z4-_&)k5oc#}leYG_}Du%CR)@+C0 zBO2(O_%w}X#TbdK5jjdEH=tL9Mrj<$HQfSdF#=%FU{hq^7Az3Cc92w;r^xDYQOZW2EFTMFX z)yBtfOWp@x(|YC%0)~g$Jag90%#NNr7S_Bi?NN_N-m6YOLzutxQ`x9kEAqsK|{xjcn?ttQ4fJ8Q4dB6EnN3E zT;Vh2pPISrUzO_x=X!3UE)C0RP?rQ3dv{!HAXNGv8~BvVULLwN`agM7;PtP4K+8Ok)(Fdv!RQ~p%6%2{V$3-voU2h zjYm7SYuDYe3>g^K{yaycEr%#}8+0`fJB{M7-%vInaUT3xWf8ye%)!Q*H|9O$mFKwJtxS`5L3Z zj9s}1tS}n6@bjBnZU1n?bh_cU5DgoeksCY>Kj# z@*2-uBhqkA<6@$8N|VEp+3(x6M?bxPOH10N!Ln(;E^x= z2Ip?if9)5>U#iPnj}@f2{Z9FG|HY%AWW@!~g!baTrmkf(y%Wkbdaen;%vn|fKa7jD zlz*hl^IcgSj!p#W+uBl^9uBN}7@jTF{bI|AeFxw6{V(03QFm*NLRHY5+xFxpA-}&- zP|`88DH5+eUF%+R+et}79;|+i2iDM`Rv%aY2!7L4FkIF3aC#JX>cZh#drH0XK8ps= zsGnU~nsfB`ej)Z&+w=@+5UaS!%Db@v!mY^D&0Gne%f7vQ_Ce42b_TjrST=EtRC#_kNM>p(O>n@covbDqC8-F-^iI0Exk#kus zV^RZ$h4LAI0z=8vFuSv}b831d-OZ(;N8FbxH{Z1xGD!uU^;x~xPEyrC3s7TYS-;G* zsp`9(`Oq$){xR}{N#OUkyWK1Yd4BnP_Pjq$K{PI)EL9%&!E9G0MdqO3vv%)L?2#S~ z+B-3+$8)(+gk-uwyi#pSv%n9Ztv+9Xwjj_Ri_q~Y0v7loei04C+<-M4#b<89>$-2) z@aC&_ipM)+nMR@2{n5FL$6qg~$=9fJ0XkSl-0(^l{!lvddY*#m6`)G1zL@!g2LYdD z{huYVt@i~GnM`Fl;PyGsD0`>)Et!9fc0BW5Xr(N!@Xke2<;mtFcs5Vt zYyELceaOnR?z@PtCx=6oUz3}JNp41u<;xqGfeNj9X}eEMZ|)7{o2)DG z8_}FLajS;tdUNb{?_a=Di+$rlYsB*ktqrk{Lc}jjV3hFmeeXGq$N>hGWAlX}GbZHDl9rR3M7f3!4T;9z4@1e>se-;Z2;-@J+;;iJ}lvE_^8|E0X1PLc|- zj>YZ$Gc+^Uo5KNSi5}j#KN1Ue6o}SjC4oca)(d#LLc!#;y7Vw^VoXiJ?Q}BpXsNM; zwzHVtSKjxLP8Q|sp$~zzhI|(Oqm`n@FWbcG7kZ&+#}e#ljS=bF`sJ~wwzWASNSJ6^ zH}A*|8Z>EPAogo&uS?C2Ouq>xgJk=LV#$P-0wLoX+%^P1N>i^;5kZ=X3XQ88Gk7Fc z%HJZRl1E>ove6C!>=zqk>KEgqdCrTCKf>2v>N;1@H@$8|x7SF8piMP7L{&`OCO{<( z7PM2_g--V6ISNr-crC3ZB`D#({!%c<`zjibDt(4!@ToOh#o|j|!>w4WTehTEH9KyC zcTr3I$Iqti?(-7n9>eDwav{cwJM%yuCzIyv#Kc6$M!H7m2|`iZuNyEaxgOGJuUW4J z(`PI%>!vZgm=btc?!v{sLa2C->m9KU1(sXGAOWi41~Lh-K8&%04$nw&?&QSTL3Lre zry_AU5vdTz*L|a-O79&yuXd?XKKfX19YGPB@|aRi?9{fM2c*$0$NfhL5=hA5pgy}C zUFzNFN4_aQd>a@-4zFosWz%PKW4F?l0^bj1{3QF$9EoT@hxf*XzK^W0JWMNbk@GP4 zk68;EUmWL%xm>3vle?ofH(9qP!`l4(7T-S;_xP=;t^OT!CXllN)=J}AvB~@>Z2XEa zs8At(D8@!9y}{X}+>s$ zx+f5eJiqX{xL09CA?SFYl*Lb$48o6Ie}nizJO6m%NPhew!0CJ~JQxyXM?d2o=u9XS zOhBl)+U3{IHb5^XtEXzmdJ*!l(0o>&N})P-^vnRQY!rsu5D;xIgoKrlH!~GFE&4f3 zYzadHLuq@{QeQKLrmjx%@!XF+zA-`qXlFF~RoNxIm^Zek?^wAr!<+kJT2@)+YuIsI zY#@-J;6i|K*BmFq9_cvowYty4iN6dEyOc88di!zR=(!Bd4EwWydgQAk@Y)~`+9!Wh zoANS~4jshX61~gIEi?lnaolsS!s4WmEV){BeUbBEr$OEj>gr(1v7%NnbAGN`($yE34n18oL^*Wu@Wwfk z`_;DnTVag?+Z0j-9*VZSna$>JRH8ew5!?rh!U< z>Q^+*8R=8C$nGU7IdG2OwDSh&>DVcpeW|;KqOQ)m(}EB%NA-O#1`B)fT9xm~m{cIU z!;Ga%L=O2WNR@mxzxAE;96 z6rekgRojLt$cS^-h#C1PN|_406OTk-y&A|iZGkd@e5kx)By_6gW-+Shq;Z0@bM#T7 zsX#Ua%@bSdk$Z^K+8tIs40zY^PR?AmkvIih@~%+c*K5UXuD8qY0h04a*K9?4>q$(BBidMw`$bf%XxRZ*F!cHVsL<<*MLw`j(e%sk7v z9KDzAg4OZz{2-$!IMgyG6Dj_1%*Q6<{Z_6>k%$CyB?rZr*Y{h-ahB&c%WG8@W zYBZWe)Ru95vb3kJTjUatq-1JtzNr4pRM>Q5$tbew zeyr=6M$`Ji17b}0Li5{Lgjr-&g#*4QI7u5*dSJ-NT3edevN?BY8%K$19wkt`%-$I@1o9n<53cMq>Th}Z*nkdTz0djd$k>!I-+W_h z0MW>zck_@&x|!!0^CiYP@y@fZ(;E8~QYe#iDch41W-H2IfO^N#{PrKjJ6w9|%{EnG4g=J8an#Tt5>gVjkHJjBdnnP5o0XW)5I=bTDYkio1Ap$O~s@`q-!;a&3uYk3T0^K z7CGFCm)ccopdF2JcBW8!nm;frBjnUYaTe_S=%*^i;Qx~qX|tY4e;?E5`qin?-Wg%> ze~Pu?bhpsY{<09*f@0E6DT&q(g&xJo~d7c3PoMP?LL>-0N4_~~c2x3@cp zhGveA*Se*U<+8J17guF32P!FNpL>cAc0XP!^;mx*TVBX#2brfT3ZN=9=@(`_Ko$G- zbH)+MVGZ8S$M0I=^%Qz7J~yXtD;WV@mhiL&F#>=Q8me#DlAhQbcKY<|bTfFdD73Hf z(#Ydk*kh5#%tyiXH8>_-)fKPWwP6e2w$!`}1O}>q-i=t2tZ$02)_L79d+(d;1&Rxx z-}-}XMf0+zQuQsu_;ap3v}R@*ymwjt3W`yA{^m((;#kO7zQmZ5T?^zYylPH#gJ zqEMAaQ#rO~Dc`kpHVp!_d+Rqm+}NjBM~w^%2&XUpwh-3sBWkT)Ac#P~exAG^ssyTlIo_g$9+k|D%(JTDbep=H1&nf4_@C zqLk%Dcj^fY+MOze+tnJtA|+k@0M{R*Y=#|hjcTUF%_6O5#mn;$&|fyaXITR_ zIfIRbMRCxS479>^^NA><$1?U2s+gCdgRr6Ljl2cQ;kd?*Z-jLSISz~)_A(`--x(kk zcvjN{EOcv`^K=sbili_^0FGo_6%4X;ftw=IrOjs-AaM-pn=lngFtXy7Lpt&Nf1`v(gZ2U_G_HTK(g| z7iC639!y$rZ>TUC{OjuL&*FQuH?xJEdupB{Fzs^OMm z!v^;z^N4=lELI>SbacJV68u{3$RrmXiTw0%W;PQBQ4yrBdv8lq=lo*jYEkc$T|#7C zohi0tZ~XS#mc6v;w>SyX)I7YsuihMyqDfGZ&J-M-C#NEYouaX@aOsU1nN7qZKC)8` z`TB>k37~`YpzG6%$BT@yj9EVA{glR;!+J%VYNU=dvY42|F(SI*MRzat`9z`oXC!Vv zjM81;>k<-?)hejh$eNP#&IXCrw8l=goDr}JB{B}t(6bIE_}UJt^^L85GusFhot+Pa zBn-~he*FrWO?~kDl#FIQ6o$B|^yZDOd(U`f7g>#NhZlu8QuOC6aw3%y7H_s9|kyqjPB*lP;X zti~gzTpGL^ntm2BbKE9l`i9;ZR88sX^S3V{99cX9+@BSzkO1N3Ne8cPDzax{& zajQWou6s`<#Ykht5THze#VKahznx0k=JUKLZ-xf%S01Chdlu#Xsmt+!AqWvMoqN|g zk8z&Rm-IiAAZ1>Wj}{n0n|TVTfJIWeuZGRxsf3O1KW9qlkWs5E4?uCqvC(cxkejkk zUAxuM^L@)5ltmx# zX}OwVL1|#Y+TwQ%pX}l(u`elq=J|_;9sEeRhsuF))lATdinX(q_D`P+7^YRC=qgq7 zBvUr&J{tL{#(>QB+J00qsB_ZMGd;N;xeG1L4R;)WWPY0~4&q?CV2H!@55H)ezl*T{ z{imqZ<9K;NU*!@yJ;xQ_;7_6QocjfRqg9?hA#7)4O*dbf5guoYbH8!r!ncMAz>Q5>4>?wP?-IOO{1HhC8yA z)>IK4Iv{zTB>w$++M1AdX~2d?$|mNguwcWi@2_zo8A6fz`JP4f%?P_{L6==+ zEPdLgPwrA>OBHGMR<9sEsrY<9hr0`O#zn{zx!H(U_GV&jOmMt{Fe5vtXK`5I5wXrHS?BR8YiD4Oalj1s&J z^`uc<3z_}^L>Oe3XE|~gnhJu=BB)s@fN5wmoKNkU{6IKIs8qBaJqK0pF^LS87x_tK z!{o@tzUL@3eHiJX(V@qsmbzUJd9!0&1`8S%q~;Z&Op2w6dA$)7?**C1iP*d~HZdywg4UK&lJKG=k5=R9bX>3*jsdA{Ak{yVKy zW)x}rsz27!HCfuU5LlUTc{H9S)W+HJ#Y?R&*mk3oBNY-2K+SU*&;0nu#TosnUS^&d z0S8$hC@{yc_Pns+(6$F6fh?ei&u2n`&tfb+C>Km#XE>STr!pl>vg2AnfNwRL!{v{z zH=`M<>*uM)kwp9wy<&Sj8`Tg^)5s@zC=!te?FY~PwG;t!$=WDdxj2i>-56+SmnxN~ z*rn_AS^_F3EA1W$Zt^*i&@TBdk`WH$8xhAZfNgT*WdEd?$0>%HnOQM|^q6RnA^8_^ znbIUt?QLjvP;FfNNq26g3Yrg?C>qd1jopISPg`U~;$Su_eQuI|s;luG&0G%k-Y zo6?fgNhot`jKXK?Bly&S9oW=nzi`iJVSwCzmIP~Z5_8J0P49-&A1f9DK`I~zrOdeQ zjHF=7o_G|wp*gXK#A|I?mla^rha<1IRmP<)iX4CxC{alRNT$x~J=O*{!naYtY0c-a z_6oI9J8vbF<5*Z&zJIWJY;!vzCpKVv@pBte&^;>9l;Zr3r}+2F;#YK$f1JcK;pyV> z*B!R#oZm$qhZ%_AwH@qRXb`WDS;Qr^rI_C&0)?)(3<93qTJ{Sx9)&KNF9d=~x`s}A zd8ypz{*R}#j*9Ag!##*fx0FaqC@J0DDc#-Ooze}`og&gObc1wvcM8%Vopg`i0s+D%Qfw^+ZHEy6PFLXNE<%kTNI^%ETC%1WrHrKSW z{qZH7Q-&s;AO&pDt{x`4Zk{t@G8kst71xIgia!UIZCZu3NRc*d5wPC9d+kG%eDmx= zX|E(90l$_FP_1+44c?psoVk#bp1W!Ixj~Ka$Go1Kb&Q|`&=tQ6@?0*hwu zOIc2It?5N^Oxd8+hh0w;gDA;E7>h9H*B(}J*3`Gwwe>+_9s%5|SkgdoCY+p9DYo}< zE7m6QZ3J^h`Iwo?<^&~Av-_qSS8K93=v+$`{-sEc8^p__cQc0g7Hfh>)tQfqh|(XY zf1s_R5^#3=(N3SmbiXn))g7rD*vAci@7i2$H4{fLV%fKkTev2FEwu7%H>X=@k6_w^ z(>J!yCTJ~H(`j7n@!^H~dj~D7;iuwE>A)4At6o=i*Bq-RP`0k>(42N$F+*mC6F1CT zy%b0Hu4b@Yh|5kZv74}&xY)mB;Y#!s)n@ZX>2GD|MsZK6C2!oq<6D9wScYoL8Kl|L z=vWKua!IvtBukZh^SAXg@amQK>uA=f|9x*7nphQ;U^5NHQVRNNc>dMs;tt^kYgBm~ z$~`U@e&Tm>DsPAd1xj0Nm@2CcKPy7Zt?b&Vd|+xouFZBS(>cFVnu{}ibGb1pRUHyq z%==pS-(qY9PPHXv!p}7;ZqhfUa;U^6dieWy@Ymn5N96GK|Es{+JD8@+$WAo<7E8-P z8(BkSGf$QAiG`A^q18WsZB|R0OT(u;U{F`h>zvUU<(C*SH|$|@*($D8mK!a_-ci4` zA3ZIJWBnc8)n=hKMU};=gN9=E(67tN*HAyP*75PX)JrYE;BXYhcp|iCWYx+5(Uc=> zTET$QW_XlySnt!~x)oNn8O~F26|KwjYV?~yn-+bt4s2xp^5d)Se;Y-`;L$jL!f|n? z*;Wn{s|)Xo>S+)&zB@{B9ifJ62=!x{d0O$zxFDM1dO#8em39m1KH2l>_-z~L_1~7A|b>RB2p&l?bUu8dY<4<=g+0chu^Fmg(vv`8uyL9D20EqnGzT*@LL#9D| zfBj56E~r$4g(Wpn(Nbtu@#mlZPpJR)$^Tts%NvKy?z5H??pI`jKS0gv=>qIY0pQ16 zX*2ZyeIC5N+&$ROHd_9ry@4j{72dc1zAIR7v!VxR%QU3y|32?ODmYsI@oLF-Jg?{W z11>tLz4}I{&0FwZAuo&}WdH3;Vv$J9n8lWAHbYlpBh_M8WkHRD9JJ43eWh9Z(^|8^ z;8;vjyUA_|@7QhrFO*?jspQ-86~`~rydno~^JRQyzjn-O7!yj)+v@slHe4WDAbkQ$ zwF~#wdq4ED=uciz*(<)!j~|FXLiiP=K*ahEOUkHpu`0-d-fZ?~0TrfIX`Qz95Kh$P z&=OTlkg{g);_CApLe8{`Tdh7Rs`GK-5&2OK4$>uWTAvi*kX*aDb7s$-n`V@vvZteF z+1zNYayqS@$!^GEJMT2Bsi`R!HoXqg%NkCr+qQgpz2*xO-YRQ23D%kv1DBI8may+j zo?bAu<%OB7lp{6Q;zfLQA6kmf)#=8{M#i5b{~)s}ebr}zD=A}h`&XApICT_-HLe8P zKis>F;L&wiQ0K@aJjvBs?A>})gAp}*tJx@0#I`w`>_S-685N>V?|L~edhmo6bswRe zCslYRf4z3-5pKk7U|d8IE8h1-SafI-dobM8*)ir_!Z!ZTzOAsvX4WJdtLinmGB?OR z!-q%Mx7qpYhKl%YW2efVnWo$ylfUIbk9$N!>$isEJ?e83cfE!^h5Y(#G zS}5OvMuFl2>V*+o$<>5|=74X^(n^Ic-|FH)6kBD_+`-Irx|TsEU@SOkG-}}TkPY^Y zs?4V-WNJQR(hk{$wZ~N4U!S0Y(h7TdofGY^xoP8?-Km&qIB>ynJ?H*}gX$ zAur_F%xt`_KclIOOM&IhX|7!#LA?MF87N6=q4i{({queJLCbx!{`kfHT)2N|$eAJ3 zA^4TQc-hf8hd;lDmR4!&^V9Qv&jRXmPKm@L@}X>M6JMDc|pVr1d$9 zSnHc}JIXm-7QwMp_R++v*m^-RP&7ONWuFv|qa!X6QG3IAW)qnh*yEAmbcDLJM2E8z}%0auf6Le{2t;FopZpI&=*7j>|d0~LmvRs zwm`O!@HJXFR^t~ErN&{B-BGP-SNvCA=ogyU$k^I-Ls*;Ox?q1)P%W`Ow|Gex5?x?L zly+(i7>CA}NCvFNY3iJ3qHTJ={rM}opC~~5)j@9aQj@|f+@7f*r;PmP`+QHdMz^d3 ztv+uc6HH?-{hr0*HQ)0CQ?$OMwZACdsic$?OARxKf+)t%gjP|Z<8L@-|8PA&IKqfz z$tUZ0z_>QTKt!=L9tNpzT{lrZ7Ty zQZ5hj<#SrIw6ZG&2M+Jru|XDw>g|N-ZEc&a+;!$0GZ{$tJSxA#!a3-&l&#@-w;Svc9eU1p<1v`< zSuR~r>P3e0DwbW~?Nx9zmy-5>MUe%d{0~B9tXAy^?>RU)-Y1Dn#JI*o;STK9BUw<<48%YEOx8h|Dv;T_ z*GL=>MT19QRQ$?ge785O`SC8>B*^QEnZ`rPT{fn}@ITesn%i?miNj$clm~DT4w5<&9 zGwvJoL;bjamXLgY#)|I>d57wJ!!x0X&(~)ksrr^DOqes6*kQHBy)J8-nj&<34L(bn zO2c78*bda#e{3=jHQ*SW<_n%^?(}u~+dYb{ML~R7<~O&%emN*j=n7>=*R8ck0xr%!bi{$;-f>LXduXJ1 zfwhGLM(-clZ)(82D$0Q*-d`4f`Al>@Jq_uYjm3~??NvKMwRnDd)Yu($)zGNyF`{{H zhjWx0BZpLUI)@H{gf_zOSytvNcaiLDGn?^Xf`q_amIu$kNzc`$=~tdhdLM5QeA1DM zWFsk6n%-y+?i~%Xh2FSDucup6l8Px!+g1*}FlK6jcksf+IW{hQN?S%pyn2XI`3o*d z2?=(gNX}oC{S4U=O&uJ5^m z`3r$)MOeyDTpuEUCPS!Ho0pZON=Bx^YX<`8J53EhE51?pGqMb|8i+45W{HX;d1R6mgEGnadQinbvJX-ZU zfnUU~UW@y!+R_G6#+!TdvtV(3`1p#ScuWOnxH2UnU1)Q2JF)!v3u>go`zo8`bL~)! z_Bw^AV~lEp*!&CLA4V}g_X!LdlF-Du5DxEb(KMHIJ+@hdMY<3G(TG!|P<|zGSbBVe z`rs_Clxms*ynLCwiVc0u@x}29*Z1Eg*lWlv1BIaUUHQPpiAx6C=-LTiPrzc(4HtR| zT?rq1WLbp-uYukdg^%gvwSy~&*JA93vkOHS0Q&epQ=yGoXk!8R=2B}h6K-1q#c$uX z>1lr)VcZuzCjdI^>%sUo>k_iKh*a524Ysce-zdS=KNZUV$e{|V?s2XJ|HQ1-jzo9P zJ~aL*I^>)Fa)JF;FG&OY7If@pTdp8G9fPRjT)8$~$sZV!-ra0vKhQ+)wHCcWbsdTL zr`+b-uVQlhA$g3T8Fh)r^Xm1bfXrb%L8y`@LAZ78eMbzuqzc-925!a3vFB5@m7j{o zO|h2g*XFm=AxQD(uRrxk<-K$>bG8w==!}?L>(qYD{{c%g|BKE_v)*R82UpUJ_F%C# z;$mTiw7is+f4laqZhinWdg*8ufJiQi2j%Ko#fK_b*(G>g$}*+JHd>TP;;}?j+t$Kg zIu0$pj+|BzrIP7-R2=?VJu5qVxwEF7=T!2 zgwcwhXU@3tUG@s7vzkG>^bBEq_R$=j$Kj7Aw}@O!i%m#wWWfk!rk;%Hs{|p5euZz# z>e-!`w&RGh-#^W7ki*qpN3xp?)DybC?N8J=PoR?0B}nE0eVQS>;@ciiKOq@41Tad% z8$N10Welr10w5jB4<%NR2}Wld0ATm20?+g9nD073I}j(qa*NpNak+`tu+p?LGGwji zPPAY_DpdGQa={=d9@#_#M2!s!NUDYYO(w^O>kTa?+?q*`)CLFrCPOpQ5ve8&8@@Re zO?-;F1v)o~$v37YN6Dg1^D*~^khuWQq7nm&K3ljr$r-)^TsM@?O#B+)T1 z3v@>zS}E={%WD?HA2gued{H)DJGBiD57z?tnBssoZT6Py%1o-Rt;(!k&4r=8ll(iL zB(%>V75y71n_j?kw2z25S)j`Pp?NV#oN2Dq{)pA6Gi8%H)y8!H_w*7w@18}6-fxb> zlccI0>;eUDpUwGjN3FV>TxXAkDq}Az`>q5Ko)gAo% zNBh#eCtjr$n}ImVJcYKLav;MnZDkQ;MJ->dwRk!bF!wjL&vYe1(B(%CR{6)G!F3-bw^S&(6D)Z;z_3&|61*5*ol(zJqfLV`|Mj?u} z3-NiD=kf2Y6rIcvjmzIEsul7e+FUD(y^JZI%#O&N4zD`%R6sk_?5ASenMM8cXUu}JxTReb#*3h^Z*xziK zhlD~0>PlOJ)Ol%I#L@WvFfL1aXvh1LKQTkVfTtje2hHO=1yW`1GGa3hjGu1980B`& zOQ1w*=%k&?IVQgQ23EpLuG38dCN2PqadI}J*Zo&+(Ax0bCw}Cz@9clruM!U&5!@_? z313x+CVOcBal|Ea|Jk$y!{OOh-y8CUKn_^Km}v~WAlPNnQbG(`12~EEx}r08_6a)e zJJ|H~7Fp>w2!dvZa}L%QE-tRJf@Sme$E)<|)WR_HG9j7*pVM^#)z`JWEYdl@N57JO z_)+W~-g6BpFR)>-Hb~2is1S?94MzK`RcB=mWkZFNKN~+6>7el$5-g5IJW}d5@1}Qu zW$j`qb`?I2Q6yO8-H*^R+Iv-&hh3ZzOM3;sRk{G7DwIT)t9I;{H9+olu0AP9%T!ek z67-h<8S)HgtO+BrgCUErI6kXYsPO{9?Z1-prdNPwISPMAsvJQ^CjuM0pP*huj&^H? zJRJl)i6E;vX|cMoSj&MjoAm~-;Q4f3+!;?lGNz13e%BijpRnXyJyXMtrwnfz!u#W( z-SuybkI3hCCpm{KM{Wssq%MWj3+f<#aGW%z-Hf`)=W&slThyk0$$81TUR^~5t@i!S zK~C{P;|7MMg2EF#Dz}|(&Q`oSIqV1DAIniDTLJ}RfO&%%pmnLPE-9jgi_Mh`(2tU5 z4PKbIli@-$?-mZ0ktU7!2s&0#XpJp*@%gF;b0^3{9+u~(?DnCX(<*F&B^Z2+;_quG z6iO`oB15bMjmBz#XKOJp>i;yxPbd8B7c9g+TR9UhquFM4&w!vnF z6Hiv*OOd1zU%Jc_oVo7^x(7+;A0DcKhOSYQPSz-cIY<9O3qQ>B5@ z%p`_FpRv}7j$li%tnWYvj+1;#O8#P7iHUPR1 z$sLvYT@A_#YMLWC)EenmA^)n!p}{t=Crrp zpovw}jfI|&rHLWK*x$}4lHV7LJP9H4!A*E$>+pzNE(tlaun3b0)lz{;>c5bKXEE6| zX^EeE(U|As36Dl5H7Ce?F~?1b#zt5u{^_!H1ImQNajOdsv6dSJ%y&J<`t4DdYn3R= zAAZm+!@(GM;5%>Gn6^9rl>b_utAX(YyIc4w!qL0`T@AKIE!4Ygyh}7irJUQj_9v|K zjLs@~q~S@6oO%0ukqB&isUPa@L?tRADI44t(|tF3m`YrXi%HXYd3nskfvVN(Z@z6D z^bvZJL9I{D|J0kUUgYD#{gi$-DPonbSnMGi5)t;W%g5CL#4L>Sw(L0cI>Ww-3I8w{ zs;YMX(|;#Yt2Pbm^||r97t-8Bibb>*+}?E4B<*P(E;J9TrM+!Ms^F;O@$nb)VP-jMsDF&=F4M%Z zlAO1)CtpqI_&(N3(wWCbMM*_gFSU7lriC3unmU!(+Z8KgvU*^&l}2pF%AQ5Sr>-r!l*$iRC^f# zEj$X$`~Gdg$KE`rU9mQ2Uk22#c6!bn_|1K48Oz0L)@}Fk3OiW?(dj1|n*6Y6K-jPg z%SLVrXZfpFrI2XKzvF0(8^Yw;3{2Y|mV8jEGh;@u7oN}%FW6kRxO}Cf}jLc)4tQ`p;<=i*o)lfyieZrNS1<@$$oMt)=`weO_hf^ zKC}gozSK=HzY_F;9Y*BP`y#IC?dj2fmV%iidJG)+l(x_~7}Ij90F>?geACDG3Zhgz zgP_ZI+5v;M|Ho9>irekn7Na3G_`sT4D_IRqvqO}&7?XoEno?x&;_uW?M&2lYC|#p3 zTibM63lv*FE{`9zz@{r&u3K2C6A=2*Bd^=%IgnA0!?i4oVF{0 z1}Tmd>budGJNL#G)gUr;9?^hu~|d(t&mHPEq%xRIs?$yg=yx z9x$^oN@&5-J1&1c8IGA9iaFxL=_1UgMk`IybXLoEpG<6$%B*oniGa>GboV7s+}gxN zEz&#M_sanNwh zfz%^F2@$3V+5L+ZiH0F(4r z4<@PdSE)iZ<1=q0+xaGEY8fXojG|r=#^Tf((6dhaChkret4U|@#}<&%)>343%1Q?q z#V0}%*>?E9K>-rJSd%u1&N?0KR-$Ej!Nd1&Qeuuy1LTbTa{tmv?okGd41Kmz5#8iK zLtV+PRju#?Q?SrXW5m@B^^QkIiE4!l=n-lcESVCLPLSGg!ui&aM~_B^9A!wU4GSd|d76?OO=!mpBU)XMvaJVN-7Cwg+zBFMiYc zKYB4hTiqYV#G&{x(Ktfr`gnyT4uj8Og>NCwh=|O2Xyiu>FM`Qz$@}1bJo_r)w+O1~ zwXfgt-~JnOJe$u?Bfx<+l`eN(y|tBdi1ui)&xT~PXwU^Y)2W;m`bRxzn$dP~hBskV z*pnw)io_mnOU8Sg8f7Edww%4y^ZGH<`0+}SvtIE_Jf8M}!@VF2{0^v+{-QJI!dDH4id9_;TAsC51 z(}iEzKJT5lH=$xbS_y9NrBwI<%@+32v7urriw2{bgF#*1M1GC~rD*L>*%;4u|wF;z}+^&@_R^6=;WDD{H9k>RHGOh9AC24+y;8&p-bo=(` zl{p%+P9;j1H+KgWFmy+9kXVSFWk{t0Cq#IpI}Fpk9tYY86g(^>5$u#!mdAMSkw9Tz zg+H>~O1dB2u)N80=Um(b+Y_(b=(^SdqOhd0X$mAZUftwLosHE|Dg7H&SPFhl$cC&U z1#Whm-#-~n!M)UgA=Zt6NF!ejV|la^%*Xy3Dy-J+i8qBE)7N!kY=xiinOeaXaNN-v z8Rh)b6YqtfeFtK^+1I1pT(c?any;Po3}BliKSqTmQ0inHGJMJ|GgQt`qB?6nvx5P* zk{q&%Qpz_E!WrJMp-R&?cb(4En(yCeA*>@@UUPgOZ;&ttr`!Au1LJZ zTbTr@QxJL7I5G|Y*D~MF*?l*@W??Lx%W6-&$4tHJ2vS)OU-E#_&{~lS53KmLyKY3UbijPuLy9$)MoksP9hS8fK_QL!WVA4i8ze7^hXF$WXo`O+;@v|xwYuBzp%_uwqJNW>tlG(&kw zNsVb&|ch}=y%COSo0_>tCGPuw@mu(HB{aon@wk$T<$!1s0j~f2U$KE zBA=-+B&%EsT#k9mx)3yg!s5<%@_eK3j*TYY65qV@g<;yTU)xa--|v#E+_}n-v`?`x zhN+fzW0}%~YMH=hCf7g%mi8}g=iFZ06X=xg{AZbX$=#4PUm0R@@;8!F5mI(YTZf~^ z)|deErWAhPTD_Y}9vZ||KY#)Bg`2NpJJZMl0-$51NFm#)YYko~_07Xz)5)ZjDh##8 z<#r>k2*Ht%&R54nf+6KAq0;K!qM#vGaMllhH31ZkWhlf!4jbWU0rw}a8cA5OWojm= z16LTy@71xBa9BQ~e=%VB=fq~kw7d)ELIEa4<#gJdsU9D@-PU>Y3!;O7RFZBL zZD9(K;Ng_QtBzwl4?5Vi;$)S8E|3oquZ8;J6TCu(D@=#FkyUQQ!YYb^Da89Dfr-KWs50`ZDorJRBOjlqB=N0BLF;*C&xcj(nI#opaapn!IJT@s`59VUqnI~H^JltL^Sf3ARz)pHA`2e*JWmMeXIh?P zuGelKoJY4ZPEIm@4AI5PVK{J+3k5Alh{kCl=6;ugLnMKRmnV}A(ja#F0EZX@OE$0P2NQ$n=C_i zyT2ie1p?+Qb0^WyjnUVXgm3*EMampPzbp0&`-yKG^Ga+dUh?D1MQIuTw zH^8psP|1p2Su}_%dga5rxLN}#Dlb<#GUUW=wXM<^eD2Ysoh$40P~oC_ZlKwWeQAhy zo%dFE{B@0WKdO%k>vkXz(0&T)B__BAfC;+YOnPtH>MyUjerTWF*J$0+N8?U0aC2ic zXkmv(@xoW1nZu^px}8bB&0?7A>!VYJF)I&skiK@k0;*)Hhldp2B0nU9-vk^EMxv!S zv>&+B**-_(J8E`UHCA&-{62}}S~>|V@-0Veb~+xNjVF1}W+R={KS&%ApsMxj={+_> zceedCWxd)4y78mQ@Qs4k^-6tS%>~z+J^r+;W@w0YM!#K^u!^dg==r4It#s)^oppLZ zv3Mclj{~JUHLJ{DSssi(HqqN%&6=g?8r2#ef&&iCTCo|wN_PHJ)k#gUS|h5eqyOUR zQgriluU^y#`oDuuQ@l}y4iom=AxPkka~bG_i9xR{JU#@s5gU#KVlw)FbAouyn%@o*UrJOh(A7*S;$vy(Bv|ghy+26 zlzEE2-^@>`hMjoq4G>6a^z<|~4n8(iyNiSj#8Y-vU7FK1J5~&zdc}&j>afHS>4hbb zRZ-zcY1R!J?!A^xXO$tyE*&e-SO6(6CALgP7gd<%f;^BwyuowUX`Y!FcOii7M+T>u68^ zF>=0`6J;L2>Eb0F2aezSea47^2xIHfQ&)b)z(cMShyVwY98gV+CJbZ~(#d_nSXiM9 z<8B5nZHqD75?{>DQp1-@0DSmZiH6qSD9l`y+4r5cBdfhQT|K z#+@8J-_7Y>(`vLf8DN&mChM-!3l%OZ-3C0l0x>W`LiWGGq$|U)Z8}jk(w&opH<_Or zsT<@tW7$o`|D0ZhETb5?vf3;+X!>B!uDfF}k?|&^(D+SS0@Vm(7r%R!H(6zabDSBa zJn0!uJQtV5bb?KGIkH3&k%M|ymB=>lT#(pR)ZV|b7#V9Nal%lk=8m7pn=z3al_j&M z7$Gokk>t9AuG4{SAkGnzKlV>v*gQi{7j<=Y_jJ|}^DzCtoeO3{S{1qUCDLw$|N6_? zFVe>qM0S#z$Yj>t{_T#%7&7Jc=}da}av;5T3aIKev2@HPJI^3aCn)@qBl%97Yk97~ z?eD9&ens!N{_@N3nc60#F->&8P~x%Xdj&Pr)B>~Ax(p#^u>q?D2FXBlnjz)jg!)Zl8K4(5D;ST8l|=rFe+n*Y;?!Hd@oYAt#JQ?E?gt9DaZ`3=6}N zJSXD1yn6`aM|@I7IvHIuJKty5Nu9hP?vVC(n{Q9M-|N)HzRo9sW-{tWGe*AXT|oe4 zPQ}Y~AR#Z-38-wS-MG61PU{{MY%YIuXxRy%lECYg9-k@S<0~tbhW@Z3t*4s_ zmM1IqFYNVOoLXQ-=fIGFwHEA?bgf{MAK)>oNJ~pomKY+UDXYBTfi9t5O=mJ4Ew)){ z!jl|j8MEv2_d1wW($dW4ZB;xrigzZIkj28nl0N_R9mR6d@&oGofWMumBa`AZy)<|J znx0d(cVw~J0Te#8YL&#nmVd}H;s;(G2)kTJkaA&ZP%6~n|EWT7w;CJCf4#|~m@aYK zI&Grh8l)+e9~2}~NTxt(NC8h6?-WYtYCMQN6C<$bAeH>IokCGVY_N5gAF~CJjMPnF zKZ0J#Z46`Kyj88L?VL!~tr`J3=5>EmkEj$cfPDsPQbqkc0A8TisJAJD`$hL7p8a_d;;?A0o$Ht)(3XoVL5_GS zgB@g08BWX5e59T(@?Fnl(e6y_;>~2FlVc*dIhhX)%C&8{-ZvW?pB1F=Kd%_d6Jsp= z26MFz%+++B3q+_@m|Aa0Hf)AkI&R)1uv;MFIM z=Um7axdu5&Ku^zE^Oy4;P(N6k3rv>Uf6XKH?s#yfg!){T^fLvd{7Wsvx7R3BEFEPL zkz;|U&9}{B1XwM_5=ox8e)HTts7=bW?>QU-9d?2jM*F*YFQ*lmw(Tah_m7htD<%Uh zrX~-w&C?51b=*bl=Gft_Kazy>!WtJIv~w5_ihUMLw*2(gx0~m1e8bF;<-;q3WcSZ} zidx%XmYNPPQj+`0W^#rBH#gUQa+9xdW4OmL=2QEBes^r)nPyN}SO8^KYkT`qgZ&sD zdD&h{=uzU_3|;@@nWVu&t)=P@;m3945;ZNM(b8y09x9%{!N zD-!QRJl6IHvEsO(_1`ELWSzZH_Ufg86a1vD{X3qNKL?y%m7F|~q#0iDHT!sKat}HF z0JYt7D~b(a3W7tYg=-5ubegU!N9_$n;usQW34(Y0%T?)8B#F+x!JvpwU2fZG8%4}b zPaDl3Acq4vEjwj~onTrdmMxq1FL~eTA%f0F+c*>dP&V-;hR+YXYg1Ja zds(<6{?r~VLqVCQgocp%We3G@?)}T*qRuHG?}(za_ITU~Au6aEA0W^iv0!rogrqWvQ1?hctY$0xB*AaCsf80Iht zy^?sHi#X4ZzOaqAFHDo|b$-U2Io$*&QSC|Sw~R^|E!=NW7Ek;7?lrmGgzN1|UKUF| z=|NfnIC=~lWJe@v7=^Hx*j)L z#LFq*VDz?&9b2WTnje=+1$`nIAQRfsdiO_kq_cAqRg~2H`Xt22y@w)olj3$WoY6FN z#GgDId%!ADxy9)dW>P_*woa`)H6&(q+2k@}TJ(-Qi5HFguI|&vbb&i0a`S~`C zS&i2~?G$r>d}N9l#e9PEfClRtONd5)-e66MDXq`*-0^L$z%q_8Qpm(p%LuU5`peJr zP5i^jQUXZ@CO4f__ts^@J=W`UkfE!VyYU!e&p7}YQ8oJ<1>PkDm17$X;&!&#K$NM} zZY|SJ(idF?r3i-*#2}Zx#c?O>?Cd;jE$wqLA@&)kMCVt!Iw^j$y71$2HYniq5nmc% zknGMR?A_@12s2*auK~a%8FKp**I4U*!Sti4$iqjo$lP@2RB^Jk{y>2bGD-b{63Oan zY7YY9Wc?|+Qu*m3ag-E#_Iah7blOdy>MsGrM+$11n2sgFn1SMxc?odmU+eROHc({M zQZx!*hqGAD2GTi|eO-O2h*n&oDzM>Mzfxs^dqu<5l!yTTvGVoiGyIU+RE^Qw79T)$ zDcXnWt3;6q2EC@>!7EG}XI0#-2R=Y@MST zOz#X?KVyK$Sg1SN*k{*wQiLH$MS?_B5J z_g`)OQM4x52~VT1S!V^WX+Y5x#B4hH0roXn~#FQlHwPAh;Mk~V;uE3zsr+30RT^Gut^y2C}Vum za?oJ6;;aRr!ms=n9OAd#{<3Up?A>7;c?%%4dT8gY3Yi5+Tr{I}Geoi5E;mf%w)x$c z*0UKre(_oH!Q4RJ(+zVx?jiInJo)IUjgj{}6qJ8j=TC!f;9gWV&g&G-ZhN80$*T13 zdkTiZ^9|$vg|(6(uG*F+?IIPiK}=CiGLf4LPj}J775*BtH8@9>KDIV;<+-r9L?)L(k8$Lz z;~^+HA4e8!8A;6K4hE*Z5yU{~HEsV^G?%PINsaZAih99@3C~$KCRU@{cC1)8uq7^` zIpmK1l1|O0S^Gie_?ba?wkcyWrfFi`d-zdMW^j;MxA;YinWcIeYP z*v$PAIoAs-2TnCLU>t}7M#}m{K)2&@Vflu}DBUxPtDTH>snHF+-wU09@93S0$j6Gs z4Sj;CG1q?#*fRfOW+FkDUg-Lg>FMjo>h3L^FSIZw5rccA_TTT$V8!I9zqod3*4G9F z1(C;MgV!v^-}hZs7_RlNC&8*8Cyw~?noF@RVAsPm1(#0~2Hvx>($3ZThZdq%Ys|X}#R)Y7vjirF3ucQt3^CkMIuRv^L*SO?mMZwOE*=Kud#>_O|JoMJR8g)>Rz78XNPiwI24jRmu|7S7#|wkN`pLWYwS=!QqA6)o#A?==$%N<0n7M&Xr}WNaB(B ztQCjn-W8GSv$8Ge+4PWu`IpaL2cffx4eJU5rUiy z(muI43dlvkR@$!dUaBc8?_@ZRs&96{r2i5p;~!h9;gALZ=f z&t^K+1}(Cf6ExfIZwZ7N)#iP_;#cr(8+^A-meF3e^UW8j`97z0c$6lk`G9^eO>*qW zK&v-1Gb0PY&cx;>iFn~j>1vY^GCyHb8AN-~kc=o&{AHp>+{iK&gH@x}C(Ceg=4B)K zyodkGAhoNra&f22K-nO#x++4s7dTw3RFmaaA!ap)?)S1|1f4* zy~P@H?_QD8C(#!63rC)*mLQ6yRo0ugY*9y;k?1Jy=z8DzJ64xb;@GI!fXHL&!{hN{ zc&gD2PoF_JHPtNcuV8F{ff&FtD*JDCfCj?)qDl-J=32Gs*PJKCe)g6xv|jD?jm)ZF zXNdHlDk=_;7SAC{}|5r|01Qp2pfryDNaGzfLRN`H7)5q9 zN3FpS1edZnF~X98nheQ?>?F!6@2wnL7 ze6#xx`9nms*x1S_eJOqua4N6adeZ~Q^cfCp1$NxN&0PYOr7ev@CH$=2k`;HNrB=^+ z&MZycZ!Eu3#Bmp2TgQJgRW&@UpY};`leao;ddoJ>lDp>K80_!=r=HjlC0nfhxAS(j z?K`Qo! z&zKt7&+4R7u7&pud^Nj4bMZ4!43g2cKRDP=h~RwIau^`r+%KuX28k>t=-uX}a5xqe zmX=0R3Q3XLbeGWar>Fc;)>zx)I1BpH`*}B{021Cd4~G+@hMzE!cdl-lVV~yV0|r(h zqlOzj{wc?|wsf~cic!!hfS8P=MfL`2{y87I|Jk;?i+dx(iOm=NSL>A5yZ0iq`~Fvi z88g*OB2b?>dvi8cVmRUK@%y6jc;zcj|M20=!K(%Hig%#e^UG}~G0b4KrST^V%TnL- z)lvma;QU%{ITyM%#&)V{Zy}>a%TW>XU!Sw9%ZTo4Om9N~+{^M}n|KJDwu6}vx9jPl zp_{V{wDkhg3)u)Fqt%CPKfdxk*6dC0B-H%NXZ`i$_nf=D0=NzPWBGdc2#N(kQ@A8x z5x>VZ&FAJh#oZ-vl3S7OdA#7@-=?rEg;q`Yu+-^&e|Ha+zPCzPl*93$h;a@@krf35rKwAl@B zepEK*9eSI=<5>rJrqiq|MIRA);8h^XTkE*%dCvCMk@P}YOXqSekEit{Y&dE2R7y8) z<^y80FdSy z>HBNfyNkb_Q7vAVGZ)jBXSKn{z!624#(z54RTI-P`y@u39T6v~Pb|hqFvE3~V{<(~ zv*0rczhs2)lf-(qWgVgCA%jC(gJ=t=hZz9o(_(aR*4O_6M%;~rB5lplTc>N$qZiLK zR3e_DsP^|kijIB4K;z{zFn=hEboU=403N@YX3XFSh{T-`(QkpTD}25M!-$X1B2K5= z(6lY(4?v%{{>cMWgTd|j4jytH;JQWo2W}!07k_oSf%>|M^^xX&eS*jb8;3(u z)@1b6ylhi<_J~&8;osI*V`D-Rud+>`4WA}9TE-q?4#z7&{d4GC< zJ;}|T>wP*bfzx+zjDqa2QBe`SDqVC))aOhtK3ngM^MeUKA#1yF0odY!Ti`g03Gjd- zUfCp4(2#Y!J?*+?`UAxY%PY3GE3!LA?yOPEDNd(@6E>&gDRa2e%x2w^I{I69^Y$@V z1TJ0ZL;4>IozCxnbXVzY`0MI;RnAsGHp3Sn*8)_Bc#fZJVOpMnef)+edMjTL!&~5b zh6971;~rVhuyPHWxm0l-OW*I#K@%E(!xI;$;7Mrg@3YS=y;ssKU&a{Qn%Bn%HS@dc zcB(R>MrcbbaO}mGIraie1ihVS>Z;2kB1OI;9@#Je)@*bhWox6nZN&y6>##oljI1BjZ#k#zRQ%Q>?p@MR*v2zOGoCskO_8p@t^fBGsRhG+n4vEe0NpLL#WCFH-z)xIG?~=*M1TD-&(V5+ z+$<=|SUmN1WOkAd#-aEtikG}Ib@Lx*A`8j@?BX#Xvv(yWDrfYF-VOl1Gpq}+7O=e8 z??Cn%)U$aKM5=BRppxad9YNnFca&GpmCbGLMKP{Lhl`5Xv}S|pkh`+bP~o9#|1q+l zCp1R03Tpif+!S;WH#dKG42h@J2{~63h7flKjD2uh_p_)+ts1Vy zb5_r^GDO-XjM7P|Q~Ud`!Z#tG*60EsmG?&PEnabPak$}e*~;OsG4dPUKbRcJ?CyK_ zv7ia?^B6vp`h@;wtv~i-Q2OOlACa$B{v6^Qn|e#kt-5Z59T$xpajXv@8cFbf z)xImRYw{o~xLPv%&5*S`v9NXnaDXc5NyOXo_g3*Zx*xI`Q2#NMh;M`DLNSUs|IFFTzx$;y^lY-73 z8OZ;84dfMw{B{;eH#@N6i07lGT3$WqYZo0(t7Z8gA z`wO4De?Jbhsr|V-UEs5;r`0@wVLsSN@MYaXH;eiG*lDEIV$J8I2y&{03Y50ZaO%lf zsMZq)40F!W_1^(g;#t}MuHQHNL=vS2$6$vGH@TbfldiD3xuGUmEJXY5vW9mF^JTDF zr`-`$ZT^cwCK78BQO+)rJ_=b2ET=~23?v-*=Pdntls@%g%=an&ywJG3h;zWQJUaWZ zPo8gkqC*$uZP@ld|IsrLGiV)7KPR`0Utn$#U2#E~s}8O70JjE-#%gB_c-K;0e~U%? zzeysBznIVm7oq30V*9_)#M)#o(1$r`b}TPz+E@oX6M5{B7#z++h{dAUWG$+M_c7t> z*UwhG(IURkcBBZ$C1tc2Klll|9J(0{?w6|GL-CXD=#~hYjHH$ZTh5k-{h;6EcK38Z zgl|U;8__X{)c*)4W#Zi<*rZN+IWRkx!b;2i&}1pZA=}xqX@nmDtiG!K)3AB#9dmu+ zi7CR~Y^IuK$qO^48xJ`7*qI)*f4$ar{b}r&oc2ekoA3Rd&i4I@>F0>_BA&ezIFfZl zIowBIASXS05or>H#PemK3cht3Lbh!VLc}Q$C#w%{Xw-TvW$a4$(5GwlB`_LgB$MQ!^xB8>_RDIhTnAWBF}3k)zLB@NOg zBGN4-k|Q~EiUJY>(w)-XEl3UBAky+K@8^Dw<2l|>|M{dIxY@Jz-fORQUFZ2b$JgVS zzG%&?c^C5OwI9R?OGL=Dbn=m1uyj*pc0wV^e%Hz&p9e9KR+bw!n9zga)q6btH?%S?U>v{V!4 ztB*S*sTH$1z?u-Me2BWRiN2Fmj! zoITzXI^vhw;zi@wp_HPgeo+VX(N1C3Ad*Xg(55+ca}b1*SN)`yhVgaND`xezO_d&@+#=%e2dZ z*nk9{bYVr6|GGY;=;7P6XZ}+N^23mssrS2WiGCt<+wN&j;o3Cs zv>m>^-xpLT$=Omz*B#gJg~!*${;B65s4tT}Ihzt9l}R}PQGEBVz0DY}Yc(T#v^WRO zg!!D?mEGz4xtScfkDTA%^=C3F!lE)<=@pXrJ5LqR;sLxpD43znaw8Qs@@bq2xr|bF zfHK|1(*a!3`=Y?x+@7Nx|H;lp7dp@P%JXJvJ7~efD`l(+^aq!$MozW|CkX*nYds%R zNG}s9%EC6vbqFbzhR(;hIqa8iVtS%|!{IZniFqWo1A58DBi zT`t_Hc#_r}$_Xcs?Juok^+`bNXR9O(=mGaBe;BGVtwi{+P8gRm7kJmnry)hL2p_v; zZrdi_w_|Hhn1zjaKSggi`)nvBAS6mr?;~Eb#0@~*t9mRV$Z2?&O>gxizNO)RRq^Lt zcudm!2{kFThN)at`&)`+bF-mQ{dn!M7G+njti{w|>TqbfMsp9Ns^mFrB!8@V{N|7# zaoTe|Jr@>wWEoGmJow#)O1S#-IHciKFO+b~EgB~ktQ3b{r!RK3bK{&|%~)j&&I%vg z-(nn+I8Ey{09j%Iu_Ri4DdEu#9bD)fBq>bYx60fn8j&)-K9EWsV)M0%%?VYo8oodR zUD4estzQfCG0cW<5k(`$TH))FBDfd^b4XN;0!2^>m(Qd5 z2G5nV-rkcHzYA-%O$A0DCWdz#(yX3YbT1p`4t3rCfr@ch(Q!;$t6zpEB;NnyO((c^ z6+1GYH;s9*DVJ6@eAu1UPt9;s*DKj#+dd3$OgL7K#H>j#*FOG^}%}wv%D27MOQw zH}4s;i&@YEF?sD?5OSFO^EqxuEmzkQ&!f_;tGO>n^nZ;d`E^n7y4~K-QzxBtu^pJ6 z*mxHL{9ggT$PLn20 zcqhj8_;nlM;Onwm6%33TPU*XBy ziS}0Wh|?D_2>5j-7Cdi1}uzSSY`W4`FVM|9}e+t zg@iYssJvO4jq|(x!6Fu*EJiBH`P+l zotZ1|SHEZ5b0oCJmv3kvdClCOVm&g_}N=^BFnF!9Mhb#RqYo*9KVRm=-^t^JclSayywnC%~$dIhSM+v3&bI zdvl8|Jmtf`%#z^kp@?Uf%xL#HM>^kP&2iZy`EFR5mxQH7mJ{L*dFI{)LN|s)^OP!{ zjC4wd4xfQQ<(lxjp~cvR;q-PGeA!^68Y2?#8J+sjpbaQkOyHx1V)!k~aS`x3<+ay} z1jc>MeAE&{c?N}Mq|by|OVL(1r^I1#1`b`96K^KK40ujWl?M9f@xd6C$)U&C=_b8r z7~57P7w4CXGY?yJCFsHLUxVp_yhlXCY3(O#4);i(0|$jWr~a}(3chvCl1!nQvfng> z%;t8^t)D|ZJ+7q6ys+>TEK&?UuXQ&>Sa36QA4zJWKjqV*{-HD+`@fYux5i^di=Iy! zDX2YpKUghfkOgDeBphP4Xadnvy2IIg{gf|y->Wg9ANV{AK1tq_Vkni?uPG6ihmF>| zH3*}|+y1zyqii}}5|FtRAAUQndZ7 z&FkoWAjX82AWGJhwdJ7>B^W1DLXwF);)xlwi$i^dnd#6o83&SqU-QcpeG;4m&(nkaZ;FJRjvUQd^{3>P=|iR&i$W zNCNg7*AGnF>di-7Y4AE!X#gDPWX^A+a}S6N7k|a2g>K2hSXQ-nTl+*giupfWwwPCK z&~ohHUDGpj=bULvB_JB_E|tYE^j*%uVKH5%M>|@v-+BE=GHx)j99wlgvS`+&<&Or4 z>?xn#N!8V-d6?^QoIs84g}mPyCO@*Z$%0wcZyvlE0ts?m&!*?ZKcqQGI~aUNt2}tz zBys@DG~VWuz7YS{V*3$_u~_(hSq|SqzB1s&_gK8e&PB-IcVb8u3QsBfjMdKZ<0hlH zJ(fvS&xyI{i7G>7g652=ki})A40oA0TTGYw2#)iNWnw0|77hn8PmdxENc?&QYfZc%OwAdUWf9=c@_`|tT{rg-7W)^ZvKBbI zm!ykD-@ivrC`b*-Lu&=`d=&pGA8iHnOldH2s~}lK9oZnG_3qY)>a@oiJK5vik-y0OFyuaKH$|!u2#=jW*aUTZcviok>>Av1_yr2J88?l@6 zAnxr%$8hZ`rljrO?ORc?kr_InXlfMfJ)FwS4hqRvEEy5MQ!DsM(C#Cpd~yfSJ|(5P zB5cC^O?9ES2lXkb4afVAlcH;5){V##O4)SWtG?XL>Xy$PAX3d4A(SZl_2re!!VuIi zRykLf6-dPWRrVh8S`DT#jxNs(e4(G=LNoQk6MBe<3ZxcFmTr==lyD#2p`n?ESf_}` zz(zUn)JuROkd@6{s5*NvRk*mdc=2EHrEUw%xHHmJxFa-}%zObP3qrs68JeLyKD1N} zOO4{*9 zO*3GFD|7t`;`U4$fFQ5&zq5KqW_fc8nJ==9ttS6YYX2lLH1r&*yxboMTpeT!jH{F( z>|Gl)H3PL5{v5T;q08^>Pyz$ZNXRB8i)7Rb;qgWEhn;Bp!*~UAL-)$9c64*6)xSEw z!cmMqAB=&g786rZ+aC7b3ypZw48nSeY*FKvGmAfjiRR3EDMA{ezC*FaLBM3EhhWyb!E%1a^EEFTUkCRS!^G=utQi+ROO(MMNchx-STBr=Uv&L1!o!h8|gbZRW1 z5rh90xA=)XlYA+l5d7&iO*NJE?NrNp80Pb-Wq zKTE&z-}am6v}cVw_7~f$VUbI7QZBp|gA!~GN$Qpk;&e}H@Z)XIi+Pod9H%{epXc1~ zUWF(dVP$w@6CkW(_XAW+J-#S1tUZIW*J|yXHVfj4hSWVNQNaPZcPWK1^+en;F0|8I zjGljs-GTY-DPWtXp;h4$JfQsK+)Wc8fF_4dLf>;B$7Xv7@`fl zE6RNV?^mN#V3Rv}jRT6BuZ}W&^<#eKH~r*&4QQAO{98dmqRZZ#h^=?3%M?>Qx}cq; z9PYbCxl-YI+{wx$mb1m}VmsU%yDt8V$6uIra${&I^V|3DM3&*nW$F1v!f$mGbM7Z6 zw~T{|^!g)VU7=g9MkvBcuYA94N7LU|3Ho+Kke&U($`n$r;f9JK09kQD1OX@gF?02LkUTIc7gg?B${r_Jn9_po{#hJXXzOk zNroZty2A$}^pUc!dVKt?F}KN{2$TqI%aFI4lQht01@T!pg&dG*9&5hx#)60xwtT(ypysENlVD|!AmM=cr~dc* zZDz5<;V#A3|FVAb(_MY^SO!pn0~(IC-O!M1l?&{wZ+XM!6qe_EbvCbq*S?E`!>jY{B>P?pi^p&W(z8`z`u@GP}&5nqRB| zgxdexvPBrGeP6asy9)J2SjssTc2fjiizmWT%yO?#jOCc&qUvwa8LJx#!}Jr6BR6dC z?%y`}%+U2fp9FS94CLBjC2N1`V3VXT5MPCGay)|->GoOJd_X&H`&gVkl2KqI_>OOf zFa+!*k>t0B=3aQlcE_wm#7~*s{54KkIS!-d(JuX*W5zrudp~L=VOMqRn?>qCDJr@E zYi5QmIQ(?c=AYo@69{n+<0HQPuj%}am98qZ8iv;Jj_%IC8x3z_FdM$|c#YWFqm+={ z0mf2@(QQL^be#t`Rv#`Oarw#JEyfooe#Zk-a-!C&<=Cd+k~>JIk1j;K1a99v_H~!L>6|@2bQU!#YTpu z%SF{@AE>yVXRlDvk1pM2-USl=N5UJzV)}`5EiCPwHgDcc0z0i1Dx&ZBK1GF}NMN-XFGw?|UZshs{g*E@b!D>vkz5baO!69PqI#3T`z5OBd%2zZG- zunaz3s3=sY!CV`?x8X-}U$uW0<=f0W6n@M`^|omdQ~vS=7UW#_R#Eix#TnbeiC0e+ zQrF&?)XRS5>Y-*ZYK`i?d*fTG3*`u)ulI|7t(4aFz&-6-=k2mvEwf+yOb?kHf2lBu z=dEE_i3+#jPDL^w)np$S#EAsf)2?If6C()ttWO-5$CnI`WtyF2#0@C_w}V8a&tU08W&O4 zbJ25Y2&I4RHy+(`DQ}_(8{%H!*qm8b{r%b9o54TRvjpC>6afEQeJiHhN(P30&;;a% z=7ju`Ba**|W&IJ^MsAT^*Jt?;6tA%b-w?-h(Z7dBa+ru`2i$oxhCP5Hq9O|wNM%Ec zh_sg`ZQq(L8Afx{AZUAus5HzXI3i0DNZA-1?cVy61wV$>nwMgIzW0R6M{*r^1Qfq>_4oxY@gnTm772Tqd6|gv@5gGz zHJ<{A#nGV{yd+8AzL=(eUO#yF_xD&P4eNf{*@Sy3 z@)RtcmABu0F3IrkcE9L(n^l6uJO;Nh1`h#M2=?p;bwnDM1s8V;m_qCS{KS_W#J6D<#Gra|11M`ybEieL(yxk%qBBCUxpZYhBy4C!>uV4-&Xb8pT_Vpu5KazT zKx4@@B|GADv-+rO3DNboqj@|gEXj&Wg5ONgCcIOVD`ES9iy1@JZ2A0Al2o&jwd&Ta zciIb3?-OR{QXofVd%@}M`Z8XVAvbo?Gda=HYpfYCr$;vu?c%Ll){v&P>j!2NOxQ0O zZ?eJgJ_f`4xC0I?)myKeIe}AD_>IQ$K3Z@#)0)uM`lGQQWzcmFmLAEtBF$;YFBJl3#|5-nYtc?du4_{m|gL^6I1MEXC+h(!h zK~nROX(hA}=bsqFQ(v<;C$lr+Rf*l%dv=1XVvb=vdQ4wt2pa_r1Ap#ge`B9?ILb@> zd?MDgQN1`gs4h7)p&seX*P*UKXJ)6@;Ndt|kO9JaeC{(-z5B^N6^a-ZX&HdzS7$Lm zV+PXi>PRB8eI<={*JI(npZl7aU>(_>{ayT=I>6&UE(>ca#D|CsvZLsAIC;@nLL8NJ z9gvk^D2Kil0c7)8qjVz8GDMYzWY0Fike!c=oI`T>a{HTBff>QX5-X|lb8KXhc9Zov zUkNB$QXPCaoWWz}!V`GC06ZVwy3npOCbaoYXaeHZjEx3pZadj*!J!CY$Z$Z=hqqr zZ_N6Is6jcqM7PvTuHmT}bU>!rh#~5C)1*OdL}|e<&^6$}w(cEdQ#Xee)&-|BNrg4=)6A z1!?1Hn63QKp z`aKnKXJP6#ihd;)OmA!u5tEkp6=fyf1DOM~LMKM7s%bHyuq=UD<`ez(Wa!j}`B=JNNn`DQ@D zY``4cud#mPN!=J2Wsu$+Y~%;~QFcLlwV1xKOMuGgc%nQIM^Su>c@D-_<<^A^4(nlb z;g15sA4G%@+p(8NX!prLZVG}EB)zP1=_nP%+|!5U*M zJ%qgzSu~smX`X}FxDbCgehh9`=130!m-Sy`18cs8=Iex+K@g)6#hl*<8|&D=0l}D^ zT?ZfDF`=W*VdyBz0I^gDKrH(jq3<)7WiJWHH9?3%YaqgIbqYjntkh4kIDby!H4pBZ zO`1=ScrJM4btB|?4(28DHVJ`Evg12$6z*6dpPQ&2iv5IBIedA@^iRZ?r?QM2S49g1 z(Y;l&Yx_XQhr#@Sh|J-m=nuX62mi1?{S@l|%)#4ieWL$0Ar>kBDy6_)f^Hi=^YWw8 z*tW*gF)8^d1}>&D!$7kYjn>{Kx8k2o#_?ar=W{P=Wa(#2Ln^iJx8XG4nS9MYjeMFJ zL7OUiIJz&)nNjbatGI{}qndbJ8r;gHBDx8agDGnpsRZoO6f!P^7K=Dm=2TvoN`}OH!Fk@w&d`Ehy>JSBzg#~v9rY48lt%gC?o z8M+D-@&YfqRo$5f2;Y8C+@_C(IW?r>aSTTI=_Hz4YdgK)aGT{2KlZc!08fCmi9IKh zhK5|i&~0Hs@Z~1czn>$%aQwX=m1y9^JGsC|en|9^qC@k0EQO%t^>4rX*%3q11QB|5 zF4p;%_OIB{CGdA~7vZh4GoYa+U`gcT-P)(FtxcuK;KeaFV`N#%Usmoa!9#!N$7fPo zIY(EN9z+9X6i*Y&Nh^uKR?4dv-#9!fjc*|H>kAn!1t;MhjmQP-l&OGd3ir%RJMTMs z1t?smd0b`kaj@h})}|d2P^&{;Iq)(0nTMsBB(Sq`=CCPmZnQHU$;N)AEIo5q-deAW zi}D-z`a${=5<_jOg)_nqeb)rGx=*vs5i7$s?(2V~B)q0IJA$k{{`Jwvw?SWCh~*Dw z27GiNT{(d>+Em0;8wt_ASA^hk&O~Cs)nhJl_;`mHzjva1JyNi(IWHHm0twCnEZv+j$r% z*WF9E=ur{8={3(k*ZI4*@ZsfU<&fOsJ^UF(((bj+a9fM!E#B(xs^H3WA>wzb{&6yH zIA&+HowD_MP|xnxgQYg~)k?uUEHcq{>iM$0QDw{aGiZiW>X@aU1|MJ~CclhgMZ>8a z`7ZtLB4A{Q*aR!^vVHqXh|zlrs_#3|Iry(6htG zkEbpnE92Dp;)tucwE+0NYYCk~$Jp`DQy@R>ahDx-tYB2*;-L_=!LY2Q&KmTvjlCPJ zlSb(c_aa(T-pWAH#$nN|ga*IDOt6RL()bHL2?(+@*59+6Tqe?Am() zp&TK*gKYbqAe3I)Q*ZkNTmD&odQrVF2R8ww4Q9FgqvE{Dt!2!;L+dlnTFF!a>r69& zSnj;MpE7HSaP>8ql!CbG7zlAPv$%Ozp2gR6Q7- z5Jz>T$OWg>c%2-GoKias?1zQG+*oBcii+FTpifE7agdNCQOc0yvZS1PEP=b3k(081 z_7~)2t{}dRfEY`@pCF+aEl@{O%!-AgM_Vd~{~(Ujdj^w8!zTFaiZ3q^mKm=@H_TwJbS{@AA;OF*6Q=i5Cus{?kq3xvI{t3Mmalu1x62zxr|S<$UhaN%Z#0GYVERUSwTG z7)F0zB81~QSdkndq4<;Ju7LzO8;?b8@HP>~xtFYu7wLfHaGg8*5*KJ}#Q*NwhBzBbDy;oco0uKiDOL57> zOM|?(OIR=`=_GB$wTOXtwA={4Kk^{HzPOA`p_(t`ogit`#>%18&AF=lgFTtL^4dxY z-gFSF+7Xl2>J0X_d2*ptq|JLT zG?ZXuekp#;OyJdBg_OQ98OC9(_T}t(c?D#mNIhtcPC$0#;M0{muxXQ}k4mXRT&uUf zR0bBtSd74}rAL$cPmH{fSK|p*4eYsv`eTi~TFW8m?k`452oJ8QDwK1i{bgp5T>fsj?0k22f#&D-&1__`2dyw4m?jIfGMO66;E_i^qt7e2 zd;Hy!Ng$qr5WAYkEK zoy@5s_Y9hd$!cewc;W->mt%!QY{HeF$ok32o_2E~GFT4MS>3J29J!m$%(7ltFq=a+ z8%$6JphU(#BO}nt6fcT`Wp)a~nb4$;Lha@9=(p(CE58F}%eG>#ND-oYuB2o>8g4?x z-vbnMp&%SXymvn*oxICnpX>7O`luq0a#*seai}7NHPGP;QJLWL#=Iupd-c^V(>Iku zGjhCRIGRf=l@on*rC^zwNWiuoo6!Uo|M&i+)b|{TS&wFG5}M5uJli*qWKVw5gzV=> zHGsN7Lm?>4Ti^SkE587rM&zdf`2{aUV zy9h!r)?SMJ)Lda05_7#s%=C&uc5}>Hx*4WDsgZH}3?JCdU!Y%rw5A3W=QrcW05f&`{3gTBXQRsG- zjGxLAaYxUfUSK`c7=~QNpRRW=4uF#xIz7@D$%Hq6y(34I3^#+8?bXv7ygK)sEhMTW z>2?S3t6Wa&p0lBEd;i&e7*qNC$-_@BE4gp;a@$F+v6OZ|%Y_~HzV|s4KL-BiKpM*P z`aO(K2eQ%<2Xn&dr z|H^b-yvM;J9Xh$%7A(9eop?V1sCo3+3&{*lUTw2LZwc(7)fEip<`qmz-+#a9&un&u z14ZL9Vd1m5rR06L(=vEjQa82ob&LJLvH>Sr6q)69Fsk_N_e>bu(fck?jO_fJnx{`O z%H=!|hb2Q zGFzBe^V*s@_}+t*vdPKSPe3Ajo|eeDEy}S`iNEV7iL{W)z@uSp`#_2k#BZm(rb^eQvzPI2qs7K zcYb{WRA8{L`+Yc%eRqHcMyo`I2U(z~e4cQIOtg62ip1oa>RQS$q33;~yUWAS@GWTB zcoQlmzS*vqK{cg&_~K;Bhb*ZF)c2!69lYobySba-SAE6L&D9{pu4|u37_>=kI0-<1 z;H&f{w(vQ1m7AMJR`<3X^$B+A_g+@(V3HTqI#tenT-Di@)rY8zGH)vok!U6D;AwBJ zyQ4gj`+7vdb|UZ<=I@7CL}WJW5lSXpDjl8@4MQ8PXU)x~F(toQSe9hBIh1!Ug{Q0u zS-4&x3lDYS&NElpwwnK9N3*WzR8`(@D;m3u_I-Phx7^ga;cSNzglT>7@=rp*CId^z z?y#`&(JuZKiDn-yU^}Nw8zM*T?8U;}c)(@Wyki2WAcmB*XZs%zP%^xQ5eZf!$NdUP zb6a^nBI875Sj5F+oks`3_K?l`Vl*FChj)Fx|5+po<4EIuU{3a{BEPJEeW2F{8U#b< zUNE5z|BYkWUCg(QpVcHTPgiqHtZL!j;68lLuPW&d`?KO7IQXh}i#7Q9ow(DlQSCFpCYg?Dv}Q-?qr`8TYxG{Ss(ox5K>E*LOt*djSb_CN z0}W5MoXnT9kBsV0KA0IaUAz%>!Dl%SR|KWMbSMj2C84RHcU)~b)XusssYQG|M|oG5 z7)(0JE8fd^hsF6bMhV1Z-}=}heAqt(1@rmOe>iY`%w_!K5U6c3cotvYVF_=IfKS?` zrN)TWbLOe!_^L2lT4j)9E zT9}y;zZcL2wCr`>=cBeU-J1WA?;U<=w?LIbSYTju<^cJQ@!X@zph2vs%MHTnRC=u# zn$R67iLl5utAwXux0oKun{YW?Y|g8HJ|*1_4Z?xHSV%uwSmL#6$bx$OxjtQ>{y?dH zy7G+|d36x;PFLw)Iz96~??opOs+Or9vj4n+llNsSx(2!IggRcu(4cQOH+uh)i79Qy zh}8ziA`Cf`8PG+MLW9BI4ONvTpq*s2?>yjD*#)0Tn#@&}c|*i6XDxg%snkr?Um`G%)^|PT|ASVWg^#QZDoZ z(A_c*6Jb-2avtf4;CK~aWl(Q_smJdiM)$Tn%9)ABNSo@+=F zvmS=LRqFGvueDyj3s6f1Vc~G2-L{XPdMDRD%qFMCt!c(i5kkoG_0t^g%qhZz%~VeC zI;YgO4g<+mUhJEC%WRi&tFvZvg?y8Iw<-H6-|kVeqV0!l9ufE43g+!cZu?)!k?UC1 zFa*{tmhF=Ju8b2Y0g)N`_1hZo+ggI}_A>%ysH&aJ_WXbFJ3BAhK`@-+eQjZeBRRTk zxH>XZoSlGGXzd|N)M4>iht&%evXy_l=xxG@cNF@yGMF%UTXak??j}yV`&W{9}#X6pVc=Vi%7` zF%%;8;KOswE#SQjlh%^v`Kdz!D=Sh3NDW;iES)&pg}Z*I?9NxR`FEcjT!k&2-YE0c zpsmv<a|KQc(mSc{vOuNJ3!$9CV7mJ!|%ncI?h_ZuJ~9J8X9o>i7xL$iY((vhFM zQEFh|!@T-Y?!S$I>Yp>ALnv5KDU;@6q5N^^M~c?jNMadX^SqZ`KotPK*(E_B zsv+U~kO{n}ArW-Kou;+|WJd2udf@+pXiyKp=KD98{hNmH%?m(tzgOl*5oz7KTV)Aq zuQ)^7ql|=SG!3aqgE&?>b9dhROSr!)J1?1sNL}v)t(X}8R30f*Hc+r z)<;>TVWEGz`nQtjR_rEi*}$~!Yp8q#Z9Fvk$C}RqtSlnK0}(s-3-E@_A8N~_d^fW6 zG<-biaEfypbvbi46^4J16#j!K44we0_N*OSgOlvu+%t=lyl1U4u+XkY2lq%!&0GYM zc9kvbm3ma|V6B+JHMYIm_s$gXcza)Qq#GSdCxibly#aX+V=O7m* z@bhZmW(Qn@h3t`imrW<4F#Q>`cu512!y+rj4gQ{S0q#f6wkd)ehr!Mq5Eeza$d^*r5cpoT+SQWjFw}R*`$HEgR z>RDsnC#~W$Hb@Pu^h#*IODk3pa?QF|G$ei}x_F4ms<`3k`5SHmBjsLU)Z5K0tYH16 zsE2bW7~~)RQ=0i1wlZ=H>g;V)&|B11JqhGI$}Hh*q%!j?a9`_dJ7$ti#sR$GKMMa! z3g;Y*I~jTGF&_mOTy9kyp^_WeA?rOvk8oMgK%k+@V6;0lKk`oNzS5lwM-VX8+bwrI zu9BcCnWZ2__VLxHB?bk6X5?!N$|N2Jn&h_3VM`K0$V^T*!XlL^jLgzz>JK`n(}L}a zB!-#Iy_SL88X6%zmy~lz=42GHONb$wHr1u-!U>HHLP-2t1ksOok`QBQ*&)|8 znV!2=PjY1z1mTJnD|MO;%QJ_*7jRJ0TL80VGj%!Z=x}j5XyNN?-5PC+P@;p*lbU`k zo+8&jWC+#f>zwTQN@4vBGBaHq@}r#);Qwd>_FP)qMq4W@UeTfgNpl(9vw;BWBV*o4 zfpD%g#d9kokgJu^*xS0~0Sb7RVS{zVx5ffP*OS_>YcxE%#tqRH6D`U?#CMZ5A1VZA z?t(U#gw{_2!OlCa7-{MfCOBkoN1QaT;?@Tw9!gw#UfRet<0RYvA8c|KHc~3h-OUyDb*^t5E`OWIPXr0|$-- z@j$S}Oct(D)O=RypQ~eYUIjtocj18qo?a~ei`rh@j$AJ*9_9>@*PM1^{*ad^`Wzem z?5yd^Cc^5I(X|b`y9K~Q$y;OIO}R-Pe!q|)OOR=t#L4A`R+&CDc*s^*}ISK zeha7Wq4YNI>5IYcaeC)hv?3@5QttF;bu&-ickPZet~-{vKKR+Qb0uZ$VLB8}Bhs|= z<0VY$a^1i+^W@kYc$(Fxa)!)3BH(#orxon6umNCz=6R(Nq?FgXmAmupG<>ZQ#NJJ9 zweDNvNb&36W7wI$ObdtN#&d@Xeus(^cpCZ*#OJX|G0OeiJ{DRx6tBKT#M%qF-wEv# z<3*{hxZ{&BaJD*4088YiYA8RpMkk9wum^mN!eJE2j$&0zxXLG89lvs$EpEDa9?l@~ zGW`Au322YRz4PA6XP;mxgBp7~HYACAmbEm-)E_tzD6+3S%8Yp!@@j;6G(us+A_&Pe zrWh*-0<=x5Ywf-z?v4{sS`Qm9ZWR+Vl?SF9tq-P;J0pr;oM9ngcc(!Lnt;q*gLb%? z8E$9z{VWFFFN;2LF)PWQ%&)9+&GPdWSTBAhRXDeJd4L>R!#p~!Hvtm`I$|!nF4s>P zB>u$-s~k5`jU(yZE6Vi}c_Hoh|d{7X*&6+d6vaRQ@=`?57{OW+kZFKFKBs(yUX1>h89R8)4OzNzW6W;)-ECt`mqOdNg zutNS=qRKWiLU#&wqu{l%F>ww0V@-2X9HM7Z^41qJM5cTVr^ z@iZ?86yFXVO6K6U$0bWboNb&(aIl-cE zRr@}Ux|S9$ulC79YN#B=0WIKR*F&RnJX&O;<>z}z17Q?p^q;8-KbyCC&~ zWf0q>S&%;wu2hiZEWIdgn4Q^wH8!4Ox4Y&R;ljy4at3xvVZc#Jq%>=a#ao9Z!JeP; zWL=nNKqL_d{bHY&b3-5(tGJn=^Fom0#LJ`6aYeq%-V~?Wm(gwE55F;HabjJMA}U7pXW3-6GOyItH6$z`6noyJ7 zrfv(q8z3w6tBfgD>vVi!X}Oy8Rnaen&wX!)bu3qvd@RR@yXpE59j~A7Ow7lRlp0m` z3qp7qvNHDuSZjCQL}J;l~Vi}7ZdwziFbQ6H8Vy3UBIe}7Qj6l!ir#WU8z)#*%9 z*B!hRIdqEG`dEY`HGV|k?09ML^i7EOOXl*3>$>QgCkPkA3%rb$>$GY~c@$QVEia$) z@AIu=yZGX{=Xk-MKIebNlMq2orUI79_`FzwaXZTesv$n!QnO{I5%!HYi>_6Yx``+3 ziLO0i0wIm4%|3_6Jc)MG2|EU}1LL{McGFMVv>GOpz2A;E%E**ildLCAt38no?-5(7 zx+Ux>Sf;lONPTm&!ignMtDmI5ZT^a|kTiI3KFwQK`qqbUsXqRq0v_DBJy=aSwEZi{ zN8Cr4PCoSz*@6)othSl%qkL6nbY4VHp}o-OPUD~9p&;z;C)vnow;tDb$UmRgjC(|J zfZNOED{Aa4-(;9#7YNk#OCH>EU93tPAwlN#+Bt(-DN!>70B z>>7U=@%4{bPFZc&vCo1so!GpYk&gW*>lLMDLx+Sk9z_LaE`t-(yARu;=pnZ;YJcyz zIpSsYd*#c*uUX7f^pkr|EOx<11np! z=#4;}U)xokh9xU4znh=^(571dzu)2tgqVstj&nI*`Caj+y>L`Clx0R=2p(=PPMH)% z|L1G```Yhnoag`E^zk%%yu>J36f)OUh)4@nl5|_hmX-bQkU)}!AJhAN8X(GzMebq$ zaUvGRvB}oo$wJZSL;pjJGc`R7aktur^^)jeC(qTn+GGK{WnuFOX<@Wo!g%mTX7&G^ zGB{@@*hhov7z$C4$43d$78-#6KDSMZxXc42?4T5R8a30r_GABgw#inYwPf znwgAS@VzTW z;Xfoh;xIf}sB*UDc%E7&Abu?a;w>4#FY<6Vl;pPJQvZHYT<^Zmts-^pa(;8%u4C-O z+5maI;i{~xoCSWvOR~1Lfz&YH>kGnw)go~13NThFhz}E*z$v|C1}cS)v07uQ^f{?= zp6cV#W`!tmw-Gq^`Tl#F{khsP1g)vzIAPJ1_f9zf z;0qY!`z2t2h|Y8u{P*FJ8$ly9CgNbwBfmj##g`T6N8|ur z^ug6m`Oq`pOry!#x7-#a%d-SHm6m-}TOLfYAWS84JHt_oTgpDRq?(%;qb;bw-o$36 zYiRgjd!{@W8i;^6v7}#BH-o$j$7$0L4q|SC?4Pd5djbFZmDSiMHv-=rE(aY3+!K8v zVD0q2=4?4E=*o{%N5@9U)G>Mt+`J0!;jKiTeO$s{(Okv*+b}`>@GSkg>_psXeP;90 zq&Kl33`Ms;LrQ9ml9-T>Ae>%Ay#X90l+o22wlE#}=D(BH6)(E(j`9&NAF!r9(x*i- z#j>kvYa^cUDxhhmFExX#5>PnS?JM#|fxD zKHjAhYH#F=oiB6)t_9v2hs)oaEdNwR2BGR0aDzX8eknkfoAFEe>S9|`S0W1_x_My- zOn8nUVK_3iAh9e1v>mA0tPaxwqE&<~id@hjgWq;mAil;K6iIVp0uCe#!vU~VYg7ze z7`KCS@Mk$d4Ooc-RF~qqEh0+}xw$pgL<6Y9FR=0W^e^9uj3?!lrP50!7VzY`_4f8I zKg|UJ>zd-(iDAE9viw6yg3rfU$mZHbJPzkQF4+yyUoKo@y0u0WhO0gF}IhoMWR zVObjg0W6q=@!kV@mD$YD-S*0nbt900RI`;8{rC-lIlm+6@&W;uS`93|)Kq#fYPGee zp|C;f{jv3~@cS$ke;g$Lo|&_zsdTlnl>G#Fo#mR2S1+;uJAaOtAhKUAg^6G8lyi*O z>kc1$(ibZCClDD<3GA!Z$n|4I>G0q3q%(xz>w<+h*o%`Wzma8lr2YL$4=DGCDMZ>X zne3R7iW~UUHeeL$A|SW&|Lf_xn~Y;SWM*fVy|?Ui>`i24uWW@v zWM^-(vR5c%^FGq=^@o4-IepLfxu1Jp_jM5h2F&6HK;zU20EgK%Hp`-p&Br=yXO>_M zx>~>4q(bE9H)`_}IO&5n- zgT>BXo}2-Vr52VZ++gSgYtalo$4!#)Px{4X#Dm6?Anz}_*w zT@8RUVx(DxyE!zjktVN#%yQ0aRGa!fmx-j(%5MOaCGKrdMAwnT7l{Kd-Jwzf*}l)~ z66=_{MjT%g$fcAKYN*jNV4j=<5tO%#!2_uN&#ntrV;DuM4qf8vUjh?{pB;WP(Ix?3 zkie)ZBcTb`F!BF^7$*UmZiXfG!3sbQi++d1tQ3b*&SP3DRkf{vwz9TmI+Xc$B|YKR zLrTHxqSBCN)30G~RD}Y-`IBQ%!I=qdDn9>qk*%`oe-pH_d|04a*sug+&j-~rz#NuJ@VLR5N{D;w6W(3udKp&d$;?K|UHY0zqSi`D;LFf&*=z49N z$x=o~!OM)QEGeOY1Qa3H19_^6>RWa;MWnYSx(c+8y@ZjuLY{StKpT%Zh|$ow)3TH! zE(o`*=x5Y_2Qy2^I$GeE3o(MkL8Ku`4#CsR(X#OHp-fRSy}4gtPlT(0`<`u%f{hB# zD9PD!H2HsKMw0beg#{7?ikp%9c*SJ#Re9 zjpWn_#hXIZc)fp1!X14}wbEA;R)C*vJ+TdO-f#X2<@q+dx*Q9_X~4wU59%1vJ)sW1 zE|>*1WkRNiyT(1yqmQ2Z#=m}kTrAxu5Pp5}-9zp_fBzPMqO_!f|H2a8mL}(GpT{zY zF}k|(^d>6B^{S9|c^|HK$`;l|yU1#`D}jnUPKapiVgAZ}-(B@%Dug=r-cCOt9LGAv z!}bN@@GA(N_Q~FhxKS`#m)0Y{9f`0#>ZvJY&@A*zigL80=WJXx(}nO7dU!=`+``Kr zf_b=h$p}$&;H|Gx=Ona0>1D|-HeUoXHp{DtYC8K;cAo*ACeoy4X`1~%*E(Xt5g&yi zD{*t_D%&6Dol)LJNYHNdY50BrkG^E~m8ydvFMvZ5Or{%fr=X)62SPBi{kReh1#bj? z9wsTL$2W|=IFh#H-kld^`?G%|tA|DQP#2#8=NmGf*b{O3l_oGAK;jVxE}Hm01-CAC zrfo$dv-K-GrW8&i$|;Trx2(7=sX`G#e@Qpzia7k-#WjbQ<6RPfs5to(6*Q%$?^f|D zd8-+aVUG*zaomykVu3_IJaioQVMyF@(1cxY0+Tc6!TZkZ#stNN-1ushv>xD*W9W^b z*oytsqayi@UfU%E)t>u%Z{%$9Zj~*!dBKt&YV|9KBZ1aOL@8uvsFgs1w@OEKisU4r zp+(5b`N7KmH*Stm{Zi80O^Mn(a>+0yF$bDf{kB}NfuQ0P<1gi(UR>dSg zA&n?&$fob9#n12IcNFWKF{7pO_fREh05$lhihq(ihomNj9>zPFej7^01e=+xZ!_kW z0KriJ+d5H&WvPJqXbY&opJF>)g>qV$Ckqdni_UnWeZj;;x;LQgJ*QDq+I02dzvLi< zDL$%77J{18gKnq6QwMtNJ(Q$C_A`zc<=<@n^!zGydFF?j}_O6AK*5BlD0AR>q9MISik)Ne8>5bx(y*b zfmO7$&QPjqyP1TB*V>Qtb#w}Q$l=p~oUV~-mI4emWD6lZIMKae**f1S&^~ z8r2aBaq;<+zZCdfp1glu9#@so9vpE4^mxBF0^00Q#?exv^}$Soh*KrMy|WFejFZ@@ z04$$3aS}C|!?!vDfI8pP9Oy0J2hT%PhOMDUSS&Gyb5se!T7z7Q5gI6tSLeshaIX** zaS#rr346$w@qkJR+vbUY;{x^0@H-hLZ0Zzce5o1@`nOG>c-p?XSGM42z47~KOs!zm zBg(wGDGRDvqZ_HBh;?%qXM(+rVLzn556!~`GzH~{=CgJs+# z8zO4Q->XkMAGPjAD=(AFka}szXuc$EeYNa4 z2NqNSN2BC{?i_U_Y@rs?5nne%<*0&2fxP9y#>Tb`V114B#cE>QY$U0@wK?9esNz1~ zTtvr5SgaTQHHs8;BedQCH_{{>0JZrW&D z(C5!?iA4~6IvC1q6UxFE&8*@jbxWBi0AenA=_=$JaB8*^J5;~@eyx- zRUvdl60fM@UL)22WS?SrHj?y;92w{Wu_Nv*S{J#);@SLgT_hp0N$xn2_X%B!HLw-5 zQ#p;6_B>ASLBbL+$Rw~>bJ{}C*(i`sU=AtcU#-`rWt8O9SwRnhm@XMTKv(lP!xi>eMmEST_hlzRAu-G_AO&*+=ivB z-CNYZQFRB;;ca^+%1->{|GvEwdofcw?~%52PGv!f1*Vvw5WS>9nTSM7c1seN~OsyK(2HLnyK!B=Vu3JrS)u;Mjf&T)&XZNvuN3ItodDWa5ar|DA z-i=cLq18;L{?2@s+~G#5qK4?>~lhhxh7@-g_6!&1&J8MRw@?-XA z=39OXsBC8hUwa9W!p`7_yAuD!@XU;RkZQSGyXC*=Y6{vpENT5#BenmU0H7^0nrb_B z=Rd&jgdVWXa+g1V-^%pJdW@#gb@{i9^?!fB-|q?hXV#z{a_(Zjqitzt_x~mlQ@mcd zg{-V>9tpb+pMH&nVjghLvtj?9sOnTaQ6aI%Q{cqyeX?__-?j1)5Pk~>g}2s3b<1i( zq%7FKk!zav;{GxqQkrTxz9Mpbv*u$cC=UB8D0BNYMsgGw>=cZM`NTbdhH z7%ZA79NH1ilJx*wLR-4W`^4WnM~~l_@eAwyc?%&9U9u!H6^u7{JO8it8-dKt%+Ysq zB+jr6?=Ccd8UdV}3>A&*l)CrLTftIg-Sk823}PJ}9XWu2-T>TsjJWL=V3m=5*_PhE zkn#t!G|iD%O?@;|%zrs1TXk3L_op`*j4{yw(9XQ-tIGY!%vl29ouUVUXvs*fEY_OG zBUWp+>{K|Q_tMyOuxSFCa)KftE5-*(Q2kX^Xzunq`H8a_zlwhgVZKn?>HE(B@EJ#m zk+-_%w^IT&%60fNl*MSt0Et)~eH;*ABLHOiq`-J9xR@p&pFV?ap{b- zaseqUXMjwG-x%O26HLs=U|hBGqzpGi7~xnGj@3c*jrPM1=akH$WQ17%~OxQ8xup%vT-pI@FG z0*>15xF{_RjogQELV{Fy|J9?A`I*_*^bi5y*KV5~3Iqyqy{dr2A=~Z^$A=TLqp(R)zp$5!jezVR zVee1jEj_DH>k9$);uMTTkB2>!fGJy%pdA#6ZMi~O60NtK`-@CwO~6Fu;53=sFjSWNpv$Y5}M8GJApdR59&+d008g6iS`n-qoHRX4}o zi#@Zc)BNv`CT+oTz@bv0sL--3fHHyvFI;E{oOWk3M(%fSu5X1Qt91CgDI5k7U~Gt) zU&p72%`i^-nPzjY@y(~FbNN4u|6O2N`*4en2hj%#31qL6adZ?qgqQ1$apMj4Y9?MS zRGYu%b(j-!28|NT4!vd1?|}Rfh=H$Ak*Zj*KJ%P+5ALxfb;CEiK{yklMZry5k*9VJ z)opSsQ5~eOy5t8PGy3>cBM*u?I`Fku#0av5%)79iLCp}}P3x;=sZzTWxpaJ+Z7GO} ztj2{TgPcJ;4o|xLL7SE*)#Q^nSllm=EJXfV$tD9ePfWJglYh=VGM6zP4a?ANwI`m{ zc@Knj_-(t=A)Fp!1U@~}skRu1oAwKX{z~#%1rUuuVg!o!w3>UC2_tmv5pVhcy3PkE zG=T0ERS0x&-gA*v@khaO6tAl0hBp|#V1>93ZB3M=_VviEp8`lWUZf3_p?L(XDsp>( z`n-rSFc8e4`Hp?zrcgP4o)24}oyCRrfmV?h(vRvJOuwQP-KL?uLg)ys&V8&! zaG+u&BqBVN;%D(MoT>9MCM4d<<4s!^F~KP;UUtRa&+fBWU&Y${33S+0+%|`$BtLXP zAybvl_5&XVK|FRQVSu2&JMkV~kNOQxIXQGI_6>(e! z`MH{QR@;fe2NhjqvPZ_$Q$||})Ll{wxMEd}jK$q>fF|m6Z^zzYn41HyLnj;gM`%HO zdFAOY&{L^6;&NyN|2)T`B)c zNEa2rbU_V9A4PBPCDiYF23l+pPcog_oz1#qwl!ky9MC6~nV2K11>J+GB%|VRH z7|MkbieQQnLWi$_#0YHA=TC`|7MnYg=lf3%L|3{yMl8ZbHcuxcnkEw+y&m(wJa?OD zc`1sMfG`6(N}3L0bW`a7Xh5d^J{MpE)(p1aY%H_}wBktq*_l$~F#h}mnbj8e{ZbQ83Y}25fh1DVz05(LBr z<5hO!a+NR{3pfaYgmirIXnw7@Q?;@88p&gEFmg8+4+_J8ND7#?qgd*tQ1ZQqYrlSN z?y)zw1(gLzq+0u2U+69u%Og(CLCi0vHmRJM{3`XuV%Lt?K%L4vodfbE((q)YPDcfYq4Jf*3i(Nm*@fwm4Rr$(1 z{K;WngytnqQEIh#E^Y$9@A39ph;73NdNDPxRg^@`D8io!gkQi5=kKF?XB&N7i&p?x zM=1RW4r09NzN{SL2b+n$O7#pr>jWPVJSPAN$jkU(doZ~PgKRTdYuytpIcW0wWfqVL zCMzU82IdvsAnUFJGZh;+qr3msXaU{YSYyHD(U#^hCAjHUD(|N7U4{SjvV0ro;3qte z1e2rZ_M%5Q)c|%rS-Arc^|frQtkof3z&mOrrVmYh^sEk-diwcT8xB;XbxR_ICf+y( z5JxQvK4a+|aHkh(Sm7HX5Aiseu{$AOns70lc^3q4W{CI%Hi_BU=pRB@@6H7<(KhS1 zPlL1lG32&4{0=!TX-!%yZHw=-JYTd=FX%{}9Vh&V`3XP-=W;+S?a@X~C37PW3ORi?<>nYuPOebnm1T^U7Jwk%r}^Dsd(vJzxJwF@tfLuH_?S zv?p!tH<+P!?vH=)O+1Vt58UHA-=ocUdASHn)#lyQB&Oadfg0@AHnbqf*w-?vtL6AE zeF^e;9CQD%1L`{i8#-C~+q2MSgJaJQV^i>SptpWp@F~MqLH)vxYd2Y{jU`Geika_~ z3D%a;V3W7RxW6GuLv{#wlKB-*ps`}9(ywO=>LGyv4!$NYi75YpHQOEbdAcK+<ehEoI7r}#d z?-xhvK{MZjo_~CC$xWc8u^=ogT*x4vQeMJps1L#a&lK`&5vg;Ap>+4XSL1o+2ivr4 zr{!2qy&o{yaueboP=cgV#P8IJ^g1Tc2DCc+Po>yVYPrAQV=!Q*r8P2eplJUAgO&2f z0h{m88@ub^th|$fh-zLfQQGx_7P+59c-o%>fF(Ra;KdWQpVQR?;oEV8Lqndo!k~yX zz;|zhOQfpBCL(weD#J(AbF6V?-6pOq&{v(icz5RE4iDhiXI%P$dDSa)$2RoOd%KX( zp36Q5FO!&*RBmQ`8U)4(=4Ft{PVon+q_z=_<`>Jrgh}T|p=cn_E9EqPsESkm-1Hph z;MW<@2pJGB4132e>f0*AMh(wb-0V-|^&nqR8IP^=1YVy1=y-n-NRhGU{^*Idqj%K# zfH$o&{bS|~TnbnVY#8)EgXYGaR^vya)EVxpPZt~hbrJEKVNp;@Nw5d-Nd}WDkWs^H zxg)%;SigCA$eGd@&SO^m6G=}PA=jATfJ)4(s{Qo)TR$Q!&sT3J&$r2Q zI42NRZ$*ze_NH&T_=WhRc_SmLphMavutTa{;ZNXt z(9w}$v;F%1B;tEq9I4xGQlc>nlS6KuE~+}ZE%Pad2F})JmUumP|!3XqJ4V@#D_0V zS5^pzMuEk zRp%;EhO4~sE-ET2IX`xsT9S3`4a0fdl;bAMpNkmUBpo>tgh0V+o*Op3u=I*NhE2oV z+K;mO|>dn&f2b!Tqjb0^X~8P2pV;~Y)k3cWib0a0I1UH6-6^Q-&F3;)OM#d$=}7DWNyL| z&1zKC=hW%Cvmfm9O0^mlWrhX>Z;I$Cy?~013fZh389B!iyP%+8A}i;c*fEoY%_h}T z#nD&qkx0eRu!~@Cm!nTUm44cHsAN|4GqRtl(WCNt-OYr1Ut;bpyOH)+dUg3+Pw?Uc z(`AjArd0g8Hrqt_c29=|{V%-&h|Ru+9rFWnF9QR_)H!o}T|`lYsX$JIEq9}f`t)%T zLVNzK6kRN5HN$LT@jRRm$p-5&v{vSX3z_id_wQcuYj{Z$?$=gOh$Jc(;Mi91EK_7ct<3dN6vrIc1zelJ>{6hkYOov0)f2{3%uNVKdjnOXKz4toOCy34QZhQSSLD(U@1nNtpVtKzJQ9g?Y*5xA`{JqHP z1)&OZSEh`r9QOtI@-wad5r+`#w6H%gFG{bi z1?K1gu<<8qlN)`O_A5%|2OZ80C?~hHJXBRRyszDaTjAKhLL`s6C z@yPPqj4OyA_CJ9Pv2qj`AJoX4Q!?xe*z2DWC~Ar-Fvh9wn3T@!)NyV+rf?7V;mao= zENA*mnKz5uPM)|$>j!@^TKI94+HG{mjGl=jdl6Fc;u>u0lM{H@D2a+<-p28CJjC&$M-FztpU$l)lWexLVs z8>tT)H@xljDvG9rY;CWelvH31=T5>SxR`w>myQ#D8jbTaBHabMO;6PL8?wHE0hl$w z)WkfX9CP43W4c$aXKiggyB9_=JI+-4<=6H*LGEJ=C{m!??Y}VienURg z3v!JT0P(lYbLv9tGUJ}eS0tLRzXY)B;drAi77YZAe}M!KDLx3pETgFl2>)1rquq6? zn%x3OkL|IdSV}>M4BF@h-xCLU0NgPr;jh9_iTL-dgADOgZ>o(d(ijad$W<+|B>($E z3?1Pq7SglR6DMdjePm`1YOG}bUuQ`_a-StLlaJ)3xN+2!zRcZ!uW%$90ljvVtfFUd zP_&G^`*3YDcvNtMZQEkB!w^x}d>>lr6!Om0c}zPK>JOiZ9r0)Moqu20J!lGY5SIyb zAWjvHN}ad-W**Py{XL;%MA|&7R2Jm^r5AlWXXZ;j%)1yucaI1Bbrhxj8*Juw-r`DB z0YMGoN*=0o`InDDg)!NBef-G%Xj8q6J}~Os9HP|5AADn!A?nFlP+Y9gs&tt6_iG@< z#}6a&K??%D1`?pAs#m$@Ay`<3W<}74f=)#}t^cX1c;zLKRMVK5nYkX%F8&oy!Y_(? z179*ke!J)CU`jk>@eb&`6pxQ7*moR1{roL{H>qn16|L`+f$et`9nC znji>kPX(`4MQhZ!psC$Xt#xJCK*n5!WawC@Q2Y0r9jU%n^{Dl<3!& z;yt{Tm$Lc(;l0gbOY<$gEv;qG#kx@7p&Uw;6W_7iQz0B0lvdD#)CDEQc<>FGN1^ZLPVBm!`Jm)pcGFew&Owh* z+t}E69n8{x0yLXmXJ_Z1t+66r01AJe`Fphi^eRiJ5PAHsj-T!Tt-0|Lb+TYKqeKNQ z4)dzHoT{qfb8rnvhA1p2_cEWu00<=-;DkWdxSc-0zpy`9te$t|c>`KkY$v?zdOyqW ztWfcJswQ|y+3^u51<)ARMSCE9U^D?blL)Z2gwYY^ukhja#39>zy-XouZ15e0hDwMn+p^ z6W_wg#^#bcy0k#)Y{M!XgRyq}MX5%=v-mi#DUrR3CIU$Nsw3McvuP8LG(}9}B7f)4 zbtBk7T~sU19o)8nJtCR;&G>0QVzTGkxBAs6<++1DEk1~vE@2kU z3>*hG2L}fyfmx881UjpSNGhVjHtHk81`~NHn^XPXZD``WxvW#_rb`QE;Tj@;(!`6FJjiiuz@^OE>gp-JriO+Y*x*pOy4nwz!l6@NB8~{GcdO*>xDuYY z5{_0q09~RoP_ClKt}T>cAEnFX>8})mk+ufkfIrKf zkrM#qF_FNetmUwGj~&AXF|KwqDhpI>VCy7%I#0&Sqb_yY&+m&@x>{qr!C>yecaKxwt?1r}{1Q)zy3=p`84EXsB4;=>wxT_D8KXaj?LBiJ_&>z?IRfB z*f@RF3AbXFuEHKpPn)BVE?A;E%ckI(aEQ71n zwKcs*pAUjTgBLsSX$3d9=a}D!?%cW}EdNoi8eo6@MQ3re`Sda@y-Hj~T|NG`b6gMV z9g{;P>KsIfaI4M4TcaxL;=!zek6=!{8bS#H<-o~MJ06b;1D%8|-V-RoC zm-j^Q#V~}#Z@s@?<*hBtUQwxkMP-YA9;n_v7}VR81Z)@@kByD-EfLtmB<;1E(RDXa zGzY&lg{RYN9PCV0J~f4)b9q+)oYTe5E!DQ=HuaWt007e-yMm&A=x`#W;e&7Wv_P8xr-8Ouzua@bnfs;Mx-pnQRFHC+Q7y`dQoI zFLGVu2t4Lzpn*O1W#w9#0j9hfMSKv9isjaHb~`4%#YcMVPMgvQyD*XlLL%!C3Ljr> zsj+eVd~Py=cA!Ax`uNLjG2-=@w4xWKA1*|xoC{zt&laCT<-Ib{Ac=&k2+Su>N*M~! zPC>GqH`bC7@@!dCO}v29h^>15stP8OMX8YMIgbBZ1;FQO|Lo20AbYB+sxte&2%P(n zy2&3dSp!PXeRL=LrXoE&FQ7J`cHb1R(!5`YebjoHaMXm?09@Y02@MGi%5soq43&r* z9Br>yk$?9Dr21}0iCT?%Lsv2H!MtL79|!IS#3sMx4=~Z+WuJVLNf&XHP?fK+z7)7A zXl}Y|;p#5e0}{hhKtg-|2FQ05gK44=n(AD(CV47)PJf03=#4^<$yx8K(Se7%PG# z7R0rA?VEk4xO{%z%D9aS%p`4-X=o|9A;kG}xU|MI#i^IFImbAW)0@b`VQgesVc4hV}}>jc3Q3oiufN|y4F)M_3tq>`(xdRr+iS^Gp&@Qr0LB2pP$WZn^j9a)tF(qb3=+W;`1ycgA1w7v_b)QP?5iWL^icmw@ADD4fMQd@FL8Eh+6}OIJrb5sW*^6 z>+Yd6&E`qY7E*~L2An*g46C5^WU>VLC2(;3{Lq@G`MC@T!XNBrG#+CrV$PS@tK6F? z=>q9==8ZgpWI9T|xu0XX>b9te5t zzL6oubd*9^0no#TPd%SYw!bP7I(7rau1-RaRmPqvFF%@^tY@Ydd7tk6NAem)U~Xjh zKtqo*TX6s7{Ld&DXndA^n-EIJV8h`=3j-rnIkGyUcw>j~$4mzbKACXF6KzAoU9Tz< zEPa|+KPXP=U3#05UP2j-6rxyaC4O&X@mklJK7QWs#qM@fKnjyC)SO5D>9T|9#>bep zPSa9k!CMKoM;q|sCAm!~MkFl>O4fw7`JWH?JOypVA?NHyY%zK9#D8Ck5dM&?Gq`{f_K#->juG`Uzd%(FTU%YDGv*>7J2GT6|;&iPRoMd;Cz5Z!^lQD&$5$yUE5 zx9+bHnVOW8FFTKA)U75lv)Fp#6d~?(i65BUvk8VY-L(Z2#gSYju}I8VRqK8^0t^ga z??I_G=@EogH8F>kSbP9%kmz!EBU{i$<^WoB!eIj#PE?6Ae$Lc>=kEHEpP_A%!)?rDUF^ZD1={b?>Ppr9Nk9*V&V|`*FDG#Oy z5!yndz;)s-;sK=+$9Ff~w-xp_Jk1Iw!bAOniy8SRfzRg}ez8nC2NNidIjf$0`W2QT z=A9b`JIoyBcl@)GeRElKGw*esRbr~pG263ia1e_Ur1&@IN1^`)cVixrM7C!>rc@o0 z8?eK@G1k?6LA5BO`IJIzQnCl20^9`o%_sqPAP4qG#rJQEi>D?seL%5E#z|J1!$e?? zJK&rjv&AI{!PKoLJyFf){T0PO4t!Kzj@E^-D(I)kin(S`%4jNY@!#uYQ`qkUjJ`CP z5gXK9kI`acZ@}EL32RPLw3SK-TbhGE71+_(qGF}7_*UKI(26Yn)jo2zs*N0?#%DGF ztGCmbA=PxMGBR5b^2J-CB4225&TGXBQYZ-X9gK{4qGWVeu_MK!VJw3fafDr%7NL>2 zjwz~m2xH_!&DH$%sO7YM-x$ppUX{ilykWlem3v&JUzOK(}$8*jOSpOst8CJF5&OzYd7*Jxeyh%Y0l(% zhr!~nahIQX{GOUh`#V?K6;FiWL-(Woc<%)SQQub-A_WLyg0{aUF05lVKB-3Wmz!Pd zD&!?*y%Yk@n=)Ev`ufewPm}j??t;bjo2^};VdzyZH~I6v{$%#lU5h1h(*+t8>+j66 zI91*Zf6UYc+dD{k3ktyAQxgHoq2o455TCjAS8>FMCB8`?{s}oC)ixT<4@jSXcVCTo5lzgQ*-$k;>!S0Kc(eAU?=!Q? zB+-cax*rQ=7~ut2aC>%nuqTogXS5s5_7{VW}i;*_+%5|e~`^tn8*04TS^U!gq zjEz2rf?`X+x7SspyZ0)6KOziL`~0$v%lD732n@H!9CIiDYp-QSeX$zh?vMlQ;8EWA z%TI{VohY)UA(1br^Y#Zbgjc@LGb)>hy$c@k=F6<2m74(Rtb2lc2(lnre^jG8z}UKV zpMVXka*!fjxK;_rG>%LoqW(Zz;>&h5vXZMM9cjHKm@6T!hz*^!h^C2vr8t>Io92n9Q6&aizfZ^?reS>Occwze_ z;Kk?y1_J2z7a_Ki%WbT;z~d+)vrW(iquJN}klUxHs3rV_Y7}4XS@E9CekR1R2xVAb z{;{!230{g4cYWM$IF`MKtbh>b=R&84zKZq_aFnc!a^tK5f+eD(q_AgMoj>cnHut^; zqevSF_7sat#!L~!NiCf(oDhM1jvqHau|@!)w`?o-r2Ngpv-`4lAzT=4;lQUZsFA}L zKU^XPwuI*Gc)+~JlSm-8Pt(U>>j*< zU^soz_eB|O_{l<(y3(Seu)m+GptZS!vliLzDV7`UIu$A%*2*w(Rq(%NwVi9IF17r& z-sJq+TF7?NPmfugy5$-DOScLlk`9AW=vF(7#mW&Ri^+ts-N&woF8Ng<^^tRrvL`A7 zKDD>^IJZnJk$#{sn+K4<&5cC>iFq%bXxCrO`JfP+Mno&t+2SFS6L_LOF5T$w7E#UZ zBgd;uU)rO0c<#Y46EM2n6@DNfAmA!OrL^wMG*{sYuQ|Q=rc5<38~g=9QC1aNA#D=; EKRQ*LO#lD@ literal 0 HcmV?d00001 diff --git a/WEB/public/index.php b/WEB/public/index.php new file mode 100644 index 0000000..ee8f07e --- /dev/null +++ b/WEB/public/index.php @@ -0,0 +1,20 @@ +handleRequest(Request::capture()); diff --git a/WEB/public/robots.txt b/WEB/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/WEB/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/WEB/resources/css/app.css b/WEB/resources/css/app.css new file mode 100644 index 0000000..3e6abea --- /dev/null +++ b/WEB/resources/css/app.css @@ -0,0 +1,11 @@ +@import 'tailwindcss'; + +@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@source '../../storage/framework/views/*.php'; +@source '../**/*.blade.php'; +@source '../**/*.js'; + +@theme { + --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; +} diff --git a/WEB/resources/js/app.js b/WEB/resources/js/app.js new file mode 100644 index 0000000..e59d6a0 --- /dev/null +++ b/WEB/resources/js/app.js @@ -0,0 +1 @@ +import './bootstrap'; diff --git a/WEB/resources/js/bootstrap.js b/WEB/resources/js/bootstrap.js new file mode 100644 index 0000000..5f1390b --- /dev/null +++ b/WEB/resources/js/bootstrap.js @@ -0,0 +1,4 @@ +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; diff --git a/WEB/resources/views/auth/login.blade.php b/WEB/resources/views/auth/login.blade.php new file mode 100644 index 0000000..ba6666e --- /dev/null +++ b/WEB/resources/views/auth/login.blade.php @@ -0,0 +1,75 @@ + + + + + + Connexion | CESIZen - Ministère de la Santé + @vite(['resources/css/app.css', 'resources/js/app.js']) + + + + @include('layouts.header') + +
+
+
+

Se connecter

+

Espace sécurisé pour les étudiants du CESI

+
+ + @if ($errors->any()) + + @endif + +
+ @csrf +
+ + +
+ +
+ + +
+ +
+ + Mot de passe oublié ? +
+ + +
+ +
+

Pas encore de compte ?

+ + Créer mon espace personnel + +
+
+
+ + @include('layouts.footer') + + diff --git a/WEB/resources/views/auth/register.blade.php b/WEB/resources/views/auth/register.blade.php new file mode 100644 index 0000000..4ce4172 --- /dev/null +++ b/WEB/resources/views/auth/register.blade.php @@ -0,0 +1,94 @@ + + + + + + Créer un compte | CESIZen - Ministère de la Santé + @vite(['resources/css/app.css', 'resources/js/app.js']) + + + + @include('layouts.header') + +
+
+
+

Créer mon espace

+

Rejoignez la plateforme de santé étudiante du CESI

+
+ + @if ($errors->any()) + + @endif + +
+ @csrf + +
+ + +
+ +
+ + +
+ +
+ + +

8 caractères minimum, incluant chiffres et symboles

+
+ +
+ + +
+ +
+ En cliquant sur "Créer mon compte", vous acceptez nos Conditions Générales d'Utilisation et confirmez avoir lu notre Politique de Confidentialité (RGPD). +
+ + +
+ +
+

Vous avez déjà un compte ?

+ + Se connecter + +
+
+
+ + @include('layouts.footer') + + diff --git a/WEB/resources/views/diagnostics/index.blade.php b/WEB/resources/views/diagnostics/index.blade.php new file mode 100644 index 0000000..6ca67fc --- /dev/null +++ b/WEB/resources/views/diagnostics/index.blade.php @@ -0,0 +1,54 @@ +@extends('layouts.app') + +@section('title', 'Bilan de Stress') +@section('header_title', 'Évaluation de Stress (Holmes & Rahe)') + +@section('content') +
+ + @if(session('score')) +
+

Votre Résultat : {{ session('score') }} points

+
+ @if(session('score') >= 300) +

Risque élevé de maladie

+

Votre score indique un niveau de stress très important. Nous vous conseillons vivement de consulter un professionnel de santé.

+ @elseif(session('score') >= 150) +

Risque modéré

+

Vous avez traversé beaucoup de changements récemment. Prenez du temps pour vous reposer.

+ @else +

Risque faible

+

Votre niveau de stress lié aux changements de vie semble stable.

+ @endif +
+ Recommencer le test +
+ @else +
+
+

Quels événements avez-vous vécus ces 12 derniers mois ?

+

Cochez toutes les cases qui correspondent à votre situation actuelle.

+
+ +
+ @csrf +
+ @foreach($events as $event) + + @endforeach +
+ +
+ +
+
+
+ @endif +
+@endsection diff --git a/WEB/resources/views/emotions/index.blade.php b/WEB/resources/views/emotions/index.blade.php new file mode 100644 index 0000000..3f35397 --- /dev/null +++ b/WEB/resources/views/emotions/index.blade.php @@ -0,0 +1,84 @@ +@extends('layouts.app') + +@section('title', 'Journal Émotionnel') + +@section('content') +
+ + +
+

Comment vous sentez-vous aujourd'hui ?

+
+ @csrf +
+ +
+ @foreach(['Très bien' => '😊', 'Bien' => '🙂', 'Neutre' => '😐', 'Pas top' => '🙁', 'Stressé' => '😫'] as $label => $emoji) + + @endforeach +
+
+ +
+ + +
+ FAIBLE + MODÉRÉE + TRÈS FORTE +
+
+ +
+ + +
+ + +
+
+ + +
+

Historique récent

+ @forelse($records as $record) +
+
+
+ @switch($record->emotion) + @case('Très bien') 😊 @break + @case('Bien') 🙂 @break + @case('Neutre') 😐 @break + @case('Pas top') 🙁 @break + @case('Stressé') 😫 @break + @default 😐 + @endswitch +
+
+

{{ $record->emotion }}

+

{{ $record->created_at->diffForHumans() }}

+ @if($record->note) +

"{{ $record->note }}"

+ @endif +
+
+
+ @for($i=1; $i<=5; $i++) +
+ @endfor +
+
+ @empty +

Aucun enregistrement pour le moment.

+ @endforelse +
+
+@endsection diff --git a/WEB/resources/views/layouts/app.blade.php b/WEB/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..0eea36e --- /dev/null +++ b/WEB/resources/views/layouts/app.blade.php @@ -0,0 +1,37 @@ + + + + + + @yield('title', 'CESIZen') | Ministère de la Santé + @vite(['resources/css/app.css', 'resources/js/app.js']) + + +@include('layouts.header') + +
+ + @include('layouts.sidebar') + +
+ +
+ @yield('content') +
+
+
+ + diff --git a/WEB/resources/views/layouts/footer.blade.php b/WEB/resources/views/layouts/footer.blade.php new file mode 100644 index 0000000..917ee23 --- /dev/null +++ b/WEB/resources/views/layouts/footer.blade.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/WEB/resources/views/layouts/header.blade.php b/WEB/resources/views/layouts/header.blade.php new file mode 100644 index 0000000..6660466 --- /dev/null +++ b/WEB/resources/views/layouts/header.blade.php @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/WEB/resources/views/layouts/sidebar.blade.php b/WEB/resources/views/layouts/sidebar.blade.php new file mode 100644 index 0000000..b4e3fca --- /dev/null +++ b/WEB/resources/views/layouts/sidebar.blade.php @@ -0,0 +1,67 @@ + diff --git a/WEB/resources/views/profile/index.blade.php b/WEB/resources/views/profile/index.blade.php new file mode 100644 index 0000000..7fa2b37 --- /dev/null +++ b/WEB/resources/views/profile/index.blade.php @@ -0,0 +1,121 @@ +@extends('layouts.app') + +@section('title', 'Mon Profil') +@section('header_title', 'Gestion du compte') + +@section('content') +
+ + +
+
+

Informations personnelles

+
+ + @if (session('status') === 'profile-updated') + + @endif + +
+ @csrf + @method('patch') + +
+ + + @error('name')

{{ $message }}

@enderror +
+ +
+ + + @error('email')

{{ $message }}

@enderror +
+ +
+ +
+
+
+ + +
+
+

Sécurité du compte

+
+ + @if (session('status') === 'password-updated') + + @endif + +
+ @csrf + @method('put') + +
+ + + @error('current_password', 'updatePassword')

{{ $message }}

@enderror +
+ +
+ + + @error('password', 'updatePassword')

{{ $message }}

@enderror +
+ +
+ + +
+ +
+ +
+
+
+ + +
+
+

Suppression du compte

+
+ +

+ Une fois votre compte supprimé, toutes vos données de santé, votre journal émotionnel et vos favoris seront définitivement effacés de nos serveurs sécurisés. Cette action est irréversible. +

+ + +
+
+ + + +@endsection diff --git a/WEB/resources/views/relaxation/index.blade.php b/WEB/resources/views/relaxation/index.blade.php new file mode 100644 index 0000000..0e823a5 --- /dev/null +++ b/WEB/resources/views/relaxation/index.blade.php @@ -0,0 +1,214 @@ +@extends('layouts.app') + +@section('title', 'Détente & Respiration') + +@section('content') +
+ + +
+
+ + +
+
+

Respiration Guidée

+

Sélectionnez un programme pour stabiliser votre rythme cardiaque.

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

+

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

+

+
+
+
+ +
+
+ + +
+
+

Bibliothèque Méditation

+
+
+ +
+ @forelse($activities as $activity) +
+
+ @if($activity->type == 'audio') + + @elseif($activity->type == 'video') + + @else + + @endif + + +
+
+
+ {{ $activity->type }} +
+

{{ $activity->title }}

+

{{ $activity->description }}

+ + + DÉCOUVRIR L'ACTIVITÉ + +
+
+ @empty +

Aucune activité disponible.

+ @endforelse +
+
+
+ + + + +@endsection diff --git a/WEB/resources/views/welcome.blade.php b/WEB/resources/views/welcome.blade.php new file mode 100644 index 0000000..a6292f3 --- /dev/null +++ b/WEB/resources/views/welcome.blade.php @@ -0,0 +1,169 @@ + + + + + + CESIZen | Ministère de la Santé et de la Prévention + + + + + + + @vite(['resources/css/app.css', 'resources/js/app.js']) + + + + + + + + + @include('layouts.header') + +
+ + + @include('layouts.sidebar') + + +
+ +
+ + +
+
+ +
+

+ Bonjour {{ Auth::user()->name ?? 'Cher étudiant' }} +

+

+ Le Ministère de la Santé vous propose cet espace sécurisé pour suivre votre bien-être au quotidien. Retrouvez vos outils de prévention et vos diagnostics. +

+ +
+
+ + +
+

+ Vos outils de suivi + +

+ +
+ + +
+ +

Journal Émotionnel

+

Suivez l'évolution de votre état émotionnel avec l'outil d'auto-évaluation.

+ + Accéder au journal + +
+ + +
+ +

Tests de Stress

+

Réalisez des diagnostics validés scientifiquement par nos experts.

+ + Commencer un test + +
+ + +
+ +

Guides Pratiques

+

Consultez les fiches de prévention sur le sommeil et la nutrition.

+ + Lire les guides + +
+ +
+
+ + +
+
+ +
+

Vos données sont protégées

+

+ Conformément au RGPD et aux recommandations de la CNIL, vos données de santé sont strictement confidentielles. + Elles sont hébergées sur des infrastructures sécurisées de l'État et ne sont jamais partagées sans votre accord. +

+
+
+
+ +
+ + + +
+
+ @include('layouts.footer') + + diff --git a/WEB/routes/api.php b/WEB/routes/api.php new file mode 100644 index 0000000..7c29470 --- /dev/null +++ b/WEB/routes/api.php @@ -0,0 +1,28 @@ +group(function () { + Route::get('/profile', function (Request $request) { + return $request->user(); + }); + + Route::post('/update-profile', [AuthController::class, 'updateProfile']); + + Route::get('/stress-events', [StressDiagnosticController::class, 'index']); + + // Route pour enregistrer un diagnostic effectué sur mobile + Route::post('/stress-diagnostics', [StressDiagnosticController::class, 'store']); + + Route::get('/emotions', [App\Http\Controllers\Api\EmotionController::class, 'index']); + Route::post('/emotions', [App\Http\Controllers\Api\EmotionController::class, 'store']); +}); diff --git a/WEB/routes/console.php b/WEB/routes/console.php new file mode 100644 index 0000000..3c9adf1 --- /dev/null +++ b/WEB/routes/console.php @@ -0,0 +1,8 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/WEB/routes/web.php b/WEB/routes/web.php new file mode 100644 index 0000000..e813120 --- /dev/null +++ b/WEB/routes/web.php @@ -0,0 +1,41 @@ +name('home'); +Route::get('/diagnostics', [DiagnosticController::class, 'index'])->name('diagnostics.index'); +Route::get('/relaxation', [RelaxationController::class, 'index'])->name('relaxation.index'); + +// Authentification +Route::get('/login', [AuthController::class, 'showLogin'])->name('login'); +Route::post('/login', [AuthController::class, 'login']); +Route::get('/register', [AuthController::class, 'showRegister'])->name('register'); +Route::post('/register', [AuthController::class, 'register']); +Route::post('/logout', [AuthController::class, 'logout'])->name('logout'); + +// Protected Routes +Route::middleware('auth')->group(function () { + // Profile + Route::get('/profile', [ProfileController::class, 'index'])->name('profile.index'); + Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); + Route::put('/profile/password', [ProfileController::class, 'updatePassword'])->name('profile.password'); + Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); + + // Tracker Émotionnel (Personal data) + Route::get('/emotions', [EmotionController::class, 'index'])->name('emotions.index'); + Route::post('/emotions', [EmotionController::class, 'store'])->name('emotions.store'); + + // Diagnostic Saving (if applicable) + Route::post('/diagnostics', [DiagnosticController::class, 'store'])->name('diagnostics.store'); + + // Relaxation Actions + Route::post('/relaxation/{id}/favorite', [RelaxationController::class, 'toggleFavorite'])->name('relaxation.favorite'); +}); diff --git a/WEB/storage/app/.gitignore b/WEB/storage/app/.gitignore new file mode 100644 index 0000000..fedb287 --- /dev/null +++ b/WEB/storage/app/.gitignore @@ -0,0 +1,4 @@ +* +!private/ +!public/ +!.gitignore diff --git a/WEB/storage/app/private/.gitignore b/WEB/storage/app/private/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/WEB/storage/app/private/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/WEB/storage/app/public/.gitignore b/WEB/storage/app/public/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/WEB/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/WEB/storage/framework/.gitignore b/WEB/storage/framework/.gitignore new file mode 100644 index 0000000..05c4471 --- /dev/null +++ b/WEB/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/WEB/storage/framework/cache/.gitignore b/WEB/storage/framework/cache/.gitignore new file mode 100644 index 0000000..01e4a6c --- /dev/null +++ b/WEB/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/WEB/storage/framework/cache/data/.gitignore b/WEB/storage/framework/cache/data/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/WEB/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/WEB/storage/framework/sessions/.gitignore b/WEB/storage/framework/sessions/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/WEB/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/WEB/storage/framework/testing/.gitignore b/WEB/storage/framework/testing/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/WEB/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/WEB/storage/framework/views/.gitignore b/WEB/storage/framework/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/WEB/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/WEB/storage/logs/.gitignore b/WEB/storage/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/WEB/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/WEB/tests/Feature/ExampleTest.php b/WEB/tests/Feature/ExampleTest.php new file mode 100644 index 0000000..8364a84 --- /dev/null +++ b/WEB/tests/Feature/ExampleTest.php @@ -0,0 +1,19 @@ +get('/'); + + $response->assertStatus(200); + } +} diff --git a/WEB/tests/TestCase.php b/WEB/tests/TestCase.php new file mode 100644 index 0000000..fe1ffc2 --- /dev/null +++ b/WEB/tests/TestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } +} diff --git a/WEB/vite.config.js b/WEB/vite.config.js new file mode 100644 index 0000000..f35b4e7 --- /dev/null +++ b/WEB/vite.config.js @@ -0,0 +1,18 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; +import tailwindcss from '@tailwindcss/vite'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + tailwindcss(), + ], + server: { + watch: { + ignored: ['**/storage/framework/views/**'], + }, + }, +}); diff --git a/Wear/.gitignore b/Wear/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/Wear/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/Wear/.idea/.gitignore b/Wear/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/Wear/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Wear/.idea/.name b/Wear/.idea/.name new file mode 100644 index 0000000..b3405b3 --- /dev/null +++ b/Wear/.idea/.name @@ -0,0 +1 @@ +My Application \ No newline at end of file diff --git a/Wear/.idea/AndroidProjectSystem.xml b/Wear/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/Wear/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Wear/.idea/compiler.xml b/Wear/.idea/compiler.xml new file mode 100644 index 0000000..b86273d --- /dev/null +++ b/Wear/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Wear/.idea/deploymentTargetSelector.xml b/Wear/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b257aa1 --- /dev/null +++ b/Wear/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/Wear/.idea/gradle.xml b/Wear/.idea/gradle.xml new file mode 100644 index 0000000..02c4aa5 --- /dev/null +++ b/Wear/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/Wear/.idea/misc.xml b/Wear/.idea/misc.xml new file mode 100644 index 0000000..74dd639 --- /dev/null +++ b/Wear/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/Wear/.idea/runConfigurations.xml b/Wear/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/Wear/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/Wear/.idea/vcs.xml b/Wear/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/Wear/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Wear/app/.gitignore b/Wear/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/Wear/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Wear/app/build.gradle.kts b/Wear/app/build.gradle.kts new file mode 100644 index 0000000..4612356 --- /dev/null +++ b/Wear/app/build.gradle.kts @@ -0,0 +1,58 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.compose) +} + +android { + namespace = "com.cesizen.app" + compileSdk { + version = release(36) { + minorApiLevel = 1 + } + } + + defaultConfig { + applicationId = "com.cesizen.app" + minSdk = 30 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + useLibrary("wear-sdk") + buildFeatures { + compose = true + } +} + +dependencies { + implementation(libs.play.services.wearable) + implementation(platform(libs.compose.bom)) + implementation(libs.ui) + implementation(libs.ui.graphics) + implementation(libs.ui.tooling.preview) + implementation(libs.compose.material3) + implementation(libs.compose.foundation) + implementation(libs.compose.ui.tooling) + implementation(libs.wear.tooling.preview) + implementation(libs.activity.compose) + implementation(libs.core.splashscreen) + androidTestImplementation(platform(libs.compose.bom)) + androidTestImplementation(libs.ui.test.junit4) + debugImplementation(libs.ui.tooling) + debugImplementation(libs.ui.test.manifest) +} \ No newline at end of file diff --git a/Wear/app/lint.xml b/Wear/app/lint.xml new file mode 100644 index 0000000..44fac75 --- /dev/null +++ b/Wear/app/lint.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Wear/app/proguard-rules.pro b/Wear/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/Wear/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/Wear/app/src/main/AndroidManifest.xml b/Wear/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..60ad0d2 --- /dev/null +++ b/Wear/app/src/main/AndroidManifest.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wear/app/src/main/java/com/cesizen/app/MainActivity.kt b/Wear/app/src/main/java/com/cesizen/app/MainActivity.kt new file mode 100644 index 0000000..e21caae --- /dev/null +++ b/Wear/app/src/main/java/com/cesizen/app/MainActivity.kt @@ -0,0 +1,261 @@ +package com.cesizen.app + +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn +import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState +import androidx.wear.compose.material3.* +import com.cesizen.app.presentation.theme.MyApplicationTheme +import com.google.android.gms.tasks.Tasks +import com.google.android.gms.wearable.* +import org.json.JSONObject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class MainActivity : ComponentActivity(), DataClient.OnDataChangedListener { + + private var userName by mutableStateOf(null) + private var currentMood by mutableStateOf(null) + private var isRefreshing by mutableStateOf(false) + private val TAG = "CESIZen_Watch" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Wearable.getDataClient(this).addListener(this) + refreshData() + + setContent { + WearApp( + userName = userName, + currentMood = currentMood, + isRefreshing = isRefreshing, + onRefresh = { refreshData() }, + onMoodSelected = { mood -> sendMoodToPhone(mood) } + ) + } + } + + private fun refreshData() { + if (isRefreshing) return + isRefreshing = true + + val today = java.text.SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault()).format(java.util.Date()) + + Wearable.getDataClient(this).dataItems.addOnSuccessListener { items -> + for (item in items) { + if (item.uri.path == "/auth_status") { + val dataMap = DataMapItem.fromDataItem(item).dataMap + userName = if (dataMap.getString("status") == "authenticated") dataMap.getString("userName") else null + } else if (item.uri.path == "/daily_mood") { + val dataMap = DataMapItem.fromDataItem(item).dataMap + val moodDate = dataMap.getString("date") + + if (moodDate == today) { + currentMood = dataMap.getString("mood") + } else { + currentMood = null + } + } + } + isRefreshing = false + } + + CoroutineScope(Dispatchers.IO).launch { + try { + val nodes = Tasks.await(Wearable.getNodeClient(this@MainActivity).connectedNodes) + for (node in nodes) { + val payload = JSONObject().apply { put("command", "get_sync_data") }.toString().toByteArray() + Wearable.getMessageClient(this@MainActivity).sendMessage(node.id, "/wearable_communication", payload) + } + } catch (e: Exception) { + Log.e(TAG, "Error sync nodes", e) + } + } + } + + private fun sendMoodToPhone(mood: String) { + currentMood = mood + if (mood.isEmpty()) { + // Reset mood locally to show the selection again + currentMood = null + } + + CoroutineScope(Dispatchers.IO).launch { + try { + val nodes = Tasks.await(Wearable.getNodeClient(this@MainActivity).connectedNodes) + for (node in nodes) { + val payload = JSONObject().apply { + put("command", "save_mood") + put("mood", mood) + }.toString().toByteArray() + Wearable.getMessageClient(this@MainActivity).sendMessage(node.id, "/wearable_communication", payload) + } + } catch (e: Exception) { + Log.e(TAG, "Error sending mood", e) + } + } + } + + override fun onDataChanged(dataEvents: DataEventBuffer) { + val today = java.text.SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault()).format(java.util.Date()) + + for (event in dataEvents) { + val dataMap = DataMapItem.fromDataItem(event.dataItem).dataMap + if (event.dataItem.uri.path == "/auth_status") { + userName = if (dataMap.getString("status") == "authenticated") dataMap.getString("userName") else null + } else if (event.dataItem.uri.path == "/daily_mood") { + val moodDate = dataMap.getString("date") + if (moodDate == today) { + currentMood = dataMap.getString("mood") + } else { + currentMood = null + } + } + } + } +} + +@Composable +fun WearApp(userName: String?, currentMood: String?, isRefreshing: Boolean, onRefresh: () -> Unit, onMoodSelected: (String) -> Unit) { + val cesiBlue = Color(0xFF000091) + + MyApplicationTheme { + AppScaffold { + val listState = rememberTransformingLazyColumnState() + ScreenScaffold(scrollState = listState) { contentPadding -> + TransformingLazyColumn( + modifier = Modifier + .fillMaxSize() + .background(Brush.verticalGradient(listOf(Color.Black, Color(0xFF000022)))), + contentPadding = contentPadding, + state = listState, + horizontalAlignment = Alignment.CenterHorizontally + ) { + // Header + item { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(bottom = 12.dp) + ) { + Text( + "CESIZen", + color = cesiBlue, + style = MaterialTheme.typography.labelMedium, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(4.dp)) + } + } + + if (userName == null) { + item { + TitleCard( + onClick = onRefresh, + title = { Text("Connexion requise", textAlign = TextAlign.Center) }, + subtitle = { Text("Ouvrez l'app sur votre téléphone", textAlign = TextAlign.Center, fontSize = 12.sp) }, + modifier = Modifier.padding(horizontal = 8.dp) + ) + } + } else { + // User Status + item { + val displayName = userName.split(" ").firstOrNull() ?: "Zen" + Text( + "Bonjour $displayName", + style = MaterialTheme.typography.titleMedium, + textAlign = TextAlign.Center + ) + } + + if (currentMood.isNullOrEmpty()) { + item { + Text( + "Comment allez-vous ?", + style = MaterialTheme.typography.bodySmall, + color = Color.LightGray, + modifier = Modifier.padding(vertical = 8.dp) + ) + } + + val moods = listOf( + MoodItem("Très bien", "😊", Color(0xFF4CAF50)), + MoodItem("Bien", "🙂", Color(0xFF8BC34A)), + MoodItem("Neutre", "😐", Color(0xFFFFC107)), + MoodItem("Pas top", "🙁", Color(0xFFFF9800)), + MoodItem("Stressé", "😫", Color(0xFFF44336)) + ) + + moods.forEach { mood -> + item { + FilledTonalButton( + onClick = { onMoodSelected(mood.label) }, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 2.dp, horizontal = 16.dp), + colors = ButtonDefaults.filledTonalButtonColors( + containerColor = mood.color.copy(alpha = 0.2f), + contentColor = Color.White + ) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Text(mood.emoji, fontSize = 20.sp) + Spacer(modifier = Modifier.width(12.dp)) + Text(mood.label, style = MaterialTheme.typography.labelLarge) + } + } + } + } + } else { + item { + Card( + onClick = { onMoodSelected("") }, + modifier = Modifier.padding(16.dp), + colors = CardDefaults.cardColors(containerColor = cesiBlue.copy(alpha = 0.3f)) + ) { + Column( + modifier = Modifier.fillMaxWidth().padding(8.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text("Humeur enregistrée", style = MaterialTheme.typography.labelSmall) + Spacer(modifier = Modifier.height(8.dp)) + Text(currentMood, style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Bold) + Spacer(modifier = Modifier.height(8.dp)) + Text("Tapoter pour changer", fontSize = 10.sp, color = Color.LightGray) + } + } + } + } + } + + // Bottom Spacer + item { + Spacer(modifier = Modifier.height(20.dp)) + } + } + } + } + } +} + +data class MoodItem(val label: String, val emoji: String, val color: Color) diff --git a/Wear/app/src/main/java/com/cesizen/app/presentation/theme/Theme.kt b/Wear/app/src/main/java/com/cesizen/app/presentation/theme/Theme.kt new file mode 100644 index 0000000..e178509 --- /dev/null +++ b/Wear/app/src/main/java/com/cesizen/app/presentation/theme/Theme.kt @@ -0,0 +1,13 @@ +package com.cesizen.app.presentation.theme + +import androidx.compose.runtime.Composable +import androidx.wear.compose.material3.MaterialTheme + +@Composable +fun MyApplicationTheme( + content: @Composable () -> Unit +) { + MaterialTheme( + content = content + ) +} diff --git a/Wear/app/src/main/res/drawable/ic_launcher_background.xml b/Wear/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/Wear/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wear/app/src/main/res/drawable/ic_launcher_foreground.xml b/Wear/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/Wear/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Wear/app/src/main/res/drawable/splash_icon.xml b/Wear/app/src/main/res/drawable/splash_icon.xml new file mode 100644 index 0000000..7874e83 --- /dev/null +++ b/Wear/app/src/main/res/drawable/splash_icon.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + diff --git a/Wear/app/src/main/res/mipmap-anydpi/ic_launcher.xml b/Wear/app/src/main/res/mipmap-anydpi/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/Wear/app/src/main/res/mipmap-anydpi/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Wear/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/Wear/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/Wear/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Wear/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/Wear/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/Wear/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/Wear/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/Wear/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/Wear/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/Wear/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/Wear/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/Wear/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/Wear/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/Wear/app/src/main/res/values/strings.xml b/Wear/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..a078ab8 --- /dev/null +++ b/Wear/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + CESIZen + Hello, %1$s! + \ No newline at end of file diff --git a/Wear/app/src/main/res/values/styles.xml b/Wear/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..dbf9c83 --- /dev/null +++ b/Wear/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/Wear/app/src/main/res/xml/wearable_app_values.xml b/Wear/app/src/main/res/xml/wearable_app_values.xml new file mode 100644 index 0000000..73fe710 --- /dev/null +++ b/Wear/app/src/main/res/xml/wearable_app_values.xml @@ -0,0 +1,4 @@ + + + + diff --git a/Wear/build.gradle.kts b/Wear/build.gradle.kts new file mode 100644 index 0000000..18318be --- /dev/null +++ b/Wear/build.gradle.kts @@ -0,0 +1,5 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.compose) apply false +} \ No newline at end of file diff --git a/Wear/gradle.properties b/Wear/gradle.properties new file mode 100644 index 0000000..34c5e9e --- /dev/null +++ b/Wear/gradle.properties @@ -0,0 +1,15 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. For more details, visit +# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects +# org.gradle.parallel=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/Wear/gradle/gradle-daemon-jvm.properties b/Wear/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000..6c1139e --- /dev/null +++ b/Wear/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,12 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/73bcfb608d1fde9fb62e462f834a3299/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/846ee0d876d26a26f37aa1ce8de73224/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/ec7520a1e057cd116f9544c42142a16b/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/4c4f879899012ff0a8b2e2117df03b0e/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/9482ddec596298c84656d31d16652665/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/39701d92e1756bb2f141eb67cd4c660e/redirect +toolchainVersion=21 diff --git a/Wear/gradle/libs.versions.toml b/Wear/gradle/libs.versions.toml new file mode 100644 index 0000000..c7ac71a --- /dev/null +++ b/Wear/gradle/libs.versions.toml @@ -0,0 +1,32 @@ +[versions] +agp = "9.1.1" +playServicesWearable = "18.0.0" +kotlin = "2.2.10" +composeBom = "2024.09.00" +composeMaterial3 = "1.5.6" +composeFoundation = "1.5.6" +composeUiTooling = "1.5.6" +wearToolingPreview = "1.0.0" +activityCompose = "1.13.0" +coreSplashscreen = "1.2.0" + +[libraries] +play-services-wearable = { group = "com.google.android.gms", name = "play-services-wearable", version.ref = "playServicesWearable" } +compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +ui = { group = "androidx.compose.ui", name = "ui" } +ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +compose-material3 = { group = "androidx.wear.compose", name = "compose-material3", version.ref = "composeMaterial3" } +compose-foundation = { group = "androidx.wear.compose", name = "compose-foundation", version.ref = "composeFoundation" } +compose-ui-tooling = { group = "androidx.wear.compose", name = "compose-ui-tooling", version.ref = "composeUiTooling" } +wear-tooling-preview = { group = "androidx.wear", name = "wear-tooling-preview", version.ref = "wearToolingPreview" } +activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } +core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "coreSplashscreen" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } + diff --git a/Wear/gradle/wrapper/gradle-wrapper.jar b/Wear/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..8bdaf60c75ab801e22807dde59e12a8735a34077 GIT binary patch literal 45457 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 c82=K%QXLKFx%@O{wJjEi6Y56o#$)Bpeg literal 0 HcmV?d00001 diff --git a/Wear/gradle/wrapper/gradle-wrapper.properties b/Wear/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e1474f4 --- /dev/null +++ b/Wear/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,9 @@ +#Tue Apr 21 22:42:57 CEST 2026 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionSha256Sum=b266d5ff6b90eada6dc3b20cb090e3731302e553a27c5d3e4df1f0d76beaff06 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/Wear/gradlew b/Wear/gradlew new file mode 100644 index 0000000..ef07e01 --- /dev/null +++ b/Wear/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/Wear/gradlew.bat b/Wear/gradlew.bat new file mode 100644 index 0000000..db3a6ac --- /dev/null +++ b/Wear/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/Wear/settings.gradle.kts b/Wear/settings.gradle.kts new file mode 100644 index 0000000..333a77d --- /dev/null +++ b/Wear/settings.gradle.kts @@ -0,0 +1,27 @@ +pluginManagement { + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + mavenCentral() + gradlePluginPortal() + } +} +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "My Application" +include(":app") + \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..f7cfc63 --- /dev/null +++ b/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "blade-ui-kit/blade-heroicons": "^2.7", + "guzzlehttp/guzzle": "^7.10" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..a65bcfb --- /dev/null +++ b/composer.lock @@ -0,0 +1,3109 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1e774f56575c4a96a81d9c9533858b97", + "packages": [ + { + "name": "blade-ui-kit/blade-heroicons", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/driesvints/blade-heroicons.git", + "reference": "66fa8ba09dba12e0cdb410b8cb94f3b890eca440" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/driesvints/blade-heroicons/zipball/66fa8ba09dba12e0cdb410b8cb94f3b890eca440", + "reference": "66fa8ba09dba12e0cdb410b8cb94f3b890eca440", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.6", + "illuminate/support": "^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", + "phpunit/phpunit": "^9.0|^10.5|^11.0|^12.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Heroicons\\BladeHeroiconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Heroicons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of Heroicons in your Laravel Blade views.", + "homepage": "https://github.com/driesvints/blade-heroicons", + "keywords": [ + "Heroicons", + "blade", + "laravel" + ], + "support": { + "issues": "https://github.com/driesvints/blade-heroicons/issues", + "source": "https://github.com/driesvints/blade-heroicons/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/driesvints", + "type": "github" + }, + { + "url": "https://www.paypal.com/paypalme/driesvints", + "type": "paypal" + } + ], + "time": "2026-03-16T13:00:23+00:00" + }, + { + "name": "blade-ui-kit/blade-icons", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/driesvints/blade-icons.git", + "reference": "377eede719f9690b03bbbfd516afef887e27634a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/377eede719f9690b03bbbfd516afef887e27634a", + "reference": "377eede719f9690b03bbbfd516afef887e27634a", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/filesystem": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/view": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3|^6.0|^7.0|^8.0", + "symfony/finder": "^5.3|^6.0|^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.5.1", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "phpunit/phpunit": "^9.0|^10.5|^11.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "BladeUI\\Icons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/driesvints/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/driesvints/blade-icons/issues", + "source": "https://github.com/driesvints/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/sponsors/driesvints", + "type": "github" + }, + { + "url": "https://www.paypal.com/paypalme/driesvints", + "type": "paypal" + } + ], + "time": "2026-04-07T17:56:48+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.9.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2026-03-10T16:41:02+00:00" + }, + { + "name": "illuminate/bus", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "9e70f409c744e0ba6b301fa608bb5b3c8c38669a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/9e70f409c744e0ba6b301fa608bb5b3c8c38669a", + "reference": "9e70f409c744e0ba6b301fa608bb5b3c8c38669a", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/pipeline": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^12.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-09T13:55:34+00:00" + }, + { + "name": "illuminate/collections", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "83313b009c4afb6f02dbc090bdb67809756eefa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/83313b009c4afb6f02dbc090bdb67809756eefa2", + "reference": "83313b009c4afb6f02dbc090bdb67809756eefa2", + "shasum": "" + }, + "require": { + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "php": "^8.2", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33" + }, + "suggest": { + "illuminate/http": "Required to convert collections to API resources (^12.0).", + "symfony/var-dumper": "Required to use the dump method (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-11T14:13:25+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/ec677967c1f2faf90b8428919124d2184a4c9b49", + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-05-13T15:08:45+00:00" + }, + { + "name": "illuminate/container", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "9abe9dba6b3f5220205ce143069c975a601e4294" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/9abe9dba6b3f5220205ce143069c975a601e4294", + "reference": "9abe9dba6b3f5220205ce143069c975a601e4294", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^12.0", + "illuminate/reflection": "^12.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "suggest": { + "illuminate/auth": "Required to use the Auth attribute", + "illuminate/cache": "Required to use the Cache attribute", + "illuminate/config": "Required to use the Config attribute", + "illuminate/database": "Required to use the DB attribute", + "illuminate/filesystem": "Required to use the Storage attribute", + "illuminate/log": "Required to use the Log or Context attributes" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-16T14:05:01+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "099fd9b56ccaf776facaa27699b960a3f2451127" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/099fd9b56ccaf776facaa27699b960a3f2451127", + "reference": "099fd9b56ccaf776facaa27699b960a3f2451127", + "shasum": "" + }, + "require": { + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-02-20T14:37:40+00:00" + }, + { + "name": "illuminate/events", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "ff22aa6017bdbd90ace660f50638ed9c580ba555" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/ff22aa6017bdbd90ace660f50638ed9c580ba555", + "reference": "ff22aa6017bdbd90ace660f50638ed9c580ba555", + "shasum": "" + }, + "require": { + "illuminate/bus": "^12.0", + "illuminate/collections": "^12.0", + "illuminate/container": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Events\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-05T16:20:14+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "b91eede30e1bde98cb51fb4c4f28269a8dea593e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/b91eede30e1bde98cb51fb4c4f28269a8dea593e", + "reference": "b91eede30e1bde98cb51fb4c4f28269a8dea593e", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2", + "symfony/finder": "^7.2.0" + }, + "suggest": { + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-hash": "Required to use the Filesystem class.", + "illuminate/http": "Required for handling uploaded files (^12.0).", + "league/flysystem": "Required to use the Flysystem local driver (^3.25.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/mime": "Required to enable support for guessing extensions (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-09T14:26:54+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e862e5648ee34004fa56046b746f490dfa86c613" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e862e5648ee34004fa56046b746f490dfa86c613", + "reference": "e862e5648ee34004fa56046b746f490dfa86c613", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-07-23T16:31:01+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "b6a14c20d69a44bf0a6fba664a00d23ca71770ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/b6a14c20d69a44bf0a6fba664a00d23ca71770ee", + "reference": "b6a14c20d69a44bf0a6fba664a00d23ca71770ee", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "suggest": { + "illuminate/database": "Required to use database transactions (^12.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-08-20T13:36:50+00:00" + }, + { + "name": "illuminate/reflection", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/reflection.git", + "reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/reflection/zipball/348cf5da9de89b596d7723be6425fb048e2bf4bb", + "reference": "348cf5da9de89b596d7723be6425fb048e2bf4bb", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Reflection package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-02-25T15:25:18+00:00" + }, + { + "name": "illuminate/support", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "cd8a3c5a95501b9ae0828ac785b5af5ffccdca45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/cd8a3c5a95501b9ae0828ac785b5af5ffccdca45", + "reference": "cd8a3c5a95501b9ae0828ac785b5af5ffccdca45", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^12.0", + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/reflection": "^12.0", + "nesbot/carbon": "^3.8.4", + "php": "^8.2", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php85": "^1.33", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "replace": { + "spatie/once": "*" + }, + "suggest": { + "illuminate/filesystem": "Required to use the Composer class (^12.0).", + "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", + "league/uri": "Required to use the Uri class (^7.5.1).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the Composer class (^7.2).", + "symfony/uid": "Required to use Str::ulid() (^7.2).", + "symfony/var-dumper": "Required to use the dd function (^7.2).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-17T13:55:49+00:00" + }, + { + "name": "illuminate/view", + "version": "v12.56.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/view.git", + "reference": "03ed552cf1d9a3e424750c760244b46e0cefda4a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/view/zipball/03ed552cf1d9a3e424750c760244b46e0cefda4a", + "reference": "03ed552cf1d9a3e424750c760244b46e0cefda4a", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "illuminate/collections": "^12.0", + "illuminate/container": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/events": "^12.0", + "illuminate/filesystem": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate View package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-17T13:09:53+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.11.4", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbonphp.github.io/carbon/", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2026-04-07T09:57:54+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T13:54:39+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e0be088d22278583a82da281886e8c3592fbf149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", + "reference": "e0be088d22278583a82da281886e8c3592fbf149", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/ad1b7b9092976d6c948b8a187cec9faaea9ec1df", + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T17:25:58+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T17:25:58+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T18:47:49+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "2c408a6bb0313e6001a83628dc5506100474254e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/2c408a6bb0313e6001a83628dc5506100474254e", + "reference": "2c408a6bb0313e6001a83628dc5506100474254e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:50:15+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "114ac57257d75df748eda23dd003878080b8e688" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/114ac57257d75df748eda23dd003878080b8e688", + "reference": "114ac57257d75df748eda23dd003878080b8e688", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "33600f8489485425bfcddd0d983391038d3422e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/33600f8489485425bfcddd0d983391038d3422e7", + "reference": "33600f8489485425bfcddd0d983391038d3422e7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-24T13:12:05+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "d870a33f0f79d2b4579740b0620200221ee44aeb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/d870a33f0f79d2b4579740b0620200221ee44aeb", + "reference": "d870a33f0f79d2b4579740b0620200221ee44aeb", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2026-04-16T23:10:39+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/mobile/.gitignore b/mobile/.gitignore new file mode 100644 index 0000000..3820a95 --- /dev/null +++ b/mobile/.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-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# 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/mobile/.metadata b/mobile/.metadata new file mode 100644 index 0000000..51c0bb5 --- /dev/null +++ b/mobile/.metadata @@ -0,0 +1,45 @@ +# 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: "db50e20168db8fee486b9abf32fc912de3bc5b6a" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + base_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + - platform: android + create_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + base_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + - platform: ios + create_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + base_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + - platform: linux + create_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + base_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + - platform: macos + create_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + base_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + - platform: web + create_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + base_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + - platform: windows + create_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + base_revision: db50e20168db8fee486b9abf32fc912de3bc5b6a + + # 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/mobile/README.md b/mobile/README.md new file mode 100644 index 0000000..f89dc56 --- /dev/null +++ b/mobile/README.md @@ -0,0 +1,84 @@ +# CESIZen - Application Mobile (Flutter) + +CESIZen est une application de gestion de la santé mentale développée avec Flutter. Elle permet aux utilisateurs de suivre leur état émotionnel, de réaliser des diagnostics de stress et de pratiquer des exercices de relaxation. + +## 🚀 Fonctionnalités + +- **Authentification Sécurisée** : Connexion et inscription via une API Laravel (JWT). +- **Espace Santé Personnel** : Modification du profil (Nom, Email, Mot de passe). +- **Diagnostic de Stress** : Basé sur l'échelle de **Holmes et Rahe** (données dynamiques via API). +- **Tracker d'Émotions** : Journal de bord complet (CRUD) pour suivre son humeur. +- **Cohérence Cardiaque** : Exercice de respiration guidé (5s inspiration / 5s expiration). +- **Catalogue Détente** : Activités de relaxation (Méditation, Musique) filtrables par catégorie. + +--- + +## 🛠️ Installation et Lancement + +### 1. Prérequis +- [Flutter SDK](https://docs.flutter.dev/get-started/install) (dernière version stable recommandée). +- [Android Studio](https://developer.android.com/studio) ou [VS Code](https://code.visualstudio.com/). +- Un émulateur Android ou un appareil physique avec le débogage USB activé. + +### 2. Récupération du projet +```bash +git clone +cd CESIZen/mobile +``` + +### 3. Installation des dépendances +```bash +flutter pub get +``` + +--- + +## 🌐 Configuration de l'API + +L'application communique avec un backend Laravel. + +### URL de l'API +La configuration se trouve dans `lib/core/network/dio_client.dart`. +- **URL actuelle** : `https://apicesizen.sam-coffre.duckdns.org/api` + +### Compatibilité et Sécurité (SSL Bypass) +Pour faciliter le développement sur des serveurs avec des certificats auto-signés ou en cours de configuration, le client `Dio` est configuré pour **ignorer les erreurs de certificat SSL**. + +Dans `lib/core/network/dio_client.dart` : +```dart +// Le code inclut un SecurityContext qui accepte tous les certificats +(dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () { + final client = HttpClient(); + client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; + return client; +}; +``` + +**Note importante :** Sur Android, assurez-vous que `android:usesCleartextTraffic="true"` est bien présent dans le `AndroidManifest.xml` si vous repassez en HTTP simple. + +--- + +## 🏃 Lancer l'application + +Pour lancer l'application en mode debug : + +```bash +flutter run +``` + +Pour générer un APK de test : +```bash +flutter build apk --debug +``` + +## 📂 Structure du Projet + +- `lib/core/` : Configuration réseau (Dio) et thèmes. +- `lib/features/auth/` : Gestion de l'authentification et du profil. +- `lib/features/diagnostics/` : Logique du questionnaire Holmes & Rahe. +- `lib/features/tracker/` : Journal des émotions (CRUD). +- `lib/features/exercises/` : Exercice de cohérence cardiaque. +- `lib/features/relaxation/` : Catalogue d'activités de détente. + +--- +© 2024 CESIZen - Projet CDA diff --git a/mobile/analysis_options.yaml b/mobile/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/mobile/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/mobile/android/.gitignore b/mobile/android/.gitignore new file mode 100644 index 0000000..be3943c --- /dev/null +++ b/mobile/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/mobile/android/app/build.gradle.kts b/mobile/android/app/build.gradle.kts new file mode 100644 index 0000000..9e1521d --- /dev/null +++ b/mobile/android/app/build.gradle.kts @@ -0,0 +1,47 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.cesizen.app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + + defaultConfig { + applicationId = "com.cesizen.app" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +dependencies { + implementation("com.google.android.gms:play-services-wearable:18.0.0") +} + +flutter { + source = "../.." +} diff --git a/mobile/android/app/src/debug/AndroidManifest.xml b/mobile/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/mobile/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..031d178 --- /dev/null +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/android/app/src/main/kotlin/com/cesizen/app/MainActivity.kt b/mobile/android/app/src/main/kotlin/com/cesizen/app/MainActivity.kt new file mode 100644 index 0000000..ff6b776 --- /dev/null +++ b/mobile/android/app/src/main/kotlin/com/cesizen/app/MainActivity.kt @@ -0,0 +1,108 @@ +package com.cesizen.app + +import android.util.Log +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import com.google.android.gms.wearable.Wearable +import com.google.android.gms.wearable.PutDataMapRequest +import com.google.android.gms.wearable.CapabilityClient +import com.google.android.gms.tasks.Tasks +import org.json.JSONObject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +class MainActivity : FlutterActivity() { + private val CHANNEL = "com.cesizen/wearable" + private val TAG = "CESIZen_Mobile_Native" + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> + when (call.method) { + "sendAuthStatus" -> { + val status = call.argument("status") + val userName = call.argument("userName") + updateWearDataLayer(status, userName) + result.success(true) + } + "syncMood" -> { + val mood = call.argument("mood") + updateMoodDataLayer(mood) + result.success(true) + } + "isWatchNearby" -> { + CoroutineScope(Dispatchers.IO).launch { + try { + val capabilityInfo = Tasks.await( + Wearable.getCapabilityClient(this@MainActivity) + .getCapability("cesizen_wear_app", CapabilityClient.FILTER_ALL) + ) + val isNearby = capabilityInfo.nodes.isNotEmpty() + runOnUiThread { result.success(isNearby) } + } catch (e: Exception) { + runOnUiThread { result.success(false) } + } + } + } + else -> { + result.notImplemented() + } + } + } + + // Écouter les messages de la montre + Wearable.getMessageClient(this).addListener { messageEvent -> + Log.d(TAG, "Message received from watch: ${messageEvent.path}") + if (messageEvent.path == "/wearable_communication") { + try { + val dataString = String(messageEvent.data) + Log.d(TAG, "Payload: $dataString") + val json = JSONObject(dataString) + val command = json.optString("command") + + runOnUiThread { + val messenger = flutterEngine.dartExecutor.binaryMessenger + when (command) { + "get_sync_data" -> { + Log.d(TAG, "Command: get_sync_data -> calling requestStatusUpdate") + MethodChannel(messenger, CHANNEL).invokeMethod("requestStatusUpdate", null) + } + "save_mood" -> { + val mood = json.optString("mood") + Log.d(TAG, "Command: save_mood ($mood) -> calling saveMoodFromWear") + MethodChannel(messenger, CHANNEL).invokeMethod("saveMoodFromWear", mapOf("mood" to mood)) + updateMoodDataLayer(mood) + } + } + } + } catch (e: Exception) { + Log.e(TAG, "Error processing message", e) + } + } + } + } + + private fun updateWearDataLayer(status: String?, userName: String?) { + val request = PutDataMapRequest.create("/auth_status") + request.dataMap.putString("status", status ?: "unauthenticated") + request.dataMap.putString("userName", userName ?: "") + request.dataMap.putLong("timestamp", System.currentTimeMillis()) + val putDataRequest = request.asPutDataRequest().setUrgent() + Wearable.getDataClient(this).putDataItem(putDataRequest) + } + + private fun updateMoodDataLayer(mood: String?) { + val request = PutDataMapRequest.create("/daily_mood") + val today = java.text.SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault()).format(java.util.Date()) + + request.dataMap.putString("mood", mood ?: "") + request.dataMap.putString("date", today) + request.dataMap.putLong("timestamp", System.currentTimeMillis()) + + val putDataRequest = request.asPutDataRequest().setUrgent() + Wearable.getDataClient(this).putDataItem(putDataRequest) + } +} diff --git a/mobile/android/app/src/main/res/drawable-v21/launch_background.xml b/mobile/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/mobile/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mobile/android/app/src/main/res/drawable/launch_background.xml b/mobile/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/mobile/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..67288c11f32c7c8e02b012b442f9af0e660f82d3 GIT binary patch literal 6852 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 literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..67288c11f32c7c8e02b012b442f9af0e660f82d3 GIT binary patch literal 6852 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 literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..67288c11f32c7c8e02b012b442f9af0e660f82d3 GIT binary patch literal 6852 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 literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..67288c11f32c7c8e02b012b442f9af0e660f82d3 GIT binary patch literal 6852 zcmV;#8aw5QP)pfc1c7*RCwC$op*d&)%Cy?N};8UU&|^j1)7G^A5bXJQr53wl$N$X zDEty9&hR8VAqx_+;E{w3vLGRYkU$8TP6AmaA+araFL}m$%6nUurz8)Z-#Pa^$%-Yt zCnt{er09?Pabjz{d%ySGd(OG%o}&N&g$K5g*ti;lPIam=9X6Jqg9SxLVOjBU_^Kub zGTW>0&k%ym$3y$C@Wf7W`5m<|J%2wunX(G*iCX|SN6mt3BPPT35mVug*tzg~H3z=g zJK=m&HUZ|mVBG-fwn`;Dob)~@RBwVJ+z(p-D3pQNf`o?u4)2 zHF?3xuXXqKa_6nMAz zn8)n7Zr_0lLvzS)la})PrVUiuTPMQfsViYr)^>OOTiPg zW%u4!O}##AO3xq^f4fWU4KXudM|A|`cGN(nLCY0%*200h1h^~iZG=0~2JWzkN$~Hi zZDv!*3)WSwT;CKjJaMs|?jGYDh5n?}km41etZOVk((CksD0&U*+)417?-c}BR zE$jvB0%;w2ydf175w`p4HBnPwK5ED!`z5!tDiSAzt)$aly-?%+d#&3(ct@|18cGXiUt8Ao}mgk33kf{k&Ua&4`)kdA_SBdZ1EW;#ma|;hk zN*qc&x4lwjM{0xNmiRf4+g<}+utROPnoNo)T|OuxC-aVmetT=YuGpD9a%8c-0d9z% z(a)I?%zn44D#{CXs9Tq*N3pLq4#C>)kt5Vgp}DI=mXM;f2hNUa+p% zV^^1cX9Jd&(3i75c6yJ+C0+Ga!9g2a_}Yjm;FG`83)U4{@!pzPgy3hR75_%P1lqa{ z8Yh=@&9kX%ZM5R+P%ECTIqU^H^mc5oLfM>)=FX&kcI=yQbNp zkAeH&tSvS+D7E29i=m~vQzfA|sa{IoVAt3DTlF$PjoIrfcF{gNa!*YRg7LGFI5K;d zmK+y7-8opBh{~63s0?Y=(+c-_Pj_6|%JfaD+vDch4R^UCZY~_HOST7yQ)=_zSMdw% zgwpW7=43vK!h0U;szwfm_cbRF&;+}2OcYa0W>I5T8!fAxuBTJAqbdSMBrLHT^hS<} z*K@afBPiq$@n5QMg!^z$wT*`0W1fBzH3ObaT?4OXehMSg*1@eYbL_`Q2})B^o5maS zB!^})nYe>>Nqlg)y$D459f34AN0E#Xf$(mLH%d`vhXP&P%F@$(h^gK1Qn9$=U}p0C zJ9{f>(jlHO9v*cQptVQOaiu5u*kL;ni1widvi?^V;$tF3tl!3);gykNb}3)b7bU@!0dwzu00){~qS z7uqVpKX*60n7$sy<$Mld+8mE@^k1!DxtQiccv$_ukOIh${rp|hQaDtX=<#qp7pkrh z9$>jC{H!7wgBjd=;}^o=I<-f`^-!oqOfu~ssK04}8{)xmJq~ItgSyNyR4cgm#lH(j zJQS`+L5)MG|DE)nG}L}@9R$63!O8(@d`qzi)Zl)5?Zt3^jc||Edlp=efSMo$Rp}2S z5*G7kvr5Nszo}30#yrXCQ2jwiP?bE?H*&T^T5B1*`oYIVc|Ke>hpK^xB%r>YvyHN{ zvAE*;u2$7sg$E_!e(M2n-4<$6D?xo<6zadTw?TzLdl8^|V=Fh4!S!_rm+}}NuTOPr zxNZrR5?MZ^7Ki#;_EsCH7sEZk!&Nzkd!ixDZQ;5dRJvF5u$mKv`l<-jfx!Ju!Xh~7 zrf}T~Y6>bqzjp+cX}#n-3My2IMjb#0@OaZE!?yML2?~Ng27F93%Ig|N(rGK6@!YB`j5=bP-Bp=PvINJ4!j^Aq!BszKZP2<~JFxc4L6?;0=28m>H{wiDFl zqRa1d5>$Dp}FP_5xk%HJy?xl7<|W2P+O z$_i?x6Hx!gpf(JN>A}PO3KZuZ!~HG6ZIT~c*+9)|uY$*tSBOG=IdjvHK{dB(g!^Wm z1l+_W@V(67x((F7W^NpEsMc_U32vx3+;dG?vVrSzsM+n+@VErjmo99CVtu_!JwFU? zF2Nn+5bgtsOD&~KO;<5kF2_xvTHqRVTu|qlaAAY&pjyKX7y#U>0xX&kAupt_ z7lrzK#(F4{DO78?{<&YEw(J-#MR*i!>kV2jexPR!ZuPUoH>Ys$_ztTKIF#8g;P zb{wvXrMRH84sMEl%WeW_YPZGAfe$n%-2pDQyE+=~h@I!)fIbL@MNI~ZdA=&Z8cjXi zS5&Bhz}ih%83Z>+&4T5cQ*wsOeSuJKjhXEr_9}?=?*kY1!6gGjd4{)DDurBzB5+G( z30HtRM+B-ryjOApI(v=WRp+4SLdoUfib!tsELc%`T264eFRNn&r~wWobs0hJF>+U{ z=Sk7k+rw>@fO`wVT`3Q^4C-wXP?r`TcR5s990C{-?v~1Mxx;08ffUpw#ot1Q44}&9 z*pBvG1~*(B?uVuSaRpof>ReH%i)92=RtN0_cXLIU1l+e^Rq1y_376Yj6DLTjW9@g5 z%%I9HG^P)(zeBkHg>Y974P5T)+BiW{9YcM$_#4?lm1QuSfz@<1!wqr_x9rT7gv;%# zjfdM~rJx=I%4+V7QXCN6P|?a91b5Aqfh$0rCvx#ifZA=4t#?eeE<1wzam9I2xIaa> zYs=0KCR}bmLS=43yNVKjn~&-U$Qi2auXqsLO+yElRi~7OdW7oJ%Knf-_9rNMf?Ix0 z0`6@1=i^8>qI-_8}$3gWt zu+-WS?y9oyEah0lpiW1q&0QTH2h}6NGRZ}SibX%totpk|El~F%)J~6t>ak$WamzcZ zB6zr@F_ZGdYPS2q^n8@m?hcQI>d|1$am%}^qhN%33H&5>CJa|EW?`(_?skuc>hWNO ztD7vzrc##&>h@Au2A;VK*t@Yk1$=J9dDu3h7^;O-TkFF<(SJtmV$Rc~z5BPH_O zD2$7bFiv;N73>q(CS%*#*wvj`PbQv=89%G%4&EieFMCf^(lK8V-q}^x`y?suYb!e{d*q!|3caZcs*+y1m*34_wc=+ zS4FZ!BsIpCLGR;bb+XRbsy^9}&K&Kd5#V#!vHKI3umI~HM@|zwKK=u1$^f`FVlum; zI3jT|{5fS6jLO~)OYu8Y2)eDupc15H53Bmr1Zbd*)fEYmk#Hs}E*1)&?*9nOGpTMH&O7y*z`_tfe3SPxW!A*e~6gNp8_xQs?{kF|)mjY0WREZ(_9oD2GHJ z$V-JdP}l*Mi9-_o7%t@jIbWDFtvcOD$(SH2us}(xSP3zD0E8Y2 zRo@2+I?(bQ_r)&+U+iOOQ(uZ9(J`d_^kCvmZ7F z+i3j#Xg=Ab(yy;ky}3{y{_pH{zPztD%*lZ@OEM0^ow4(nlJb7Z2`EHu)WHmA%WZ{0 ztD@kzmr=31JMNu}2GQw0(sPE66P_FU5IS0z_~yP*qrQw1`bYg7%a2Q_xsSolPh_f1 z5Wfg!6&!$uuC@?iVmb|$)8Ib(uM3;uN2CBbs^VzfN%H7~jkAEcJ#HR6ld%?F&)mum zt~XYmhXbe-9BfEpRUc0^ro&0AcDP;*dun50b@_M9DgRvBNASzU1^ga+o(5z*{~e+e zt8a#rQbSt?rGY2KhxSbK-kI2{VPP+S#C_~$wr~0g0ph_f7mvj2BaEM)1ZW=c zH4&5GMbtHv+FXZmT{cjuV9_60Dm;+vDc5LQSi1@=*n? zSfP*gU9C;srXETSBiTo^b=7Fk7grjzP5FB2V=;V-+W<}c3AwxAft2@zNj%nZ;DFWn zGWCV7dD=_uchT}o$^)4z4wqd9bUbShC3DQ@N-;!gl!7Wlb5@tBCq$S*wER7I8QSTC z!e^kl(HnxxW>!+0hM59X-D)_RL5lOjEDsNqmNW!Nm$>?t?I7_~tEz@GlElm(scPEHd+xoI58WLJdNFs;4kE8%nwsl(lNU5WQp=`1_NbPq|+(L-a z6@s-sVa}Mw7ZeKjvp*=fr;xLNfC>c`F2}SOv;n9#Hmk@Bw66RtUm8tyX=c|j+_Pvq zSy6Tx$bK!;Hw`6B(LSOitBxVy=P#`1C$NLipFbzBBD>yFdq~j>CLi+XQ0HtmZY5s= zn>;R5E=2}FZ93lGV^GoUfV(LA@G|Vo+t4;&SacL{<&pzb8{H?bvj*l-VdDsUTS+i; zZU_lj7#{@=Ovoryd~BECVAd!%Z;e4GC!oxkK&f##%?WrReH|asKL}0&3Nn8tbq%|# zL-lE`C$bFE!TV^t+e1D?_Vsp$_n7m?UO`v5vqDs<~u#>KW455Eovf;CY1m*8x3hc0c zf=K>(y5+#Y(kTkFrTV?-rs$av*_;nzM(|KcClz_1)CI3*ZegxOUc2>kLc8TnhY?9j zU`qa8_(RHazF-4s_EPT^>|65P{w-q@%T|-uULyx7_9^VFW9C=?K3p3?*<*L{U}qH{ zvM7~hS{D0LJf95_)Erm*jyO~>b6qS z;JLK6a-eXTzh``mdsPtcP_dg3yT9wwk2!0eNL~Sx^7gP|!N%Smmq{_2TDQAMP+=lzYkJ0=gWiJGmByu41 zQ~1~lP~2J1Oo=!1zk;8|&Jny@QpUI3 zP``;tw;dSR*K)Vn2U|EKVA((y;Xv=MiiUCIh*!VQyE3Ju(|WlL9RtIY7Q@1lqi{}} z1=WUTsext_sj;g~72cc+TDo54<_nyLLnniQv}QdeJzrPy*vUt!Ry57s3B<<);O`NO{KXHt8oN^tctkBmRs zcN<^}F1Lwo8p^qJDTC@mp*zW~Ww5PE$)Y{@$VRDU+FFYJ*%2EB1q5J!D1xMX5Dv>l znwm6sd(Zb!;(I(;nrRB9t@1<%%Li){1|u7bWtpWJO-E~!^Y+3sDXaS~9C+7Im#`g`(;PI- z264G&{(Mqy`#%#MVFu#F;?13o8kXYR-hYfexHSDh;^FC$^LT9gmS~jArzm zEZt6^uqR5vv{Ht`$HSjeKZMm~-$A6V0P2lb%++UErj@u%uP#5s*9T%ga$jjFW(rqd z|0rD%oivTf`V3ZRP5~9WXzuR36lrD?kBSmM!fMs~*?jMha0@-b*OKQQ6l1e@+F7r8 zyN;xaB#i2|HFtMZ3Cr^-;lViJC;eYtuGdz@>I#7pOix2?_7yY}9z=WaCiC%_Su&;0 zAkET=%i;A=)7a_Eeq6S*+ADz$1%}XB;zJJl3vCrZc@^md=4Wvz#pgyjcR%PNN#?_Q z?oV6{FQ#o^irc4^;Sk+i0JX*z(Q(B-S4E)dNufITqOdtS-MT+v5t#6K8CVmTe8|i4 zgQ%(YPfCOX-r@0!*cqT-?rxY{c!)*lEiV3sh09Dp+leCeo=I85j*|G3lt3#5$ccyx zYexdw)la6bV%f#dH)lhoLF;M^zG^n$J0vPDWc;yh6V4o1`UdZ#z_<1X;K^kWwQf zS7u*0jR`_>I;vUFz&pi9;en)O!cslPNyz;|U(Dl%{~pF14U^fKG5HfLV;e5Q2H!s| z|LcqNAuCsvo||8M1YbB_{EU-5kX780;8S)!?kUKk1QAR!Q%Dioi%T6HlhNKLLnplG zAp{*G9>A?)M&W*VK)tjNGKIg0j-{i3wxE9FE8+shu_Via954A`h472Ah zGb&GMCv*lM=JC{(EG+=-n*_6AXwN*a802Q*te7CrEjkQOq^!U#ZVCb(B^=%hrkwI} zBQ}Ky7UV=3(}17~2O`k6WI~P3-T@D%e$W>I!lD?*3i`&ler*i1r+*wh175zc zi3O6Uw^xYz7^EZr^^FkOk`G_8D8e%^t>A0sLVNYX7IrORR^b6ySaJ-uRD}b1lFnpwOrL~vC8Eqyrr8ZTa$L;A51m=Co#`d)fpE65>ERIDuzMoe| z!uQ%NDAGIUwshuUMqqmd+gm**(`MX<&r}<91q2))PNTzp1r-Q)xg{sJW*J*-n{j(O ygZm{LTWV$crh*!S?hI~^n}yfBBD_cPv;QBQK1yn2h8c|j0000 literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..67288c11f32c7c8e02b012b442f9af0e660f82d3 GIT binary patch literal 6852 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 literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/values-night/styles.xml b/mobile/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/mobile/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mobile/android/app/src/main/res/values/styles.xml b/mobile/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/mobile/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mobile/android/app/src/main/res/xml/wearable_app_values.xml b/mobile/android/app/src/main/res/xml/wearable_app_values.xml new file mode 100644 index 0000000..7d4a277 --- /dev/null +++ b/mobile/android/app/src/main/res/xml/wearable_app_values.xml @@ -0,0 +1,4 @@ + + + + diff --git a/mobile/android/app/src/profile/AndroidManifest.xml b/mobile/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/mobile/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mobile/android/build.gradle.kts b/mobile/android/build.gradle.kts new file mode 100644 index 0000000..dbee657 --- /dev/null +++ b/mobile/android/build.gradle.kts @@ -0,0 +1,24 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/mobile/android/gradle.properties b/mobile/android/gradle.properties new file mode 100644 index 0000000..fbee1d8 --- /dev/null +++ b/mobile/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true diff --git a/mobile/android/gradle/wrapper/gradle-wrapper.properties b/mobile/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e4ef43f --- /dev/null +++ b/mobile/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip diff --git a/mobile/android/settings.gradle.kts b/mobile/android/settings.gradle.kts new file mode 100644 index 0000000..ca7fe06 --- /dev/null +++ b/mobile/android/settings.gradle.kts @@ -0,0 +1,26 @@ +pluginManagement { + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + 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 + id("org.jetbrains.kotlin.android") version "2.2.20" apply false +} + +include(":app") diff --git a/mobile/assets/images/CesiZen logo.png b/mobile/assets/images/CesiZen logo.png new file mode 100644 index 0000000000000000000000000000000000000000..67288c11f32c7c8e02b012b442f9af0e660f82d3 GIT binary patch literal 6852 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 literal 0 HcmV?d00001 diff --git a/mobile/assets/images/CesiZen nom.png b/mobile/assets/images/CesiZen nom.png new file mode 100644 index 0000000000000000000000000000000000000000..d0eab94a09bebaea963f457e33ab43ebcfdb0b98 GIT binary patch literal 6912 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 literal 0 HcmV?d00001 diff --git a/mobile/assets/images/CesiZen.png b/mobile/assets/images/CesiZen.png new file mode 100644 index 0000000000000000000000000000000000000000..78878ce646895b74d462541e79b37648e325986b GIT binary patch literal 13917 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 EKRQ*LO#lD@ literal 0 HcmV?d00001 diff --git a/mobile/ios/.gitignore b/mobile/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/mobile/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/mobile/ios/Flutter/AppFrameworkInfo.plist b/mobile/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..391a902 --- /dev/null +++ b/mobile/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/mobile/ios/Flutter/Debug.xcconfig b/mobile/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/mobile/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/mobile/ios/Flutter/Release.xcconfig b/mobile/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/mobile/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f619b68 --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,620 @@ +// !$*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 */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7884E8682EC3CC0700C636F2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */; }; + 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 */; }; +/* 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 = ""; }; + 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 = ""; }; + 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 = ""; }; + 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + 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 */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 7884E8672EC3CC0400C636F2 /* SceneDelegate.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 = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + 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 = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + 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 */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 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"; + }; + 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"; + }; +/* 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 */, + 7884E8682EC3CC0700C636F2 /* SceneDelegate.swift 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 = 13.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; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.mobile; + 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; + 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.example.mobile.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; + 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.example.mobile.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; + 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.example.mobile.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 = 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; + 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 = 13.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 = 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 = 13.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; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.mobile; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.mobile; + 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/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/ios/Runner.xcworkspace/contents.xcworkspacedata b/mobile/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/mobile/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mobile/ios/Runner/AppDelegate.swift b/mobile/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..c30b367 --- /dev/null +++ b/mobile/ios/Runner/AppDelegate.swift @@ -0,0 +1,16 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { + GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + } +} diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/mobile/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/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/mobile/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/mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard b/mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/ios/Runner/Base.lproj/Main.storyboard b/mobile/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/mobile/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/ios/Runner/Info.plist b/mobile/ios/Runner/Info.plist new file mode 100644 index 0000000..a821fdb --- /dev/null +++ b/mobile/ios/Runner/Info.plist @@ -0,0 +1,70 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Mobile + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + mobile + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneConfigurationName + flutter + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/mobile/ios/Runner/Runner-Bridging-Header.h b/mobile/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/mobile/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/mobile/ios/Runner/SceneDelegate.swift b/mobile/ios/Runner/SceneDelegate.swift new file mode 100644 index 0000000..b9ce8ea --- /dev/null +++ b/mobile/ios/Runner/SceneDelegate.swift @@ -0,0 +1,6 @@ +import Flutter +import UIKit + +class SceneDelegate: FlutterSceneDelegate { + +} diff --git a/mobile/ios/RunnerTests/RunnerTests.swift b/mobile/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/mobile/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/mobile/lib/core/network/dio_client.dart b/mobile/lib/core/network/dio_client.dart new file mode 100644 index 0000000..f81872c --- /dev/null +++ b/mobile/lib/core/network/dio_client.dart @@ -0,0 +1,44 @@ +import 'dart:io'; +import 'package:dio/dio.dart'; +import 'package:dio/io.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class DioClient { + final Dio _dio = Dio(); + final FlutterSecureStorage _storage = const FlutterSecureStorage(); + + DioClient() { + // On enlève le slash final ici + _dio.options.baseUrl = "https://apicesizen.sam-coffre.duckdns.org/api"; + _dio.options.connectTimeout = const Duration(seconds: 10); + _dio.options.receiveTimeout = const Duration(seconds: 10); + _dio.options.headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }; + + // Bypass SSL pour éviter l'erreur "unknown" sur certains certificats DuckDNS/Let's Encrypt + _dio.httpClientAdapter = IOHttpClientAdapter( + createHttpClient: () { + final client = HttpClient(); + client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; + return client; + }, + ); + + _dio.interceptors.add(InterceptorsWrapper( + onRequest: (options, handler) async { + String? token = await _storage.read(key: 'token'); + if (token != null) { + options.headers['Authorization'] = 'Bearer $token'; + } + return handler.next(options); + }, + onError: (DioException e, handler) { + return handler.next(e); + }, + )); + } + + Dio get dio => _dio; +} diff --git a/mobile/lib/features/auth/models/user.dart b/mobile/lib/features/auth/models/user.dart new file mode 100644 index 0000000..f769f07 --- /dev/null +++ b/mobile/lib/features/auth/models/user.dart @@ -0,0 +1,27 @@ +class User { + final int id; + final String name; + final String email; + + User({ + required this.id, + required this.name, + required this.email, + }); + + factory User.fromJson(Map json) { + return User( + id: json['id'], + name: json['name'], + email: json['email'], + ); + } + + Map toJson() { + return { + 'id': id, + 'name': name, + 'email': email, + }; + } +} diff --git a/mobile/lib/features/auth/providers/auth_provider.dart b/mobile/lib/features/auth/providers/auth_provider.dart new file mode 100644 index 0000000..445ab99 --- /dev/null +++ b/mobile/lib/features/auth/providers/auth_provider.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import '../models/user.dart'; +import '../services/auth_service.dart'; + +class AuthProvider with ChangeNotifier { + final AuthService _authService = AuthService(); + static const _platform = MethodChannel('com.cesizen/wearable'); + + User? _user; + bool _isLoading = false; + String? _errorMessage; + + AuthProvider() { + // Écouter les demandes de mise à jour venant de la couche native (montre -> téléphone) + _platform.setMethodCallHandler((call) async { + if (call.method == "requestStatusUpdate") { + _syncWithWear(); + } + }); + + // Tenter de restaurer la session au lancement + _checkInitialAuth(); + } + + Future _checkInitialAuth() async { + _isLoading = true; + notifyListeners(); + + final result = await _authService.getProfile(); + if (result['status'] == 'success') { + _user = result['user']; + _syncWithWear(); + } + + _isLoading = false; + notifyListeners(); + } + + User? get user => _user; + bool get isLoading => _isLoading; + String? get errorMessage => _errorMessage; + bool get isAuthenticated => _user != null; + + void _syncWithWear() { + try { + _platform.invokeMethod('sendAuthStatus', { + 'status': isAuthenticated ? 'authenticated' : 'unauthenticated', + 'userName': _user?.name ?? '', + }); + } catch (e) { + // Échec silencieux si pas d'appareil Wear OS à proximité + debugPrint("Wear OS sync failed: $e"); + } + } + + Future login(String email, String password) async { + _isLoading = true; + _errorMessage = null; + notifyListeners(); + + final result = await _authService.login(email, password); + + _isLoading = false; + if (result['status'] == 'success') { + _user = result['user']; + _syncWithWear(); + notifyListeners(); + return true; + } else { + _errorMessage = result['message']; + notifyListeners(); + return false; + } + } + + Future register(String name, String email, String password, String passwordConfirmation) async { + _isLoading = true; + _errorMessage = null; + notifyListeners(); + + final result = await _authService.register(name, email, password, passwordConfirmation); + + _isLoading = false; + if (result['status'] == 'success') { + _user = result['user']; + _syncWithWear(); + notifyListeners(); + return true; + } else { + if (result['errors'] is Map) { + _errorMessage = (result['errors'] as Map).values.first[0]; + } else { + _errorMessage = result['errors'].toString(); + } + notifyListeners(); + return false; + } + } + + Future logout() async { + await _authService.logout(); + _user = null; + _syncWithWear(); + notifyListeners(); + } + + Future updateProfile(String name, String email, {String? password}) async { + _isLoading = true; + _errorMessage = null; + notifyListeners(); + + final result = await _authService.updateProfile(name, email, password: password); + + _isLoading = false; + if (result['status'] == 'success') { + _user = result['user']; + _syncWithWear(); + notifyListeners(); + return true; + } else { + _errorMessage = result['message']; + notifyListeners(); + return false; + } + } +} diff --git a/mobile/lib/features/auth/screens/login_screen.dart b/mobile/lib/features/auth/screens/login_screen.dart new file mode 100644 index 0000000..c3f2198 --- /dev/null +++ b/mobile/lib/features/auth/screens/login_screen.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../providers/auth_provider.dart'; +import 'register_screen.dart'; + +class LoginScreen extends StatefulWidget { + const LoginScreen({super.key}); + + @override + State createState() => _LoginScreenState(); +} + +class _LoginScreenState extends State { + final _formKey = GlobalKey(); + final _emailController = TextEditingController(); + final _passwordController = TextEditingController(); + + @override + void dispose() { + _emailController.dispose(); + _passwordController.dispose(); + super.dispose(); + } + + void _login() async { + if (_formKey.currentState!.validate()) { + final authProvider = Provider.of(context, listen: false); + final success = await authProvider.login( + _emailController.text, + _passwordController.text, + ); + + if (success) { + // Rediriger vers l'accueil ou le dashboard + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Connexion réussie')), + ); + Navigator.of(context).pop(); // Retourne à l'écran précédent (HomeScreen) + } + } else { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(authProvider.errorMessage ?? 'Échec de la connexion')), + ); + } + } + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Connexion CESIZen')), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Form( + key: _formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Bienvenue sur CESIZen', + style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 32), + TextFormField( + controller: _emailController, + decoration: const InputDecoration( + labelText: 'Email', + border: OutlineInputBorder(), + prefixIcon: Icon(Icons.email), + ), + keyboardType: TextInputType.emailAddress, + validator: (value) { + if (value == null || value.isEmpty) return 'Veuillez entrer votre email'; + if (!value.contains('@')) return 'Email invalide'; + return null; + }, + ), + const SizedBox(height: 16), + TextFormField( + controller: _passwordController, + decoration: const InputDecoration( + labelText: 'Mot de passe', + border: OutlineInputBorder(), + prefixIcon: Icon(Icons.lock), + ), + obscureText: true, + validator: (value) { + if (value == null || value.isEmpty) return 'Veuillez entrer votre mot de passe'; + return null; + }, + ), + const SizedBox(height: 24), + Consumer( + builder: (context, auth, child) { + return auth.isLoading + ? const CircularProgressIndicator() + : ElevatedButton( + onPressed: _login, + style: ElevatedButton.styleFrom( + minimumSize: const Size.fromHeight(50), + ), + child: const Text('Se connecter'), + ); + }, + ), + TextButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const RegisterScreen()), + ); + }, + child: const Text("Pas encore de compte ? S'inscrire"), + ), + ], + ), + ), + ), + ); + } +} diff --git a/mobile/lib/features/auth/screens/profile_screen.dart b/mobile/lib/features/auth/screens/profile_screen.dart new file mode 100644 index 0000000..d38c277 --- /dev/null +++ b/mobile/lib/features/auth/screens/profile_screen.dart @@ -0,0 +1,267 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../providers/auth_provider.dart'; +import '../../tracker/providers/emotion_provider.dart'; +import 'package:intl/intl.dart'; + +class ProfileScreen extends StatefulWidget { + const ProfileScreen({super.key}); + + @override + State createState() => _ProfileScreenState(); +} + +class _ProfileScreenState extends State { + final _formKey = GlobalKey(); + late TextEditingController _nameController; + late TextEditingController _emailController; + late TextEditingController _passwordController; + late String _currentEmail; + bool _isEditing = false; + + @override + void initState() { + super.initState(); + final user = Provider.of(context, listen: false).user; + _currentEmail = user?.email ?? ''; + _nameController = TextEditingController(text: user?.name); + _emailController = TextEditingController(text: _currentEmail); + _passwordController = TextEditingController(); + + _emailController.addListener(() { + if (mounted) setState(() {}); + }); + + // Charger les émotions pour le journal + WidgetsBinding.instance.addPostFrameCallback((_) { + Provider.of(context, listen: false).loadEmotions(); + }); + } + + @override + void dispose() { + _nameController.dispose(); + _emailController.dispose(); + _passwordController.dispose(); + super.dispose(); + } + + void _submitUpdate() async { + if (_formKey.currentState!.validate()) { + final authProvider = Provider.of(context, listen: false); + + final String newName = _nameController.text.trim(); + final String newEmail = _emailController.text.trim(); + final String? newPassword = _passwordController.text.isNotEmpty ? _passwordController.text : null; + + final success = await authProvider.updateProfile( + newName, + newEmail, + password: newPassword, + ); + + if (mounted) { + if (success) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Profil mis à jour avec succès')), + ); + setState(() { + _isEditing = false; + _currentEmail = newEmail; + _passwordController.clear(); + }); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(authProvider.errorMessage ?? 'Erreur lors de la mise à jour')), + ); + } + } + } + } + + @override + Widget build(BuildContext context) { + final authProvider = Provider.of(context); + final emotionProvider = Provider.of(context); + final user = authProvider.user; + final bool emailChanged = _emailController.text.trim() != _currentEmail.trim(); + + return Scaffold( + appBar: AppBar( + title: const Text('Mon Espace Santé'), + backgroundColor: Colors.white, + elevation: 0, + actions: [ + IconButton( + icon: Icon(_isEditing ? Icons.close : Icons.edit), + onPressed: () { + setState(() { + _isEditing = !_isEditing; + if (!_isEditing) { + _nameController.text = user?.name ?? ''; + _emailController.text = user?.email ?? ''; + _passwordController.clear(); + } + }); + }, + ) + ], + ), + body: SingleChildScrollView( + child: Column( + children: [ + // Section Profil + Padding( + padding: const EdgeInsets.all(24.0), + child: Form( + key: _formKey, + child: Column( + children: [ + const CircleAvatar( + radius: 50, + backgroundColor: Color(0xFF000080), + child: Icon(Icons.person, size: 50, color: Colors.white), + ), + const SizedBox(height: 20), + TextFormField( + controller: _nameController, + enabled: _isEditing, + decoration: const InputDecoration( + labelText: 'Nom', + prefixIcon: Icon(Icons.person_outline), + border: OutlineInputBorder(), + ), + validator: (value) => (value == null || value.trim().isEmpty) ? 'Veuillez entrer un nom' : null, + ), + const SizedBox(height: 15), + TextFormField( + controller: _emailController, + enabled: _isEditing, + decoration: const InputDecoration( + labelText: 'Email', + prefixIcon: Icon(Icons.email_outlined), + border: OutlineInputBorder(), + ), + validator: (value) { + final email = value?.trim() ?? ''; + if (email.isEmpty) return 'Veuillez entrer un email'; + if (!email.contains('@')) return 'Email invalide'; + return null; + }, + ), + if (_isEditing) ...[ + const SizedBox(height: 15), + TextFormField( + controller: _passwordController, + obscureText: true, + decoration: InputDecoration( + labelText: emailChanged ? 'Mot de passe requis' : 'Nouveau mot de passe', + prefixIcon: const Icon(Icons.lock_outline), + border: const OutlineInputBorder(), + ), + ), + const SizedBox(height: 20), + ElevatedButton( + onPressed: authProvider.isLoading ? null : _submitUpdate, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF000080), + foregroundColor: Colors.white, + minimumSize: const Size.fromHeight(50), + ), + child: const Text('ENREGISTRER'), + ), + ], + ], + ), + ), + ), + + // Section Journal Émotionnel (Le "Journal Santé") + Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), + color: Colors.grey.shade50, + child: const Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Journal Émotionnel', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold, color: Color(0xFF000080)), + ), + Text('Historique de vos saisies (Mobile & Montre)', style: TextStyle(color: Colors.grey, fontSize: 12)), + ], + ), + ), + + if (emotionProvider.isLoading) + const Padding( + padding: EdgeInsets.all(20.0), + child: CircularProgressIndicator(), + ) + else if (emotionProvider.entries.isEmpty) + const Padding( + padding: EdgeInsets.all(40.0), + child: Column( + children: [ + Icon(Icons.history, size: 48, color: Colors.grey), + SizedBox(height: 10), + Text('Aucun historique pour le moment.', style: TextStyle(color: Colors.grey)), + ], + ), + ) + else + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: emotionProvider.entries.length, + separatorBuilder: (context, index) => const Divider(height: 1), + itemBuilder: (context, index) { + final entry = emotionProvider.entries[index]; + final dateStr = DateFormat('dd/MM/yyyy HH:mm').format(entry.createdAt); + return ListTile( + leading: _getMoodEmoji(entry.emotion), + title: Text(entry.emotion, style: const TextStyle(fontWeight: FontWeight.bold)), + subtitle: Text(entry.note ?? 'Saisie rapide'), + trailing: Text(dateStr, style: const TextStyle(fontSize: 11, color: Colors.grey)), + ); + }, + ), + + const SizedBox(height: 100), // Espace pour le scroll + ], + ), + ), + ); + } + + Widget _getMoodEmoji(String mood) { + String emoji = "😐"; + Color color = Colors.grey; + switch (mood) { + case 'Très bien': + emoji = "😊"; + color = const Color(0xFF4CAF50); + break; + case 'Bien': + emoji = "🙂"; + color = const Color(0xFF8BC34A); + break; + case 'Neutre': + emoji = "😐"; + color = const Color(0xFFFFC107); + break; + case 'Pas top': + emoji = "🙁"; + color = const Color(0xFFFF9800); + break; + case 'Stressé': + emoji = "😫"; + color = const Color(0xFFF44336); + break; + } + return CircleAvatar( + backgroundColor: color.withOpacity(0.1), + child: Text(emoji, style: const TextStyle(fontSize: 20)), + ); + } +} diff --git a/mobile/lib/features/auth/screens/register_screen.dart b/mobile/lib/features/auth/screens/register_screen.dart new file mode 100644 index 0000000..a9d4693 --- /dev/null +++ b/mobile/lib/features/auth/screens/register_screen.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import '../providers/auth_provider.dart'; + +class RegisterScreen extends StatefulWidget { + const RegisterScreen({super.key}); + + @override + State createState() => _RegisterScreenState(); +} + +class _RegisterScreenState extends State { + final _formKey = GlobalKey(); + final _nameController = TextEditingController(); + final _emailController = TextEditingController(); + final _passwordController = TextEditingController(); + final _confirmPasswordController = TextEditingController(); + + @override + void dispose() { + _nameController.dispose(); + _emailController.dispose(); + _passwordController.dispose(); + _confirmPasswordController.dispose(); + super.dispose(); + } + + void _register() async { + if (_formKey.currentState!.validate()) { + final authProvider = Provider.of(context, listen: false); + final success = await authProvider.register( + _nameController.text, + _emailController.text, + _passwordController.text, + _confirmPasswordController.text, + ); + + if (success) { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Compte créé avec succès !')), + ); + // On vide la pile et on retourne au menu principal (HomeScreen) + Navigator.of(context).popUntil((route) => route.isFirst); + } + } else { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(authProvider.errorMessage ?? 'Échec de l\'inscription')), + ); + } + } + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Inscription CESIZen')), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16.0), + child: Form( + key: _formKey, + child: Column( + children: [ + const SizedBox(height: 20), + TextFormField( + controller: _nameController, + decoration: const InputDecoration( + labelText: 'Nom complet', + border: OutlineInputBorder(), + prefixIcon: Icon(Icons.person), + ), + validator: (value) => value == null || value.isEmpty ? 'Entrez votre nom' : null, + ), + const SizedBox(height: 16), + TextFormField( + controller: _emailController, + decoration: const InputDecoration( + labelText: 'Email', + border: OutlineInputBorder(), + prefixIcon: Icon(Icons.email), + ), + keyboardType: TextInputType.emailAddress, + validator: (value) => value == null || !value.contains('@') ? 'Email invalide' : null, + ), + const SizedBox(height: 16), + TextFormField( + controller: _passwordController, + decoration: const InputDecoration( + labelText: 'Mot de passe', + border: OutlineInputBorder(), + prefixIcon: Icon(Icons.lock), + ), + obscureText: true, + validator: (value) => value == null || value.length < 8 ? '8 caractères minimum' : null, + ), + const SizedBox(height: 16), + TextFormField( + controller: _confirmPasswordController, + decoration: const InputDecoration( + labelText: 'Confirmer le mot de passe', + border: OutlineInputBorder(), + prefixIcon: Icon(Icons.lock_outline), + ), + obscureText: true, + validator: (value) { + if (value != _passwordController.text) return 'Les mots de passe ne correspondent pas'; + return null; + }, + ), + const SizedBox(height: 24), + Consumer( + builder: (context, auth, child) { + return auth.isLoading + ? const CircularProgressIndicator() + : ElevatedButton( + onPressed: _register, + style: ElevatedButton.styleFrom( + minimumSize: const Size.fromHeight(50), + ), + child: const Text('S\'inscrire'), + ); + }, + ), + ], + ), + ), + ), + ); + } +} diff --git a/mobile/lib/features/auth/services/auth_service.dart b/mobile/lib/features/auth/services/auth_service.dart new file mode 100644 index 0000000..dfad7c5 --- /dev/null +++ b/mobile/lib/features/auth/services/auth_service.dart @@ -0,0 +1,130 @@ +import 'package:dio/dio.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import '../../../core/network/dio_client.dart'; +import '../models/user.dart'; + +class AuthService { + final Dio _dio = DioClient().dio; + final FlutterSecureStorage _storage = const FlutterSecureStorage(); + + Future> login(String email, String password) async { + try { + final response = await _dio.post('/login', data: { + 'email': email, + 'password': password, + }); + + if (response.statusCode == 200) { + String token = response.data['token']; + await _storage.write(key: 'token', value: token); + return { + 'status': 'success', + 'user': User.fromJson(response.data['user']), + }; + } + return {'status': 'error', 'message': 'Erreur inconnue'}; + } on DioException catch (e) { + return { + 'status': 'error', + 'message': e.response?.data['message'] ?? 'Erreur de connexion' + }; + } + } + + Future> register(String name, String email, String password, String passwordConfirmation) async { + try { + final response = await _dio.post('/register', data: { + 'name': name, + 'email': email, + 'password': password, + 'password_confirmation': passwordConfirmation, + }); + + if (response.statusCode == 201) { + String token = response.data['token']; + await _storage.write(key: 'token', value: token); + return { + 'status': 'success', + 'user': User.fromJson(response.data['user']), + }; + } + return {'status': 'error', 'message': 'Erreur inconnue'}; + } on DioException catch (e) { + return { + 'status': 'error', + 'errors': e.response?.data['errors'] ?? 'Erreur lors de l\'inscription' + }; + } + } + + Future> updateProfile(String name, String email, {String? password}) async { + try { + String? token = await getToken(); + + final Map data = { + 'name': name, + 'email': email, + }; + + if (password != null && password.isNotEmpty) { + data['current_password'] = password; + data['password'] = password; + data['password_confirmation'] = password; + } + + final response = await _dio.post( + '/update-profile', + data: data, + options: Options( + headers: { + 'Authorization': 'Bearer $token', + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + ), + ); + + if (response.statusCode == 200) { + return { + 'status': 'success', + 'user': User.fromJson(response.data['user']), + }; + } + return {'status': 'error', 'message': 'Erreur lors de la mise à jour'}; + } on DioException catch (e) { + return { + 'status': 'error', + 'message': e.response?.data['message'] ?? 'Erreur lors de la modification du profil' + }; + } + } + + Future> getProfile() async { + try { + String? token = await getToken(); + if (token == null) return {'status': 'error', 'message': 'No token'}; + + final response = await _dio.get('/profile', options: Options( + headers: {'Authorization': 'Bearer $token'} + )); + + if (response.statusCode == 200) { + return { + 'status': 'success', + 'user': User.fromJson(response.data), + }; + } + return {'status': 'error', 'message': 'Session expirée'}; + } catch (e) { + return {'status': 'error', 'message': e.toString()}; + } + } + + Future logout() async { + await _storage.delete(key: 'token'); + } + + Future getToken() async { + return await _storage.read(key: 'token'); + } +} diff --git a/mobile/lib/features/diagnostics/models/question.dart b/mobile/lib/features/diagnostics/models/question.dart new file mode 100644 index 0000000..d353d65 --- /dev/null +++ b/mobile/lib/features/diagnostics/models/question.dart @@ -0,0 +1,13 @@ +class Question { + final String text; + final List

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/macos/Runner/Configs/AppInfo.xcconfig b/mobile/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..d378045 --- /dev/null +++ b/mobile/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 = mobile + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.mobile + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2026 com.example. All rights reserved. diff --git a/mobile/macos/Runner/Configs/Debug.xcconfig b/mobile/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/mobile/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/mobile/macos/Runner/Configs/Release.xcconfig b/mobile/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/mobile/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/mobile/macos/Runner/Configs/Warnings.xcconfig b/mobile/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/mobile/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/mobile/macos/Runner/DebugProfile.entitlements b/mobile/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/mobile/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/mobile/macos/Runner/Info.plist b/mobile/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/mobile/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/mobile/macos/Runner/MainFlutterWindow.swift b/mobile/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/mobile/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/mobile/macos/Runner/Release.entitlements b/mobile/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/mobile/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/mobile/macos/RunnerTests/RunnerTests.swift b/mobile/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/mobile/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/mobile/pubspec.lock b/mobile/pubspec.lock new file mode 100644 index 0000000..ee22aa7 --- /dev/null +++ b/mobile/pubspec.lock @@ -0,0 +1,602 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + dio: + dependency: "direct main" + description: + name: dio + sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c + url: "https://pub.dev" + source: hosted + version: "5.9.2" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + 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: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + 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_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" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + go_router: + dependency: "direct main" + description: + name: go_router + sha256: b465e99ce64ba75e61c8c0ce3d87b66d8ac07f0b35d0a7e0263fcfc10f99e836 + url: "https://pub.dev" + source: hosted + version: "13.2.5" + hooks: + dependency: transitive + description: + name: hooks + sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388 + url: "https://pub.dev" + source: hosted + version: "1.0.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + 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: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + url: "https://pub.dev" + source: hosted + version: "0.12.19" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572" + url: "https://pub.dev" + source: hosted + version: "0.17.6" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: transitive + 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: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + 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" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.dev" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.dev" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + 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" + provider: + dependency: "direct main" + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + 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" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + 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: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" + url: "https://pub.dev" + source: hosted + version: "0.7.10" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" + url: "https://pub.dev" + source: hosted + version: "15.1.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.11.4 <4.0.0" + flutter: ">=3.38.4" diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml new file mode 100644 index 0000000..b6774ca --- /dev/null +++ b/mobile/pubspec.yaml @@ -0,0 +1,97 @@ +name: mobile +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.11.4 + +# 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: + flutter: + sdk: flutter + dio: ^5.4.0 # Pour les requêtes API (plus robuste que http) + flutter_secure_storage: ^9.0.0 + provider: ^6.1.1 + go_router: ^13.2.0 + intl: ^0.19.0 + permission_handler: ^11.3.1 + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^6.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + assets: + - assets/images/ + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/mobile/test/widget_test.dart b/mobile/test/widget_test.dart new file mode 100644 index 0000000..a6b7d51 --- /dev/null +++ b/mobile/test/widget_test.dart @@ -0,0 +1,30 @@ +// 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:mobile/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // 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/mobile/web/favicon.png b/mobile/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/mobile/web/icons/Icon-192.png b/mobile/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/mobile/web/icons/Icon-512.png b/mobile/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/mobile/web/icons/Icon-maskable-192.png b/mobile/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/mobile/web/icons/Icon-maskable-512.png b/mobile/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/mobile/web/index.html b/mobile/web/index.html new file mode 100644 index 0000000..52faaef --- /dev/null +++ b/mobile/web/index.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + mobile + + + + + + + diff --git a/mobile/web/manifest.json b/mobile/web/manifest.json new file mode 100644 index 0000000..9dc3ff2 --- /dev/null +++ b/mobile/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "mobile", + "short_name": "mobile", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "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" + } + ] +} diff --git a/mobile/windows/.gitignore b/mobile/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/mobile/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/mobile/windows/CMakeLists.txt b/mobile/windows/CMakeLists.txt new file mode 100644 index 0000000..eb19942 --- /dev/null +++ b/mobile/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(mobile 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 "mobile") + +# 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/mobile/windows/flutter/CMakeLists.txt b/mobile/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/mobile/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/mobile/windows/flutter/generated_plugin_registrant.cc b/mobile/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8883006 --- /dev/null +++ b/mobile/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,17 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); +} diff --git a/mobile/windows/flutter/generated_plugin_registrant.h b/mobile/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/mobile/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/mobile/windows/flutter/generated_plugins.cmake b/mobile/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..d1aac24 --- /dev/null +++ b/mobile/windows/flutter/generated_plugins.cmake @@ -0,0 +1,26 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + flutter_secure_storage_windows + permission_handler_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni +) + +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/mobile/windows/runner/CMakeLists.txt b/mobile/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/mobile/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/mobile/windows/runner/Runner.rc b/mobile/windows/runner/Runner.rc new file mode 100644 index 0000000..910c995 --- /dev/null +++ b/mobile/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.example" "\0" + VALUE "FileDescription", "mobile" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "mobile" "\0" + VALUE "LegalCopyright", "Copyright (C) 2026 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "mobile.exe" "\0" + VALUE "ProductName", "mobile" "\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/mobile/windows/runner/flutter_window.cpp b/mobile/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/mobile/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/mobile/windows/runner/flutter_window.h b/mobile/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/mobile/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/mobile/windows/runner/main.cpp b/mobile/windows/runner/main.cpp new file mode 100644 index 0000000..dbb4717 --- /dev/null +++ b/mobile/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"mobile", 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/mobile/windows/runner/resource.h b/mobile/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/mobile/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/mobile/windows/runner/resources/app_icon.ico b/mobile/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/mobile/windows/runner/runner.exe.manifest b/mobile/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..153653e --- /dev/null +++ b/mobile/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/mobile/windows/runner/utils.cpp b/mobile/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/mobile/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/mobile/windows/runner/utils.h b/mobile/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/mobile/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/mobile/windows/runner/win32_window.cpp b/mobile/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/mobile/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/mobile/windows/runner/win32_window.h b/mobile/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/mobile/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_