From 77bbe52f7aba4fd5696b7031efeacfac8f893bd2 Mon Sep 17 00:00:00 2001 From: Dennis Eckerskorn Date: Mon, 12 May 2025 23:16:40 +0200 Subject: [PATCH] Projects upload with docker working --- docker/Dockerfile-api | 5 + docker/Dockerfile-front | 18 + docker/docker-compose.yml | 51 + docker/init.sql | 975 + docker/nginx.conf | 10 + memberflow-api/.gitignore | 38 + memberflow-api/.idea/.gitignore | 3 + memberflow-api/.idea/encodings.xml | 7 + memberflow-api/.idea/misc.xml | 14 + memberflow-api/.idea/vcs.xml | 6 + memberflow-api/README.md | 60 + .../libs/memberflow-data-1.0-SNAPSHOT.jar | Bin 0 -> 260039 bytes memberflow-api/pom.xml | 137 + .../MemberFlowApplication.java | 11 + .../config/SecurityConfig.java | 71 + .../config/SwaggerConfig.java | 41 + .../denniseckerskorn/config/WebConfig.java | 17 + .../controllers/AuthController.java | 58 + .../AssistanceController.java | 81 + .../MembershipController.java | 76 + .../TrainingGroupController.java | 161 + .../TrainingSessionController.java | 51 + .../AdminController.java | 122 + .../NotificationController.java | 127 + .../PermissionController.java | 81 + .../RoleController.java | 116 + .../StudentController.java | 275 + .../StudentHistoryController.java | 98 + .../TeacherController.java | 137 + .../UserController.java | 203 + .../denniseckerskorn/dtos/LoginRequest.java | 25 + .../class_managment_dtos/AssistanceDTO.java | 76 + .../class_managment_dtos/MembershipDTO.java | 88 + .../TrainingGroupDTO.java | 109 + .../TrainingSessionDTO.java | 71 + .../dtos/user_managment_dtos/AdminDTO.java | 54 + .../user_managment_dtos/NotificationDTO.java | 84 + .../NotificationMiniDTO.java | 63 + .../user_managment_dtos/PermissionDTO.java | 32 + .../dtos/user_managment_dtos/RoleDTO.java | 42 + .../dtos/user_managment_dtos/StudentDTO.java | 217 + .../StudentHistoryDTO.java | 62 + .../StudentHistoryMiniDTO.java | 53 + .../user_managment_dtos/StudentMiniDTO.java | 26 + .../StudentRegisterDTO.java | 125 + .../dtos/user_managment_dtos/TeacherDTO.java | 67 + .../dtos/user_managment_dtos/UserDTO.java | 173 + .../exceptions/GlobalExceptionHandler.java | 166 + .../security/CustomUserDetails.java | 107 + .../security/CustomUserDetailsService.java | 41 + .../security/JwtAuthFilter.java | 105 + .../denniseckerskorn/security/JwtUtil.java | 95 + .../core/AuthenticationException.java | 7 + .../src/main/resources/Checklist.txt | 7 + .../src/main/resources/application.properties | 24 + memberflow-data/.gitignore | 38 + memberflow-data/.idea/.gitignore | 3 + memberflow-data/.idea/encodings.xml | 7 + memberflow-data/.idea/misc.xml | 14 + memberflow-data/.idea/uiDesigner.xml | 124 + memberflow-data/.idea/vcs.xml | 6 + memberflow-data/README.md | 179 + memberflow-data/pom.xml | 67 + .../config/HibernateConfig.java | 59 + .../entities/class_managment/Assistance.java | 86 + .../entities/class_managment/Membership.java | 108 + .../class_managment/TrainingGroup.java | 122 + .../class_managment/TrainingSession.java | 102 + .../entities/finance/IVAType.java | 72 + .../entities/finance/Invoice.java | 127 + .../entities/finance/InvoiceLine.java | 122 + .../entities/finance/Payment.java | 114 + .../entities/finance/ProductService.java | 122 + .../entities/user_managment/Notification.java | 151 + .../entities/user_managment/Permission.java | 83 + .../entities/user_managment/Role.java | 100 + .../user_managment/StudentHistory.java | 98 + .../entities/user_managment/users/Admin.java | 59 + .../user_managment/users/Student.java | 185 + .../user_managment/users/Teacher.java | 84 + .../entities/user_managment/users/User.java | 235 + .../enums/MembershipTypeValues.java | 9 + .../enums/PaymentMethodValues.java | 7 + .../enums/PermissionValues.java | 7 + .../denniseckerskorn/enums/StatusValues.java | 13 + .../exceptions/BadRequestException.java | 7 + .../exceptions/DuplicateEntityException.java | 19 + .../exceptions/EntityNotFoundException.java | 20 + .../exceptions/InvalidDataException.java | 19 + .../AssistanceRepository.java | 20 + .../MembershipRepository.java | 21 + .../TrainingGroupRepository.java | 7 + .../TrainingSessionRepository.java | 16 + .../IVATypeRepository.java | 11 + .../InvoiceLineRepository.java | 7 + .../InvoiceRepository.java | 7 + .../PaymentRepository.java | 8 + .../ProductServiceRepository.java | 10 + .../AdminRepository.java | 11 + .../NotificationRepository.java | 12 + .../PermissionRepository.java | 11 + .../RoleRepository.java | 8 + .../StudentHistoryRepository.java | 9 + .../StudentRepository.java | 11 + .../TeacherRepository.java | 13 + .../UserRepository.java | 15 + .../seeder/TestDataSeeder.java | 371 + .../services/AbstractService.java | 153 + .../AssistanceService.java | 107 + .../MembershipService.java | 159 + .../TrainingGroupService.java | 149 + .../TrainingSessionService.java | 119 + .../finance_services/IVATypeService.java | 79 + .../finance_services/InvoiceLineService.java | 79 + .../finance_services/InvoiceService.java | 171 + .../finance_services/PaymentService.java | 103 + .../ProductServiceService.java | 77 + .../user_managment_services/AdminService.java | 129 + .../NotificationService.java | 190 + .../PermissionService.java | 174 + .../user_managment_services/RoleService.java | 191 + .../StudentHistoryService.java | 125 + .../StudentService.java | 298 + .../TeacherService.java | 146 + .../user_managment_services/UserService.java | 220 + .../DB_Diagram_MemberFlow.png | Bin 0 -> 156419 bytes .../mf_db_creation_script.sql | 403 + .../AssistanceServiceTest.java | 107 + .../MembershipServiceTest.java | 107 + .../TrainingGroupServiceTest.java | 137 + .../TrainingSessionServiceTest.java | 109 + .../IVATypeServiceTest.java | 78 + .../InvoiceLineServiceTest.java | 93 + .../InvoiceServiceTest.java | 97 + .../PaymentServiceTest.java | 102 + .../ProductServiceServiceTest.java | 95 + .../AdminServiceTest.java | 123 + .../NotificationServiceTest.java | 105 + .../PermissionServiceTest.java | 92 + .../RoleServiceTest.java | 120 + .../StudentHistoryServiceTest.java | 105 + .../StudentServiceTest.java | 181 + .../TeacherServiceTest.java | 141 + .../UserServiceTest.java | 147 + memberflow-frontend/.gitignore | 23 + memberflow-frontend/estructura-frontend.txt | 90 + memberflow-frontend/package-lock.json | 17490 ++++++++++++++++ memberflow-frontend/package.json | 40 + memberflow-frontend/public/favicon.ico | Bin 0 -> 3870 bytes memberflow-frontend/public/index.html | 40 + memberflow-frontend/public/logo192.png | Bin 0 -> 5347 bytes memberflow-frontend/public/logo512.png | Bin 0 -> 9664 bytes memberflow-frontend/public/manifest.json | 25 + memberflow-frontend/public/robots.txt | 3 + memberflow-frontend/src/App.css | 38 + memberflow-frontend/src/App.js | 19 + memberflow-frontend/src/App.test.js | 9 + memberflow-frontend/src/api/axiosConfig.js | 21 + .../src/components/common/ErrorMessage.jsx | 18 + .../src/components/forms/AssitanceForm.jsx | 88 + .../src/components/forms/LoginForm.jsx | 51 + .../components/forms/MembershipCreateForm.jsx | 101 + .../forms/NotificationCreateForm.jsx | 122 + .../src/components/forms/StudentForm.jsx | 83 + .../forms/StudentHistoryCreateForm.jsx | 91 + .../src/components/forms/TeacherForm.jsx | 37 + .../components/forms/TrainingGroupFrom.jsx | 86 + .../forms/TrainingGroupsStudentManager.jsx | 142 + .../src/components/forms/UserCreateForm.jsx | 327 + .../src/components/forms/UserForm.jsx | 0 .../src/components/forms/ViewTimetable.jsx | 58 + .../src/components/layout/ContentArea.jsx | 63 + .../src/components/layout/MainLayout.jsx | 86 + .../src/components/layout/Sidebar.jsx | 77 + .../src/components/layout/Topbar.jsx | 34 + .../src/components/lists/AssistanceList.jsx | 70 + .../src/components/lists/MembershipList.jsx | 95 + .../src/components/lists/NotificationList.jsx | 63 + .../components/lists/StudentHistoryList.jsx | 107 + .../components/lists/TrainingGroupList.jsx | 107 + .../components/lists/TrainingSessionList.jsx | 68 + .../src/components/lists/UserList.jsx | 106 + .../src/components/styles/ContentArea.css | 179 + .../src/components/styles/DashboardCards.css | 29 + .../src/components/styles/FormStyles.css | 40 + .../src/components/styles/Login.css | 76 + .../src/components/styles/MainLayout.css | 27 + .../src/components/styles/Sidebar.css | 47 + .../src/components/styles/Topbar.css | 49 + memberflow-frontend/src/index.css | 15 + memberflow-frontend/src/index.js | 23 + memberflow-frontend/src/logo.svg | 7 + memberflow-frontend/src/pages/LoginPage.jsx | 16 + memberflow-frontend/src/pages/ProfilePage.jsx | 115 + .../src/pages/RedirectByRole.jsx | 32 + .../src/pages/admin/AdminDashboard.jsx | 35 + .../src/pages/student/StudentDashboard.jsx | 7 + .../src/pages/teacher/TeacherDashboard.jsx | 7 + memberflow-frontend/src/reportWebVitals.js | 13 + memberflow-frontend/src/service-worker.js | 72 + .../src/serviceWorkerRegistration.js | 137 + memberflow-frontend/src/setupTests.js | 5 + memberflow-frontend/src/utils/jwtHelper.js | 15 + 203 files changed, 33940 insertions(+) create mode 100644 docker/Dockerfile-api create mode 100644 docker/Dockerfile-front create mode 100644 docker/docker-compose.yml create mode 100644 docker/init.sql create mode 100644 docker/nginx.conf create mode 100644 memberflow-api/.gitignore create mode 100644 memberflow-api/.idea/.gitignore create mode 100644 memberflow-api/.idea/encodings.xml create mode 100644 memberflow-api/.idea/misc.xml create mode 100644 memberflow-api/.idea/vcs.xml create mode 100644 memberflow-api/README.md create mode 100644 memberflow-api/libs/memberflow-data-1.0-SNAPSHOT.jar create mode 100644 memberflow-api/pom.xml create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/MemberFlowApplication.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/config/SecurityConfig.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/config/SwaggerConfig.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/config/WebConfig.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/AuthController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/AssistanceController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/MembershipController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingGroupController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingSessionController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/AdminController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/NotificationController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/PermissionController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/RoleController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentHistoryController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/TeacherController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/UserController.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/LoginRequest.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/AssistanceDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/MembershipDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/TrainingGroupDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/TrainingSessionDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/AdminDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationMiniDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/PermissionDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/RoleDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryMiniDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentMiniDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentRegisterDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/TeacherDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/UserDTO.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/exceptions/GlobalExceptionHandler.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/security/CustomUserDetails.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/security/CustomUserDetailsService.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/security/JwtAuthFilter.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/security/JwtUtil.java create mode 100644 memberflow-api/src/main/java/com/denniseckerskorn/security/core/AuthenticationException.java create mode 100644 memberflow-api/src/main/resources/Checklist.txt create mode 100644 memberflow-api/src/main/resources/application.properties create mode 100644 memberflow-data/.gitignore create mode 100644 memberflow-data/.idea/.gitignore create mode 100644 memberflow-data/.idea/encodings.xml create mode 100644 memberflow-data/.idea/misc.xml create mode 100644 memberflow-data/.idea/uiDesigner.xml create mode 100644 memberflow-data/.idea/vcs.xml create mode 100644 memberflow-data/README.md create mode 100644 memberflow-data/pom.xml create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/config/HibernateConfig.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/Assistance.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/Membership.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/TrainingGroup.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/TrainingSession.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/IVAType.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/Invoice.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/InvoiceLine.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/Payment.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/ProductService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Notification.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Permission.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Role.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/StudentHistory.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Admin.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Student.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Teacher.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/User.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/enums/MembershipTypeValues.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/enums/PaymentMethodValues.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/enums/PermissionValues.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/enums/StatusValues.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/exceptions/BadRequestException.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/exceptions/DuplicateEntityException.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/exceptions/EntityNotFoundException.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/exceptions/InvalidDataException.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/AssistanceRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/MembershipRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingGroupRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingSessionRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/IVATypeRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceLineRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/PaymentRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/ProductServiceRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/AdminRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/NotificationRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/PermissionRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/RoleRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentHistoryRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/TeacherRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/UserRepository.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/seeder/TestDataSeeder.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/AbstractService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/AssistanceService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/MembershipService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingSessionService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/IVATypeService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceLineService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/PaymentService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/ProductServiceService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/AdminService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/NotificationService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/PermissionService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/RoleService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentHistoryService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/TeacherService.java create mode 100644 memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/UserService.java create mode 100644 memberflow-data/src/main/resources/mysql_db_init_script/DB_Diagram_MemberFlow.png create mode 100644 memberflow-data/src/main/resources/mysql_db_init_script/mf_db_creation_script.sql create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/AssistanceServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/MembershipServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/TrainingSessionServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/IVATypeServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/InvoiceLineServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/InvoiceServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/PaymentServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/ProductServiceServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/AdminServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/NotificationServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/PermissionServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/RoleServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/StudentHistoryServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/StudentServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/TeacherServiceTest.java create mode 100644 memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/UserServiceTest.java create mode 100644 memberflow-frontend/.gitignore create mode 100644 memberflow-frontend/estructura-frontend.txt create mode 100644 memberflow-frontend/package-lock.json create mode 100644 memberflow-frontend/package.json create mode 100644 memberflow-frontend/public/favicon.ico create mode 100644 memberflow-frontend/public/index.html create mode 100644 memberflow-frontend/public/logo192.png create mode 100644 memberflow-frontend/public/logo512.png create mode 100644 memberflow-frontend/public/manifest.json create mode 100644 memberflow-frontend/public/robots.txt create mode 100644 memberflow-frontend/src/App.css create mode 100644 memberflow-frontend/src/App.js create mode 100644 memberflow-frontend/src/App.test.js create mode 100644 memberflow-frontend/src/api/axiosConfig.js create mode 100644 memberflow-frontend/src/components/common/ErrorMessage.jsx create mode 100644 memberflow-frontend/src/components/forms/AssitanceForm.jsx create mode 100644 memberflow-frontend/src/components/forms/LoginForm.jsx create mode 100644 memberflow-frontend/src/components/forms/MembershipCreateForm.jsx create mode 100644 memberflow-frontend/src/components/forms/NotificationCreateForm.jsx create mode 100644 memberflow-frontend/src/components/forms/StudentForm.jsx create mode 100644 memberflow-frontend/src/components/forms/StudentHistoryCreateForm.jsx create mode 100644 memberflow-frontend/src/components/forms/TeacherForm.jsx create mode 100644 memberflow-frontend/src/components/forms/TrainingGroupFrom.jsx create mode 100644 memberflow-frontend/src/components/forms/TrainingGroupsStudentManager.jsx create mode 100644 memberflow-frontend/src/components/forms/UserCreateForm.jsx create mode 100644 memberflow-frontend/src/components/forms/UserForm.jsx create mode 100644 memberflow-frontend/src/components/forms/ViewTimetable.jsx create mode 100644 memberflow-frontend/src/components/layout/ContentArea.jsx create mode 100644 memberflow-frontend/src/components/layout/MainLayout.jsx create mode 100644 memberflow-frontend/src/components/layout/Sidebar.jsx create mode 100644 memberflow-frontend/src/components/layout/Topbar.jsx create mode 100644 memberflow-frontend/src/components/lists/AssistanceList.jsx create mode 100644 memberflow-frontend/src/components/lists/MembershipList.jsx create mode 100644 memberflow-frontend/src/components/lists/NotificationList.jsx create mode 100644 memberflow-frontend/src/components/lists/StudentHistoryList.jsx create mode 100644 memberflow-frontend/src/components/lists/TrainingGroupList.jsx create mode 100644 memberflow-frontend/src/components/lists/TrainingSessionList.jsx create mode 100644 memberflow-frontend/src/components/lists/UserList.jsx create mode 100644 memberflow-frontend/src/components/styles/ContentArea.css create mode 100644 memberflow-frontend/src/components/styles/DashboardCards.css create mode 100644 memberflow-frontend/src/components/styles/FormStyles.css create mode 100644 memberflow-frontend/src/components/styles/Login.css create mode 100644 memberflow-frontend/src/components/styles/MainLayout.css create mode 100644 memberflow-frontend/src/components/styles/Sidebar.css create mode 100644 memberflow-frontend/src/components/styles/Topbar.css create mode 100644 memberflow-frontend/src/index.css create mode 100644 memberflow-frontend/src/index.js create mode 100644 memberflow-frontend/src/logo.svg create mode 100644 memberflow-frontend/src/pages/LoginPage.jsx create mode 100644 memberflow-frontend/src/pages/ProfilePage.jsx create mode 100644 memberflow-frontend/src/pages/RedirectByRole.jsx create mode 100644 memberflow-frontend/src/pages/admin/AdminDashboard.jsx create mode 100644 memberflow-frontend/src/pages/student/StudentDashboard.jsx create mode 100644 memberflow-frontend/src/pages/teacher/TeacherDashboard.jsx create mode 100644 memberflow-frontend/src/reportWebVitals.js create mode 100644 memberflow-frontend/src/service-worker.js create mode 100644 memberflow-frontend/src/serviceWorkerRegistration.js create mode 100644 memberflow-frontend/src/setupTests.js create mode 100644 memberflow-frontend/src/utils/jwtHelper.js diff --git a/docker/Dockerfile-api b/docker/Dockerfile-api new file mode 100644 index 0000000..f76dc9e --- /dev/null +++ b/docker/Dockerfile-api @@ -0,0 +1,5 @@ +FROM eclipse-temurin:21-jdk-alpine +WORKDIR /app +COPY target/memberflow-api-1.0-SNAPSHOT.jar app.jar +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "app.jar"] diff --git a/docker/Dockerfile-front b/docker/Dockerfile-front new file mode 100644 index 0000000..e388b73 --- /dev/null +++ b/docker/Dockerfile-front @@ -0,0 +1,18 @@ +# Etapa 1: build React +FROM node:18-alpine as build +WORKDIR /app + +COPY memberflow-frontend/package*.json ./ +RUN npm install + +COPY memberflow-frontend/ . +RUN npm run build + +# Etapa 2: servir con nginx +FROM nginx:alpine +WORKDIR /usr/share/nginx/html + +COPY --from=build /app/build . +COPY docker/nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..5fe1416 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,51 @@ +version: '3.8' + +services: + + mysql: + image: mysql:8.0 + container_name: mysql-db + restart: always + environment: + MYSQL_ROOT_PASSWORD: 1234 + MYSQL_DATABASE: mf_db + ports: + - "3307:3306" + volumes: + - mysql_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p1234"] + interval: 10s + timeout: 5s + retries: 5 + + + backend: + build: + context: ../memberflow-api + dockerfile: ../docker/Dockerfile-api + container_name: memberflow-backend + depends_on: + - mysql + ports: + - "8080:8080" + environment: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mf_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true + SPRING_DATASOURCE_USERNAME: root + SPRING_DATASOURCE_PASSWORD: 1234 + JWT_SECRET: c2VjdXJlc2VjdXJlc2VjdXJlc2VjdXJlMTIzNDU2 + JWT_EXPIRATION: 7200000 + + + frontend: + build: + context: .. + dockerfile: docker/Dockerfile-front + container_name: memberflow-frontend + depends_on: + - backend + ports: + - "3000:80" + +volumes: + mysql_data: diff --git a/docker/init.sql b/docker/init.sql new file mode 100644 index 0000000..a81b55a --- /dev/null +++ b/docker/init.sql @@ -0,0 +1,975 @@ +CREATE DATABASE IF NOT EXISTS `mf_db` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */; +USE `mf_db`; +-- MySQL dump 10.13 Distrib 8.0.41, for Win64 (x86_64) +-- +-- Host: localhost Database: mf_db +-- ------------------------------------------------------ +-- Server version 8.0.41 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `admins` +-- + +DROP TABLE IF EXISTS `admins`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `admins` ( + `fk_user` int NOT NULL, + `id` int NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UKhp41pq62xgvtc2ybhg0ogn9k2` (`fk_user`), + CONSTRAINT `FK7atylq0pwosys9nu9m6i615yf` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `admins` +-- + +LOCK TABLES `admins` WRITE; +/*!40000 ALTER TABLE `admins` DISABLE KEYS */; +INSERT INTO `admins` VALUES (3,1),(52,2); +/*!40000 ALTER TABLE `admins` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `admins_seq` +-- + +DROP TABLE IF EXISTS `admins_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `admins_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `admins_seq` +-- + +LOCK TABLES `admins_seq` WRITE; +/*!40000 ALTER TABLE `admins_seq` DISABLE KEYS */; +INSERT INTO `admins_seq` VALUES (101); +/*!40000 ALTER TABLE `admins_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `assistance` +-- + +DROP TABLE IF EXISTS `assistance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `assistance` ( + `fk_student` int NOT NULL, + `fk_training_session` int NOT NULL, + `id` int NOT NULL, + `date_time` datetime(6) NOT NULL, + PRIMARY KEY (`id`), + KEY `FKhrljnnasyhhy0wacovapkhgll` (`fk_student`), + KEY `FKr5gxvfqh4k1jws31ymlw80nin` (`fk_training_session`), + CONSTRAINT `FKhrljnnasyhhy0wacovapkhgll` FOREIGN KEY (`fk_student`) REFERENCES `students` (`id`), + CONSTRAINT `FKr5gxvfqh4k1jws31ymlw80nin` FOREIGN KEY (`fk_training_session`) REFERENCES `training_sessions` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `assistance` +-- + +LOCK TABLES `assistance` WRITE; +/*!40000 ALTER TABLE `assistance` DISABLE KEYS */; +INSERT INTO `assistance` VALUES (2,302,352,'2025-05-11 14:19:43.234000'); +/*!40000 ALTER TABLE `assistance` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `assistance_seq` +-- + +DROP TABLE IF EXISTS `assistance_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `assistance_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `assistance_seq` +-- + +LOCK TABLES `assistance_seq` WRITE; +/*!40000 ALTER TABLE `assistance_seq` DISABLE KEYS */; +INSERT INTO `assistance_seq` VALUES (451); +/*!40000 ALTER TABLE `assistance_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `invoice_lines` +-- + +DROP TABLE IF EXISTS `invoice_lines`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice_lines` ( + `fk_invoice` int NOT NULL, + `fk_product_service` int NOT NULL, + `id` int NOT NULL, + `quantity` int NOT NULL, + `subtotal` decimal(38,2) NOT NULL, + `unit_price` decimal(38,2) NOT NULL, + `description` text, + PRIMARY KEY (`id`), + KEY `FK16v42x9o42cpvobfprperyat1` (`fk_invoice`), + KEY `FKt49wl938ncng8h5i3ivhw2851` (`fk_product_service`), + CONSTRAINT `FK16v42x9o42cpvobfprperyat1` FOREIGN KEY (`fk_invoice`) REFERENCES `invoices` (`id`), + CONSTRAINT `FKt49wl938ncng8h5i3ivhw2851` FOREIGN KEY (`fk_product_service`) REFERENCES `products_services` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `invoice_lines` +-- + +LOCK TABLES `invoice_lines` WRITE; +/*!40000 ALTER TABLE `invoice_lines` DISABLE KEYS */; +INSERT INTO `invoice_lines` VALUES (1,1,1,1,50.00,50.00,NULL),(1,1,2,1,50.00,50.00,NULL); +/*!40000 ALTER TABLE `invoice_lines` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `invoice_lines_seq` +-- + +DROP TABLE IF EXISTS `invoice_lines_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice_lines_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `invoice_lines_seq` +-- + +LOCK TABLES `invoice_lines_seq` WRITE; +/*!40000 ALTER TABLE `invoice_lines_seq` DISABLE KEYS */; +INSERT INTO `invoice_lines_seq` VALUES (101); +/*!40000 ALTER TABLE `invoice_lines_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `invoices` +-- + +DROP TABLE IF EXISTS `invoices`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoices` ( + `fk_user` int NOT NULL, + `id` int NOT NULL, + `total` decimal(38,2) NOT NULL, + `date` datetime(6) NOT NULL, + `status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL, + PRIMARY KEY (`id`), + KEY `FKdhc51ih4oqto9ng00e4ioso7w` (`fk_user`), + CONSTRAINT `FKdhc51ih4oqto9ng00e4ioso7w` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `invoices` +-- + +LOCK TABLES `invoices` WRITE; +/*!40000 ALTER TABLE `invoices` DISABLE KEYS */; +INSERT INTO `invoices` VALUES (1,1,50.00,'2025-05-08 16:22:31.643179','PAID'); +/*!40000 ALTER TABLE `invoices` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `invoices_seq` +-- + +DROP TABLE IF EXISTS `invoices_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoices_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `invoices_seq` +-- + +LOCK TABLES `invoices_seq` WRITE; +/*!40000 ALTER TABLE `invoices_seq` DISABLE KEYS */; +INSERT INTO `invoices_seq` VALUES (51); +/*!40000 ALTER TABLE `invoices_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `iva_type` +-- + +DROP TABLE IF EXISTS `iva_type`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `iva_type` ( + `id` int NOT NULL, + `percentage` decimal(38,2) NOT NULL, + `description` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `iva_type` +-- + +LOCK TABLES `iva_type` WRITE; +/*!40000 ALTER TABLE `iva_type` DISABLE KEYS */; +INSERT INTO `iva_type` VALUES (1,21.00,'IVA General'); +/*!40000 ALTER TABLE `iva_type` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `iva_type_seq` +-- + +DROP TABLE IF EXISTS `iva_type_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `iva_type_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `iva_type_seq` +-- + +LOCK TABLES `iva_type_seq` WRITE; +/*!40000 ALTER TABLE `iva_type_seq` DISABLE KEYS */; +INSERT INTO `iva_type_seq` VALUES (51); +/*!40000 ALTER TABLE `iva_type_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `memberships` +-- + +DROP TABLE IF EXISTS `memberships`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `memberships` ( + `end_date` date NOT NULL, + `id` int NOT NULL, + `start_date` date NOT NULL, + `status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL, + `type` enum('ADVANCED','BASIC','NO_LIMIT','PREMIUM','TRIAL') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `memberships` +-- + +LOCK TABLES `memberships` WRITE; +/*!40000 ALTER TABLE `memberships` DISABLE KEYS */; +INSERT INTO `memberships` VALUES ('2025-06-09',1,'2025-05-09','ACTIVE','BASIC'),('2025-08-09',2,'2025-05-09','ACTIVE','ADVANCED'),('2025-11-09',3,'2025-05-09','ACTIVE','PREMIUM'),('2026-05-09',4,'2025-05-09','ACTIVE','NO_LIMIT'),('2025-05-31',52,'2025-05-14','ACTIVE','TRIAL'); +/*!40000 ALTER TABLE `memberships` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `memberships_seq` +-- + +DROP TABLE IF EXISTS `memberships_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `memberships_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `memberships_seq` +-- + +LOCK TABLES `memberships_seq` WRITE; +/*!40000 ALTER TABLE `memberships_seq` DISABLE KEYS */; +INSERT INTO `memberships_seq` VALUES (151); +/*!40000 ALTER TABLE `memberships_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `notifications` +-- + +DROP TABLE IF EXISTS `notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notifications` ( + `id` int NOT NULL, + `shipping_date` datetime(6) NOT NULL, + `type` varchar(100) DEFAULT NULL, + `title` varchar(200) NOT NULL, + `message` text, + `status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `notifications` +-- + +LOCK TABLES `notifications` WRITE; +/*!40000 ALTER TABLE `notifications` DISABLE KEYS */; +INSERT INTO `notifications` VALUES (1,'2025-05-09 16:22:31.581882','Bienvenida','Bienvenido a MemberFlow','Gracias por registrarte','ACTIVE'),(2,'2025-05-09 22:00:00.000000','','Hola','Hola','ACTIVE'); +/*!40000 ALTER TABLE `notifications` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `notifications_seq` +-- + +DROP TABLE IF EXISTS `notifications_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notifications_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `notifications_seq` +-- + +LOCK TABLES `notifications_seq` WRITE; +/*!40000 ALTER TABLE `notifications_seq` DISABLE KEYS */; +INSERT INTO `notifications_seq` VALUES (101); +/*!40000 ALTER TABLE `notifications_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `payments` +-- + +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `amount` decimal(38,2) NOT NULL, + `fk_invoice` int NOT NULL, + `id` int NOT NULL, + `payment_date` datetime(6) NOT NULL, + `payment_method` enum('BANK_TRANSFER','CASH','CREDIT_CARD') NOT NULL, + `status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UK3ktj4gndg7wyqu8wqoyqlxonw` (`fk_invoice`), + CONSTRAINT `FKdryjs8tgr3kyuopc9aiwn1a62` FOREIGN KEY (`fk_invoice`) REFERENCES `invoices` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `payments` +-- + +LOCK TABLES `payments` WRITE; +/*!40000 ALTER TABLE `payments` DISABLE KEYS */; +INSERT INTO `payments` VALUES (50.00,1,1,'2025-05-09 16:22:31.697527','CREDIT_CARD','PAID'); +/*!40000 ALTER TABLE `payments` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `payments_seq` +-- + +DROP TABLE IF EXISTS `payments_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `payments_seq` +-- + +LOCK TABLES `payments_seq` WRITE; +/*!40000 ALTER TABLE `payments_seq` DISABLE KEYS */; +INSERT INTO `payments_seq` VALUES (51); +/*!40000 ALTER TABLE `payments_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permissions` +-- + +DROP TABLE IF EXISTS `permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permissions` ( + `id` int NOT NULL, + `name` enum('FULL_ACCESS','MANAGE_STUDENTS','VIEW_OWN_DATA') NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `permissions` +-- + +LOCK TABLES `permissions` WRITE; +/*!40000 ALTER TABLE `permissions` DISABLE KEYS */; +INSERT INTO `permissions` VALUES (1,'FULL_ACCESS'),(2,'MANAGE_STUDENTS'),(3,'VIEW_OWN_DATA'); +/*!40000 ALTER TABLE `permissions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permissions_seq` +-- + +DROP TABLE IF EXISTS `permissions_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permissions_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `permissions_seq` +-- + +LOCK TABLES `permissions_seq` WRITE; +/*!40000 ALTER TABLE `permissions_seq` DISABLE KEYS */; +INSERT INTO `permissions_seq` VALUES (101); +/*!40000 ALTER TABLE `permissions_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `products_services` +-- + +DROP TABLE IF EXISTS `products_services`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `products_services` ( + `fk_iva_type` int NOT NULL, + `id` int NOT NULL, + `price` decimal(38,2) NOT NULL, + `type` varchar(45) NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(250) DEFAULT NULL, + `status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL, + PRIMARY KEY (`id`), + KEY `FKr8m24u7qbyvbd8sjiq7g3jik0` (`fk_iva_type`), + CONSTRAINT `FKr8m24u7qbyvbd8sjiq7g3jik0` FOREIGN KEY (`fk_iva_type`) REFERENCES `iva_type` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `products_services` +-- + +LOCK TABLES `products_services` WRITE; +/*!40000 ALTER TABLE `products_services` DISABLE KEYS */; +INSERT INTO `products_services` VALUES (1,1,50.00,'Servicio','Clase de JiuJitsu',NULL,'ACTIVE'); +/*!40000 ALTER TABLE `products_services` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `products_services_seq` +-- + +DROP TABLE IF EXISTS `products_services_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `products_services_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `products_services_seq` +-- + +LOCK TABLES `products_services_seq` WRITE; +/*!40000 ALTER TABLE `products_services_seq` DISABLE KEYS */; +INSERT INTO `products_services_seq` VALUES (51); +/*!40000 ALTER TABLE `products_services_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `roles` +-- + +DROP TABLE IF EXISTS `roles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `roles` ( + `id` int NOT NULL, + `name` varchar(45) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `roles` +-- + +LOCK TABLES `roles` WRITE; +/*!40000 ALTER TABLE `roles` DISABLE KEYS */; +INSERT INTO `roles` VALUES (1,'ROLE_STUDENT'),(2,'ROLE_TEACHER'),(3,'ROLE_ADMIN'); +/*!40000 ALTER TABLE `roles` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `roles_permissions` +-- + +DROP TABLE IF EXISTS `roles_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `roles_permissions` ( + `fk_permission` int NOT NULL, + `fk_role` int NOT NULL, + PRIMARY KEY (`fk_role`,`fk_permission`), + KEY `FKlboaow7qn1m64rwjr8ifl6w2d` (`fk_permission`), + CONSTRAINT `FKlboaow7qn1m64rwjr8ifl6w2d` FOREIGN KEY (`fk_permission`) REFERENCES `permissions` (`id`), + CONSTRAINT `FKo60viy4q37nhjd2xyl242anba` FOREIGN KEY (`fk_role`) REFERENCES `roles` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `roles_permissions` +-- + +LOCK TABLES `roles_permissions` WRITE; +/*!40000 ALTER TABLE `roles_permissions` DISABLE KEYS */; +INSERT INTO `roles_permissions` VALUES (1,3),(2,2),(3,1),(3,2); +/*!40000 ALTER TABLE `roles_permissions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `roles_seq` +-- + +DROP TABLE IF EXISTS `roles_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `roles_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `roles_seq` +-- + +LOCK TABLES `roles_seq` WRITE; +/*!40000 ALTER TABLE `roles_seq` DISABLE KEYS */; +INSERT INTO `roles_seq` VALUES (101); +/*!40000 ALTER TABLE `roles_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `student_history` +-- + +DROP TABLE IF EXISTS `student_history`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `student_history` ( + `event_date` date DEFAULT NULL, + `fk_student` int NOT NULL, + `id` int NOT NULL, + `description` varchar(255) DEFAULT NULL, + `event_type` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `FKfifyby18m8fetblwf5nfg33gx` (`fk_student`), + CONSTRAINT `FKfifyby18m8fetblwf5nfg33gx` FOREIGN KEY (`fk_student`) REFERENCES `students` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `student_history` +-- + +LOCK TABLES `student_history` WRITE; +/*!40000 ALTER TABLE `student_history` DISABLE KEYS */; +INSERT INTO `student_history` VALUES ('2025-05-09',1,1,'Primera clase','Clase de prueba'); +/*!40000 ALTER TABLE `student_history` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `student_history_seq` +-- + +DROP TABLE IF EXISTS `student_history_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `student_history_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `student_history_seq` +-- + +LOCK TABLES `student_history_seq` WRITE; +/*!40000 ALTER TABLE `student_history_seq` DISABLE KEYS */; +INSERT INTO `student_history_seq` VALUES (51); +/*!40000 ALTER TABLE `student_history_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `students` +-- + +DROP TABLE IF EXISTS `students`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `students` ( + `birthdate` date NOT NULL, + `fk_membership` int DEFAULT NULL, + `fk_user` int NOT NULL, + `id` int NOT NULL, + `dni` varchar(10) NOT NULL, + `belt` varchar(20) DEFAULT NULL, + `parent_name` varchar(50) DEFAULT NULL, + `medical_report` varchar(500) DEFAULT NULL, + `progress` text, + PRIMARY KEY (`id`), + UNIQUE KEY `UK3ci8o1dbwgn49fx4tkhk579fk` (`fk_user`), + UNIQUE KEY `UKoljr3bj7rsof5ys5e9v932g9l` (`dni`), + UNIQUE KEY `UKgjomxh7uemp64sjo69mkefqbh` (`fk_membership`), + CONSTRAINT `FKj3wyb55uh73yti619x84pfe7s` FOREIGN KEY (`fk_membership`) REFERENCES `memberships` (`id`), + CONSTRAINT `FKkqp52wo7o073loxihnbf133wq` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `students` +-- + +LOCK TABLES `students` WRITE; +/*!40000 ALTER TABLE `students` DISABLE KEYS */; +INSERT INTO `students` VALUES ('2005-05-20',1,1,1,'12345678A','Blanco','Padre Estudiante','Apto','Buena evolución'),('2025-05-10',3,103,2,'123456789','Blanco','','',NULL); +/*!40000 ALTER TABLE `students` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `students_groups` +-- + +DROP TABLE IF EXISTS `students_groups`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `students_groups` ( + `fk_group` int NOT NULL, + `fk_student` int NOT NULL, + PRIMARY KEY (`fk_group`,`fk_student`), + KEY `FKqibb3ps0nfj4kkx6kd1qn7mkd` (`fk_student`), + CONSTRAINT `FKp6ck2q2xcptfj526ipa1ki56g` FOREIGN KEY (`fk_group`) REFERENCES `training_groups` (`id`), + CONSTRAINT `FKqibb3ps0nfj4kkx6kd1qn7mkd` FOREIGN KEY (`fk_student`) REFERENCES `students` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `students_groups` +-- + +LOCK TABLES `students_groups` WRITE; +/*!40000 ALTER TABLE `students_groups` DISABLE KEYS */; +INSERT INTO `students_groups` VALUES (452,2); +/*!40000 ALTER TABLE `students_groups` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `students_seq` +-- + +DROP TABLE IF EXISTS `students_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `students_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `students_seq` +-- + +LOCK TABLES `students_seq` WRITE; +/*!40000 ALTER TABLE `students_seq` DISABLE KEYS */; +INSERT INTO `students_seq` VALUES (101); +/*!40000 ALTER TABLE `students_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `teachers` +-- + +DROP TABLE IF EXISTS `teachers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `teachers` ( + `fk_user` int NOT NULL, + `id` int NOT NULL, + `discipline` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UK352b5808rcgb1un47hwig1gq2` (`fk_user`), + CONSTRAINT `FKeujs3kyjh75c0u93b731i9rua` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `teachers` +-- + +LOCK TABLES `teachers` WRITE; +/*!40000 ALTER TABLE `teachers` DISABLE KEYS */; +INSERT INTO `teachers` VALUES (2,1,'Jiu-Jitsu'),(102,2,'Jiujitsu'); +/*!40000 ALTER TABLE `teachers` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `teachers_seq` +-- + +DROP TABLE IF EXISTS `teachers_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `teachers_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `teachers_seq` +-- + +LOCK TABLES `teachers_seq` WRITE; +/*!40000 ALTER TABLE `teachers_seq` DISABLE KEYS */; +INSERT INTO `teachers_seq` VALUES (101); +/*!40000 ALTER TABLE `teachers_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `training_groups` +-- + +DROP TABLE IF EXISTS `training_groups`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `training_groups` ( + `fk_teacher` int NOT NULL, + `id` int NOT NULL, + `schedule` datetime(6) NOT NULL, + `level` varchar(45) DEFAULT NULL, + `name` varchar(45) NOT NULL, + PRIMARY KEY (`id`), + KEY `FKhgbvfsm24yptkm76cbhtbv4s4` (`fk_teacher`), + CONSTRAINT `FKhgbvfsm24yptkm76cbhtbv4s4` FOREIGN KEY (`fk_teacher`) REFERENCES `teachers` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `training_groups` +-- + +LOCK TABLES `training_groups` WRITE; +/*!40000 ALTER TABLE `training_groups` DISABLE KEYS */; +INSERT INTO `training_groups` VALUES (2,452,'2025-10-22 12:35:00.000000','Avanzado','JiuJitsu'); +/*!40000 ALTER TABLE `training_groups` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `training_groups_seq` +-- + +DROP TABLE IF EXISTS `training_groups_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `training_groups_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `training_groups_seq` +-- + +LOCK TABLES `training_groups_seq` WRITE; +/*!40000 ALTER TABLE `training_groups_seq` DISABLE KEYS */; +INSERT INTO `training_groups_seq` VALUES (551); +/*!40000 ALTER TABLE `training_groups_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `training_sessions` +-- + +DROP TABLE IF EXISTS `training_sessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `training_sessions` ( + `fk_group` int NOT NULL, + `id` int NOT NULL, + `date_time` datetime(6) NOT NULL, + `status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL, + PRIMARY KEY (`id`), + KEY `FKkjj30gdo7uua9ycvlriax2vep` (`fk_group`), + CONSTRAINT `FKkjj30gdo7uua9ycvlriax2vep` FOREIGN KEY (`fk_group`) REFERENCES `training_groups` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `training_sessions` +-- + +LOCK TABLES `training_sessions` WRITE; +/*!40000 ALTER TABLE `training_sessions` DISABLE KEYS */; +INSERT INTO `training_sessions` VALUES (452,302,'2025-10-22 12:35:00.000000','ACTIVE'); +/*!40000 ALTER TABLE `training_sessions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `training_sessions_seq` +-- + +DROP TABLE IF EXISTS `training_sessions_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `training_sessions_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `training_sessions_seq` +-- + +LOCK TABLES `training_sessions_seq` WRITE; +/*!40000 ALTER TABLE `training_sessions_seq` DISABLE KEYS */; +INSERT INTO `training_sessions_seq` VALUES (401); +/*!40000 ALTER TABLE `training_sessions_seq` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `fk_role` int NOT NULL, + `id` int NOT NULL, + `register_date` datetime(6) NOT NULL, + `phone_number` varchar(30) NOT NULL, + `name` varchar(50) NOT NULL, + `surname` varchar(50) NOT NULL, + `address` varchar(100) NOT NULL, + `email` varchar(100) NOT NULL, + `password` varchar(255) NOT NULL, + `status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `UKavh1b2ec82audum2lyjx2p1ws` (`email`), + KEY `FK5k6cr6ejda3jhunshjbx4nhai` (`fk_role`), + CONSTRAINT `FK5k6cr6ejda3jhunshjbx4nhai` FOREIGN KEY (`fk_role`) REFERENCES `roles` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `users` +-- + +LOCK TABLES `users` WRITE; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; +INSERT INTO `users` VALUES (1,1,'2025-05-09 16:22:31.399041','600123456','Student','One','Calle Estudiante 123','student@example.com','$2a$10$G13aVWunAMLwQNDdca0BGuXeYxfH65TFriKHzpwU3OGZvR/6O.poO','ACTIVE'),(2,2,'2025-05-09 16:22:31.501044','611123456','Teacher','Uno','Calle Maestro 1','teacher@example.com','$2a$10$.0KMijc2nwqwJgUDiosN1.vzXHqiy9Ge6gzOiOKLwmOmiLa9yC85a','ACTIVE'),(3,3,'2025-05-09 16:22:31.568593','622123456','Admin','Root','Central','admin@example.com','$2a$10$u9k50gWu3eMG.KF1brVeC.O6UPob0DQgAdNxc.Y63AE1ZPkcwRVNy','ACTIVE'),(3,52,'2025-05-09 16:24:48.404428','675529497','Dennis','Eckerskorn','Carrer d\'Azorín, 30 Bajo','deckerskorn@mf.com','$2a$10$sg1Cy1AvimKBWEaZvGG3Ue.qdwclJre7VBvAHKrPTtY5dD9R4ZWqO','ACTIVE'),(2,102,'2025-05-10 19:07:22.957486','1234567','Steve','Newman','Pedreguer','steve@mm.com','$2a$10$iNJiV73bUopf0iiQvouqM.SWLPOnzCjRFPbilWLbHiRR7l6IivrAu','ACTIVE'),(1,103,'2025-05-10 19:09:09.423529','1234567','Miriam','Valiña','Carrer d\'Azorín, 30 Bajo','miriam@mf.com','$2a$10$ghObW0nZdg8qo.RRNgEZd.OrUC0vlebRjuaKeX5uEvH/6nwgqqtCa','ACTIVE'); +/*!40000 ALTER TABLE `users` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `users_notifications` +-- + +DROP TABLE IF EXISTS `users_notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users_notifications` ( + `fk_notification` int NOT NULL, + `fk_user` int NOT NULL, + PRIMARY KEY (`fk_notification`,`fk_user`), + KEY `FKr4iwf238qbl6oa8x16gj17jud` (`fk_user`), + CONSTRAINT `FK3sbul72qkfqxu2vgqk5fw2u` FOREIGN KEY (`fk_notification`) REFERENCES `notifications` (`id`), + CONSTRAINT `FKr4iwf238qbl6oa8x16gj17jud` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `users_notifications` +-- + +LOCK TABLES `users_notifications` WRITE; +/*!40000 ALTER TABLE `users_notifications` DISABLE KEYS */; +INSERT INTO `users_notifications` VALUES (1,1),(1,2),(1,3),(2,52); +/*!40000 ALTER TABLE `users_notifications` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `users_seq` +-- + +DROP TABLE IF EXISTS `users_seq`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users_seq` ( + `next_val` bigint DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `users_seq` +-- + +LOCK TABLES `users_seq` WRITE; +/*!40000 ALTER TABLE `users_seq` DISABLE KEYS */; +INSERT INTO `users_seq` VALUES (201); +/*!40000 ALTER TABLE `users_seq` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-05-12 21:57:25 diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 0000000..1c92756 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,10 @@ +server { + listen 80; + server_name localhost; + + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri /index.html; + } +} diff --git a/memberflow-api/.gitignore b/memberflow-api/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/memberflow-api/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/memberflow-api/.idea/.gitignore b/memberflow-api/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/memberflow-api/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/memberflow-api/.idea/encodings.xml b/memberflow-api/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/memberflow-api/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/memberflow-api/.idea/misc.xml b/memberflow-api/.idea/misc.xml new file mode 100644 index 0000000..ecfa09c --- /dev/null +++ b/memberflow-api/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/memberflow-api/.idea/vcs.xml b/memberflow-api/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/memberflow-api/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/memberflow-api/README.md b/memberflow-api/README.md new file mode 100644 index 0000000..e768f9b --- /dev/null +++ b/memberflow-api/README.md @@ -0,0 +1,60 @@ +# MemberFlow-API + +## Descripción del Proyecto + +**MemberFlow-API** es el módulo de interfaz de usuario y controladores de la aplicación **MemberFlow**, diseñado para gestionar membresías, usuarios, clases y finanzas en un entorno organizacional. Este proyecto actúa como la capa de presentación y comunicación, exponiendo servicios RESTful que interactúan con el módulo de datos **MemberFlow-Data**. + +El objetivo principal de **MemberFlow-API** es proporcionar una interfaz segura y eficiente para que los clientes (como aplicaciones web o móviles) puedan interactuar con la lógica de negocio y la base de datos subyacente. + +--- + +## Características Principales + +- **Controladores REST**: Exposición de endpoints para gestionar usuarios, roles, notificaciones, clases y finanzas. +- **Seguridad**: Implementación de autenticación basada en JWT (JSON Web Tokens). +- **Integración con MemberFlow-Data**: Uso del módulo de datos para acceder a la lógica de negocio y la persistencia. +- **Configuración Centralizada**: Uso de `application.properties` para gestionar parámetros clave como JWT y otros ajustes. +- **Ejecución con Spring Boot**: Aplicación basada en el framework Spring Boot para facilitar el desarrollo y despliegue. +- **Modularidad**: Integración con el módulo **MemberFlow-Data** para mantener una separación clara entre la lógica de negocio y la capa de presentación. + +--- + +## Estructura del Proyecto + +El proyecto está organizado en los siguientes paquetes y archivos principales: + +### 1. **Configuración** +- **`application.properties`**: Archivo de configuración que incluye parámetros clave como JWT y ajustes de la aplicación. +- **`MemberFlowApplication`**: Clase principal para iniciar la aplicación Spring Boot. + +### 2. **Controladores** +- **`AdminController`**: Gestiona las operaciones relacionadas con los administradores, como la creación y gestión de usuarios administrativos. +- **`AuthController`**: Maneja la autenticación y generación de tokens JWT para garantizar la seguridad de los endpoints. +- **`StudentController`**: Proporciona endpoints para gestionar estudiantes, incluyendo inscripción, actualización de datos y consultas. +- **`TeacherController`**: Gestiona las operaciones relacionadas con los profesores, como la asignación de grupos y la gestión de clases. +- **`UserController`**: Controlador genérico para operaciones relacionadas con usuarios, como la gestión de perfiles y roles. + +### 3. **Seguridad** +- **`SecurityConfig`**: Configuración de seguridad para proteger los endpoints mediante autenticación JWT. +- **`JwtAuthFilter`**: Filtro para validar los tokens JWT en cada solicitud, asegurando que solo usuarios autenticados puedan acceder a los recursos protegidos. +- **`JwtUtil`**: Utilidad para generar y validar tokens JWT, incluyendo la configuración de tiempos de expiración y claves secretas. + +### 4. **Recursos** +- **`application.properties`**: Archivo de configuración centralizado para parámetros clave de la aplicación. + +--- + +## Configuración del Proyecto + +### Requisitos Previos + +1. **Java 17 o superior** +2. **Maven** +3. **Dependencia del módulo MemberFlow-Data** + +### Ejecución del Proyecto + +1. Clona el repositorio: + ```bash + git clone https://github.com/tu-usuario/memberflow-api.git + cd memberflow-api \ No newline at end of file diff --git a/memberflow-api/libs/memberflow-data-1.0-SNAPSHOT.jar b/memberflow-api/libs/memberflow-data-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..afe7e7ae80851c9fe5135ada6897d6a89b519f0b GIT binary patch literal 260039 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êq0*;7rCe*RkaVnDhVsIGdOF#)!QX<^@%WnGyw?b+Vbf&ZwnmPjQ*lS?HhdrZEmRM|`wG-nIjugu^ zJc&MvUPWJmJ({3Gpt}$w>q|K!S`ZuwMUp1?ul!uGx!Pvi%d9b|4IXST>HY6$>hM-n zhj$_aIoJG-`>~#}7lTGRY+MxIn_=+a;aOvOZM^JEtFUi5R^UnMv_mO^!8I(9lo>I$ z%qp`IR>5P4IQOtL!L>4RyKvvDZSJ>ARc#+==U{B09F^m~T6B{cS$GI}Vn2+M99mDF zv~=c!#-1bM@YInZ@~*iq`{|DZG_YrOM^-- z+V`8rKg~+OSO*Y9mKl#bx0)>eB6i7EA!2ib8eqPwZ)D(1TW`S4e{IPI1x1FuCh>EjV z0h2vqL}Px(>Y-Y8+?@B?Q`5)Z#!&m?X55aN7?TsncVi))nKuT7-Oei>S`J6dfxW>@c3R?<=@R=4xHQ@;&?n+^w5cl` z*oR*#@O%C%LY-)ZUqS}7kSWq;ZN?UCB%Mk?)cWJ7f)iLj(lH`5!j&c(4b`n{6?Qe- zVgt4HG@Q5DW`@-w7UvqZD#{;_b9M^EBmJHVF!o@&HWD}hl?uW zPb;kMo4t@joo~Axq>*h^cG=qSiAQm$Tu7z>S0V+8UyWS`cN(va&!5=_e|@F36FDWc zh=n_!Bb~W7koO>fqtd@3v-kY9$s^;k?fFgpGo$fP7yQA#wyS1%^VG^p+Lf#A78sm> zRUs>ro$U$7r}{Teukx;eYYd)i%zXz&#KhI9`YQ29lPfa4d$3cqUIJ7^4sz>L&Xv{8 z`EmS=Ua!Kgg)G}z>)W+>I7un0uN29bni}1@tGYoy3NZ<#iqIrzHX(**hAKo1#Sh#vMv?(ciqvn3`sw^jPN(^}{@fj+_L3A4RA>Tcs zwio%i2y*3G@-oEWcCW<1q$J!l&2GwLVf6lPSyIRed*;yW(p~4!DV7tFV2HkoOjN{t zy6`Xx(!peEjwpjIu*GsW2#H;cZU#K!21o@fIvMV2=}W}NA<+J?O9Z9~Ja9x=nO5<( zNoVaZqwUP9@wIyeQ1`C~#?X7o4jGgJCf)>T!m0Hr2G8kGaJ+#|d)yBl9_rP*Alm8S z?-)?$VU%nQt`y#Ffl-Mchv#Jvo{M>@@%^hJWA7xI*tJz$gY-&u6zxq*XY>4IYonA^ zvf2Uy)v*N=T=xw<;@UgKOmC9lamG(*HZy11r~R7PXKQ2kP-2&(Ns_^fBjpKz#%{~s z-F53eYSe8wt3=X;KLiRpzh=vdAhpPinWBp4ZRE729((OeFGav7t2c!V$Xf5i8TNzF zdU816mq15=u1&G_N6=vtn`WSDtsfs3E|veBS0~eM;U9Up9$pKUr?)n;vlGffjU%vC&hydNRhVL=*+>@5v=P5@|!0OI9$l+hDzjpYK==xP1~74V(b{LRpW< zX}V;-l*ksJ45%i@D`ni67S(KHv?xw`+D$Wn$SM!Jp=r$6%@)s6Y>(v-ZX&>b72T3H zMV~|)3NdJr!m^={HqajNRb@YKwWRcgWsQ{Sp9_qUTgIr2-b7A~f#$i@91q!4r`)_^ z1(%aEb@9!#@JW`}WV*vetFa353@6d6Q!-j(@etcO9%`hHk-iU}Y+|-5toa3PXHo}f zlx5F|ZG|x65kB)CP{*GK5uno)g|*Tcnj$1^idn`!(1P*(mI2PTAX(|+z;aaMj;#CT zz->)8jp*rN(*${3=6S*{m@OXLiWB{8&e zjt$tIQ@3_EZe54t@_I4)GWzj!%Qq;HeP1RO9JOA*3)Y(kVIIVfWt-$+cI~Y-wrwT$ zXQ3&Y)p?yI!L6?^BU@Q~E3G@^w#0mcRNOPy^C^#$)k)D?b5v8`_ZwO8%aOb+rpCn~ zJNU9hDnAd5;)s|k9Z}G|@auVTZJBm^|AR@O?V{c8w$X`d$ZG)(%RmfsIRYmr(>wn_ z#0ImQRDYdR@_e8hMqZMGqTd2>#H<&qUhKgvBi{nS3LLx?Q1nLhVxE(~`bhm67+n{S zI{^o03IRMqaK zi&`XQhJ$z|Frt63d+UuLxHSDT@KOIO>O9kYkUoT@FQzGwOn>z`fM_E=fg_P3|* zb=b#jibT;|x8xDtTq1xV7xE+L#}HpZF~nQJalYoku+j)GYE=c%#b65_6boZ{8rdQz zTS$(#P?56fPO5-;e9l2z?za$t99#-E;}Rj54YyRSiWd$b*&6rY&+aLm z&byBXGT2MMpPOOc`h}7-jHXd;9a}+aJ1hDq3PjARX#sH%x5436FmCt~J`3^S=q4-5&lity*c2}#?y2&*Z#Z=}Y+?D)c8YsZWiR~|*G6UP!k^vh3m?K0;HzL@hM ziQSmT?a%ePQpJL)d=KYRkOT8P;HlTwLyR%|khdD1bF5VyvP|8adO654>^hwrAn}e= zr;Tj^`T8nt#c@RRqKJS0(a0bDYw4&$`O`@5I!Mdt=VWA?7 zi?u02Mlkw3r7Xc+$67BB&Z3tEMaV(2 zb*iQax0S0xVBCE22{j<*no8P&eDgDSIY#*Y@F5~KqAC6O zue^R%PJp*{40T}vHgMiw*N2nKN<30lceWCP*T#@sL)!=pn1#}3hr*4c%6Q>1j2Iz< zeu!Iv2PyboY8`#QU3$*UN|eWBN}iH$B^$E4V_N|DhX8ejyycKb#dxdw+}_YXsf3WCMuK^)jr-jWL= zbq-TEw3)rxQ9O9~Yk{>-UG)S@sCoR-+|)$bGJhuuK)dimGN5^6=k_*8S~Wr-0=68# zmr6a`L$0+GyIyF5x=G(NYC16tt?mg9M8iB{+mQHC56SfY_fZ@tir6r&4!#Uq=NDp-CqWVBa}#>tgdbUs52a*-a} z8Kzz`>IC*pSMl{j-+=Fp#-R6OSO4>^81R_u^Sv?afAYNT_+7p{o@Kqizv1`=UY2cP zbbn#9Fu_Q-NYiE2R1$|L`9s8m)R5#CcklCezH&R8Z5+dx_*{02d3~bWmR{30%m-t# z>c%{otqh6!I)=hWh=cB+4Z*!oeLKd~^;G2umtX9nu*P^V*FO9=>K?0R_vI6p`%+0RI|?9*{g!N_mbVxUNE=EFMgi@~Vbo*vA| z$PxUWg|=}vUp)=OcUGfcTm#J)tl>?!B%*yFjJGJ_O@hW3<13j6Lg%XBAFLvh_L%Z1 zV;LkiDamIPpY2mjU-qwasugzk&1gs=ORPs(x^PN)*mm20OoO zCzpT(KO4O|!2g`@jA8G|=ABejaNM*V*-=ImcpkhK=hs6&^w;2aPe`A|N**-x`--d7H0d7|9IfY%UQI|G9U6=wL-qHY>0`?8J43fi_*@px+_w1Iv#8P0pwMe!@O^y2<| z)nRCFcOSisTSObH5b|bmh3(T8yjkb`-bje;&wK^#+Sse~svj}z?Il4LrLu=1Qk_~f zV(Od)s~EyXhG>RxuijHJURzJmTA6$ZfuWNzZ(A=^`)b~u#r5@ukglHm(1h>ytU}sNl1SsC zCG???$J5zWh@&f{@ORJngnYQ^8n#;5u%r7{`|HEaCXXNE2#eVD^~gG$GndQ_De`f& zrF+An0EfQ2JXjbwTw@U}KM+|rhgS^Jjrxr-#7ob)R450`O*-&az zPWaNSBWWs@$sqj}4FZrOQxB>smPwj&w#mU=`$laLscA>fD#l6DJ*vj4AkRi^c&n)! zbMxI%B>wNc?#RJU_&^u=mn4?wHEZDN4yQn4=(i9=wS|sAFto~>K*_4*55V%Y%A-J2 z_Rj-fOT2;9itf*fmY8Xv#PT`zw z+peg;A~cS?q)p>!^;xW}L2#PJRPQodS%+yij-<*@;cSx3R@HyKna0^H>Z__3*)ol> zQREntn?b7$SEDZ}&xBq#!6E+-oK6+KkTZnuzFezE9+lR8*eR8RZ<8*|r5hFE;$20g#6>Cw z8Lsh7C&&kOD;z2(vQMeNI|@0Sd#@1M2C4L*HEg?{7oGk7dB_{u7?-hVIOCnDzBA^W z(5&=Q`f4Cdl%PzMsPiQqt^+*Lr;o|^MscHtKjX|-zp6gJ>*ne z2le2dz6HE5`ukPDSX{G!7yhTk=ax(wj-F&(o3p6b`na-oFyF^TzWIqw%%2w zPs4QwGbpD?;H?}SAWzC?=bQs+&d2iMR-}nLE>K(_Gb(AwfYj;>q8l+%ETR*SZXsgQ z1i8Dlhowmxq^k?v6y0}OYExnVx?5k_iM5K`7C>ZLVGAlJPTeU__hkfVlD}kzS$=(( zSsvRM8-@&{{>Q@Sw>)LTvXO%>koNXaPX;3EZ27*g|gW^@)y`y}!NNa&l$K zTelV+`4URktZiN%Emi}iX^%MU%Oq}UxztQl>xQilOA_*&!Vp7I`#x36&<_0I-v|Rdl^wSjzCA!$ywe-hDyTH8bHME#GLIs) zS6UjvgfNNl-perw7gXNt3R5FrRaO#HAO~0o>x)h+yU^5QK*|f8Lslx;bPo52rknYw z;qG4v%j8&wlZTdbnzgE1K*bSvtsu4eOcTuWFJ)SmRxGA#HmX#y1ncFrC^g~kTm52P zDd0%x1r1%39^-Y%B<|pHjm$MfW)hAjEg)`Le0=$_e;4aDybkmjehZe4gsF)X657TA zf1M*8F7+jxGxSLpXa6+=DNPfJ1HiLZ&syicu^xMm{wDFK{m5^1%VxMn)I zZ6+`t{`!D*NRFAy)xolz&D5i-(wkKu?XLxAmT_%1pJf^7%A^ab4p?!;bgC73wumqOcZ$P z^9EBfKo3fu7FChL0Ea7BWm~@6bG`H6$_7O3DYv1>24(Hy+T&&eyA5X8BW8mm4zyo^ zWkb&PKPS)X0$uinTmfr?<@F7RU*S&$NY!EWge~s9a^TVrd)Q;I^c|_g^7TQqfo$$d zaud`D;`;_GwBg8wSY6?@Aut4B95%Ywbd8L9_4s*t77$wC*Zhv3L{M4yOSM z4N+}J<8~3=5Vxq2E>L6_Bzd>!O8tpV`{@-BI)@DvMpWFI zA?2dy^*inRU3HNSUXrnQk;#PaNU`i8E@-=pXhPLWe!UW_z|c)v88}mf?IH%>m9c<* zlZYJ9TBx{camMH()d9McNE^^A{=Qqg5OdYz4CzgD9@r~|*cY~NaE162`$^mr`h&U~ z`ZIAmNUj)hPwA)9Q?%m3tPSUto))pUK^E|5<8&y4%`KpKa?bR&@W+Zj!lnb&CR@Sc zN>C(StVhct(@qO0to4p)>pAn67M&pS7To%!7F0?=A#Ig3@50%3h=wUVk;@OT z_5tsX+Qz*Yn45M3{E=e zYaEseXX}CET%8Sr4xFtWv!kYCt*)>}9<5JGuv$NxH4~4GW z+i~RLecTJT0yDe7K^@_~9l<&@dSkneyXnhs$54*X8pgdbKTHrBsegdHW|v^?`2f#^ zfsUQP4igSrC3i#W(`azbV0SwyI@abh6(oZ#`Lm6u~g2C1tJqQ{%ei2}aV!;U^a~S+GQl zRdIDTNIo&?;IQ3DV@@sRUo})xNqs%^!G&WKOoBhO{ z+(c3V)3w}0Sq0)}sAPm2BO8AOk~PZZQLwV%g|Yc3ZHl6Drtr5+K$2dxWE|zv-j4hy zW)NA$0_#tIWgF8<)zr#q$z=rTWz#ZCC&gwV#pd>kje?4eF6C-wmG6?vl}gPa6&nT> z8+!}LWc5*^t%_Wc$L%kEe=bxgX2$I+fdT>wL<0h1`S)p7M^_6YK-Z#xp_8+tfswP4 z$=_c5J=5B({_KXjirq~L8;3kd5e*#`@f#=w6R8+j=}QqHFi(IG8|~e`Tvmij?tNg-JfP9l_z*&Rcza~ZQHhOJE^#0+jdg1ZQC{~nf!ZZ zy8G?5W_qoeFZcOyzMggNYwf*%*G@#v<{+AC+j1tgdow+f?wd#wVT$`Tu|G>*VH6U& z#5e=8{wuL~b6+OKGzpwQfqCDk{y(||Km84XE36?@cK~a+@ z>{(iAHIQmvZ({_7q+^u}bcyY1|9=ZWoQ1&zQ+{5XZ_=NAncs z7+YJj)WYV>)Y=YZ{_3jkPsD5Zpm>VxJ{4zNx5TLSqzsS|rxoJjbauvEp{4oGZDlVb z(EVu;6cgfN!3h0E_3hDeyqmq1Fkku8i%V>RX#(rKZvZ>~6Rf}3NERs9|C4#Q z@pSeVp!}%s?`VX)33-xEsNBAPEbdQ;A`Y!z8+it!(Kn;7**Db-5*sIws56u!vBN5* z{BeN2WSLN8VB$P%J1)ds$^nnRwgf-?_)F67__vq1_@oDFd=yWag~I2!llCD}T{IX8!=3r6Y6L>_Kvj>Jn8?>mrELtBsikI!7$kISpkv zi}mi%c_Dtefw;uQnuMS`a%&U6Ukn*tQ7oi|#FvJKFPj@KX5SGDy`xxFxW$-_0my0E4@u;;>1!f9Tiq_B1y7^imnoMTWcp%Zadrb3MwsEOY~|D;$I#hceP<1 zV$Uj8*e4YXZ9OS$$V9fI;}O16o;A14GiwBFH-ele?cLhsFwlNulW15sOuz1KNZey< z&^^|zDCVDnztd~L>Sypy9Vzl_ATP9fK=J}*XTQ-r%h}SH=Z9qXtFO(@`%52XX9Yoq zZf6nZ4VNyJiaBvS6vgO1Etx&QZ{}9)RnbeXKZTKWJl&;4#C;GfuEqC{L|5Kc<%2mn z`pRkT>4A;H2IE2de39T&wcBE6Og;Jng5Sqg+@!onjm0`q3SA+fhSVMw@1)gs2i$hb z>o9Cih*H?2l7m6ad{z4JWc$m{^SK)x+vB;*jVS`$sMjI5L{~GvbYG|&|2iT&wr9c% zu!v-G2J!dy7r1S7+$TEbVHnPKS&mwP*~_pPJng~enEollG{gt$lc)-K*yJK;l4+_9Eaf~95O*zuT!yHwpp zcbLq`UCMC_*>Q`C!%wpMis<-Xa;Da)OKxfbucL1;Is85^jJ+=;M)wo^jfu_?FS-L> zbgP@nf1U868y%FbWb$HHRwG>+33fZxhaWp@$g??7jdqloG6_93_QZ1L1kYOsL~0E5 z8yG#21zFfRt=!(oC32)W7oDLcc4hdM1Df8f)^Z`i8R*Tu$Y8g`s(TdG+>;zi3Dzai zFfDew>l@nxTW&WxMP(#}TS!QBVU|+DEhL3r4E}zC!&Z^{nNB4_j&`+t7>J(9RSUCg z49CM8nRurZh(g1#>b)u}CaC}z>{#vg3u@N>{ZTV2qzV?n_3})mi01!#Y9r-V1vL`_ z2kObT4jA!v2v%BzYIRupQi7_509j~&ENz-0`@?2ouatu0ksW~bfi;=KCBYeERCTzB z8tQ*L0a5IU8cxQ6 zNAwqynjVWR|DGCUb|GFUTO0Rga0JUnssQlS9bk1Nlmt2#ncU9QKdph^3A;q zdr7eLi_WRtoOs<afM|I2V$$^Bag#5eW4 zeN)f>W4iHs$nXE8p8wU=@ZVqj4^P8?08!C@10vMVY-?%_m_F9N+~5_%rp^J$Kq*Dz z4NNQuE>;9%X?&Ygb%5Q3R0ENl=rq;?PpYVd+p- zZAhWcXg*3?(sV7a%!bc)>~g9S&t-`%47`*FlikJ<6i~ByAB(gsEkd>ir`Y~pa;CjfBGiZ-5@mJ!ngz{R2Z7?@LVT~;3= zogl1asi{SjIz!&LzrDp=x}$gOpD5QtcmdWdpMlI)LxB`CiRrqEYKxWCm_^oG22)N6 z$qn~X^*abn4%~$H_}&a<=kak2k2p0#bK(I%C>a13E4AI3HE4{2e(GHo zDl-Or*exZ$;SffAM}1HETOH{muOO(It{g8L|U2=*=yfjcIVWKVFz#=eJXu( zJAKp?P1p_=#&snyy#QL7Mqn=uqC`e z1^hFL8UR0E{FQHc$kN_WVewA_KzT$_)paQ2uPaL!ln)vKxQm+OxmFIh7t<$ps?k>~ zH4`(OjB{PumJ>$2O1=^-(d7TSBlW3x=E83SaLvuv-Z zuvpi!^)IO0QOb?QCc{=1Ur5HSn!7Tm`pxMou=qMi&6A*MXo|+SR3@pPjM4Mv?{mj! zrMWNs&V0K}FSIH955rc0ZG&;My$*a$jlaF6Gnv3UTP`wn|7C9pA_Ak0 zQEo0ua}|&H_X}e;(y$t;H>_UCkh~YQ+>G!6+^?!6=*7f0duA{r>nQCCEO0R0mEa19 zOi|CW80NTik+Jct`9B2H$}43WF1o2#%7UXDC7PIg?@^Oe`J#)wi|A9oj%u)<5n86_ z+*=<@ffplOmIfZ8H1Fbx0zJ+9FSEsB-Yb{GR3yzVEv! zh5r1U<1tiY>gM~A4{l69V!TzU4&cahNaH+bG>mtHDx6Y-xk_;QQ>DN!)`nMZTL^~f zC%SS_%be9zKM^{*=sL%Y<63&5U_^F9#>s^x4J5=yac$nAllVZb8N6lVJ^7-wCw~xO zQk^t8&Dq{s#Y1_XG#7Xe%-)?ZS6C?WF<)a&r8?Zu5xa-QG8@eU-=o{|X@69Sp0$r( z#x@m9XNIw8lMz*v*vP+f(v#nJPlW8~AV;kui~hHuYs8E{cmwHoIHLpMS2x=P%j~y@ z`t}c;heryDx}~ee4=2Coi)O&CZM|Ef2R<*tw?l$EhPdqG7mthQ-V1B@&sMie)fqm^ z!-v>p&c?VR&#m6r*r!jfmBrxC=em8ILRuH@_SoUA%k!QX<_zu!T*jJ2^F*uKL}`#P zi9J5H0)kDo_9HKbUR@YK=GE@7k=u;V9%r_x6Z*8J#mf ztodHfskW2s9#sBw!AxH{#73w_CElwc3&|D<;Eof!q!+s3S_3ja_8mcUB61Cq1p}Hj z=w1(c^n7OvB7@9E!ifD3SH@OoH+zQAZWnFfexh?5yV&xvPJblX71n1u)w5G1T#Uaj zh|HUVg;_FQ&F|V+s+vXeEFyS1QAj)ZPK)QCc>B|ic&Aj|YXo}@J1KC0mVv$^KvjF~ z9$nfZAOp>^P36=ryAq`?l@|mqS6HPKj5mAQa=LW=X0G4HGYV<#(p1TIWo{oTK zXYXCTm${6UJ_lsPt_}Cj`d1d;eOWLxn(|gmngpZZM<9f7ELhSVXPN2#V?5e zEVR@oCq|xqBZtec|6j=QKO8;(fgDY0?|vw1s9#&e#%$yAg6_iEaQM!N%&Wg@^T6Wc z#jvCWzmuNLgQHi*OrsYQoJ?5ZG>@B0EjBi&S`{i*KDmMv5@l;)@bZ3l@QQrC*Ao|4 z#H;)n-X8|fR~uc=nb)t`*F48ld|&TRTt7H(CHU%bgY;v1u-0A&^0vAYjLD;GnU^pVnnr507yA$6`4&W%=y563e2G zEXpD}Qyd>UFEO((rAuNDn~;l2Vv7?v2NckR1p6e(LE$%X1=kj|pS5Kh8m(npI-QF6 zz#lfq)#9*Tk=k9_=CoG}ddof|X(bV2fVM{;9P)kEVKDo&fC>dUO=+%-MVx?8e^e*y zZQ=6mob&Jk0sViqtRndfjJ-e4_R-V~ah8T_1q6tA3FZ0xYWQOeVpc)j$ll2sDQHYA zRasdsB&N6snTEy49va0gkp~(j`b@0}k|-vb)8MV@oLh`Yctdp!K=euMUZg*^bt z-vIrO8wK+qQ$A6QE#wo$4GzrE7qnkx*=(H-i~C5XdW+Ix%Z&4uJK~YMxPU4}C@SaS zx-4|XsNdcMRmVL2%^S*Y1a_DfM{QzAe49!iWU=pHzoEV3uxx+mS3iTT)vEmp@jsmp?fL>PSL8I>*HAcCvnuibhA25;Bbak1m!P9%gIGL$%LC@DZ3L=k_g{j0muxo| zj;qwfN*24X^wqGlfU)^f_`Ig-=>_vX7y z7M_0WzV;K-aX{gNGUS`jSaf3QCctauiC5v>?@S!D5Zv_f^rkiTP)X$lU?Bv8JrHn$~?ZAOvxn*S^TEnsYX>n_|^;2!nlU!Hu9fYsLy%6JVpUBM!PeyV*=?z*|O;Y(EX0GbxNw!V7#U58G7 z+rYBlIh{sw7#KW66*teQA3svnJA!!YC#Z&2(RK4r&`=0ZPsQqCItgp@3=^KOdHE7z z4pail4)xV#JHq$P>P5Q$^jf`$z|>H^koby#9&cZGdXzocVKCASj&D_)>+8(H_EERW z0W)=p+f8)MGelQbIxb*P+uFBlANm5dofWZIT)qsYKw`~f33B>JF+DO6*i|v6kg9KB zXcMBek>RO%&_DyL^ih*Dvax6G2=;`_`0BzZAse^LngFTg0_*3=O-+qj`uh=qByp$V zyO_+I6mnfh*N7{l+_HDhclca?4jGp-<+7;1mcBC}j4MM+sxypKfm+tn5UEa+xt*b_ zY96jQL%glIf3`cpW*Pal7_v)P)3GQVn$w2PL1O$4GsEigY;n!0j+dvCD} zSbXViLhaJ1uTTyW-DZ|L*%nNMl?f0TM+Rzj?B_gd2o4(z0u0v=Xtx@ux?wwDbX!b> zBvAoVY$fboG%u^f+c>Wk0^JZ!ozR^zyUQP+usOH~z&2YGr*Udwr*W5o>bG^;cd3fk zD#uq>;@Y1*hx4KO9KK=OKR@X#Qil1Lh(5_;x`%um&6cs$7i)_T!IxAE+DyQ)GPZ@I z_m{9%G(v>5Xbl>)XHle^l=tDyx#sP!sh>KjcD+A%tUCmm7J1Wb!f!ibt`wt>b$PeN z#Jygu=-_sI@iH-6X#&pwqH2>g+N=yd-GcAx>|4_e^c;5l&G@{gT*KbORCT^exsh{7 z60l9$!43aQRvL?-oRnu9ct%jV1u29jh0hv_A9+_Be>C3^a8+vQRBQDwB zK62bHj!fZ<(IAi6R7k(dFsA@+PboKqE00_jl=Wx{;7@Q$dSR@0)r;M%pmvwybt6mx z<*axKng>`~rGsXFjhm$`rvM9$8-fMi3%2+=sPd%}z{Brv*yq z=sagkRwqyMZUkiY6H@h4e4AA_ppNNpY&_cz!Ztx{;J)SQMr*(*CG#|)T8jGLmUool z5+6RvTJDE?GQUl(4{K7PfKk5?0y!|^<#7Y>oUFcADS-{NaR+CHV3a+}0wzCnQI&zr4a%hI-wG z*q{H%&nO~(zY1xj=jYe|l7y~;tDdt2{`ldA{o{wi|F(Vg|5(WR4;|irf|WXy+rkp+ zr!iOdEqL~3lke)nV1Z%_TLD`aixk`)TD4HEF`q1HDY%)pLP$HGMkCK&n$5)`B7jI z2b3oQ%Xj{q5){_|*}uSBmZo8<&ba!#8O*Ihj7ncM)Oyv1v=7kY)NZWMck@#bB9JeL ztgBBAT4Zs9%DGpW5Fq-O*u;pjsXBAfLB>`8reD8}bsm|oA>hrQksB)vVoFG~wnS{( zZu0ABHxTluLfwCv!n`uGCU=Tnj2b|t`37%^tjSoBo_^p@1#&`((dPP+o9%dd3`wh8 z+xU`Cm$AsC*}Oh=5VBE>rQ|uqLd_H@0{oR+CsoKi-?%YQn@xYeY7OH+of6$9-Um>r zY=Ij*2_m6P*)x=sHrEJ>$W1L%wpWpQghYtiRlW6X>*pb2QLo-Zs?4Rswh7$rE-V7x zmkA*@Ql9(?cqCs#rQS#zS;y&QP)LTh#vCUrXCEN~f6I6dCVy(w=nAid0b|<|ausI_WdK zyWAvc-@u zf`JUeg@%Q)$;4+oJut`YkS3ywyPovzzO9!TP%(|t%R5g6+hvVJvPf2>@0)8TxygZF zXWkbc2_t&SAh=SXS88Li zi3Q+c+olU3y(ESqGdO2EfYp+Nj_r(u!oEwr{{d2RuVJX6-n)mn&spIjIsPR1x{us1 zz6cGhNBziejgZ=6D@i{M-ak6!b&EvPw2z9^a==Q3hJE)~(Im+dxr0M>+pGSOUlW)4 zXAH@j->t)R7q^oq(5=+H&g ztPn~cG1*w(0yeMdS>FRJjvU?7roCy#qbBm%!)kD8xC)9Va(JvDmkSQrNfPDTsV{m% zfQpww+H$o)dFWr0(RQjVpSt3sJUBd1<|OrjG+|%p?x+3hmCSTY;yJQjPQvG%dA`fi z;DPhatjNn}%IX(Wy&8*3!As!7I2p=qv#*=TnAO6uuy5!s$wlthRy zm-+{(*0N;p0@+iiaQJWL$o5bu@6u0XDkKBWy5{CVs$OC{DR>-4>|sRfwa&_pLc*~` zI9;V1JhTtGhn!oR*=ak0&zdQ~<98Cy+S=9TA?Whc!AK+w&->=(g$y(D%K#y07vFxE zCJOb7j@&(w2rA5$)2q_tZrMboRw-!25A8k?B{*Mg6>Y@9CIp>~G4K+PE1&SUSSFO< z$QlqPEuhL$Ze{F>e{ze`o2k$*-%iaU4H9Hj<*(13_#WG~FelG?^)yU2%@nE`r|yzW z^3UGHTMJoA$=h7U5?sH?-RT!8Fu&xVL)$3SRDW3~psb|fn^Qj1iL4RhlAA;LXV`pM zTF^B%HJ0o&j1FznJd@}$*u@o92A*a7e!wX|+{iQPx9-6BK>X$Z%9 z&d1(9doSEQ3r5lj!$jF<%H8`oWcE7wyOCL_5_}8wjWB*0c|`1@=Ix@oKO6kS1^QkTyl&o;#d}U(hXsE*^s~c|R`Qh{ zUV^7IF-vo2-X%Z|Yk>a_g_a7lv;>k|Q+We{(iReh>MjJocMDHHhipX+tro8z)uh%a zdjd6hQzPF)x6}i-JG2HOeozQhJz>*K|Byiwaj#-DTCvC!DT|ls}Kx zT24RdjPz<<~_f^PJ12Ul&4!+gj!58q= zW%u1^K@UI$;YLC#(NP%>KlLY~+!Uhyy4+4XW+P62tYoV7?xW>&?O7B=XwT`WPn5#G zFK@V}-p(1R0*A8m;}scYk}XmHC5f*saFrQ=SeXFt05V4uux9&qKe>g;UR&bvf<8ya zk=qk4+9v%sE!czD-3r2PGw>ybQU3G<=L08qG)o&#NZgPOSs#A0s|HNd4YF$8sisHs zOktV1C2!Wr7H1gl=1Zhg_!9I5pnLAVx%Np&hy#GMLx%i~%*I61T$4F)i9=@Z1`BU8 z9vJ3jRa;?%bgg^3-OLjNX@_@YgZQc#`fFu+`)8#XMGC4;H!VF6qjZ|W&`xex_oNs? z{x)WAYKPrE*Fkf9wBC_=)i8PJnt4A}Yd)h%Hx_l<^=*1lX=G-;O6D{_ zAn25Vr!vTeUawww9Gh~^@H18LjN|3Ew5kSmb&Fqr&s%=(Ron(yOGbKH zT%f&}%($nxBeNHAcw+1MVm8EiO68WSxr+D>zoGhG>i8j(F4%ee%L>!&!+ZVm`q-2b z0(|xM+~5s-{ZFc;|MJFVMh~^We3uKq(EeW}e*e7@`M(9*|I0%BA81>p9;Jn{jQXX+ z@2VjR$S1}ks#Y)v7->#m74-%afC0yIK&&90HF&O%hG9CNpq89twvd@4wV8Lb+P-#M z8!8MawP~cgT<$5;>&a$f;^KPem$}*3GJU>kJAUSx_PY8!_EY2gK_BinEFbm;iHTCl zU(mZ0&5<$oUtP-d^n?^1BTdnp+1XoM@Iag|y{lf1q{N{YUiJNdsAS%W8t!WG6n9eKwRaxY^)GvIe+VxWqORM=B#Xm)MEzg`j2BfqzF0)a?0i z5zNaL@Mm%{l#2P)94{(4ONyNrM~dd)APn&v9o_FLC)f|JA#qXMTOS5XtH(3T;WgVp zv0ASMMUQYmo4MWDFF@q5{iC;RQiXWqu#3mvEZ{`wF6iS?H&_#o&Kw0MmF>9At!R_=)1HVT_uuag8ln^|Tn%*}f z4@TQEcE+A6;9HuWQ2+@EosV?iutymOS(Z;UE8m|O{S1C9a=}m{ia7=EKv1@Pj8#qa zh|$-96MMu{2Ee+8jdSF{^Y1BgS4eBjl=jL|`cAIMtWK}gUiXy%Ug*1>J3-Vz+yI*W zWUwi#DP{$Ha46YYiUxgSj%Ntei^Bmu0-EtgLiAtmm8=1VdutTa31QM^!A)Qoo1#2+ z!hOEn5^d}iQzHcPBc)Rgg2isl1(>lq3SuM$6^>k?1kSZJIg0e5L7;WiUTXC%ROJMv zUF2{|*(gG#XPzqf*3GXLv`?^=Tvhtm!(fEi!vZ=bxW6CTP_Sj>Vl0}4aCu}K!-_{S zDkU)oWXahhl#;@>?vSkIhT;brfZ6>PXIx1+gK3v76N0+>a(4yAfffE| zvZyCLO4MSoEmkn|5=fRZ7>-8qf*h)9i|JGL&cD+X8(n* z>!4KV#4|FzQa<)+R1AposL}u~wWx(#QC@B_4-tVMi`~lbP5NRxL(nhIV04r(FuF+U8qEoe@(s_EM>w1; z=ZTwS8ZQk%-moZRPtnx!!|IO9Pn9dj8mP|Bi{kEyf6_i)d zEE&O8pBWpoJ$tOvhkx{7`+n%{D_u3AcL&&s-p~NHhulhYRHgt#%q49?aAdv?$}334 zJOeMmiY$qc+#O)gUJMv6ax)-2#-^wKx;(`gck%|Vikkapg|wSc6a{C<Wn*xPit z$rL#9R)Uu@tN>ZT=OJ+1+W+>5XQ(w%2$*C*VDpgx55MfWjCI}>;XidLpR>t@hhTe0 z)DI!{VIJ@>H3l`gL>>hG8ZN)NklPmHK3V!}v*<*h&AQxL)9h*Rxm?zq2BL_`#x$^%A!?^CebDHm#Qvl8&OTeVmR9Zf>VYTgmp3%#XWun%;g57O%y@+}u zhLeiazg-Jx4?8)^F_pBJlSaiHLQYdQH6|ul!=shoxdL0im|GQ?S@!fL?58kBOY}L% z_m0A+dpXMwHxZV=4Clj+E^-$cIdrU3>hgkwb~yMup46?TThuL|Ic0yThp&zY3qFZj zZ6~>FLSeaUuW)VG7N5A!8bO|adUAU>;RZju<#N_|96o;Vfo=R(qZBX8>j8(##T-w{ zr7I}erm9QLUXRDq&ft(`K(4V$YvApirwdw~{@@5pyjv#!kyf8e03<{F(A2Oigtk@( zEDHw24bZFeg6Jz<%je)0#qKL=LG8$aQC|$wNXEYoyytI?56ly)5*jzlD|sqph|bJ3d0eVD zi~UW4mU}pw+x#B#V{2$0a+g{iy!yb23#sFdBf=1z@W~gh;VqaZLwJ+3lr(}O-l$!F z_&D|MF4)AIk7*Uk=XN~a*+#D@!Dm!AWD!4yQM+46<|MDqg5zV!R=K=qFts=5!SPb>A632-myi9(>4(f3 zSLD}wj26tPO!EwF;U`X-k-fknXc9F~REJ3HHy8>ZIQSjrGG(FM3{d%L2VD{7-0CJ0 z@gk;&H=ZrREa?LezLBghHbkO}bi(G*73?bvwmo4dkYmZkRnc~TY782R!g&-^8kDgq zf3cG3f}p?8VfaY{rEL_D`v?wq-d|$BKa}GAYwql_A1qkmrwGss8a7bo>jRazZzlgY7l+V$DDcE{n==@L#pjDl1?{eVe6W=0>+;1 z2_E3?;q{vyeqZW!Yjx=|Q5mhb6fUVeI2BY6QEYA>r{1E%!RuKR1l>z^qy#A+k0sjeCY8q-NVknGL>v*EG{nzl_r@ShILYwrEDgQ zGe%iG!01=B>CcRpGfvw2tL3DlhapG~O-P-GjU+Vgr-ZKPA|iJK9TGw7Gm#r+t8xs` ztXMo9wa|g#+3el{IF^g`MUT?*b(;2hrw1RFeosY;QVz<5mS++*=J60YwlFPY3!)0S zXk!p<3u{{<#?<~HRI5%gLRE#R6BT4xVpN_=F@-FBi|?zYS>nl$rl>DIq2REE7Gv`= zm4%JH36}YUL9TE?S~B|CKgJ-UL;<;B^rOE!tp~5wwxW3$Lbm~Dhme~%?-$~pF@;fZ zBg;|0{*^L92D&SarWqtW(?aHWJcw^LvUjuO3h7Id=^*XzQlpib@lmdg+va==rUUBT zEAZX(%Op}>+{yG+a)BY)Q2aW{W^>FCmZP=gCKZ`0RhkZtXmZ?yS}ZSgNyUvTNuYSm zt4{l*2xyWK-V=la|6c)ShL0MJ5rm`Eh}cEW1fm_}1Yd#2_~8EB0?c2^PU0vidmW{% z^3-@HEBka#9DPj9mM3s32_BcupImnh1dWUX+@ivB8so7roCz3*qv1BfC_H%8^s)Im zNkx}|-X+0C>{GRYBRQ-w#!E`UaNM=9OeCk;+4}Kl_$Z?X!FMF$wWlfeio#u)E19E| zf|J7NCH9=*Oh}%HWcg0@{se_*t~vQ85l#-3)l|VwFijq>fmcbR6p54JJknDu6bn4G zyHJ^C@#32to+~$(IaYJ6lkSjg5i^N;ZJGZ8+^pia@wOK; zkv?|3t?|S@kW%*GmIUNY88L4UL*crb9)=Fq`Ib@eR7K&TCis?H7jjPoif-4WecDt{ zIcou({joH9VtQLgtMjl_Mu|E~eWDE?V`{=^TCwJ+op-F7l}Li3O`H1Bcs^)@y8^~? zqb(mfa;YS(+}(}r=ToiZuHF4{UD{`XhH)aYZ|J6!JxB71;ACTTq(LaLz&yYeVL7vb}3*$#)fiyx~HKle#Gnu>n zIu5kMJd&3kNRK>1TdIiJL`hOSg2_`|!4Jn!TNYWdiaX+#u$Ti25#~%~!x60+n85TXid z#)+8Bb#X&LWHB<-OI;)SEmUFwk_79E{~=6+G9RoyLf!VMw3MQ>v`@=D1Eo`Fx~S0= z_Ih@m)z2lvtZaR+fL8SEOkC$*;F)0K7iJR~-V9e$MD^c(W=70Z=#Vec`4tuR=1!F;icZ=n| z{Ia2RO-ka-_2OX_hGrGk!K$8jf{L^(OMni?8eepc7bTD<+$pg*M#$g}Cjkr~q1B0d z+qTmCA(!49v-dH7MMS={dv=!}(ysZIM8tjwr*hq{pimCbM`UMQ&1txm*#VOcTZ29& zv?ppv?<<}e?6;CTqw*w5$*`K`2z@$sB1M7Z_Fw|QMc~_tPL%3ciL2!b7rFYdJ@|0h z*`Jd*Y8GDoUzx)fAQQlEipuVQ zIV+@8+sV6KO1YJBZPc7^MVl}Qq}9gkby#v14m=-qLI%j6wp|e$L_G2PTv=}NGv}dc z{^~5W*Hs9SDZEV!ZN(=*w{s%J8DzY;$_X0xGZCe*dpbnRAIO8)DH-p>XuW+bw@0lV zz5kqIq65_a^M?EJBb?;N5263hx8;A{lp0XpD9avSd^#PPu(e2_8v6Z#i0vBDC|C&k zLBY|{U~ou(5!T%sxirBq39hGr^8*~2L$ZGwIW|}c1}uK#%4)a3$`Vq~4avegGIw1w z*(7d>dFEKGeX)JlB&aS4h5ued+&@ivZ9ji?KYzutdB18c^Fr+8N(Re^oc*w5UdWft zV@r_`*%#%sIf`D1PMDlDu0J)O8ktIGAVT9|Pj0C9oWOJ=MLB!=9-QXPt!*)4PLvUL zYS3WHN}D>P*cT+_LXJ64!R6tr5NjB+CNdK!;{OX0U}1W1={^ zMhNNf%YpOP>q#jO8-g(M@$e(Z8_}NN8kWbuL|F5o_8&`D=6yE6-9ao=%ZUeP(Y!9B zhfdxSu|!W!M4Xm^nxEb2`%1?#X(G>nS^)#A+d*+g3*v`^K5N1p#<`_kGQ*)t6Vo|? zjq2Jh7ILKd`O|3BbVkBcZ$=D3Dpn`}D^(>`L5mZka6^mvN+cKR(!{AmBAHd|UldoD zBscoUjFjm%fZrNu#Z0jQ*P4ZcY)(PaC63937AGpd8A-nC9GY;8;QgpZpsq7EXn|Tk zT!2DqDnPqaDbHm^df3N`NC}OINGJrSgZW`J7XNVoUI#k@;ubRmR!DTNmeLxyhr8OS zWiVoQB)-NNOq)gJtpCFc^@^gW#D1^s#9-C;R(%L_>R{dh5A}&b_In#0uJrgj!jpbt znp;iidm1)EWRyTCdTTfu?t37*vN?xAJXxrW3r{+AS`KnG-miSSUuDl$?16|O{_L0f zjH5Rv_Hk@>>7ys5=?&n5C%p==1?WnpGUzDvbYL2?&na>!oJz*)nkGf1qH2fR|oHHdV zje9vu=G20Rz+&bzJ!;If*c2F!a*{K4eDPEK&nX5GZXF{c4`Gx@O%XvHhZvpQ?9J;s zqY}81tF+u$6x1i7+jk25N4He}xrvfghzoG>bONC9Q5gEIY(ud-f|Fg(KEJq;h|3x` zol8H-{YS2{=s_CZLViJwPT(=#FhHs!EH`{P!#a<6o{5+~rS)1#AljwU@3wCvt;=jl zXmkoQuntr$az597h)+jnG&Gfzt6$>@YJs?cgWV2tV+={r5_Zhu@ZMwB(9snQXY5w% zf8N~$K5{o`@K{OL_BOdD>1}f$4S1n8qgpqB6_{xUa_3c;CuYZ9pm=33-u!z387t=5 zPq9680&XUsCdeJ;Pt{BCq_a5|_P?XDqBR~~sKs*XnS(n>7)Ti;yrg(Dq)Zi+E`qu?3M%DB(h$Fj1f1b?;~FnIcc@nQDHS-9&e z?v?*;Da^u+lOlKv4n+ggNmRPlE@MR{er=3M%bB@JBrKq{Dr9sDmFC$13!%c){accj z@wmE5>~we(Tfb_wg0lkh4+HkTRq`K27DH!;wc`!z26>i>fxz4RGP(;&)xu;oXi z{y&V6=DR5P+4t3`VY8UZsZKj0ACdlwmrffOZn~IB@$?HnWi%*;38A*;6Ntr)@N|@G1173L zW1k4Uxb?%BnT!>&&+<^c{+jy{WWi1#F~)SF5Gk@FWKYC4aHoak1I{cdIus3E-9+L5iu(Ku-&e06FPv+cqwp72SVMY}RlWU39Pn`$lveWk-#DSh0a&PZ@xBOHG=HQzBZI+L)tkCG;drwBR zzka*sKfZM89(9^u!fs?f?0#&|-S|bGR+`*CTBWsUbwDLqDz+vxy~df)mmNDYdyU4( z8B_+|+a6}Ga*VcfrbRFyPfh4R>7vRY+gEn_+y4 z{3wkF-yE0{mWt*T(6t>qR$2tT;N)GSytEvS-Kh{TB`%t1mZjFwFxynyu}JMq`>XUT zCDyWpwrL98RdbPF8yhncO{Wghagv}TZ1F<>W`VI4n9;BnYVc&uXEAdrU^8tpX=uvQ zSm|mPWnwLeb2QkMVcvRgCjM%xGHGZnXlSUMa%@xS-jffs2AaW&s!-=7(XKO;%~t;` z@==~{%}h>q;& z4mx%S#Yp0fY?Y(}8*9!2hV}R)H@EL}tIz%0Nz)>oqSDJlYpns&Z+OGtvrb?psHM(dQHCOhT7?l=PZQ-EaVo47QV5*VKR1P z7@~m9r9Uuix&O6%0oS=mujN#ya300CzeCoNDE8xRa5hlb#3c-;u^fXQkbyL`e$_F!0aDc{ezR! z=n&N0%aSf9rCn!>)9JbZPdYXmO$3Gwan`qT71@;jen>scZmiSaaKN_xR&fc`jG?(! zstWYQEy(-qxK!fPEpR&K0@DhWDd+d|vr`B+R(pGmpo@zicmP$sjLQA?Vretm!k%le zeOUQ!&Eu4#O2rwzAEtHPTx31b5wC}pLk{=4-rw@#p({XTmFP2C?OB64&t~H-<&}F; zg%>WOLffT^v-fYQ3Y(DgGT^|Lf0eKgndWS$%*vJ0#ubIF8VG73>SH}txk?Co>3+WI zB0n=1H#3{an6?px(@Nz3B=`q>$(i$JyAAlQ?<0iJ6IP)sLe zGM`>k-W}B~`2@IX<*J~TBPZ8TQle3%SfRsXm{JhZLajEwUMh0X7?JXsui+N=xKh34 z)NZju`P4)B2VVPDyAy=amu>M%fau8(2fP;Jy$%+_8XZxr6rx}oj1lG2F<<_n2PY-k7ik<^ITe56^whq?i_5ej*8=NDqZu&dzWv^ zZ(ke0_E?I1A+#3TOOrFKBCA_U5C@U5q(K~6XKOb;aRJrebDlp?;eLqR(e1Se0o2l* zbc^n@N2}fD+ye*0?PIM1M`V9zeUE3u=i!u$PAl<3cHsu=E?PGX#e7>nUKbGNgU{z& zHfode4m0PDb)3yCjLU!AIDm{qY`6p;-ZIio?8ByRwAi_B^B#8koRM(z#JTYtcl*S> zKluO*_{fn(-fY6~=Mj5RC{WG3vBC)h1Ty>4r{?D{xFeIMn;Wui%xpj@Q~h0Htj?F0 z!lJ5nLSbZY>1>c z?8zqSyflsYa@&))KWORgb8ZHuavg!#NS+kd3ca`n&VO`hA-s$@%(-*vD_wt~RE3JNel=_VpZ_XFqq9@83 z;%ouD+Q?A>Yw@!BC*H2*YSWmk|8To!*~Qx)=aX)^H{Se2LvtXlSx||7a(n-j6Jxzj z-y(>Xg-aRL0%_B#%Dcf>a^T{1=_L(&;W1|SMaVr}WRNc)ZP>0ea@@596~E!uB=jZhB=*?4@n0-%4j0h;T_u=Eprc=4+(%$N@Q+Aqi@O;6 z5$W8JYybCN>$hxf+s}zrUKQ2)V*l;c&iXT{mUq<%Q>CZ%lUNcCkmP)ip}SkNR8Lri%F|nP^s@ztzo!0f9B!1gzwllyqxziceCX)!>a))rnXlrtY1Pr< zux@wv@1XOyjadLTW>pD#pJ9ZhpZXqZFPFEnCpI!kY2W3aHD zgRke!6R7c`(%m+UccJFJ;OBm+=emNoSuM7Z%I&U`RU?jUrIe-C_MCcKq@p96|M34= z1xHNk%Rqkn#*Xygd))r7iq8M~xK+1y-%vx{bmw`D8g@G8u*50$9HF!w1{GNC%{1I_ znC>}-1>Kd9GY;@zc^-PvXcNQ54~0{P2<1XZX=`PNC_$q@TR;4uTp+ALyQai{R-~DV zGtq1smds3oZ(>nzdp)n8?mE(YfAar)M*j`=ktqm9OG$#-kSDw2uv%q_YN-jN9*3E8 zM7J59(>bBRGCi>h!CZE}uTzKq3BGmkI_q5wlNnhKhCb2 zTy~v|b6scUS=XGKT6!2gUcT;8;hwXQC(O_J5z#Y}MLB_$Y?pL!H{0{9vOA}wE0)-V z9mxe>F@(UuJ&VFZWIFJB85X$1*frsn5lH6(b6&;mR){!?82h~OF4oZkD8O$K@BMX7 zvMSrIl@uc&pVP+aZKIcQJq(;*5e1R@#zE%--{ec^J5~ZVkEIP`14C=obG+Y00tyT# z*T7=U$qyeyb(vku%aVBLjvZ|F`zAVQyj7ZE5!b4BzNrM<=hLx8=Ws0wZd*&zSJM@xWr)y}{so7486v-5a zIUWjYlgKT3C>_EyO7LbCsxh}RPbV>}v|k58$FmXiXcMODr<5?-`(Fub6 zRl7!sNr2b!jXUN~wpDtF7PjOeuDNr{D(jwdjN+^ym`=5Y^AmI`l&A7Q`-^B%SQo9H zs(|CVaZ9qEYV9i3OA!HQ&QrabMLZCKaCKf^Ztaz_7CICQoZJs zfhs6zOA549`lm+0!qdM%Mu9QN9}7dNqjHTy20_QOb0FhOB}H|tp1EFSgG{1~=h@&bqEQM1qW0o$f0%p+!A;r{*siVk%B1wE1 zPJYcPe||7^#rNGoR|%0*v)u8dS$Wyqf|;)PNSZ+9SLA@*>T;86E#rEQcJ(7+$>&pD zGaMl~`&RCHokpq1$CSv|Ey6EpZeK-Wys+;IRJ&x`zYXIk6SCd^Yb8@z!&=_D%M^$<8(;`mFuB_`tf&BzaIX=rs z8?v9?R=Ae!Aej;T2PqpouCc)sP4*q*W4)tAAFZX$wWqRky0>e5^W*?lZ}3U!xhoKV zhc({+oz5*?j{M`+syI=dtw|gN9i85Gh7<&cUEJfHvG2%#6b#w*2|ptx7qf<{MW~Am zB%NlrVxDU)m`Q*LI$ga!=3Jt z)f929AgQ~Xd4G65CYm+fg11|AjUDi#RvNqFObf(@ieR{oCI^l76kaZ2sh;-U+?`bbVo+ z#HVq&n1b619)a@zJsx}jQFLGJcW=PA1dsR~pQU2mki|bH zqhj76AwTzu`&HZ!0lzi`E#2n*3ic59kN>eb1zNJ#U4g95bdZyeYvD{&J zKOoji5!UmaI6L8>kMJXk!h@=vl;;qig`|AR)mZ4Fu+qm!3Tm9KNAeRBv|NWi=#nz# z$@jlzdsI%1TR(Lt?LJ*kFD< zhOC9@#~SzTrWC`-I(P+(2%2v`1S|Tv5xh+!zgGL%2COv$Lmy(|nV{cg@--&_u1#o0 z|M{v@*tnq^_@_SiT<1eh>0L+TbuKA;oc+eL`%%9I(GtO<=C@p?5PigcPc6o)FXF53 zSEi~_>wb&XRpPo?wPeED@Qp|NimmP6En`+@dwwm>=LCT!3Blf~TDR-B?SDT+5H)Ow2K9U4b%S;z2N<_1Qry7!! znfq8=#S6$oE@ZTtO1b*7=jQtqm5pPptu5V0@c$?@>$AH)HN|llg^f#4Xn=|K1+-@{RAr>6p_%6e z2-w=~pYWm)(NWEE=?0=i%0<@xKu%WK7kv>@R3 zc#%%W(WOdeCmp5xl9#%i*Ak1c($iE!zr1zoqa)$9&O{eVc1R`)^?|MuQem=|Ksf*@ zzk8FKTjIpbX1oFL=I+muaZpq=G@Id_k5GnvXRwG`i(n1OxrMDZfqzW_b%0vKsD=7W zKqZV>ER=N`FR>vhB6|LUbz5M4E%L;w#qIoW=(kn+biA4BiJ{K56Lfl*B5C`DK|Mj-4KSBIqUvk0x0=w z=j1|;3B?znyV6f;Oh0T=mFTnULb)>CXGycK$(FmMJ4wr-LJb<~?dPe+SBV>0f3=8{5=0BSa^M99INUIwdo&2~Kpbd|z2Ypbp~J z&v{tl0!NQfxa-HYaho9Mt=I%46DbQaQ;Y^m;Sdy^O@-I6a_OO(;LWEoSkcgCb$HZ? z_=+fr6^vt|G-?hzCm9mB%}kWE0&7y%`qV#!U*2(fN{qn-q`iU_l_{$0Elu3D#Q6=t zLrwMtq9t!JrivY3*gVq|1qV!Ypq3?4q51vDC~`sj7zUtEf_mgP69zf?T{~aLHhRxZW#XEZ_;5=>jGPcq93HCkpJjW&TnqEKtPD}m_L$C{Rq?(c(b(~{RNc+He+4T>Z> zbA@TRw{hohb>?Jm#Yl!>?0O%;Jq3GN_|A_;w&9St4(TmJGV@>N#aQwQaMr%#$JNm7 zJ9o&}V@w7bGR%sj@31TTx&}-^ zEl&zydQpt?Z)J#`iNF?coc6NPhEo2~g>O>1S#`*yfV!rn>V zamf~rSo|kvo_Bos9NPs4tF}s5Nl(web`b$Wb}}pdYpH}CK@_N6h?7hI+!-|bj{;vg z{!Q^Uxz`@^6iO(dr;!4rEtQMOUmJZ4l!;DrOjgqq7W7LLVvl3w^p(j_C260V0+3ir zS6#$&t)ovAkSuj@>AIBr<8QD5@Z06SuT1zg8~F=UOo;pdBZ=vBtQ0@Mrt>ezSM-xJ z!CSSd&`={yc=!^SXiW_<3bUpWO=Ti319d*Nc$~fOxc0k4(9R{D&$dPiAZz>wIq{*t zrGiN^tgvy5uymb7(9u!uq!oXeDNW5`WYm%RRz4aKb(qVwS4ocWjHug-=-5V3GxuA_ zffa#SXyUHP8X%i@I}j-nm3|;@M0m}{Nr!@PYkr87G^%cId2MpF_x)1Ovi_B%yR;YG zk4^4t>z7ZecdP?%F5a_s?keFgZrRUP-!oR4P9bB}mc7dI+)wz~bTg9Up(Y$jox-?+ z?qAiru07tyc%$CNMO0qJ(Bk!}M?}1paHz+HO0v75Q0&OFXf`=9o8fNf1=<)HOZ&>A zMXtM8W+Rzrc!3My*!N1pKiVAP;Jl=CJ}fDbvwof1nt3Z1J_5;HA<2@&EVl8Y-yS*$j_F5b<(H zVEXB}BFkw<&J|^@b@;KC6i>D2B3BoxBRt&7<6Hvz0+Y`yCjN~8z{oaO1Dim~M;H+3 z+9S&Wk zuEpzTS02ZVpL`CG4{t3I#bykTM%S)9&s@9ySuNjYx|P{*z-K7;AmjsDWi_2 z;ZA$s7je-F22ew5^!kVeYbl3c1X~-Z4MSLWFO(KgwqK3}-*1Ezjlr*fQ64PW>f#1gEoH)T!DK#XRT=2Q|%xcwyK-k4)^ch?mXfr zs__T={ExP5CVn#sq_6#kFygmwQvd&t_XQ}9d5 zHPp@mnsEnJM@`Plx(kiA@=VnH5}i(lE3X(DulWFh98jtu=9XhXeyig;<(b_gW5sPC zF}2mATk=EveLQd@pmleI@vebL|2vC?DP7Js%75+y(ZtBVja#y=-iG+1dZ(FYNd zRF`ulS|!Rk8~2Bw|G4sdKp;3uBGhP%Nw~gIvOoPceY99jgu--;7fza-V4DHr6CuLV zFD>-ga(UVY(+xU=#!)Y6PO zsyr?A^hRnqCL|X7pF2 z5v${VzW`zF07QwzB=;C4(VZooPqQE{NAgRlo!`Kq5rE9w-+Z#1(#Wsv1^E&fsh#!C z!bdCkEf_o-+qIFR>K8yn$G1R@HJXU?2?e{;t*k44U{ggk7uu^t*lqC|t$r(S*NoO^ zN@`xQt|1w2K{6jdNGH|{ImxWm;%eT3A4ox{(<;=4Kf((2X{Ly@jn?w+lQfqj3C;BQ z0}IdOJO;~NMG^;fM2<2~-S1Fpz5?Ghe{6q)cPPA^dB7149)t+Z7*e3ZAWIeM6=t1n zcnUH(VKAQsz>zZ&&B(Pfs2N3qtYS5@_xg5KFcuxKVxbGp6k(d!YrN^AnLTI%9O29z zV@@sd;U($&c?APa1D0@xJ?boxs)s!$ZmBJTy|ie$l)>DAH*k5HiC^1`RnMeGt9^>~ z(J5wSEMyFm$Z6};gS_4IznbOo-rd+i*AjC$dFakqU7=SnBq#R;$PI06<5Y9n3-TBT zh^j19a|KQJ!aQ+330NeDr6X9jd9dl+tgM7J^^9Wa3{qGqXy8iwxn(X3u&z1TI-vJ= zV@aB!^U}JQRjJ8`NlN8B@3GvC6tzdaCUePtCW%OvVSmv&Vem`hNV}@Ss7bVEDAFcT zQ3djc6SPu>IuT)QuxhDg*0E$NMqAbXSb=vI(T4f#d#kD*0p}&H!Nnlk`nd|ql;;xv z%gVdfk2zqCR}Qy@saF7>~~SiDXHO|Cxw-vNqvKcS}J|#70ko8 z+j_yB>m?uh8POA69X{&vT;NH`U@M@5u!cXGx~Oz)j)vnvE97^6G~i8bC!qQ?PjD-{ zzEiQ?EGe%aWx}#du8cTzW!k2VCdPKM24td@r-kpqWS-P)kwQiaU$PK7(!dWmUpK)@ zX^SXL=22tm7fh*wiFj1jM{I!$xh1-<4ny z&1LC6VQ*pW%YSPc z3hzZ>CaiBFtUuv?VX-Ry!vK3*gK!o&j*sISf~z=I@g6N|7eJb?BAhurr@?(#+z z`pMPy>k}FxNx@(l zf)0i+N{3P6`$3J(u%pry;)ZN@3H&^V_fO)~UJ5v?VoL|CAjx>ts9{*0Xjq*=e4>LyyKH9Um5b{E?J(?@;yuCnIH|1?Td!!Eis;dr>H+D)t$>|;ZOx)$Z`Sa@V z@m@^?#^o<10*W;E>#9#5c>iDOpI~qQk>;~gK64oUGMQh0DX+x;Re4>VO`Y^@4ebog zZB6Z5^uNCSZ~D54t)<<6=?rl^7OA@;K{J+pGC}1JW~3@692S zT?Ukl$AXcTQHjy7*l}2kwZgqHoxM`4R4q4 zz%KBzd}iH7DVl7}SOyjAXY13Mu~hSDYD)3eYjpb}nY{iWc$B5de6L9YlubV*UnenP-BqaT7|jNY31=B9SIv68Nt|fTj`sZ#YwRu&LX3y$%oZWPnAj36(S< z<+WOgs41L%JjBJG%#E#v63RPc6f z>$F*Mp$&Y>JZ8jjX+-!DR5hmRv3ObUt}nMNiHf{`l%O#PF4y0?#eXs#Z>_AlLgv+< zp%qL;H_tdEED3QOjj7JN(vDULgI^Sw@{(DSo{sMF(0#i^20=ZA#|e>$7bnCz1Gm!D zwU>P>PTQi3UNzSKVUzfEgccIML6yFktElU`k1{({mfO_BEbRdx4QxGN&@Dfac$Wzp z(huQ!Z8P|c8>|ZgA>z9YOr5otc`GV~miaB7f7BvRnpiyP2e*4#8B)_Dr2W+E2t^m- z7}{F7VNbUQw^0+!JCkE_LQiYPu3QnOlgLBvT#4yoN*?`fij?vrc@e6SZ7;%F9m;;b zfbzM7_(JBnL%t;ga8)6a%I@ZkEknl{tpmgPokM6p2C0=Lj$3Y)OHr(hn_yA*u#GBg z>Gyp5z=`kn75-y-FUV($7wg-+EE-H;5;ldoRKW zc{`Tj4>3$7Epe(Oow3Fq`)SW^ z|F&4l*}GVpSsELN*GBz+V((kmI7GdutT(wO6@i}2?2-IY? z{oeh?`;2!?%6eyB?eytiOs569rZ^GBsOS^3beHYV}PH$U@s^DXYr*888o-QK9fh)^IEh>U+pL8KE6X>gRCwwaa2DK0jM!70OQmvL5! zs!(t6nXDEe)xK^30_NCcm(OXzXd8Kfm@wJ^<$2@&BBmldwuxB>mD;51++ZZO#b86r zCPTU4X7WVd6GiJy0Zfua2!upN^g4m3355827YCWyq?OdNb;$X^APFq; zHPMktjRM|sKTK7@pa?ver&XJOOBHFl z!l4UcvOj+rl=g_}_npRtr5g;YwP@q3?`bt8@HEk~QX97R)Y;VKhUFpe%>2QcOSths zP;E&tHV^3$!sl@PA*f<(`mNk#!Jx6n%paqzay5i)nz8;jit>fuWK4oF`qy=a%2?If z^vknvfLD2eJ&OeJ5=^uhuUkOV##SCpL?oS}f3Xz#us~S((?4$}N+=o&q>+~i3)H0D z(GMoWJVPL>))?bB(NsPI1@%z^++j9W3r}X>FreUMgWI?{ku+X@Vq$ByvB*d_%ejb? zc8KR#*$2)%i^c}af>Aq{a4cnw2u~?45#=ZGvWv6I_QUSz1stA*jIxPij9xLtd$HhB z3O4M@0iFOfqqA8inN}==X5~@8%#=^3q*usl@|2^?A#}c4*B$sZsl=_^&A(^Z*}xlw zM&X^K9Dn+oGz%#3=4mz!>W#oWCH{pZJx3~;`tGe!FOG3DYb?XSGT~-?)*V~fT@Zij z@HfiuyfA{HD5?w>D2M$tOXgK)BidZqp>nlkn^Ybq4=u4G{!G2y70U=3G zB@p^6T6>mm!lQ3g*|VN|-|$g-lrRSAeg$1d(^0`9^9pTHC~5TQjG(Bi=h(1Zq2+RZ ztE$N+t96yU=B|TB@Y^gNt&G#UgGU?5Xg@2b9Hw$ zfmpN+g7MRVke^9JW00cj1Ol4YGWth^sVBTCtyYU=k+Kmq(ydo5RHBP2=yxfplI1)o z9hFt{kaH0Sp;w91lR&gFH}d1pu;^cI-3UoY&=I)Wh2n5jATbY%4VJOxHd8(Q$TJZ$ zOnQgj<{8C@lb@`!z8Ld5X=Xuu%V?HI4HR6OW1D3>1Wsou-D#0HaLW9Y+Yj%Ln{{*e217BYh|AYAM_ zANA|6Y!5Y0XsD-H1#@y!%}Pfk%@6Pyufb_7G z^I7-?0^?P^jU{!d{^lC^OsCr|p8skIQJtZ^?eIOXYnKNsVX8^}*b6)21S{`g5z2^k zYR)3A9Vfv9)gfD>B8Q)g^8^=$SMb$Cb-bLSx}(z&>n?Kk8f{EpeDPz<6y0Gs2}l`S zMI_P8TKdl`+Z-j@J};dWl^Y{DFR@Ctz!Vn|kPq!{OuIDiYK)eh%#w}P0dx*Nn-ke2_i z?^-tkh}lCaNWNod-Aj7F94Pqjvp0_a21T?vk|9PAgt>jZ!^sI?IiJ-cn0MpSi0pp zqB)GFnDdiQlq<>{bL%W2`3=V$;>snZj?nnVEwb|-9Z;_t1I0M{Sz?^<*_lJ(MEk>Y zl1zt`6XXE*9n6Z}`jy{DHGpYlwyxis9&tv8rlHcEFtn2g-~9F+c8l>rHxF7EL{KACmb&(_7#mWjfIG5#xsv8>sr3$uHzj7U@vJz%z~^pL|qt z*bRh{PaK9m(NM}~aTGNd<%*kE6uU>LxTfz9)iTOVt^~P!CGp3;3KXh4m(N6y=ryOx z>{K@eVhxz)w9IbnDE6PEv1h8We^DDa9T#uLB`Kxs$@gZ5tx$hm#q#SWyv z&o9zutMA0+we-3$@9mXkOiun>Grw(6V=hkpTvMXd9XMH5;5z|#6T37Tvu|GdDt~dg z?3N08W8L%zF(5wkzJH?mJ4TfB=-;@%A*=r9No2ZnDe&aWMRN8G+DUJ4{dq$8Q;d0R z0!rI;gH1Q#(lUYNa;wO;josussKK#qkoO(`9i5lA)7~r<6R->6<&t_Z>HXyQ)IQ!G z>;L}r;{EOAW*UR2Bwm5m7{&_Yu{c_Xs^3+&(Zee{W2wXNlrk~{#wuOA^uuzTEvbQb z_ZP#$eOa5;6C;jn6qXsA>4B{3^i--;j6Tc6KNYdsqy-&4$uu5&jWXNR!3B`#LDc8c zJf~(Pg%#<5iA~6a!`>1C^t}sV@v#)!uFn|?+d7~t!r3`J;g7w2&dTnmiErBn}~PVP$;VYnxS zIdIYRm1_1W0{fd`QgVg#l;`)iKynh#gvi45F_Om#H-EcDR zr-+DEVuV7ZR5RaGBa}s*OwYBUh%iDJ#4z+_lE0y+60dGnXnHERMX1BP3L&Nl$c?qluWB83@>uAd9$zh5zLky?$01xmP;ZgMmpE zggi)&5ub~R9`4Q$Z02W?gU zCq0P~CJ9VpWx3i?#TY3&61u6ZP>eEWRPYYAlCXu#R3=Tb@0}Bqs|4#SN0DT{a;|H( z0vy*unPy-Ky+NA7%+E0o_9oFdLu(^I-$cP-KR2wUQ|W{;(I=f{OkF|lCq*Is@_?A~ zjL*2DKPpA74q5TBlTj6E((}=Rn4f9>NjJvKFG)gFQV~kc9$CP5GzRSfG11#?6>TW= z|J;cBggf=ps${H-6p`@AV+;It7is3am=c;*7g_L28nfe2=)9VGL>^ogjqnXJ?AS|$ z>qpA#CRO?n{ppRoWDDKnE+Xi|2u!(&2)-KgKvkz?9$!y2JSEMVEKO#cU7RwrPmK|j ztrZcguq?ossx)3d#A=8RkwBf3k5Z$`%NjkB z_)S-10{$Ut0+)x?i)*BhD5$i)w>~c}Jxq$rO(o3W_B1$s5w+bQeyNsqvC+N1>EXen zkPQQyqOGurPG8OYXgMo_I_Bje&GH>0K@*!kid0L!iii~pE#zp(0V?3wFn6TQ z5m0yHP6eUk;RnzVX2LUtlsdv)dOdK??8YL~wz~JPu?IXmNe8`GeK*57V5aOPka4#Ali|R+1EEI-V1?h~M=rc?y|PLUuUV3I=Z< zQTM1wxrYN{WV^I(6Hx_#uQ2a;R;og@F=~--gq@qs7Wg`Fl8}uxz?puzF39?AJOAwI z`8IYz%UFQ_@0{0)0Gy(2L|70-kwX+#7oUbpBEsRI?oO8{#2Yw2DafoAjz7N`N-uxbN@NXw z_vl_lm{|PSW^7Y58_hXlf_i&XZ3a=cL6~WLXJ7 zT5?M;djVt--hKI+`093_f-7*JK=6L|%S3Z;_zlt$z(4|`4`NVna|gjOii*!~FGuaZ zK~kO8)ATzXgDK~}%$_?q5;=zr3D{;NV!#}J&C&_+nag#}qK(bQuJEcVzex7Ke8>aE zY39aJx`uRRDyZHpYdhxffdCkL+K74-DGA%on18nHs!!}5_@U83~F zFPFDgqI9_Ck>QhUJ`c0TqLFF_nMQZZgtX+;#N@TQeA$oDOFe)tA~$GTk4|NingY^T zdCS*x+AB@RiS+_@%&OAtnA^Sa&iapndik#r#(@66$5&h*rzC9s+t=_LBIEyAt_K;h z?P>BgQ_X%kbN}x|rT^2hOUd5G^uOM^G+xzl4lwTe{mn>`>-7iQRhl;Gq_8>&$>G@ZkUsCR4k55is zrzS3^=&%!Pcr&xc*|$5U@A$3`UV&c&Retw(iCqwekVO~)jUhG`#7`zOy3!J0?y8lU zWaByMJX3s=6|FVqqFm9T&2T)k+!{851r3o*C-D5vXSLvnn? z`N-&CM`pu9$N#*2Rg&RPjVl+n?{1}$iOix1$_O!&1S}LQQ_L*3X4;IbW?FF^Nr9A$ zs*)`(YL2U5i5NH)=dHq%niib~>r0`%`(->sgR?9M0WQoLs^EEqX=W8lPR zscM*M=@Td%4_!$7c8!?V9JRr5k=#IT0m-M$;C<??if;p}$T8Di9p@$|#jVXO;T}TQ#l2w!0vtrz!Q-o7zQY}$tA^IGZ*ey zcsU8xXYFFNImq-;#LN#=oO&2q$lu$!asrV#Fne2qLvKvWQceLT0`;*+x4$4731_|8 zB9y^&tDJvoRw8lPX*nj5i{FIxY$fJ7qpBBHQk#(YDlKWI|M)xqV+tYk{a-7!C`k-B1> z7X$!Z6Z2>*s)&6Jr?Bk8LptD?0B8!Ab?R&-RCAgBI99)AvoeKL3MWT(6wPK8P0eWf z5w{J^nR5XSj&JF~qE(UC5jL0;N-2MW1XJts5;dWtHjJ97yQKy9?CQxQ?4i%$MJP02 z90T)juj_--Rx`0wWFZ1BDOt_w>?aF7$0tzhDI-t=e5=MIO4l4?-oad#t%_HNRRQuf zv9xIGs^f`y9!fb+UMQWbQkcoqx7tYAdsAx~BX@H>t9Q77ueLM`310aFi{*Bu%;+7+ zL>z6TKZJfGwjj(?4_4#_-NtNFqiF!m0)(D=jQ9-?z0LICHF5_+ZzPgm#9zhfD!q_l ziwsZ|vaAa9V2G#xOpsg93W8*BSD$WV?lz_`(KW6UmM1E76rW>oX5*K(1fl7E1_KvCYhJPsc5O>k!m zyV7bH)5>+uWoRNWHxX93d#@4rJrc$%klsUa} zRv_ZF?mXd=?1yxnD7WU?8x|Ys&uH@E@#Q)>w2V2er9WAL2X^FT=pAuf4ct;{>r`4B z4JWo|6JDnWpU2TCgFZRacvb6(0`=TgRN2JM>h8^qr`lWjV#_$F2IG{AnhZ(vO#Z4I z;Ap+=3t~Sw3(l<6mXy_+dOQjn!ghQEUhNW<^FunSOiO6JMo}fojwQsN`0Xw91&Jy) za?;EAVo$?8qvv*5!U`t?lN5(p)QU(IvLHRX1TL!SGZvI&%~`9-A_rxtr4!Y_XRdyI z_~n+XeO%_<(akjd;4cQzA76q`?s!i6zGEZ!zT*?r9dH|MY*5{bnyntIE&8#aU@3X28*#_2}uY$fT*xL~QoU<&duBK` zAY_q-$#q0+BlOsxaLF7IzRYHiK(=o`<%CDOt7F&~gy$@l+BB4!GyuB$uYQQp&tIY5 zzt-_6#2@&Ij09vOlugFyipTKpsjC0dLK$Uea~n-D4m;r38J+!izNv0DaMxU9C~-=`uuvZAGK)-Qo9$NK`BTKWJzlZx5b_zM9@EZ{#ae#ja7E z`v7i5G`GMIT9{QSk$^iDsB)7FfK(y*k857i=j?Aj7`eK(sDNj#t!vM>jG>jhzM2G_ z?RmrdgmTC?jN);XIhhdY-3cx;a>%8d#UB~ZVqpmG*AxF_X@YCm91L)!X*PPuCJ^vI z;{Rkd?o0LuH|-etWrxizLcPN0K$;}iJilgvM-+NJk{w}=RCkhl9Mbji467A=>xU0X8fPLFtI@3xIKCknRb>tC01D(C-besk+rurKvpw%HzW22Y%bpB+_W?@BfS#AzDr$aDTaWO1{vL z|Mzm4|I;9&?BZ(jW#f^sbat_K^87C&O{1Eo^Sm0$M-?*BFcg#~p$!<8gpq)Pg%Bfn zW+gaIGDiUotzeTq4r$%Kl#_(Un$XGZ%-=c4R71@XVXEpCZXRl!^UT) zFErc#E;)~~{XgC>;J-P(p$I~`BAuGr2>j^Z{hu+T4HnnX;-l7!3GJ_#(T3j4{DvZk za`>wgD}%<4fhBWEb`#ftV==4dyyA40-%$f+jJ_Tg}~<3Qrvf#U}N~)TYl2_zOOj z(b-5&R%4Z>S)39q-ppdcskvovW-%*u9*t#jW}<@2#3BayOj5;q2#YXRa!8Fu`5aii zhC{PVl@E6TyPnA|kZf$;k_`phE|RQ={et~Ts$Po&V~j0quB4qaui*1JW}|qX==8ZO z=3?|UA2GQZvI{G_euI5z<1}W(sVE>liI|U8J=c+&ylIdQ#Rv%OM0y-uiH*fD3UEY( z+N_K&rGovLHf3rO;6|2mn`lzG$=gUkf@8pecy7ixdG|kqLR@Ba7Qk%GA{HFYRk-{N zB;J2ylo6)XIxQ+Xx1|NF^9?$rgQ)ce7~(|7Le&&;6vEoyh?tlo9U}~{ zO6<(QqNqwqO>I0x?;4_*g_wDS=Yph-(-@|h&an@F!V9UW{UV;KakXiQkcsmWW&%Q_ zV7J(6yJ6(RTDg96cXdyui6bN>_PL4LLzz>#pMurYM4Fiz$LNOuN+=5aF6a8Iw84SRA=lZ2(JMF1x>r+fe`BK3*e=*yE1cvzb2J#0rf93 zaM(U^XmYjtMc1vtXH0fGWc>@D%KrvDW)F6hL?Iv!&nKZ+OX*E~!q*egMQMS~o4vdz zn^q|mQZ2#+W0ylRDazuAQ%ZXsbFddl4sV~Gctin_HW`MgP$-({EQWq+i2+mB23d+# z*drYlKf(8xs05b$A?{@q%Q5SiT;8;i+D7S7oha?(ttf-M)z!3^i&(VLuRhE=r8UPH z@S=|UFZWU z;3|LGi@Z6~aok2|v!VhSTmL)(|AXhm%VTgFy0)yt6Nd9*mh5Gl^gs&-Cfsx$3;isb zYSthkn3IJTEik5Rv&1hT5Nor6a*w(-*UX8lA{T;op{|m@71q&ZMN(^CxaJgTKT=nI zlm7Qv1`jpnJ+~$T8};iOi)iq&bfRT+;cu2i6%un)E0%m^ks>FsGLytY34|UFt`sJA z;hF-vqbBEtZE&+II70QQ-z*nt$auWQa@t{kz8@aj#*+l=Sli#DYS`D`Q)B5HNZa2- zXk~l86cuaBcY8}z<7QZTSrNXXT{NJ(#tp0gZbst6@GUW%@$c(LUhq`%?VPSHY$a}s zx^NBqh?ck~ee4)2+MadI|F=VZ|8@evp@N3u5dR3gO=LOafxXzr4MX}6KJGCT%9*>G zg~stE#qq7#MSxCOdVq3e$=j*KKs%P!O|n@sdi9{SAs<_L0jtR(wD}QyL1P$++|>Kj zvm~Gt$oiGCJ_ESI==tYuI^)gC~Xj6j_#vpFfVdG|YB{4OdN z+KKd6J>T$jSAyU4=x_O9Yn!{R|3TV0HfI90Te@T0wrx9kVmlq%HaoU$+qP}nNyoO6 z>38PKoKrP5Q#Dn4|At#@t!tLfh!He4!HG-?Fd@P3rFLM%VM1`)km7(Nn>GT!mA|IM z38;CGEB~{i7qD_8;>1T&bwSrOS9iF`EGQ3{B}bSVHi-(I`+!cZ#2Pms>DKgpPwcvR zwvxZbIS3$!=_MuiM(5_sloaSYF-MZDkFp~AR5I}iuiB}EtY}14F}thF3>p7!t`7mxEp^4!JwsCOCwKfhj`#)218FgV==eltBqLKC?7_VD(<>^y`f ztP=SD_mP`PC9OgApSJXf@&Coy@qejQ|D{BAYeDIwp16GHkTz8=6FS@H!a&Y}9k5~& z)deB$K{|vDLK^aJ;7LZRb>3e?$K9-PWxa;QzFuZea%F)UlF(*x+9o28hHpMfVN=*< z>`3BJ$S#u0GR?fqPR-2VBZtaFucv>V{OtZqXWaSO`7rZ%8dy*L#X63{|CeYt5Eu?c zfl>oI?0FR;T7ndn1K0;ZyMqxec76!B)S%QKy2$J}2v5V8aMl0`7=X){psZJ{>#3l_ zz9^4H7!r=pxlY@$!;KwzKM(X2t`*?UTOEz^H|I?X8wokDC765R+{LbV!RU`9M)1at z$cNGzVK<0#6MugS+gY>|MHbJxiy0!sD5j-}{0%~-8nA7{Wx~@E+;CLNcQJ;#o@dQ4 z&j?iO`4x zdcIxdP^(pSkR2><4*TW6GhyA56u4U|0w12@U){a3p{`P|bh*NIHN+69;6a6A4<6it zm5hZa7v6tox2+B_yc7zB@M60h^zEN<<0OHKh(=jLvBPIJVl+c^_H+o;2hdDA-yPgw z-`m;Mubmb7wYD0ArelQa*xtmz18^s7m+VCqk5%U~Lt7wxrm#A&FAXmxb^*J8ErA;KlF{i}!{=rp`6qvz>5TbWVcNQzL>Y+yg-td@R@Xh7Q_ePM+}J@ zgvP(~`wN5%BaFiG{X>{6AAW;6kk*&^yaK_!R6MHNYsZQuZ6H{*$)8QF1`09YBUYV` z>Gw@nI(Q+2A1shppQFTeg9akRYK}&sW`@K_<2K~GkXnggj`Za%i zg$Bcv)B!GDMq5+H?v)uhFZ*KNl!#;04<*(I%}a{;75U~d?@#( zN6+gEpyVOHRD{?a{H|CLH~RhfYtp~ha!PFZW4S?K@%H4EoyD5a`jlxAeB@pax*}tN zk<`hL9i8Dj11*m)13WF6lj3syHD)5hm*G1ldlA1-!1DRHa0MXUf1wh$VN+G3%^pD~ zkhk`1-qE);;(q70RZo>#JTO<`x?OMX=b5Z_{L^h&<2$6~CrJ^geWY6d9gF=9^&^Au z@MwAZ6`*N>-vUV1(8Zo0dR2$}2_a}qA&ue$F;u+MH~Upg8e`kA@RW<~>;Hp{S`J^uhN|o;FB{mtczN)|h;+Q) z%l3)jJN)aC2@v}l)9>$ZKSulZ6S?bt>xVsaNY~Q5F5E8Ajx^w4WM@a~nbpirfhn#Z z6Qjd*ZjT;i9rhg2F}>FWJ&~Dd(eJBj=+n+mO^A6K!f#UPVM{65TG}K3pV>hx3J> zPORZoZ?unI>|Vx~VXj)4ooK*yZ<0a2XaWw>t#`wc_Jr90QKobxaGxG#mbHcZXC1;g zJ<3HleVVkXJ=K)bRb(5!f8}gsnB}))dgVCpT_yOiH}^I3MtKmu0-twnN9A9C1#~D| ztlXtLS~XMJ{eCTUkKzoR6|}M#j<0-)1oGu<+!sl_->90N^Anl*Twk<*6FoJre;DfCfqjaVnX?{K^GpnlfBIJICoMrELC{iGOXdk zHN0gmp+{g|1y*=pFLw@vycyEvg}z+W$GzJkpqI^P&1Gz6O?q=}J$hjNIu#%`vQGf7GjLI+jdsaiUq#h6-S!Bk`zcn&=vny^*kQsKb3 zyX`+cUo?X1=0{p2aoDb)_fmeTa)cd=QIHpvhaG`U)?wKlih_9qM9jk6g=xnZvgoU0 z%0EA_tgDyaly)nYuJ_t#zx};mDZw!a(U;^sEEYd(6IIH4n}X#2Ra!E46Wt;2C!&t> zmPR2yV%|F$_oPlg8IZcMM?d=AJ0Pv8-@mA1HaQu5k}wQ{x1S!$fYA`6U43gpEy=T% z&W^DjU#80~ds;u^g#j~CUkrV`S$o1cbh*E0X+m<6S3VO?z8WdupK_p@ekLnA{eUW& zW62g?a=?1`CbYbkZ1%z#uz&|B;K1H0uFRcS`)1K`g+gyr2^|E);@d_%!BV@|3~8XO zd~^nQ9*Nzl*5F=vJ&$|(kn@Ubo{x*HWS5~ADa84 zm|OAoPnBgZyw0mXtlNb;FBy!iUTq?rs0)>R@3%Erk78*pfg;i&eY8U3u9j9{tP|8}+t9WV5f^;A4V7muys9J>%P< zi4e*o3?)+U-YbtE2f=r5-~#O>p^(nD*|5W%#zps$sGbY%^`2kv*E|_C>iJon#gv&Adz!3w0dBm;6=BhV`&7hW`h6N~PECp+@_Q2K0d&s`$7WIME{;DurAV zE}rdkWmXleORl_}59Hs6lb7ALkg3x2#5O5?C6uq(KT(m{GeZ-o+!uipTT#-;t~xT0 zCKFs4Z&vt`WkQSeC{;O0ca!qq7x%a=lqr5E?X5J+)*DK?$7&`?OOD-eO4H?udOJ}V znM`oHy;J&dkx_O!7q25mU@)BSzkg@Z_&{TGt!}P4_K;Dz0L;aOf3fiiW#?Hpit5^Qg? zlKKCQruk(|pvzo0)!d4y-E!^JhbFVT~~U5Ro;LDXr18<^|&4)&Q(7nC+m20Z1_o zBzq2mlLswzkv5Ji1psIQ0CrG;fXGBngAc1Nr^q!GEt`VU1Jb1J-w7#1vkk;|Yuv{* z)gogz;U-PZEPaG6vN$>FDEiuZoqE%n$4`dJvK4zGCJm)LhdXmxG-5i)P#McNDr_Sa z{xGEjX)8XoRH4AM#|`vmc96>JGthFC&g2(?!tAv?P?Ni!g=xXZ*vFR)C<0>!fibJV z5ZoK%;SG}YaN%0W=$!wkL)<1+7==#xu)QD-xeC)w%jDDJierEe#^}8)!CRc3q65A! z0(z8?c;;o@nfqeNVOhg_zcn|$)clG7$f3(8PgJS3sqe07NTFZa!QVp{ zF0MC9t~X4sH%_iMP%e*17!=DrTD{;xZ3rt z@+;}>F*zFJA;*!3$5L5{+NdCcW*U%iBQh{$*Su1vZ3PufN*=L^!MgR0b3|f4>Pl}XC3vjg zDNY)-^dzrFL`^2=-?Y)i5Iyk_7vomERLk|Q8Q&i;(tRvyDnDqwU$VX_JiQ`rzNwNI zUbL09EG512eFB7g92y3`VRD~i$zAYVeF*F0m9VRuj8+o-RO}wZS#+{FiwGv>X#i1$sg^#lsH=4`maS z#91u}A6GSYrQ5}_EOa?XtjC~uM8AkoAlK~6pT3)f!`_!Gqv=!wh z;vBS2%$?)uH9JjX*Rpm8U!d?w1x=D)EbIWol&aEDlkalrIFmy1;6xqAZT`|2lFPXV zr?Wm;idqebBiq6)+?K@9;8f~W>A}bP>fNMGPfJa2td&T5ob8p5B^)FkQS^*@aMVh{ znmB5}oupG^5ozxhF5j-V@c7XVhVi;nnj`h#HP?_;cJRQ0oh}J{x1t>0 zAL?|ldtD{(#v$XmE*|pHBlL%B_I8mSk{5^P?fbfRNm2ax*s;U3yWjtnsnO9dI!*CU zFCp?zFY$km<@i4>Z&XYSjLc0O|I6~GTK&TfXBh1p;M&#DFcO0zd{q+uhu4~`Wdj*G zETI1m#2WR)V3Z2prXywKUh6`~#qDUwKS%+ZE(!e|e4~WUXHI-$L@+BOXYsl8G3#6Q zp9a;lv$%9K1YYOxkI{KU1#!p4(Q#p*1`Gx*Bg`ddbm9sqq#qHb5RW`*eRm z26{`6gghHX(c7Q7yJ%|u*kmR4k%TjEPZ15mL1HhbgvbPH6KQQzk%Xe6w5=aE?0^x; zqeJjYUsVa!aVUizeRy0{8uCYN;WP_E?G8m)Cdar9CxN)Ro6m%#(;8D_M#S~{EF zT5M6Jt;44?ig=AY5p&WYi2CC&2+Num{SdKf_s^tjxPbLqNKK+bY^f>^@u~*pmIKSXT9Zy>qt?No zPEnt%uZX!mg85&uji>LCrM3w&z-Vt_MnscYqN=ye>%{C|xQq33sB}fFQf^efv=VW* zxtr`rylHRTKdW%B+9~)VWmV9r?tQWGZuPD2@8rO9Q7SpsZbYUMr3<=1#I;&BbMiWeenuJYAx0St%p0@NRWRw!~d@Dmg~Car_ch#aKgZ z?Jj5IUM9tZh?R63naG)Yy}V9H3ebb(Rq6@a>RTbFq?of zd_%>3aiez-(^`8B{>c;~u%8hi@R0L_;lFM2;_S3DF{w{;-&$W++^vkYte=nYgf%^d zy|A9$QsrGAr}bjoD{P-dSyumf`Ci&1C?;^_V$?CYRX$ikWmDTMB~>AI-rfqP+Aj{w zv#KX0JE|wc5l4AdD2TW579v`x)+6UB-;q7v2<1%P$8q-a`;mS8Mc1>1w8K{T-xrj; z?Da1Z%ZS`_k*~@5eo2_(ADR==;=Ti)9`fPx#<2t53A=){8%iN&E!hssu|A=$Hq|~u zs4sr{t})?N2(9_Ow$dClyDf|&kaBz5JOAkB%)ct7(eX1*BXCnI<9*4XIf6mL`LDtL zz;M-l`81BYGSB-Fhw2v^aDjy4m9q<-k4*}7>9pe+${2CG)fsp}kG?<(=QyyzW}BfO*V*dPJO}Cpf-mVv@7K=AJ>8bDty& z{%=moUa1gVz#~2zk-wGuQv_dN111}QU?;?Aw~(0V8YD|l8%!m%mBriQ2X#34n$YL9 z)-T;FEZwUGp}X<~#atDZx+7}K1lolW{rE!+)Fb+b0cDS7EjV>vth7GRJ-EiQ))2E+ zHEBlTv`=EMk6!DGJ|6o{+d{PHs#k*28AOxjIv{ouXkXqP4T6>B;FI~7SYj*4g^%`c zn)v4LNAFFMeGDt7KL>nv+w#A`DU*HC%e+Y?ibq5-z|5d#niVtyDYn$|%a{}%on|2V zb@Ga1?I4rnR6AxE3=Hnros&PWNoOZLX{ZQsoONIiIyXkfFWhVb9~Y84(OnPrhc}mT z$n@1$#r^8oJsa*9vh#YSvMUDwsJ%nA0U@_}6oSOn^S%2=v2`Z%lUWTrcq&%Due+nQ z-6wX!alOSSH@xzo--5jex9SYZpf!gg-cc<-Apf-;QN(DkgN6O|%aGvzN4}}*^xt}s z=Ko;6j?jMmB#kLD#}hyk5P3CFot@~RsgW(=fLO5&WeCyB4vgIzuo`$8v(w>*8cS`K zJ)2iLtF>ZVHh?V=yDEnZwSIeTbSCeVb|YAQ>`Yyn)&?P7G4y61^6Y&0-TcFQ?QnQ} zM|Z~pog#+5D+VYLOc>(^XaZLwks!rXbkt~C8jG@3BMmMMrdY;UA}vF^!Tt+e6}|Lr z71Cdk`e(jQ1XBy@fMY>#Nhm29{YS^lw`G}%|DWdTm7;&<>!SaduVaGc<*9wrTc1b# z9VIAV`WXs=8w5v}5S1RA$nsC6X!FmXQ)E8CJtz90Z_A*_fcdt?icJ+Pf)kwH+5e7N zy^#D_=T{jo14Q?Qiv=elPSc}ac6A_w6{T6$N>XZR>)V#qdsQ-5{4ZPeruEn}^psdN zf(!FGll&f?POxBchfbrl)p8m{KD$a-o&(AQi{3~+XVhy9PCX__t;1Oi0^KI|wd=+P z87>iHryf?Zg-}R6v3tK58l+)9g7^d{bR=lSy%|)J#d{o)y$sT}CY>3)tttt-M`Z3C zF5Mw!5a?e;vYPnF@){=fkciEbK2c6b={eFuEIQC}CBS%O3_Kc;!WwD5Y@Vk`!XM+> zEHL_b2U?h{m`*kmt*A=9EKH zf2Dg||HFn-*Rz%hQR7)WsWYS;ylZ)~M2Be4FY{3;f*tZh#YAUF)+)6_%MsFkn+!hOORa2n+0v+G4U)asd&=czQ5z;{SP4#5!Zx*L zl0jP8@KL<*6q*IrgNh3ar+KnN=PV)XItQMEJ5?i}rA?7}34KMTlNl`y4jVAw9yxtq zKr)E8J#E?jw*(EBGJs)*n4}%n)5}ap@s8z5oZy`Tj%JgjLL>=IcQ9bY6V|IbexcB6 z0gnxFjnL?q8O#zz5>oTx97%)^yJln#?eBRTn%PdLtN87|;sorDu4}B4-k7)h*}#+V zLCw-`>=%|&kXU)hGid(^U;#*Ct8hG=W#CV!cbzsG%YhLl7EIY5b#S530_;X45Wj*s z6eEMe`VL~ID4#(ODEYWI4>@7WaRWm@NGK zk~2t2!@_3_GDc|TLbU(dYP({@-SI)8l4I0)fuiwYFFh&-Cg|iGeY#`F5YS?=i;o?= z@difmYRr>RCmL~vC#pC1*E|0zWNtCwdE*kpw)@pC>q6*1G5LhOg{_(WlC%Fc_;$WK8|}K z{aV+@D;}Qi;*h^20CX(o#+@Y#l}{$}4CWo1uyRPT-O&xF!U9^XV&of3l0A^Dot zCoCQ)xA^e2Nf_h7Soz)-b)lJ@tMXJTgHOK?fYz9?p0r7q`4f~07UK-yj$wXl`%Q(J z)!AO?lDOdcov@Oa(c09Uv*;~VR^9G^#BiO+%s)&P!jP|Ut4s&gsw{hOr6vCyXQ0Gj z^xYK2gXQ#x@dX~IVCYEA;gmZ$$l9pM>LQy8D(|G`MSGVa zV{O&AteoBm41X8pA&qNQo+ilEnTrI4x4iT!-F{$}tnGdZj_#n=qC^`_nO5n>AfQQo-wrbi!}}G* zWQ{g*^gljyx3qdx2BOKrlcD4xeHBeshXTze(Y#W3+Dro*`LW{U__mkjU}U`X{Q{7o z(5_l`7Plp07=zuX7aXcY>oP9*Of;7bciwEfNMG!Rv9=0>ShD3?(Ksz7XY(OKo6W1b zgm9#NU1e!XR29j6>cKh>f5}v?N@%;kezJGaGwY3zw4_AFpICn7$i=`{iR8~9%0%HJ zpzuysyizwJTbas@Fp{s7b7(mIqsT(;6JG-i)ZW4=V#SbuIk9e8G|jkQh5(0AWywe$k& z-ZFGHex}d}Ag0vwy?}Xo&liHTqVd`S3U+>c=u`Z7)ga4SkJY<;O$u)X~t;!alv6beQJ8<($pM>5# z*%l0oY=4wG=u7s+7u76=R?n(u@M7%tGXFdb8B%%J!(Bk>96`ac^8M0#;G}-hmxH>V z9?KRx{8OxX4~*pjc$jk>kaIW=Mg7Q zq<~jOOo&2_%}kBWi?-{Km$ZjwUBW@_Wnt^zvBK-JPkinvxvg1LW2bfgF0uW>OXHn; z9T4d#|3ta1X*gEDg^#NqaNNxaggFYW)D?r2od9UUsU&Z!AW8W{7j(e8WP~VA9AJd# zf(WLQjwMR;`AdMb`>AXs7V`Hv>Y8s93op7SZ{yNG%sf6M#<2xiT3z@qRx)AcspfOp zqlQv$e=Y^di-ZmGvr&L|d5tfQTR8O>V;!~e(*Wn%d%I^#l zf2LcvAZ~5J7(b%w#{*gzRue|neKYtF?x`o*TPMq8LS6AO@ha0zkv)vp;?ddazb7Wn zdH@M(f|28Bwv)?|l+ksb84_Pl%x8U={OFYYW)oZ{@ZAmw5;9INGw?H{+xaKQ1ZS|b zjs*8MXz_hZVK2C=2rIlH*_s^K0~36+&qtcijJoARdkC-cz;4umU>!i<`@KZfD6gH> zaUA9>ll=_3i)2@Nl*c3~X$Ls!E1d5I)(LZLSIe=_tqE*VqrcXepyYe8*0X+;^?vyj z+oZQJ>=uA^OHT1zPS^*d{chWQm`{_m#e}hmYZ7B-@#fYmc8EDi;s{InZ|4I+N#F{I zCse)_5~w$H(+l#(2jmqzu@Oc7wwU>iU*ufMtpNL0G!gxs`{r&I;9VEt>|+s*;2xWP zGgPW4`jCXfQ-|QGqsFPTX7aqF|DxjGy|l5zR?2O8i#bMq>u>YUar4f;TpNkifR64e zpY1B2rcSQ3Tl8TM^_gp}OX;eopC?>ryTQN+NLlekp>gJ@c_FWmoxCAX&H!@6GEH5q z@FELpb?zWyjyN*IT!>%1@R)R4&i$qhsR0Jl9pw6tCUieTVzOR-ulo213Vyf1;H+;f zfoU;zBZ#W%(Wm-_E;(g|mTda9A%ia66SIzoGKB013up9Ax|k04PF`hVoq*c<`tmmP@@TTQOLcw%_xJL)bMX}c{6Kb%0huw z533GcSHfyoAuY^XJNHY#s$-0!GlD(5`G)jgC-^Z8U)_}3KPYTi-+Ff(@)N?Pp{T18 z2>Wjz^L2~iuqeRrg`x-KrM-s)GhewgN?hdMk=H*ZyB9OmQec}$0dOW_`d{Mi3{-V;h@oE9x5RtbR^@GlS};9vCrJoq*qP7c<3#)f(pwif@=4~-lx z?421zh4n-&49px2Z1iMJYz$2t0oHbI^!B!9QJr8Ks@ts`5fY(E3+)zXw(+)zXYf#G z*Gi7c#M^}1blboSgxlGfwnaA^J+(hhGj6j!*R78p8eYR$PSf+fOn_4!F)C+NVN^^^ zOlK^MyB9`ANGV1}dpL=@J~VcJe#bq8fcmT?&MB0~-PV-=4NOc&Oe_Z^)t9C~GJ$1{ zR`!(5`87chKSs)^u5(h1@#Tey15f%gYH`+bq-6V!{;1BaL(JYGh(ZBaR&Ol2h^8;54=4f%Dha1ptSjozOjD1@tp4pMI()-|KtQp7G?hABzD5j z<0ET*q~*dSfeoc0Tx7TMV_(A*-ET!3y0hnVIgK}$|M;jmapha}XxFxHk$swavW=Z} zCIj@x9(vu9t8-)-c}`_BtEW0I94@BWUSW8ka1 z!E(?u3|oyjo({>$$+2bnByPtf6|UtQ6(&fj$V*ogf3x6xknB-_23t7}R5^g`$@U3^Xgr)^b?+Oh)qg-{q`5J;L^{qR_ zXi>FZoSZ@rKIT|fUp4-RVorRb^b83m6NJ-{d{7TTJp{aDA(VQ(5N_qAg zb*gNaj^i`M=o4Y$mfc?gHt$ZCD za*a>DeT}eFn8^gK>fZU7vid-(KOR)w)QPL4^_I+~rkl`qS+h{;uu6zzhk0E{^?3vs zY+u3}&JFl|L|f>YhT@T3#$yxdA;OitxVcDtQ!1IuZX;-|al+03PrLZr?Xa>In-hvk zX#G3Bp|lRy!o4x!b6IN;AIVQ$gNt>_9@2--P4(2#i!*stu3P7@=tm_pBZp$dr;&E0 zMyH*$b;C)II*{2VIG19v;^?uWH)qrK&9`omz>#(4H;$$cn&$3x_0qY6t?Svafn|ct zkFxStN~ilhLuz=Tlp(k!Qhs4RlWWhQ>MG|hestyvt*Pe*M_=NjXaN0TQQMHTni@K3 z(7iZ#1?=)OvItMnjjav(H zJJCK!ux^g&wRZ7tbyV~!Tn_!o z9uyOBHU9$G73ohal``<54qli@m;R6L87IuV(vF4!GUUP?jgsG z{a^8e?8Tjt(;pzrgGA6gvZzJT^#wzU1eCO+zq?QA=sPVq9jmq6Jff0x9e8+E?68tX zguu#$Km~$Y`L3BvK4d1dklWTTwKc?1fnV0gCdVCP<2Ykv37L-pNl68j&42BqD_AS!L{Qh> zhVEC$=H_~HgW-9H=019fTfr$2`ZRKfy8HX}jccX-K5nN+d7)+n{wT-)_3$)e|; zrJbb`_D!rT8uYm{-%#m$J%oKfg+;uFJNp^!C(@N-Q^2YQz04^u*R>?o)07*np&=%e zO}~2sTkaV$?ML*I=1>JE&-naf$V-jlj$qIe8PEoFX-f++(mqI#yx{cmAgsOf-&GMg z)0K#J4K&+r$@a_R3>cmAw)jq2s_AGiw3%(zPAu`OAZsR$)Sd$`jLg*mSlC(zMyy5E zid=o`YX;^EDL?w^-(*7Qf2oR=+7Qa7Oea@7Pue()SJ(HWtmd zmjiSe7uYZ1IjxUecSaWtk|ow7qzEZ@_V){~cPQT+BsH+DeLFvGA|r=TI58T0t_3F> znW*g7?*U6V1^I&<3A@d7ERt^t-qww$Ik5Rj3w5NX7oXQ2kYnV8v?4`0pjCk3DN9E?@%Hyvz(xiiONIJ5$*raZd>x(z9AH zJ!{c9EgtN8mhMPQlWe)m2AANv&GhE+*#nv5sL8nbyRi;@_tzbf6Em}!t27!-Tqj`N z(n1_wszq1s_*G&BsWulsQT3{MWn+D&=qLrS=Ebb@9Bs8@=MhRInt zd%^?RmtUQPHPIIJdS%Q?cEI=M7cXu0lEEpySo9r{mJ*H~0temH=F}C>j9vJsqte|u z7Iu$DWa47QB{;%dkk+1!jz+FqPMtYntuuR}$oV)v*L)afZly05tZ=oqw`k1hLa<6Z zxLoyF{#)^2b#`Z+R3VIx5D_U}qjE8k<}J&AUPVDB?D2e?+Qn6B$!QqA$)#N{T`rH-q5>?drW425=J>T?Hx)hRy zyUVg@36#bu2cvN>5O9u1pFw-rHwmS-bghQcgD+r#tJr`}129Iee?39wxmG2lea`Lr z*kmHehjWRj$AOh^8aS~y8%a7Czb-w)1Y{7Ugt;3fc=W|S;zKXPtf_G&`RI*URoOpN`>{KcdT5v4O(VLO=z z9CH9Uw3D+vwdR0pxZB6Gh}Q<`z-xeiCe&?)N{HDtvuD={{S&WDn0LyeR#{qKy(llM zWR<+!!@?!8X0VZ0H!U}>cRd>qNRE9D!^@CO+a2W?gbsI1fqBaXO*6_GDlz!nmjK*;S#I(`vslOmhGrUdd=nVA` z&|=g!o{>H|71KB2c5uHN03#|2ozD>KP;jOFRFw*+hD&!f(@dmmD?5#ieSUx7KJ5X} zQf;X`U_Oa$Z3Bk`Z9VlULp^3mL;>0aps7+2_^fP+lH)T>xxs2E^dEqYSIZfEUa)`j z1w6qZRC!+mRsD&%_N_^dgjA-Q`7jB6iJpSA*-aqnH#fqD79!`uw<~}SMgeJ&l%~$Q zQBBm9Pec|uy%w`90b15PGkwRg##;of;N z?IGgnL?B2}8VIN8rjtt8&f?WVMKP1&=xrr7YvUhF*Rb?aLu?|A3O4DW)3)QigbLsB zq%gyoZqt~Us-q>h1@_Oo{Mo~yynt<2;%WHPBo!%7FVkhms@I+ecZWtJv7#(A>wXT0 zj~Yub^Q!jzp(I0*ls@&WMCF33ffo+W;%$ND`H-mgf{ME&0$wS}k$ADmVioqz;<;|F zH?6mnV*d9;N%fSK=iCONi@IPpcLu^YNNllStz#c%m|%lmI-Fw5_QEXn+613PCj^sI zU8mxnQltSsTWewU(9RFjUEl9}$(WPU#id%{(o02%3N>Y`?`4=yjfHF>dU(FzTJ)&> zeoWpf4rH{yu>S=^VHF zlAPNuWsv+~%PsKz+YP&}58j51YwS4E1P+4Ib$*YLbt{pDR>sRMtNp1s%a0pEYM5eQ zKmULovlNNHkQX&FA_p8fAO&X-CJrf&-w8^k4krjqJ~;Ezn@_Hm^)sVuWhUkGntXu; z{36%)29lKD zIJ>un&5uKEA)%USjFfdt%ic#Lqu=#UxgxzXkPcC!HvGIM9ax^v z`?E{VAnVV}qqC}g+i%Y2(OZoZ%8Kj;Wgmvt#H@EpQ)e;sPo8x|Y-^SLHo^2;N>zsK zUq0pG)8!@3iut)YM7e1m2H~|zCsksJqq<2a_Q1>mUkX}>mRtt=Z{Y}AT(&xO4Pynq zp8@qTqOHDjwPxQn-EnS~7F#5}F|A6V)MZ62$q*bfyha@3Q(}>^rFb>ygS|gYoqw!N zS5K`5>2v602pR}28B0AwNTRgVx|V@gB+h>;GpK$=v>!1s@Zd07bL-RPPtpur>OIvp z<|HE=JDIqBaR1T3OX)U`Kwsvb-V2}5*S$+f-e;`MHXqNxq`t97?x2qvUAYY?)w`{> z)`V`{^G1e)6|<4V`W#ahDFQtp6trnR58cMQCIj{YsoRM zx7t0la${~`B$5J}gyfzq)e^QFwItA^lxBeZYGW3jWn9^Ax--3sxICPeiAtrQmLG?Q z+xGAbAHJ{EV^gD)BEZ5os7nR{i^tR|ZF>Y?2)nLLdPE!$e0Ot0BQxmJ7(w59r^`S4 zE77uMpDnXT88B;~hsqV%5tId-%@A9F--+`OYK&R@XH{e5{(b}WJC5jjkL<{b=w$oQ zmWrH;V;1XpFf+2xaWy+?FAFh*rh&$=Hp$^)C^WRqhzP^3b{V;vY9Fn(3Qm=y{#R&p zl^C!;OD8flS1#@1Jg}A-C5+v-)nK$26j)0179iO$CbUNu9cAp7UJtNt~$_2K=y%O>G7C;=s5?yvup}i6-e2Vuurw#p38#|e28=-u%Edj#?k}J)7%iz6} zW5k|VvUx&Es&E_^SGs2`MC}_Jt_9flYW7 zWR)$3SLUHJ1XOF;n**bYjLWD1I@!w$i)rm;y_sUJ%_12RO+PHlkfHInGis$NrlX|& z4zBFS)9ajlR0OxtLE9678%h z39ts|K}glGpBOS=_u{UL9ddv@*p4!0$+G`~;w=_s0~@jAdN9r+c-2Eo|4CDSnWe8VS?w}qKM0;Y>1OT@BJLVLCnh{c$h(aW5mq^|GS z-K5H>@q#~Y=U%VXd=ZEY-9tF?Lmt3Z;F+e$Xu0;{%T}I$W+pMT#*N#5p4|yr+gzs# zsqv<3n%V^IVmsVdx$YCj$ih-YuLLJ``D+jTe56KYCN)Hv0SoX+9E5v@Ca_+BBUbT&?mn z`~~#nWbt%m`Uy=mDvqa2iiz*bWZf7l85Z#QuR1z*VP(Db7qQcsQPF@Oh{w&8fdJk>gCYdmwXLno z>+A1`jV?S!wyy}fp9%ccUMHR3Z+JHcGO2|9Bl8h@O5nqLxOfS@dR}*d6zeo>05)X$ zR9uk=8*dsKRorR?xq-XCN;ZLdZ!HWUWJ1e9k_1xo45?#!Qs$vKZtqk>P^611FRu{p zWqCcAk{T5`C*&E_y!Q3;a;M7L&j@wAGhYf;hq=G_$0(xgnv>rQUZDhVa-IK{WQh0! z8L~1a zXESs?R<+b4*i{+9`|L@83sqRbtpvz6C7Q-E)OzQcb*P`r`Ivg?>Br-n+l2kOVn6z9 zVw#C~WU7kB!IZQ}2>Sx6?I~^o-2%~K@WW}lsak+>*0s*Wh3a`7z13akQ{39CI~!hL zO7GloFE1GeX|o=697)wwJ~Tu5SDhQ&yA=1-L^%0bDqQBXYQ-)h!^0gWlKNq*I?{;m zeK5A)0TkfPjycRCqmQm%Y&bd#M!y>ZsKFA%`|8HSVeboe66qZPf2B66OMxB52!i0JkKR-9O!?GHU%#2yz|ae?X8Cf=@h8*bs_m zFmG8)0p%2vba`F!z841@8yg2Fz~I~t>CBcb^+)qcuh_!&ic+p^oGr6)9!uwYY+-X& zWaQ-JWQt`|aT2ECe8E;T7l(0h$t$gGRNRyg_riTSWuP4bw>yg{ld z*SDr@Fq@Xm?02L!6+m26G~p5V=YJe0Fjedc7*@{=FJr@q4p?wh$jgw(4!d!j0V)#I z{~!EvXj_0#As3p*@zq>_cc7xDx47J!vaqmlBgnax1 zAZWs+hp?Y!v-&h2sBB)9>6A#LG{Q+1zxC?Y%qeCY)&{kGno1gVovmfGva!nsg;#Jv zx%UH2nf4&ImO?)4p>@x;mW>{k%AB}oY0>ACZ>!`T>~ZI&1q@sh)N(PT_XXFwH5m;w z0;hLeeliBJ@p0A0W0HtitN#F<>FFzvo3zoSfK78Jhb|=gEW+{tQBA9eV8Z%0O1I?# zqpPHv7zd($hFOGS>3f#t57A)oWF+^8NLgxI(@A`rn8@#)ofE z1KjhZy&TrZR=!lkndc6v+kY)GNs;C-C5x>0Zfy*%t(CEh>9E|t;CEVCk02t?&+9kY zKrZorf!mfu5gT2gpWD!pM1d{%77VH$t6I6~FM`^$H6(emL`DkuaXD zY#^@Qyns9@z{0>JkUqXg_>{!%6n`*yok7Suc4I+3w$=42)8K-b zq{&$kEuPt+fmK{wwXWHN3`_6L;=G(Vr~6|)lep^KL1;Y~T$nfGHk4PCpY+5tP>gXU&=!rH3SPh7;zjCOxwlZJ^+i2i6iNyqQe+coVMsNPWCj1I(b>T zI0!bnuX{`JzKO^f2)o9_((>$HwSdBmV{HRM;!8WXwm4X0gO|rg6xj(Q907mOgRu-H zxAueMY{$_zqY%7iCa){C;A?8tqdBR9X0NV~b3lwBp1YVNAubMl!-@}AiiELVlv( zb@P)=XE2gOhlyun`--66_N(n7IGCj5)D3r@Q`l46^(B8fOkSmtEw8t>wl7?o>$bPC zu>PR5AC(|SF+SoX8qDZn6}aub9~l7pwBJwJ>3|2W+ejPWigLf7U6}9KVPrhn$eGGm zG$b<8m%YUKK36)-L<{17*nUh8S||LzzBgZL&w``&FF3JiBLMEqmw@?12Uum8?2cNi zLt3TBW|sE*>y@X+r}8QNv-MJ*99sR~=b3&uoi6(4NPf@A!x}tBdSb(A z@kX0@d3vK`X}`D$@bUCE^Xc24!jh@aQy&R2`aM!pd(^Y3C&Vd#aV+uUpj1{oRKiHW zanU`>FGKWe6QV7QtzH)*(P;bFDjHJPF0b;PcuA|l&peBzt>u8ytRm|XtxAh7cNcX5wbJsWPjeBAlod0xzL#A9E7Y&bkU^PJm_ zGivLtWg)f3W0PL<^P0-iJ)YM^dG+SgEcMoIe^}h@+8rb9@!`m;R;8zx@nJH)8_@VbMD5!!m z=2Ou7ckiMz4c@Sx^Z?KJUQYSVR&Dr*V6t|?tU?_Ah5zO^O|W-x-9_q{>616y6%Aw5 zSzA)^wft9IM~jpkh&KLFnb=rM|ENqnW;8Vhyb5XcKS8E#gP>E64m!F3;>uwu3r%+T z5-#ZVlJd)zRQ7xmKNiXTljktq%(;4)EI(;!+uJ;xQj!0y&osK>cv3 z%prRA9D(ggQ!vVhk0;$vyKVj9^=2>OIu-oM8{kjbD8IfH$JzMO=uB_>A? zx$#bS<#4{VAS{6@yywc>Qxs2g?M(qR#vd#&=Qoh=zE6)M<-c%}=!&lD}hKKqz{W}J2iBKNvo#KUbN{y*5)B=jeBfD-HfuD94Wpq3d=cgb)AB zrr9;pylvg|$@*t{gj}4$TePo=l|`|Z!NjgcL0FH*>d(d5Mto{Y&P#v@-OM&2zL}oS zv?s31v{?Yr6_HHU_Q~DwPJUQ4O|6uOH!C&kd_L195zbUGzB^wQX{j_mxtv>6T_rAl^`$0vW@7F| zbHXK@QpQ*4=aR6-dy(yhF^Z<9fcq>9A(e?rer#4=vHBHuX9gp9j=;C)Wr==Nja_ms zl`)|Gt>L1D{@N=#y(Z5~Ut{Bx_cuwqSYxbR zn1hcZH2ZtUWMpL5oYkq8_yL_AtY}?8Jl^(!6v65pQNYw)apxZ7hvf<9RR)XkUz6eTDYJd0^}p5Ciipe?y+7L6jcahK@A@R3t7z;N z9XF+e%jbq~QC8TQNphxWd-wB1K}; z)qZE!b!eWxp|tJ52NoLh)fq(&*@)7pc$1uDKU%ep0mGP=8}~}9G4)KfhvTV#U@7jU zu?@8Bi;)$O9z?jc&#h7rN**yF5>L8H% z0u7Qs`D{c={)Y^>lF--P&*Kqy!Q@D|tvl2uSuu>pR%dC)oe3Hi-QPk>4;60t%Y+YJ zo6p^Y&f|#tmmSpQbD=QFTO+`-J9x6r%-SFh$m z97&j2`fJu+O5^kJ?%z!B0o}grd$;0xcpFmDc8ftXF-WoSzsB&WbeF;3q_K^Yr!3tM zYyHSh)2w{gDjGO1^T~B9=Yq+E*3BEUbgXL#{h!#3w(ElFtAwHMQ#Z6?;Z9$*Xq;5I z&9-LAtvO`rs5d9)%V6T1*L4^>$MfSMI%bd8hFr_fGn~b-=|XL0??GqGV`r6hJRTsr z_>luGiLEUig00XTa5r%YT_!aUC_OkN(wd{tUA&4}2D#5hEU#%Vq;gt|{4!>@W8N-% zB{_4j?jrQzM7OFsbckOqvR`peQmGf$M`df=Pcw}I-VopH+$>Vv>r_hkR*8bhzDvxJ zkCHNmFYO5Nx}E4Zzx}JEe;@|j3Ro@aY5Q!h<{~pvvSFV=WOVgW97vORz|=|y%ZukQ zWmoIl!zmEQa*qmrU0CDEOI9|v08=|E8rOMijD*)GC>hZ)7S=pd(qgm_s@M_d{&~&( zpC%Z4Y$wT6)QK8%Dcza%o5MSO0LJ(flmHP1AgR=13LvTg|1Kq(HoN~Ov zW_UBFWNL%s5RQ7)jl|2Nl-Gd7(=w?*hJZU4xDKr;*Vyo-Zdu88hbg~bA!zIagb*oO zs_tMN%2%ie^0tr=S?k`#KR1bJ_j@w(M98dRBR{M*IHt7wRUbDQ*?CR@r@p`)g{io- z>#-wPV96=6kJ37qH!F*oAh@T4n{Bm{9rb;6HBdew`~78p!IQA--2*jp3#{1rs?e-) zr-;Fa(amZC8Mn7+nJw^$Lgy79wYYK-)tW`mIaeMQGa3$|pJ3Z@$ z7S0QG%hz#=C&dn8`%OwT%5I+xepxtth$7t*cCX~3HQ)Fdxj$VdCnJ-5s_HPBS=$=g z$9pb;q8X`WUTsMHpdn%{mkNy}hHT7212H-?CwbidN-yfw1c2KTwj zhw54jEg%w9_81t%iJp4rq~}Go2?Ge1?CYM1e*BJ1|KUW>K;Dl|I}A3B@? z=Z6}UB0T5f_T*7kCplflJM+v8o(g_rIw!4OJ;ZPNW4L|MjUzTsm~OUO0o!R-0nynE z#4(Y}How;*Rfa(Gu@PM15jmirYiDU0qk4F~RPkQWn2WVnT1i2{)6K?KmMPOKT!VL%Za!C9dKxA0Zvj`X9Kc z3T7*?s@7NRZDRZb#9b$x4T@@8Weg}(F)3TygLj5dgh-lgX^krYts2I?LJ!cBo%2!w z!fg1K(NG{#U0lB{YOH2hMUiMRrN zR}}@*%rTmeS|y*A3C@Ck!mdb{BIJ+b6e^ay)zMI$Fq#>$-%teO`k!<|OcsxnlMmVe zL74@PBojT$lM6#AQrJDYpCnVld|fw|VyPOB7{M*_v4$||4{V~CJlzKA0ZhV(emzbV zu=OI?u2l!Mp!2F#;{I#AR9c42TWT(kr!XoIsP(s7hPxa3>ju(wJDL>(>+udfM&8+c z8kE_BkJCl?Br=YIRjaFLYi~NdFE1`yo*wU_N#Pj<$b5fOsA))fzJ!5Ug;vf4=`tIn zMxV|nFcJ4s1HL{rHN3c9X`KSnW#9R!Yy_j`F~gpu2+2Jd&||BS-1%QGs9VJiY5n?!7f?-FluJUkUabs`3Am~bXs~22*|4QfgFT$e)LClv-6}_dB0|SSKhPu1E3A9sO zUe_#xhQ7a-U34AT#v7a4cdcUAiM_6A${$d?dHJq&_&jOq>t;rxFMMgR^E$gwSwbJ_ z#dk4lm*FElw{lSyNG^ip11q~3$ZD^*ZmAjn(AlpkShNb2Ei(1DaXJDa#c>O;Fd4GiKV zFH_n-0~}H974prfRwTT?r7_8_b&jjKvGB)J1^gfEj$du+Ynj6S!~Tq=;eCk_RB4gh zX4&F(V>Rlw8TW);TwH8!ZqhMr)sRm{CV;A_e0Tx=h+!N%n^VR#LF;<=*5&pqr(}4Q z-50LXf{GzrgeqBWiRJ>Z>#qs;Kw}9uSa`$_MXTh0Yy}$-OFKv};rr_6*hXXzY==cm zZCI4hu^2?h3F<7s9%6kk*ecC}s=}}{Ejv?g5U4s;{=C62+dYSORDm-f;})UEQZVzl zbtYXvT}NYb(j=pmg3$_4#1c6<$j_e#VUWfFtKHffE?Zq?G|QN__IQ;pWY0)`aJGV> z9wUJj+ML&a{ycA*kSoTkNgI9QF)b7x@xd(#oldR7_PbiT8bK-5kxUweFpghFUvubq zv+uBPtJ1yxpUg~)$UHnu73CH|{7FD@DT%PWVg}bCws6L1<-l-rpoE=;YIx-3I)!9j z>fLxWY#pEz6C<=;PA0xlu%W5U?KDrVfA79s2i%&EE=k%%Nm(LsXRnC86|(3U=uRZ` zYF-gjrH2_MxuR46JU)@aQ~|2t0~T&Kp{4=%Q*YUMpvHB~>}3IO7i+vKk3s`;;|!%j zBNmkhB`092Squa8QC1&3j8*yBNs;MzHNWV!RywCeF_wpzFWPG4B0}qQyOC;+e`jT6 zWN?_vCKz(Upl*uAMMZ)!gzvw8v}ik@XzNidP{9lYj*fXrClj8Vqi7^$8|0nM2~?pH zj|?|n;w;n`KXF!;6n5-I@3J*cv?O!%4w(k z*-v#JFYv+O{lH$q?Fy!N7IdnUJ6f0y?Bb(j2oK%89X^b4SQ66E7Dw<@2OM&JK0yce z+fET>Mm*xc-QLJcBpmb2GXck-jzyj?%a50U%rWk0qW^A3hk@x>htk7AafuGjVnW?= zp|TRy&?9utKLGRjZ`#ByhH;Znlwh~l(x;ovPjC47_gtGFn11xt9pn@C3pavCTZpF0 z5P+RKL zn-W?byJ3v}Prq~j8*Xhv_j2OVzs&agZnA8CC?}!9FF9A0NLh0l_L<5$?y^mI zb)ABlU%nH zL3azr7=POJ*;~e>mW7#zVJ1+v&WbbTOR&Yp#s(gSKiT4wZ1Xm{U7uo{LCEs+S zZ9nztL*fWLqnp0bfoaLCC-)tPA&u>1o2tzWl2~zcqXTUX}4=NDctK`eX+otxc zai&Hc?y<7PMXt6_hH~Xp471f1o8u-ia> zM7OI=bs!9Jnu-=jsL7!};|x1BRj%twjt96~q1_q`cC3%{oaxM^qE?DI#x%nfM=<01 zBhxQ|Amxpb*ssOz$NUV)N(NVdzxZ8R-qg~xNEb;RRR zTi>jH4F0{mjJ*Ou%kGa3=~_+(9iG`5xOD`6rjAKYzR4kbkStu%GTLWEKkQQdtO@_$$ZKlnQ; zIod3yxcH!#%IM}&+fnl~DO+c^m6H}458gZiEG(h3dd#JVkvmn-pOZBKiUAS@s;@J> zjv9Acly=hqho-e58ycW7S}G|%dd^NhAM8%yvid6CvEKPl*&sSJ@%N0#e;Yj& z+As2BEh(vCY$jEsfsdYAf~KpT4tPo&8(K>+i^(ZG3+=|i{L+7V+V1^8`*@W8xOO*y zS68OpD#@HEM>Gq?#ge5BD(v>mZEUn%o63P9S0QUF=`e=cf8J#+0p8u$U>+nB>Km0V zAi8REB8ehh-0{#K@3tI|9-{%gY0v4SQmBo{TzR+cTfU^)#fsL&%0<(>6WaOuaLCfo z--8J1*694($+m6b=zV`1FHA2reBkA1;&gH`lo%)Fyr=VmeSAO zZeu{z$U4sN;vK&4HxqYrrE4C&o!;KwP;j3u|2Ga56>6NyqXA1p(Tc9K^3iI-B*K8K zpY16FmPq<;)THO-Lmftsp@MlOfZB`&bDJd=m8p9(nzi7(xn;E?>a z&@uDUlrm1(>sk4K2siW!wFq-_bJMFdkP4F$5$QBKQe%|}84Fs~%^*iwf=WJv`z#H= zRB>lHB$#S$znP{%l9J~thDHE7Sp@^o^uGcW35$=E=Zg1{O#NnBh9GI$hey~-I}Zex zCf|{lUG)FSd1pmZmwe_k8!tB3hRL5Mj7lyIgx3W~-2U@OwjhneELwO(90>*kjJiPFwYTr#B?wMFh9xGKz zzQm=7APGq+c1!@Dg?ATNmMQ00)^isZ0RbazFK^x=B;Yv`sYlj2WA+7*s3nn?p;9?+yiWqR6fVeoNg*G%o0mjEq24dY=l^jjnKf zleau~_F6%ud1`(+w<2kOoS{|XB&GHUx1@|=Jb8ZS&08o&32W6%&J9SvwU^+!q7q56 zYOaJQd1Yx{lcXf6qyqluf6e!LbiYZ7dIkM`=SW*9tslYf?a;I2ma+wI+rl6 zA6}DKL^u(W0y@?a+QNm&4JXn4-gd9i$-FmZs64P+K9SMGq8v$?_H(9c!_T(6a`y4( z$N;^ZLz@74$ucLJo0KozckNm2bDP-q4fpl+4GhT2$Qa?9%{yt@r1p#yT7LZU8Ba%F zf#>NtK?8)YmGpw2Oo{b+gt`jH;aRRPu8-)Cq(@^IKf%%j5CJqKH zcVz^tKl#u+wBl1eVD;nij{L!2BRR~n@q><=V0{aFzkVb_UN!$anNv6f%vw{Si;lO)6vm! zRyh%HoQv4z@Z8b>HE{~_WOZ;va(mRADeftK4wx6+o<6vMEvY3sq{wJeIB2~av?~m}!G64y z=Tes+j1q*F_4a;!$v<{OlGJg< zN2BpV#o-xX1eDnRacb6|`NMz}+>SoRs60}KmkY}eI~fPf7|X8G&d4tk`|y$$#lIj< zyg95F&a$I)boeCkSqmNd-U;VdSCOF~!QXlU6@>mNVXKs261H9-T45ZvOl^9Je0x%Uf3{`a6Q z(JcIteu%tWA~g-&X2UbsA+Q^&BHp!ox6jVVi!Xx_7xsT%H6{i;=}&zBTPGs?1lFd% zz~@Y9B@(UJIWFg@MxVP&X$)lOYvc(Oz>I7% zAJu05*JeU~FrlIrd*auG^d*3GW=D}QFS`r(mEXT_de0{tm;L@yzm?y%{t0Y4V`kE~ zb$U`k=^6g3kOtITB-t}7qy#QKRPbzVD_WW_RF7>^#v}~=W6$cinf5J233HB{CS)`@vRTDRp+|>(EWPZhxtmWCK?aaTm09?_n8;lm5Z4;s{0Czb+OIAU402hfq zhF&y~Yic)H3mU2Y>imJn5vD&t$E>BNTix_KZ>opIgDkF;+1KK7+lC;B#Y|A;``M`9 zZ%b!)I#5@z=|^Y@j*Fl-0s`14v0T43Gbt%w^$m@uIOh;+ceUTw{-)bIzy}bD{6jTX z=^0^}X>o$m&kR-Fz2i=3>UK`YG1N~G1gk<+P4svLlj)-T()zR0(xCT{p-v%o1co^% z!fRO^r*Akdp;B5moNdRy-S`a(qK;{1*;yK_nyO2W*Mzzhw4s{MFe$*M9VLJIeR8C2aHiqAxf$geU27BX}cnuJ=*w%I{IQ=4nIN zgok9{@pr&M`=i185Zk4sG<=LXrf!N5Mm~|xTT?J>BA6Mx>6EtDtYcrv(VCY&eE4ui zt0YPGhM0&b_PbR!iU_8)&O9N;dcDo+3l)3AzkuIo~y$`^N8$IhcE#?(A>UD^Ck+|!6!c#hWL8+GembFGbZ$>7nNl*=}92(H;97cV+5_ehv@ zRL0Rrkwq+`JYdbcC8<(gmcS~9~?EjAKy7v$e-aSUp8 ztDs|HIT?w#Md8A#x{+|cYDx#!rdqb_7jvqKTYJ1Jl2^B(tmT0)5QZMKIh}<|cO}TN zGyHX2GBPTZ8!H^1m1ND8xM(e;a;nvJ;4^-FJFbzh8)de{0?k8KYJ=)pWOHzMID)w= z4nr($)FO+k`#_Z@o&)937E(Y_!6e152L50|YIz&WT;J8t@bYX^yeF{ha5a!K@h-IM z(7AzBNxmU%FEcf15d5_o^-p??#K`#mtv2co!)SbE-WI z-4x%-fwKQJpM_#PS2}flGvV%CfRXVe(NkpmME^`L9-2V6!BwuPI@yKL>mA-)=y|F* zws;>GZAc{Mzj#zB_M2GuIy&UooKX~Crnu2jdhvlLuHJD=(a6nJx6bFf(xTb`UfXem?b5vKkT45y(&!<^Q*Q>mdFhK+k%)y?)IR zk|mb@oR%N)1qoxj_nLqE(M*PtlJg6&AC<>&o0|ZlqI2Cb6E*+CcEt!9Hn3NfYxcd< z0f)4LEH1i@oV<5aN`9`7t|wKW$`wiG=b=rIjfsVtv|lzSWI@>geGn9#U!?ttf3=UG z$azc&dM)H!sDfPukJbh)b!qkjgX>7Gg()QU)@P1x91;GkqM=qp@cJrcUo7U{DhZ3?mPFvh`)Lny}$q_Sjh9=g&V7F=QPb&(6-K%XAWBV%YN<{{e_WAatEo zzSXSqUp#8+R|K^+TcXy!ST}E}7Xrj^-3(ChPAO<-sYPdXsk=GU38xol2bVWPSJ0u2axv{#Y~}wf z7#mWFw~BA;)oU#X1y|Sfhz%T)`Q6@^lEfXAq!EVcS-Z(sI+&>i?k_~AXm=+lQTQ)(PQXxW3J^lF@+(owcuTlSu3{(}!>TmzL5GT+2oosrUb#v^y3) znzvWi(Uk#yU7AsnZ5+z-lac~z<^z|Fi?E>}Px$DCVspt*ikdAxjs#j{ zOXilgVPXwy+Adq&rCuqs-p{8VHe({O72XhM|5yOT7tVze8A9n3R;1 z?CF^AFSSo3jxmaOkk;y3{5MmZCDK4H<&9k$bMXxHIi zjQd%A1V4<=_+HwE5(b2-*OWxff z&WtiCzHz~7ZOe9%)$xHZ_Qyq+RfOX!Kq%iUtAxzraRGyIbf|ulmO?F;I~_s46G0Zm z4*I4oIC4ivJ}6S*2O_M*4vhJywvJeDVN28ROC?u`=U8oc8dii$+w0RcMcWttDuQX| zu~n*^@{7zSEt6*cR@KFB(AC7t*vc|Ix6ATF*NcsmZ!Z_uT(nUjx)*&p2{JM>?@mvA zPb6aWf0#0vLri7LvB4a9?YWL|%XQk6JxV)0?^IUx}+aEp8jpUT3wI1WHC`&qk2H}Pn%E&0SPorswCp(>B2=L%fA&Z{y=agbe#*-EPpYYM-@G zvX=Q*eWF8Aj#p}S`LA4$1s#5bwn)S;`nj+5mrYUd)aB?0J>jy>e@F zpqj&Ya|mF+bHGcxjtnI{5^aLhaE z=enKYA3CYAtXNci8p(qdyyB6eRDFdLm*p#0pY4iDj=RZS&bhjGncC%qdD^yg4nms8 zXpj$Lh+ho!H92ISz-}lRDv)IP%j2k+ZwW_t^8pG?kn7s|CSQ-oR`HWTjSa>VmuF+h z8LbD(__AMGX={Ip?~-Tr-mk$%+I;lI!1>9Arib-_8e&}K+Hjky7T8DB{V{%(71sT+ zlV&A;4kWG*1?a>HzSkQi4%ton6PBr8*^SPp-Bgbsq;7&^+}d;T>fKHZnGfUks-2RI zb^eSr`Au}yJo;N5u;W%&(9xIy7XUCke|>~~jO9(g_Pe{e;pMS^Rk+2=YrD-vmAUo4 z&uzF^Ppf*q6G4U3^Zy1=dnTbX(G5!;rtFZu~ zAxBaKc8rPVf49M+$I1DhUCSyxN$j8xA@C(?dE~z*8Bm2nk$7Yp>bfbq5Md2h8TE%= z8+&2_D$S`13cTHpr)=haB!P0r4PIb$2i2Ms(w|F_Y=A(s$4hr{RSJ*Ko!QxnH1T`5 zjQnwnT@J1eN_|z0`C`e?VU(JN{wJR#$UAk#!{3~|V`paO_VDxu_aApDTNy_dDM#(b zpBj;pwN94O+%85D+TmQ)5wT3~$$M6$ZDqRVzx&5;3R!cyr*unJQ5DaNmnRVPDa)za zjv*dBZ%22By1fE)M1K5lrqJ=H6%BRa&n8ci+`-8MI}FUHGzvj2F8UU0y*?bHk=3Q_ z7_sCLCgBKsoG^+8F*{Bgxs=&oc_sgd#RM4v)dfBH9J9Afzz$0CWg@22`7b3 zvhHY0MRT4%_YtU<@A@k23L4*pv%gSVfX zsQuHutO7jShjAu=KivE1=*Y)xufq%BN=2RL$k< zCGUIJy;fDldIX{-H-a6p=Ge@&>;aoU)hSjs&(3`Nv<}my>`vLXe=K3OYGV-8*+vZR zoU;dDAEmG8braOlG9Ttq^%3M`u!F@qNz)x&+&6z{c-FPdlMj+I#HfyGZsl?@qu=uj zY;UX7EL+(a)r>JpKiN!8$!EmoI#x#PJRoJ(Ppy>;4H}tSX4zcg_KFzB@}FJF0BJ?6 z08U@_&f-zAHEMhXtd1(Vn0qWjKb~rVlM{n#M9{@L*Ie4$AAf8dr}+KYqx~HGm72Wc zeBzgXoFDy2@`=_dM2<@k5)3cFC**s3SNI;8%tP_8K97S6DmfFa<+Iq4(bo@8F~v$_23|9hkvTb$Gc#*ea~6qy@rjcV66>SFzq_9ltJSgK=OA4vn8>>oR$*wK-HYXd_OZVU&zKgFEj|^ zJM5Xop{d@tGVP;ELyJ(6)FmWxOy%LlRv)s*);CIC{9Pnv8xb~PJ@(ceFX1S&tA+E! z?9^Kh-jqy4hBkkyo3Eeclx&|Ph{g`fzFvv^0o8M>11j;pMrxyMi5Mbm%n&;694p`;jDSU5jQIZde9nm%L||nKm}RkP^&D zRai!OwR$byX%cN3K#g`};rE7>Z=DFov8!T$jn!^{S~u1wr06Va)YPm{5@=Yc@;*Q8 zT7yy2CmcD|CvGQ2Sm$fPFJzQNhoue9>96u>d*BY`_fAdyR$Phbh4?rFmpUXyFih0= zv1FM^UjadR7t+17so$x>q30spqxj3b^I_!EJ{Gl$JwPq z_lqy}8Lb>Idfh)hu8>WN7}YGEe^a4grDW3+X=C~&$`1PuFOUv_YGI2pW4w@@xppp{ zDtaSloTq4&`eX`&Kck92bR})m)~V0#X#qd2S8Od0oZ4L5RrvNL6{-AFKpze(j_ETp`7o*ajo4pNbbb3D(#hTq+W(>yVffNg1u9YzYr+YCiN8rTGke;)!hRE`QbX(k!#>+7!o`)lbhqT&#eOz6ykr)NlTKl(6oK`pnW^o3L1P^Vk zvEK$H`E9uJ@tP1vf;DqeB{MfPLoBVY30-9vom$ucfRPxrlF_lTu}g+TdOe=4>RsN4 zr3t$$sj2j1C0a1!eYB|`e?4oL%Fx8#>xHH7fiHWCV2_&U(5^_4uXpX5G_s$?J3qp8 zTk}aSbNBnX>|bv-G?*C9oN^R!fW?|*%TEGEhDL-RQWx~G6EKjr?SOh6J8!VpYe{uG z^U6u+y?j!(htrq*j!zyIWycT<&R7c8c%s*5e-^m9L18V z8{h(rfuFyf`7j3jRmo0F1ihNUrE6YbaE*9#&R&R0ev!hE=*aAVMHG3Mmq+%pl}h#1 zewoFvHq>;azi_XSwfy>)|HoB6>wVpPA;VI%_K;r zQ<3FIwcUJXjC_`0TTtlk@8;!k7A#cMjECubul;&{?jvflb3Je=!EJ574Di9Pwj^$M z5mvr1Mu`G3?2f#3F(63(g``^}yw<+zyedPs&=uG7M? z(KWT-BRt@Kkb`~G59U|_+MS&KT;$#N{&L_A9a{!VBp9o^=Y;dHamEv2r;NKt8p z$JJWdSU)^5FlI9;zQWJr!cgyxS`ch1{-tqwkJMeiF1IMdWy3sQTV_02KM-+5nO2|R zZDr-Ke9+5`j{w8T7$hO@KJ;Kp7)E~icI8v)Ie^*7kqUmvr&|EOEmHG>4ZZ^n5k4@R zB?u>|3j?7BVDy<1g6Z>l?YH-ZtE!zRyX_z*>Ugv#I_j0qk9TPo0A|;FeKX7b-iFiMFSYeVG0|CN25$H;gU>HVz z`<#lR#DbBD5*(Oq&(ian6f4!OHbVO5alrXJ;~4R(qBr_zsWz)+r-^8Vy!i3_>xc0_ z48;j#`a2{6pDq;b!%!T4e={ujmLgN8ywhqVd_bAv&UiZ7ax-gAZ=s6{4TX3&YU>4J zwbMFwA`Ek5+5P(9vqhb=9#w(SR{3+BLxVBXrSTOdiyAA&z@OODACnsAAGj_KR>Jhm zR0PY$u))E-qM}bMEUeiXD6&DXJ3oa6Z8w8rL(O-}Z}7B*_lgt=ck)9=OV{e)x#TvFRa{5A2)zl#HlcSNHW+PZ+i2 z5uzQz$5Kj!tEp3yOvw^TQzhN|tWQ*NpU{-}J?HuMENh}7!PxhlPeJuPQaHWEXIeUw zo)1@@Z4%OO;gV5d3JL^#j-~}Ah3`w~G3n#K5ymz+B>l)QvCodbmi(CFx3p=*?ZSNK zyY(LUF6J3^5DvI~$xVe|{5P*2j*b-kty3|YtEcwsIt@b2< zFBM?(PiyV&L{OQ7{*3EX+HT~H&RD-QRXx6v=HT?rE>UbtijrQ3>Z*aHJbML)kkiH_ z`S@t$2j+CYTC-J^5ql!oNrWfh6nxz_=dT;(g42$UPp#)}n*c*VyuXw`R1|fthYori zz(JHUtU{%)$N22jr4eZZKHorI3~%^XBss$;sZl1tnG#+?;TZlTWNaC`Fx2ssx8g}~ zSXowBA$JMUNm4Du`;dO58ZOs^JneGbuy6Y1`chq?c5uP#zUMPp&izLJq*~)#Be&;? z^zh20BV5$2Fu`4cufu0uR8gU6kAE|Fm-yQo?F+5P#!#lv$5U*<^MyNO*B_^eUz&Lz zdHi4FM&x9#JwZbY*p&U|MMHX9UCn`+4~LmAmQNYv;Q`*t5866FyqMigNWw};D&MM| zXCUxR&8ELOlGj0^R5uma5X7GElLXc}orDDfb+8{fg1bcF(1!e7E@?~aod1|b3>2(=JZx(7koMy*#+{L8%AAT&+z(9jCQEWXgD89q} zcD}a+_(flru6@;E^VVyJn9*H2t+bsZ!>ixxSUt(N(rG)Vtl$a0b;r|I!;Q&8xg*p= zwXxA@k65dsSlY$XLnJk#0g*vg z<~*r;w0|T=K!ONa{?TeIiS*8k)`&qivWf+y?-YrHDi^7ce^|2M;k4boY$i+XdDG|T z_oXeUC}to5H+K=ogg-i6Nc$<`O<7s9b{I{4kYt_a&i-J5XcmF+b7xz%q!BMG7HW#T zcWv0Ncx_6$Bt4g;)_z~X)21M{AM@E={m?ZOBdUkfe80aj6JEH|%e~p;4wFU#Jds4GQd3_{gxz!Ng*@R%GoGKe&(&7$FetL59QY%k6y+Z{9aoUsMpo4smh8Xi%5ov?NIk$hGN9Kug%oROQ5fys&_`Lo-Wdtf;!$yu+u);(7#YJo2~hdwgk>jGa|{pIDS0_K5dUZb}S8cVT8y%=uK;Dtt7I z{ZjypPIE_*la;$WUMgCwBxRO;*Bz@n}IsercPgT{yg*q)8L(KE(PmbD`%7{)lN&mV8OWH=PSe`;`5_2-x#|aj@ z!s9?m`f69o1!h$g+jR?w2ArB$?fhag2F4cMT5^(10kN300oiF)Z~M9tceX|cO`vc? z6`VzHa;0Kp5sstwxZS2Xut=1YHwSDPPKqbE;J*={oG7fTD$NXq+NTHt#p9db1&xXZ zFr8TyalYF0Yjuvn3eq9TEw#l*Fct{<9}1M^!(X1#BRxZR zFejs?F~1i_%2AuAxe1s|o!kjukaJ;j{SSwu^R(NLxyR^QS9wI1|0 zPs?6W#Rw!30H{faqM!#!NK>$*V|Z~1HAkvI>$AAhc)Qd@uF1z!E!RjnE(Hm73Rg-O z7k6tp@h!@EYYct~plMPTYu_VNHBsV*E_7w?HghBIblV^)Ir4^ulcqJi8w+zSk*s|! zT!m;=Xv=Dj@2e8Dwg+~lABSxyp{KSFVJ zQED0$X(r0;b|$F5|-&T9Z*Y|5;`R&WTy^s}6Z5|0dTlV|--*peg3 zZiRrDSRGHw7SXI>ahg8ii%is^;bSrNU0qX*ZX`!ckB;H;kzp}ns4EC0peC5)889pG zE@>&GjL0$7aEE`xmZF}D&Xsa2bY)+vv7B!y;p3qt*7xmO`=m%aYc8)mAu=@n4AWWK z0QG3ZBX%1a4E~IIDhU;lMtVNP^D7yka{JiQ(!dx?uy-o-`x5Z$_$m-|03b1GE4IN3 z>Nia!{v-)6xRm};;0PSL$7a{fVen1Q`>LWZs40T^;cBsZvk0QNM&@D>!<%?2nQl|O zKnD0BV()Cc`C-{8>m?wl3*7J^(`E*N=!5p8UI994y5>N87EA<0V^pk zd+p1DZYE))qnr#F;~cOQ!k_w7nnArKX>|GeF9o}Hx{z+u(yl9sKb&&#`>0Tdkcjdr zann|&QNC=^@ErUo`&*2^uwj-ZM5&fuf}%kz>mw!`*Su_o4^Ti#mvEC06VWwe{Z1&b zQ0|#sF}8_Mpgz%+tZGu~o!$8nk6b$YHDpEv7;At%eVvw(k<*PsjD^mhv27}>Kp{;e zs?xk4*z@v$H#cNdKcfLM zV_8@0erKdvd!|Q4#W;HtFjSN-+|@S)Y}W6V5s@vTrd@1D>I-D*UE)b*AOcRUTgzu- zmKw)TZrEFWe^iaf#_n0o-rBXXS})<~L%p`Xo>`oqx%y=5p}HIJHOb7wvY8 z2+DlpzZ`s(TC}}bxw*Lo^?I6hfkva1d~9LkMb&QV+#bipw-%aVJVZCz0M;5AUmTey zA$I1Tf^CD5&lD%gwcLXhU$4N9TSE^g?OA)89qf*WbF2%2VgzGFCa6bRy_775rds^( z0Q4I6r`c-57NK)f&hEd*XIu5Z%(VA9=xnycU5fses^!OCO9H9}mFy1ha#Az|)r{po zs#?bvmLy|7#hJR^E#fybc$V~I4WBReJ!n(34&tuDXE*l#JBh5O=8BDBQC;J#h0N^* zKT!KOYtX&+aD)G?^C~41g`w>)QS7mPMo#;^rdGlC}RBuBxEa{B=!GTzVPb+5uNR6Ju6JII|tZgN*uGZb%&DS=W#7TK+qN1E{-e}X&b6d|T>gi=BB_&Pi)De!2%+kRR zhyfi528^L&tbuF3#e1Wzh7X)=~QdwaBny6ZD!1p)}dt9CaI;= z;a6CK2PJK~vs}ZO5iL9%B5r=Oz#Fl+%5*9cF>1+oXd9nJ8@IS#&YN()N9M{$KHRXG zWd@TzE>EA3_EoYIaOu`)oB5+`?c(4X%Md#ochVT&O)b%n5kx)XwgYCY}h8Jqkb=0t3?YZBpF-4Zoc;aT#tkkj8^+C2Pz4fg9(G*v% zp*x@}IJCFPRE#tvRU_5^Yr?RyNeSfhetPP;>9Du7^IK|XOR<#h=g>*AsX8=!QhEL& zdYpkWJcd%*l3z1Z&rSt}ZzB{+rpuX`o`uHR^Cyo=%a$7*atZd81yMpb+nsqqliMyh zVUgb=N zmK91`{YtSOq$2&omBqU}B9OOKNT=?zsUw2mp4+{;l)ZCEhD#_5#_D&tk2WQ}`nG27 z=;85gAL*is7Zg_0Sk(8iS&Q+6op$g_N-CK6t}sts-4R6QJ@RwvR_5?~(j*IXFnHwui|5ve&As zXDalwGBN~3WnxrMsyyapAMQ&M4!Iu*E+=tXw}E-D(hPa@y0+GZ}n?K ze61NAmUJOLgI55)j!Kl`tTgtvbIhzYL&fcIcgUN8wYq!rx`oHb&HXheYVcxuePXXd zRJkXB#&Gd5)2qdP$Yk81xfg@RA}Af-7VhI9=toWCe3dxAWpm6j-)oj$E?93%FUEP> z+l|Qh4zirWm-nV!H=#$CI7yozp;U3pn*y4n%5s_Ejw^J>T}1SB4>K9f?kq8pY_4Z@|GNoRn(T zm=*|0$|6)Ak{TidDixd78HQ8~HN%BUbxTouALZs4>qr?~2``MrH9Jk%*RT)f&J zi3zvJ)tl%?FJH+*LmRaZvHe{Si>lL2?%BPjSGT4wD*he=LlbbdVK0_Xg`!*AqkLot z>TmMd$k) zu8^1z7W|B0L`svxbsT)c4=Z=30v`>v%1n<^OCMsW-+Zq3wOM)U3@ZXms$&Md?u?YZ z<>laIWAWy8@pu1|mq^N?AF*)3o0@zJ&|s>ys+V2$04S_Y7{}Q z@`;FDeFz;mO!d$Zl|dZU+kyuq4mpOoX1{&sf4JUj1of|g?9_z{aGHT%_0R&zzxIhl zQoUI#+WR42I668bCmU4wt(4@WFB@iNCPJjV?AwCE$w=3`jpY;fu%FMjXCJN;P?zne z|Aq)R$0TGqUORpc|6UbOG@fwO80a`9Z{1xna2nCS^BjvYe-v zq`f7-i(=2g*{D&V#r5#yOvbs4hcpm=^+>3i)zIOQ62qhqZ$t{v*Efa98oA9H}& zdP%TZs`(&yvJ-GN{(VE!11`V9TFx?B5gX8Po-?{A@9bmgxj#HeZ2NN>8xu2sM41`< zK^s|b#+G6nQa8#+x3Bufc%ph>kyG$gVXglK2k*JR;|YYW@NWHD5^4zL#o=ZA6|qM| zc`y)yXg?w;z|A|8@DLiRyyD^{Oh>3L+B{m{%2ZE6h0VeXR!_T^^BdY^NsG;ap~pJ+V6^UVqz6cLR#wcgUgCP+hL_9B1O{{> z?X`5btoT7O>b_=4Y9U!?P;KYWke47p4YH8)@$m3SUBZC+z7kC8f)d_FH5JH%U;rEW z#dx{o`^X0^!VMy@`0-OrSXh|m{RpWX2>{SRhXvI>pe|JVx~0p@4MJa&B8bPl6=jch z_*I+LqR!M$-12x9%MOf!_ob_7End0m4g_vKjo$S_T>N$>glqNwMB?#)`DpU~)e=>C z-vwxFUj6bLOFDCnfk^MR!ptl5`bAl@u-<4j;QsrmS}}h6&0rl7nI(ftjtl=yrl1~I z)Z9`xop(24YuJ0oU{GyGgo1?1P8Wifubbn0gs-MhEeEm^r!)mcO zH)QCVAeLO8yF8uL()$ShL9c|GZ`R33XhW!JQ4FYE%q5QUB}omvS7KCo$$cvrfh-4> zbczo$NO*8PN*)X1Ew{7^y#F*k^KQM;0u^8Y_p8i9kcF48Q`OXDEANBL8Rt7k*Ki=k z)mR~l61cii0M7Zn? zZ{rc_rA_uYEUiWNs7T*?7ScM%!73*(JQBfBb7QF84==tu-$AXFQ_6;dk zstGmuAU@`w#DuWpztx_IN;(}@1(j1HrX%Ni;B2xr5v6mkKJHZpa=Jy|ACQbQJ#dSg zM0lx25o`sodI;mxy(l?kS{!n!1&K3Oa^*u-U9KCF+%$LGb;YJ%5;{v#9_*J-ygo_HENbbk8I(Y^zvGQoDi=Ji!TI2pf@T{)dtU@MS_Q6%Q{O zQl+->T3g)622hy}7np6p5}%9AYLm=^@UFlm^`nI*3rpGLcQAt-jVuF)Rc(a1L~Gc} znK&XU-RGZe5;vinqmk#975DE%O`1qEA$`@JIhn9z56pHoD%9Z zl#Iw)!C9y7Ca35vRGAXIu%_~rr#ML>HO(WFg*K36T{8Vz-$_Qhv)yVrp(Ed;PZ6Rb zntktF~W5d^5y{`ZOHe1coqc}#n z_ehZCFrNv)#jjtdz6FHf*WMmZ!YhRbF?i0pquzdOueI861^abp%b9HI8bf4XC_|GZJGp+e9 z2hTQ$59v!_aE?rT;=6Mg&{P8i)^4>zbZ;QUP)m6=o}hECRpy+As~S-W@os#G+ykDh z5W*;CMi;0B&XWfhJ+%vDSc)1hMX4Vzwzgl1PJd&Y3|ncv7*ZzA9+tn$B`kH^0D<(q z@3v+mk#CW+G5*&pX7vi1M1r3nYO+-M>b|WGhfQ|nD%jttqPL>vzo4Jp)O}O<_NlV;( zew9R<*;HR=)>G9=9cMa+)%M4v9}A(mAv*Gvfm<^i)CQ9xywVB~I}ZD(sVkPj?C~I# zmapB6?JrfUFI;04%uMq5r?3Z|isP$ip9I$$YTBar!zv9EbjF=>GT6n2x>JloHli0> zWOvoa$b99Y@A2B`T}e?^FezPD#syID!6`gq=Jv;yTaa&a&R7%*s z5!<=uy7MJ=-Zyq_H{B^O7yJ0Dj9LwIULRk5qQu*$D=yFcWqy8nk1r=~;jEo$b| z9c<#mcc3U|j2#vVY)H`gMgZOiA?acHiH-k<=Ph(5VMAcrBzXn!7pq~IaYg;BP7?BZ zzM9iADVcD9UuF%q$kgq9Q$f(GU1ZR)LFPDW~Y1~m2t!f$?lED2dIj)K zfpn0y-pmxP<`5E(*RG;a+XZLvE)I<9146H0WlYjmm7+X?4gmbNV2G&G1;&FwD$2^rii)R8J3N4a zN+^Jv{>cu|!y73S6oz!Kea;DqL=NsYGBR4ARuKQQi32E2^0@n4i)!2LtOv1B$JB#2 zzFSfpUS&qiqtur5Stsr`U<$e%F;fy05{>aDs>ot}o7}yLjNNIFG z(}3Xspwh7A|GyYiVsiYP^WC||hi1xkI8xS7$_3u&4MS)&$JYI+kIKU>8*Pm&ZbLH| zPskxRx4(FYCpwLjKe<{kmUY`Lg&cI`oO-9_@im!lDgSLB8Mr&oH!GzgidfE3TUKb6 z_7!3SboNp{{oP&TH|^HW_Oq&-+}-KvvUY>Gg!pTHZ>5LdoipLEV}MJXx8@zcSO{-) zgaR9VzyG5HYJN%{Ar0EG^gph&4m2Q;;Tls-Ix9V1S@G8B=0TQ97em!#5j5me`_S8^ z%T>|BCkGZkCu1BhKQWKq>VXFUG%SZH?O}7g~!MjQ%PU&h!wpxme_-@5m5Ic(TUv{hL z?hD5p=I{~a0=S-u7RzQm$h9J)rt#_MHPq;r7IYu?nS+6DqebywX?Z)7&}yI%;8VEE zB0g)6OZe;?0V^!-(^@$^NQ%eXk6VoUxF2qco2wDds+{=!{afgQ{R1nyOfETEY|wAC zC!MVES2cXNK2k3qDcVY)S6}gad7{ij5m13K0Sll#&5oS^DXV0@ylL0a*4EL{QBzAy zO6qq=U-GXYZOyDfL!EDlq|Py|nWiu+va51{hOnk-a(aus+=V| z9y?tqiEa)PnL_N1ENAgHieJ0fn3UeOJxfJ~$~&r>;Z=EE+UlwPxM2xuD8znQqvieH zr>XOd6)2IxktINMwfjxUzHX4)(DjbInO3YJ!La)c6tn(;H4t1>+AcTAD!ft)>+I}= zapqW2Y9)+}OukkZ+XgJj85tQM5IV98D&;JudJ;OfxB_n+B$j;5c;WTdc+I{HMLPQs zd7q<85mN$3_ceytXq0Tm4!tLw%j5tCg?icwBLa$%;ofB)y+kNf)n%05et_*qLt^)L z&oL1T7!mWBlam9BHWg=`!m#DR-c*pxFAc1m(9BxuIB$1G=|#Bv_2ek)g*0!Yl{;Gg+CP3)qFaHTU8JZh7 zQ6C?lCz)R8Fc{jPi}>j`E@KTswC-1Q?AnF@SA@l|S!fD<9@YKr9rfBbtJX9+-F@OB zqA~NoKXGEGwoN!ao#&sOIgpXX{mp(gHo_N~?@y+qk9c6l&9Zj z-3+_M3w)fRX&iyb$4VYLFKE4OQ#c=B9GEjE*Y~?bWq{?18LJRswe&HnV-5snj&TzE zX?NAo;M=bL2TsR+;qc|#&`_%W{+ILKERhe#s|4O(o-)d;WM(Ytv|Qc{+Kg)p0_(}S zcH~yt-xAkv?FtC>zUg?4+5V*+On2?7ct3Juz_wS(a0A!P<*Qq|HidYVRuX!wcLEm7 zOK}gIb^VMb0=*yYDCN#F`oZJNmgUE{S}#!(bzHK^|=RhjxNZ!h4o+h^j8V+LC=@% zvv7sB@#){a!Wp3f4tC#71&!9&H?4ML4oFa2Nl*UVEq_u zEu{43Nv^TISEWoT`ipe~lq_hHw!=BI>5_GV6k7XTOa)6Q-?VTl4Ru=FIVM#!;NInr zd3u(wQfl?LE6RR(j6>_)zmvs_tflp}z;Cxzye};*+_~3;>lFk~f=PSpu4H@lrQv_BnDXL+;nf+?(?YdsdjCgtT6 ze0cA=k@2s@#KdU*z9mA{?_EV)hO6t`BNSK0u%pCl>Wy`m7n=+B+n%s>S3v4*tqzO$ z|I?NrGg+j@vvr=5Y3L=qItPV~I$j$&aWbe?&WvXIBk_F5Li$D|SHZoFH#uG?vz!P_ zS(Ci0(7B+)jdo@9eIJR$$`?9ts4r7=`4Vc43AmrP?-Fh9-QTw{1QoF!z~iHYhuL=>Q(iZss} zOpo#Z?&anJQJ%HyN-%IWXmxVn8b9DSWVuwJEW$(dJBP*5xy&gNRWX;M4ogc8i3rk|eao=Zed zn;mPQ^%>m0ij$h3&R(cbZs`bH6l(HLAEEvLWq$su zZwV<5lBt>5&gN!MP?LMMU>yGBu0h{!NxX>#8Kb+)@NSZbp1GNbj?uQ{aoQBqp3nY< zx0ki_`wJC?*T2C(?lK}Hv|p2}wRWAXtNN%g=Si>pjxAmg6QMX&}^$DdN_HoB9lD%0{8lqNp6lT3_AB4!E*yPk2 z_w)Jq>Y$c4@%;JNh2c<3==|cM{UYO}<$Q?V={f%K(iyHo0qN<CogQ9la;@R+=k++&&&X9`R^G`9wVgX^T@wrd4RJPtBdtd?9H?zZ8MImB ziJ9NBvrB(TUoX)O&A1>YeZBY@pw>DF-JWbU{m>$NgW+Tl^Oiawos52v0&1264-McdXAwAlL*Yo+) z{AqAEd@A23#vDKjKC%si%8_sG#uIn^q zW_)}+1_p+C-GZ6NAJ@s>gz3Vg8LQ##JN?|LVisN-#@7l^3o&o8&I4h>gG+j>29d?G z%NuE|eDrq2T}` zD*m@l6y`88Ce`TzDrGr12>!PzHghFhZxIe~T8fNqy^Zf!!eCP(0}i+ zAgl0JO@I+GG5Vfe@K4C&KMmV>gapzXA;B&fv_=2%AJZTzHbF!UVc~3(Q`Xbf$Kk4j9310!WM~3JY5q6HaqKryxKv`;)}{ z8zwy5;5)03YpxB#ZeL&eE02lg`f9cS`WN)HKc@Gg;wh^`-4A>hGAtVSCR>pvJ7BZk zo}k~sH4Rp~mY)&?{nORKqVJviGprSzMZNR)y&ci7CTe|49JQ?um5IvVO<~N$OFQ2> z>rygdLmS90FImVANL?puV!UH=MMf3~|KJYmZ+(np4PiB!{Gwgmn9Orxphtl+pt%%x zPQ}LVQE48SOc{aw`X?#u9v^N_(j-sRU0&Awp_Ph64b*dI?Mq$?XYJeedhcHtXpRl&c)YxMI_j?IrZn=?$PpLPv1H@d{18`-#_C@85zf6&KI1B6*wJ5&19U(G>HxsD39ai#fwqyH<*~q zV!fhbntU0-!2B$g?i#wKC8ZmrLAqloLBJuU8>G9-8S1_GeV$)^-kN_HU}B$h_St)_ zz1O*y+CV?Tn`Zt|`tafLxb?<*$KnTGuUYF8Ne5}G*X_m^T4$^S82Le-hnf0%%o)nS z_G?M?JEJUkUKh9etBd=4e{5f0A2nxd*UrxDtk%bmWEd=uXKfSvlPzf?1ZdJImN2Pk zINAQ=lMof?qwgDW2q@fFSF*G?K0{D^_`U+@Hi4`VerJ~P&E}2|9j@w1M@Jm zRLuo1n$nGLc-YTCmVoN4F@J7!-V+#UhA!(!J>MX0^ZX+DswXObqh6lAQc;mmCwTiZ zn((}?j+3CA=SjdOGoIeVl%~I&p_vy6*l}yfu>ErS;jY3VZL>)#)>$f+o%{?o|FA9` z^St{_j4r}h>y#62B>CT>90}RL#J}8T-ilYDkU#7h(Pza?&`ere3D_FZag($S^n27uYw? z+kkbsqTXVqf3CJM;T!*ba6YLz#YciFCql$N(g4kpiZo8xm()#;!%q|$$S#8nD|7JP zpVggJ*HkY;Nzef*u$1}Y)eN4&{dAFwq1-=5@;C$)Yyo(;X7h4#j77!n0!1ZfgN-|9 z?K8jv@*Dl=FwN6F(*Y}pJkdr1tJuEud(AG*GNT|W0n-cJ-AK&&Iy8(q^*Sws5Exbd zZ}xqDiLf}ntVW!^1bzD=0XRind@G*-No-ghebbE8yNTd`q!p9wDZ7Y_X=WIj1X-E4 z5B4i076%VW1ybjWF*UOqTUThHfD5-nI1C7`_;QQ(p1b47uU<)M%6_qQUF^;Kb1+>Y zH8+PeHI*+eCLTm2CGa2>y>&L60rh6)fzS%iuA%illWSu6K5KgJ;zFm3510^#zWZ2z zLlxzaQ0#jwBLazTKT^LW*T+3KxnOF#S_4-)gdGK4B?xSx1%i%n4 zZev1va*lBO`|yPlG7iYSCb<7v9eGMu6bP)z-;G*ac7v9eS0r&IG2%vNNYIe?_x!$m z|2#an*BsgV{r{lulxx`*b#79*C4<_%ES*|lVjU6r4HxnNb8$nr!oln_C^jw;_-aE5)q46t3#!~i%<0T z3En~UaZue{hwn`YD(+*>bZc~2@uQjm2NZuDvz$&YFZ1?pa#({JdQ}OR`gyJ=R}ga9 z(*75IQoF-+q}@>=K^m_At+H*7g5^t0W;F3`f`IryAgy7ixH!OB+3RVS%I#HBdz!SN zcE{E(D54O}wRy}|S$p@K*PV-x3R?I222Wciw97GqC)y@CFV~hM?AA`yI8ezbcp64L>)7y zKp_pWI`Q#pU%PZ&wH!P=slZRQaqEWOeYwudc0u1wmP-GcZ_Ulk<>dhDb0|W`Yx{MS z#M2(4irhxtc|6-TgqI^Hvinnevp6#@JXoy~tv$Oge$JNq3C8K8)NdTDQ8#R^;T|bS zOqemOfwe7vd9Z0C%_5u%-7*uvAl;WWJ*VEn`AwJswT?Dr3}*$nR;18XfMz>Y-5@C; zWo<-{$?Dx<^d6yIjkaJ%y?-D`j=6^)pJl1Fa2OgVrZ1kDKlX0-a$Q^dflMau5KlZ& zSwd94oQRC7QJOh8&Kwz;N}s&-H+^GEP+g?6j>wtT96NogOG+WOWdcbBu z?yBYE{Er${TfS=rHo<^{=1zPG5UWvBax!i-IXO3bdfXkB2#E2Y`EQ)DeU6oDIb0?>A1!Q>>67u+ohna;<{4`y9jF=oW{Nl5-W=jS1c-yDM z#+bsmSWJcpm*k-{cpHN8HGXcsQXDuUPe5I3zy8hGa*K+#LU0YFU%H-(dT-EKxrlQ; zAs~j{AX1PkX|^PM^DZ!1ECN_t3VOZNJe|Tkag5feH1{;~$ry8~pLqnA{Luh;i0&lT zc8FWDkN21y?Y6PQ`Z1rE0DHwwBIbPn<~=qjSuZqSpCGT)h?NLUDmF?{(YmOp?-_D` zUmtmYB0Xjlw1&bYf$8iMPkahRE)oWv8B6NSR!ytKT8J8R-EEWNz(XWm2rJ$>#CR1< z9c$^<*g^$h_XOczO{i_PmqBb>4ZI7gQ(4i!ZC=U_V8Hef4NXplh>qerC4Zz8Ac3@4 zU6;#}Ab;H)(du1#e1px(mS@jTX$=R5rLL~4fq`g3?vdtgaw>qrjTNWvDEjOHd2yt% z=k$A}mLnrhWPCs7e7k9FGZkz`FZR;Wlm}`jbJO!B(?t_s)$s|p`_3Ub#?;xC z)~&p=E~YA~cwLl)S`?7~AXhg-K8HT{QIChha;L1%&(9+xBAmhC?b}`Q){VfyU+&FO zN&xQ}aICkX8C8mkxrb0H1owzv4FCD_(CX*Ax7@B78ELY>2J9}(C*!(;8~Z6yfeh)v z)6?W9P^NHlGZt%4@O)Xnc-`DL+QBBwI-9uK%bstsx6Mq$WQO6BQ>$!~C#RnNY7xG1 zT}soS>hMX_e2t@jysmi4dIlHQKWBSoeAjJyT2f5EMrj-1O1vN6gCoSwFii#foro;< zq+1{9(diFlh%vrxLXL&AOGI6ysS9h>d;F9M_jjmPego0|@II=8<*Na0>STt5%*#Jr?D8}%#Srtq%0D?|Fb(iz2*`X?{&!B#LaxE`fG-ec19G3)Xg-0<>-SZPs;70^6tHB z@=Sa`*2a$6nWKL&dE8=aRd1m$f_4ATpP+br_cC0AKdV1~zQs7)p;LjZs|g6y&H2n) z`{vehWGQmLd-slu3+JBm;_QpKc$;eNZW8;j>?uMId8#}Lg9JZ-ZbDcr$v4nBlOctH z`Ij9Yy&iPK4ot*>Lp@?zeetyxd803T|K4zOPN&6!>k( z_+6%*eS?yM8YH4Ax+)Vho;Tzdiyy`))zEPzf@{>+Rz+!7^%}Ic_9%t73-DfqiYQbQ zfn8i(T^n@E1Yc_nPfkt_49GS-Uc#ABebW*bBW-w#LZfWLoPWrv)Bnu0#pNX#(Ye)T z`GEna{0}cZY^a%fqK!(q{Ijr+#g6X>H}Pak(qg?{JjJESnGZd_-2JdOBYpRC6JRn$ z!AOnfXJING_PEZK2u5HhqU*It|DukPD=jX2cb^v?j(y~8}T z*FPyZoo@~2Jlt;Q=jTV{l`j#1K-Tg}9QYrsyY|u3)9DLL5@o_^p~|%Oxis<{SS%W& z)3kFov#)8v5fNEQXbr|^QqYd6FceTV83o0YmYF>!h|{2=jNTG)4kE~{aME;bK-F8* zf^ezT&&;@WzUPxdU3K-z2>)?ZOpMUYL0x|gaoLq45FZdG#p@$4T%rzn5*WQAP)Dok zo&mfurip(`447a95G19cy{wMu!A-U!IaNN%Rzo|6ccdoSr>D?FKg+J5Z@AvKsnRel zm5ZeO*;JGi`AB2P(Q^AuAE84gkJH+mMNWfGoc{|@HOHiEz0Hjg5SkCzB+j!XC7-#k z$(Jmh(t(Uv(&DSAsF@Cd&pSwUbq<`rq}8A&EvjwIF=4WPH#EOI1?_M=&{-RB-P^O> zw=LGSvtw$hP7wkRIS)C-xHgXJ$q~;y`S{^J)BDF`L(%`v6|&@ab)X%IwEGPNYOp_+ z_~*t7jcJ$4gcwWdY1FmYcD5h4TkEGpbs2H;c0b!VPw)bfNbRiQvlaPZu9QxANkyGp z&eGJRrHqO_mht1An$Xj_Xp>2&&Xe=?25(|@0j z+RZM+_vT9Qa#Af;@Cr`@*cr1bLWvtnq%xaAWeydfsCg*rwj7^J$ z4Vi;mLTh(w27P4%R*ovLeWgVpkH1}fEfx{A$c7@}pd=HaR8OpK;ep;o2ihlPR7RXRhE-CN1M(t z-hn_}%xuWZnRNy@@T6=5ceF7fqd4 z=)#vVywx~Vs9IE52rDgx!90C4Hr%O2Wh7MM$=vNxd$Av%oJC;D_*wkIRl}C}+!7vc zTC*aTTaZT^p|QyjZ-k3Y#fUdbQn2iU>+^Pt!kxC17B=?*$Z4)Wuq9+dF%<=yR1WFz zosq+)lMeAt=OZf%t=k4;v~Uls8!!)BJL@kZ3Awk_=+<#xfozMLR_=u-k?^G?pRu;1 zel_28X3n;ASg~Li9G&ghGPm++qkdxGBccMBb#ZgODA);)eEj7(YSq*D++el#Cz=WL zh~H%&Z*`W)$)f}(IB_|fv`t4?e>~*`}MMJ?JY~T z$J+1jLE`i2DrknRc$8$l_ydi z@6!}IqV?XTI+AVF+!Rt0Mzk^qpMJ%+UYwj%ZwLc{_BnB4(H}DW6BG*#{*1-)bzU;T z&xN^)^|52fGht}8o ziQE(K@slTki@B!F7PGS^?;j)t31Z*fPAbzZg(7JjHOctt9tEs1`G|am@iv5$9ayKZ zJQP5@1J-%Sz3ySc#Q69;;4Q*ET~G-fEEDxEt&VNG+tG%kz(4{+Ja%c0RF+;=>kPc7 zP?7BW9Y~W0d6PY%ZP>E(hzSx-j49r^?M$>@``A=uzsRnIw7>Di#qo`ext=hkYyr=Uoq>e}k$-Ce#)^ulD^!rdQh7bKU9+h~ zWP55&9uhJrC*rlVG0z*Da}W`PzPzM5sO38yfGjJ=W247Y^o7fs>#$`6wK>ssou4_r zTXWN=o!I&gHSU}lD`w3$cB(Wyc(3g>oAoUd+MGYmHr?l?cVr}B=t(KO{(&SWepG5~ z_4erpJ5eik@#T9xBvB?NT@`GqE!IY6l_DuY7RoKut@HPR@R##!+WUO|k}~QE(DUb% zg}UJ$WQkgak~{}meV_HkHyk}CclD=;-+&SuDl<{ZnFIsphPw$z~Yp};5ZPas!T2j6~dh^pz zIBAC|tvSPPeiS=E{Evm?sn52CwA~YDQ)g$p8izv^!AG^VHVgO%k4>+ zO<#-iWWWrmz4z5X`>={o=x>iBUjBy z!`oup=Gs-Emsu2PmR0!n8jm!b_X2+u#JQJH zg=Cu?45JJCs3k-2ZP?SCckxDvgbk{nK0^v>fs-)vz71ZyYR3LeM{;pV7e!f9g7i3X z$l!^f#dmcixN|^=P!`zPfAtz_s>eXV$D9%q7XF54MVJxQR-Qk5k`yJTgB4@{k~b{W z>=TH@P+v}NnUlxUO_?jYd zMeQMe&HUm8)H)s)`HQ(5^Sz$uu8^O^aE7pJLtf*EY;}z713$t&3DIHMrpD#fot?W_ zA%3Gl=c%ess8eRD<4lpH3eI})U%A$?W1xNBZ$*XgbN z{{1r3exHpjit$ANllmsZg;z=!t-(p4p1p(KUZI{yX-Np9y@#~?&bd>FZwjy%S3Niv z%@R-p^|3#1bejNS_CiSdVs>3MU`Dn~e1pwor#$|J;MVlW__`sne3oVMzRKA`eq}WC zC<@6)VZEYEwlSWrW z&k;gc{E`?1sydl`G@B>>2z}YtdwYl<75&DxtjqDJ)-FWz#i-`JNPy1i=LI|1LMOlI z`t?fL86j$z^lwo^XDeJi&x+p4gH8nd|uxCUfxrwGYi7^r}Q885R96>IoI1P z$r)iYdXSxz_ix6ay^`?p{Zz~3MPjb(Q#HEl(kcecGfL^ukW4$p%cvp2y}aJ;D@s}) zsEYgf>eXPNf&*i)iQfnXbq}H%Y4VLXc(BL2F9db-nO0-}qSV$Cs8cLlJ#&sIu9-wQ zK|)ETByxr(bPPx{`>0qdyEx=b6t#VtV@vX`u4*)jdVIfZtxKvnGTdMir?;N)EpFt` zc`Zy;o%eiW5|@`8qc1UsHex;RBUwcJ12CG|Q9~E)WI=9W~X&7wyGPcC{vUVdz*4nrn2q zxAl~wy3p2#LluOstCIVJ{e}s)2sP%Xs$#MRRV1-=Rw~rl4WeOmIgp`TkA#1}GT$_@I3t#pq#n{V&GzRB-?Ow#F6 z>gm+lQdw!=Buo~RDX*ceSZu+*tCTg8mC;o~fKRm8JI4G$%Au;F*y7@HM(P=||Ea@6 z#Z3ErIs>TM#&KU8e7HANhRc$@Qow=M0pBYt)a6JU8Xs4MxkTB~z*;;U-dB`&5bFww zpMk{=R-JKC?};+3938)u3_WnD$5pI5WRUW*HXKhzl-A6feA+7+Ez&vif5+d>D%2R1 zGf`=86hMeKd+JK=)?cjEbe5tx+Y(V3z|!e+c?%nE9SdwL)2uT1LF!g_cfnxjxf&+y zqZf<&(s3~$@3jg!k)MsDa6X(aLXwue1ZhgDDFv`rRK~kMW3zC~xkl&-rPGn6n4G% zb1Zaoz-;Y-00QCh3S)|E%k0i~@YRnr-i*l4IqM zq&+n*wHpFRq~d)&YC!moNS#$~NAu5}wBibCEUPB_JtFQH>9KnU4HfJVG_B!>+cHA| z*uhLpeS^dG*N+TL@3b;V(~4rt1kpgC00Oml?WkA~fUG|wn@186S2r|lGH%4SyCpT` z-8(9$$SW63D~J0h$tRD$DC9^Sp&ztry;$w`?_iCCueDf55j6gahmPxoIYQIAPkkP&x48T2W!}7_GG^2Bi*u+Y#9n+S2O<3EDiA*I_R9f>UlEL|1QsxiIMo!`zMB+-6}?OK)$|=H^+}(tXCmiIlKcO2ExzNLy{D zj;zJFjb<&&)qbbPW~|?Z{Y<3{9#Xc#fQ4-60!n$ z2cIweL+XlgcM$u~)0-iF@qTA0_TKr=;7V*~(IJ7~@%-@cpG63cMJ4}f;kIm3j>n!S zSpV)S7H~+T?SbL#?jM!J6*p6wWrD%!)n8=W-OsnABF+@qc{v5Mpr+ph$w3}k;cf`( ziBQuiQT;T=!aALbN|#U#_QVl88R3(Llb|wTDsn#GGZYLAVoz9A$Muvei5L82cX8j) z?}URqZ@qs?p*ZIOYUscFKCJe-em;9~#(AjOY=uHfxAT{F#pz=)S(&K6{f~wJRqwG6 zG8V+G{^-*uYxG?Br1DIA=raZrtXHp6;-L^-?2~v2^zD=v1_WFcenkCFMB5l4RJZHFluP&7wVMzW~$DD=fOX|IAf*q98@TDA@SevdY9JL)aW z9TE2UCoKGOYs_%WK;wTb9~s?5;{{Sg%DABQ6mOhiIY#|kK{(cgH`Ia0y z`l`m1r-|5zrDvE;L}E_fi%N_EUk7TcF+S&#o(yb7)0Bxh7wU`=S_XWo^WS5Y6f6&; zig&ID$QA}Lc$%hY=g{%};}9=7s(kK-7z`gG(a&`K;l~|*TS-+9PEn5=!rG~FV)S9~ z80Sdve8sQ*yHaa0k$~5L*LY<|W4719@0y9SCgc(Y^ki^NB~8Dsk}pXAPzBUwu43^; z-5VQ(zBwOFn8W>!h{x9}#xmV9Vm-XZFipPm_M|5yB*cfm=b*HkPCKM33ajj~PIu?m zQ&8^b5FDr&vwj=zmHKg_sUxdXy~=aW?c$QR&G?e#0Mzhuj5#1;oFOfVk%_rDB_&x^ zZZNWR@@#zk>}-6^*xJ*Ku07rWN}Gl}YD(#Kl#wE72yB4%;~hf3s~nbrU9eF6Ozhh@Az5HzAE9O;O-d6bR(i7#Ux{ zr*A(MSHvb&oWBfR!O%NBq4F29%l8qL8k=_TT~J&6NzoV8LcWIqJKtErasBY*lX!sL zgdl76fbbLvu|PG(t*%<)&EO!%+yVBOMFe}&@W|+B#_>u{ySsy*pMe7fkpLc34E?%p~vkJ^&Ou(nI3&a{ws=_*vrl37o7&!T-9+x5G&9RmLkRI?9tW zvIyDE4 zafU(HB3u1-x&$gSfY>?s-_l{I^si!Fe3xLNz6@@9tI?1Qtbdj8J^L8MALeh+p&;Jb zRvyxxeX~_KHgmrQDInMdA(rnFdY{idFY!1fdV5f@>_Z-*G>*Gy30) zAg~C1E$1Km^n7*E*K-PH90Awue$znMEw3uDbG|E#^(SDS`k%^Q%gP%#zl2I+=gq=m zEN1&e^>6I%J@32NbvHE^t!c$L$8G<0Jjk~+VYIF*v2xR5HQedN!R*Eb^r7KsnuHvS zI<>ij#e;)!$Z;*dJ5faij2;2_4!6s4h0f!X%BMQTG9C2`_%=P1V5<4dG4@wAOq z+6rH;>2=wcAG_a)m~mnp{$~-^VBNf3lAX<{O1i3iawa2&RLJqx@qASZjf+z|hD6At z{_=Onoq`lPH>sdcI0rXv(pnu&2fUD(9KMTe?Y4TDaf~_U-kSY3PgfYO!Yp?>qiHNY zId#ZW6N8ZTr^ms+GtBZ&=j}}=ENZ8&^I*78;`}w zU6SQ2+vLKp=-rp1wiD>iz>hWU(;LCQWU7o8^t=6iaf63T|2X7`3U z3we}&pB9U4)kns6vA0^Ou(1c0koX*4z;k)Y%hlo@K#X34IlFtM&1hIN7c(-n*y?0r z@8-67cg;^tGfE=tcl+lw2pL^STIp{&wmyuBup5;u0!?oJg&PK2?&#{9bwd6(T_nnP zmNRE?K5Q&j^y2o~+d2ASX>+V>3xuCJ0?pUE{yAykv?|7`iv>&Ie6hYP=} zWlPKZ+9@5VuZ-RMnxDR@)Q4qX=I~4J{o2CA?MB)7BpUR%AeC=7LZeD%{QDw?XOuLm z+v()@#j-F6xxvj7Lo0qSz0b{*kz$iJncWR>l>qSBN|i5?LL>HyW9vV#z1!JIgSe08 z@Hp*FmgY;va&dB6Mf0Wd=Z#(r%S8=}pESwldL*jcik_%6IUstMVjE zM6tin13?S`$g3`zsKFWb3M_qX8v~12_%PD8H6KPl;fliB_ov7?a_7bXe zq`dkK5BjD5C?yf3RLhfyLe+za`m`ocQbE>27`|C(=;LN%d}%H@P)UwXwN}mG$Zi^P-anqY!{T4-D|CBCAUd07cNoBE9L!nVy z+W)J$8kdg51rlFo*tD@~`C|r`d65w-GrZ!@?GQfE-`(wY-HH!+R&HWu8Bh zWojvhQ!{xSK{tnB+O?0+>eX*U!9qFQ@w4T^PrHs(H!Wv23AwLG1xi9&!%N0Y_Zk)+ zCcKZ^sRkd`KGU3mrJ~(?eM5BX7lzla;oOLEEJYW6Eo5gZtkSs!4Av<(i6UV;HG_}E z`AIbVbN(Q4)9tpSUxvJG{-ZA-r@e`wD#?PMQs0dzn|9wn*1t@y#a7DS|_GCxybR@!Z|+<;p&|jzscZW9bqi zKq^=>hQlhRaryWsc3s58#7s;mG@F-8gzCurSI3)P$6X1_qc8+Ip-yaTZalq=ua)M| z9UE>OTZmW{aT&E)Fw*+ml*`Ksz;@ia;T7X;=c*a>t&pgA#sd0_{Lk*G`$;p>dQ(SN8 za^_XS=ZFfna0k|5{iA4v46+ZbE~PZA1IC;3lG+zMK^;P$;;_-T(AR2V&$q{9aefz0fg zHsl0&c(it%k|QBxoq<2K>e;Vl2VLD=Y5SVANi7!;l`5CGsMHjpSfeyi_O zqTX6$EmzbfFRJ^8oyMMVM|LP z6j~RCo+IE{yNHR0Xky|VT*8vF_4cU;xi)tHQ{6?SPasn1P)s-NERRin2U?j3WGDuM zW^@qXAsUdRuzZZB{q7?510Y9K>3SM+C29*ptW*FdMFZyK>V?9 z${-T|5$q_xl{p`w(2@G92h**goj-BoGwqj`o(I<7bqwWqnf&*@P6x3RorwRqhG!~P z$hOZ1pi_#GG?*C5V{mEYaIFo$8KE*{lvJz|6C^$Tq?K8BWA}$xnQ(qfxcurh2-K*X z=GBOl`~3|(Wf1eqP17{K*@nP z&0yh}()%vk?x=Yb-lm-kBhcUD(ax$++jTcvOMWLH(0ZSrUTM${r)R!Wwsds-va@L& ziwLAWH!_Xd3D*?4WMt4Rk~R6fL_=H*z>2HyqC6w1c%wid&Q~>?r9AxT&v z{QD4#JL?DUe?3=5qDaj`20^g%^g(6X*)bK1kksKyb?>*2|KvojiO;e(t-h`81cCU8 zftS2tTDj}2yS_Iu-x99$IZKJWJ~n>@!+)g*p>H(+yBeMYWa4c6Tr;UR()^rei!bCx z;GOqPCo?m1rPE)=*v8cJuLCv#wXY8mX<5Jz`sW=_ibDCA>-3~tuZ8bm2M4y_FDhMs zGy)XHiKxHy)s(v*)X_uU;Y--#30q*ZUg_xRz=xv=uW@nXMiHv{-_9c`8!UY~XE;wt z)ZRLZWnyAkPIqEtVxo)qNT($9H5jSUnnoUlMhrmv&aak^etaRz>7+NegI@vdF=c|<#022$^Az)*reg{Il@DL;exC~4J`;z41~`r%&d$zo zrB%kyIY^aAwM*8Sa8Uc5U^uWAeKqR^gt_@!?c#FV4;8EaYm@T=84*9lDVL?E}0N~JF57UZFxhyyv!rc)bR;xlhv z4>1DOU%HVqaagodO<)?o_PmMT|Ai-ytdOC-1D(u;s`M{-+^xg}$kd5;Cz37#6YLS$ zt#!s@^&}b=sAzW~-*pR`efl^IbxlnvA`CMt|CzCTDJC4b7LCWw>b`HlKIXpD8&eKM zkU(>b`W`6_H4gUXVf13$u_byMJsFIfY7B5ew-6g{d!OZBj=wK6L6-%>N zNzyJR^mW>bj>jEfMLtz5sqhY@G+IE&9!BAF#Ry4|vl zxJGB#ylz?)Kv69Y6iVT!GJf{qRABcXq4s8DCfBOcD>SfkC8wp_TMQ(AA2ta*ZnSd8 z)c73mGhZ))U`DTlW$F8$i)10Cn6*2*#i($YGcrCp?cxvQ#MGQ~IrN8q1RyVqs2s7d zfaea%p%*QA@@94C=jU5D*B0B44|EcN=7C&*P$vd#Y-i?CKAp7ldAo&5z>-Bp{ybSd zv3g@WRQwaJvo0RgSlx~s_G(6q{1M~lolr)SKxm&Qu^15#5y$mUPIw$qUWy9kIgv8rFM(pcuuF|$JvvO^PzkD@_$Z%(B;{0Qb(4g%41GHx>yozN; z3K>k(XGV_wE;M@K$PyQ$p}yYsK_>T^f`Y;aZxox7g@=oQtQLtQabI7PO=a9V-k*di zhypCJG}Ex?A=F$lNXnwL0Id1nT7X;yA|}uQhIL69)Y!AAy*+!!v(Fe>@J?t17paX4 z2>@_g$F{HB^I(~wi~3bK8}Smc?S==>QRSlzsUFdvI50dFolQB_2xMO&Lsn)ak2@{{ z$W+R0=EO=_2X;HQEKXm|BH7)Q{!$qVrPqOuK-m!WTF5WuPTF%V?5Ciswj)i$imTV( z4y+))S3&4~2{OI*IjV^*b90;5%O>teJc?O5=PFHnhNVF*yYFkc>SdHeyAnU@U}Ip& zoPO2qoGx{s!`ldiukJ@8yb%7buz&G#<1{$q z`98mx=RX1=fv~{gV0p=ah&?oc_VE*8CL*6+>xSv64=-Pxe@bQ9+2E-Z)@hTwp~G>( zQQ|WfB`tD8=nB>AaOzo{{ZFutySKj*Zzi}cigVMB@q&*x=KSVmi0Kq%&|6&iE{-pPDyJNplZMHqyv|wCr_qGM3WBdv^tFIh_ljKT-W;+4-N)yj@{)I zvjra+_j;Mq!MsK&xn9}yGr|N4`)L((m+S<=AJ3RbR_@e<>5GX2*ejt7NwMyx3 z`MGLU9xe2Bsf1Aj(es{UqK=v3rSAhhD(#3B0z_1r=q6lJyZR17)YQE}8`Vk6iDgYg zL_nrdm*AZ3RYL}+ghHIj7zh$5Hobg|&^-;&Kzu)Bjfy$au_SiZ*6i=(qXu<0EYyDXjJ^0o=Q^LVYHjPo5SbL&G?>?)2Kj}%9`c1> z6DeEzOtT!Mp*}9h^rx_Y-niGb$yrQ2M>grh7QT8%MA63fz?8vkIjYcs84$S3i)w04 z{A zGTL>j(YwR)6j0eM29j)7U+VCdM%g7*pFv5PcV#{W?%o=YqRsbUA;TXw+s%G+s|F1$ zs#Vc%$|e*1TI#*&gl}5Hb?lc*m0Gwu8ocHBr%1^Gz;1f~qFg@-e0h@gS}_z8eojqu z`P{@$v7)3C;P4Wt&YLW^q4#&HtLrS#s%7P;S@VXUp8M`0|CCq%+jNcb!o|TA`t_=KH&B)r0iYe&Uex`v8R&(*CGB5P_LY`Pw zy#EE!2ieLMLMdFV`TQf76s1sTdIJcQVPeZ|0=xCTS zE=H*p{yeAp9VvD28+xBNzXlZX=abc3dN-f6Sbu;CMc$OmQekz=rUhzmF5q%+MMu9} zr(OI)sP=t&?Vev$tOXHnHeygOLlUF9BO21!w**4}xIKJW`(HHTv|OB=4YjqZhbkb@ zfirbN>E*9n`wTmK^R4lnox8uBA!V@T=eoD=`(lpVLb9#h(omZX>67-3-^%{qhbkj@ zU&*8NOP75p5qfbvlVdlSS3Evp(m>+i*RA=Uoq|-lHE%v>drFPUSt)a{+|}TZBSFFs z5Em2$k&1uu=WnBiFlB}z^YaehoAitf07Iyh*qA(aF}3Y5r_lO?QFDXA?KzI}MR^0a zo&b!I(ofoIM<_SE%-7esklo}lFTL_G>akyLgPrF*__(;Jt0X@5F}o!Hr_en!k|ag9 zLX`!h)NC2mdSq|P+_wf~n98ogEERZsDM60(z0#TYRSVN6061;mVq%ag8>0zMeJ62! z6SnXU#!k{wgFAVoDrT7}m58cJ1z2b$gEx=78S>im(AqEDt&%-sGK7F(+5Ab@6Or<# zU*q)VJZUp^oyZ2tt;aV#H79AkD8JzTXq46ZcWdQg56U&$jDw>kh(p_H z-)AhEY~L&GvNycNAds%;aEq3dm^RT1I9!8{tTuu5u{yJTOK4E4cLr9BpeuRyC>yVi zoHDAHICzIT>wf8%MxzDl{eki6NWB7D*^wV}N%!FP4G;YZT`MZN89#ob6S%5Dv`Ut-SWEEEHpWE-oy9ZAa@6IbvUT1>Ik53g_c|zryJ#2 zMWPbRm+T{IkAn?ZDmBm74=E3u58s&{dKXt{X@bf>Q%FTouf-@nfi<&H1TL?LF50lc znh;MGi>-gHqHB>N1Su;Wi_cr6{?YdDs|mP86Js9gNNgH?i0l>!e<9E%=xA9qs?Eec$_U+IR2&rhWg1eA#K-wdli~PvTKT}b#Tzve)44^gibd3F3fo#1xcZ&!am|u3V8)aI zkA1l7-cU+grzUw>ir*@YPVF? zp>s$E0@;2hj)$V~zn7C6JVJG4Vq%WD-k{Zm02yRohAC*z&p-~U$$zj!auS%2B{ zcUos*I4Q|~;Pt+{UWo!1&;c5d6cgigwDA0on_M~EmAJUotiLx_<+7dHuSG{*3voYf z+c;WEVY zoI=8rCM`2Pn^|F3D+qq!3GP!Jlp(F%nMIyHACaN1^>W+gyiySouFFrdbr+@kMkG*1+mU@d1Wi~leqp>^4u&mYD$lw$O5 z_}2DNsX`s&9#?eleYt5dAwE$#08N!%xh~mQRb#6g!Zed|1adG+P*UkwnMYJE^XRJ`c zTF8=zI$3ZE3?x(#+Zeqv|2F(mdu+H3&`fKD_hi4R)d$*y)ba%jNx9(7pacl+-;a;8 z*e|9k6@CFDfTjYqo*%gUNBdYJp%iNW@U;bYYz8|IL-(+wH-zog^HKg^icJX+Oz+F`(J~z0I zb(tzQfvYH$rR3N|G$;S98j?}nl-&beaZyp@LjeeVqo#PILzq8-h|sRsWovn9t_6mk z!p_0fk4xg;ZAwo{5#w=)VJKgUy-QAhcKJ;+jExtdNk)(5DoaZ}>Wq02k{C(yIF#+F z`B;pKbXw>&ACHQxy(T*qXz~j{mS?yfDqpuV4UP)HE%$T9%R6SgAz{{isof}B8 zfR#k)H?^0>_Q-W9ek1@g?WokjPYUhyd@D<6pCcGNQfmtK0=q}uY3o~M|A%VEYWDmu z{aE&z_8yN#@r~_^9+?Q_rAkVQJd%_JfYJFJVGafdxM=|pi8&Qu+nGp*Ag&oVDag3? z=6O)8S+k&@6q>2Vc-VIQ6p4gHvhU5o=>2lo`T3c{gSVX5ZcpJ*{jk&70Y`r<=}eVp z?_zE$!`_7)`pp9L`fX>22idzx7NJQP$Ot)IuF#K@?PHCW-|=KAL#>aM?SVwbVfd5| z+i$Avqd`(zLy0}T=|#boTy$WT+Y>ttQ*Pl3KC5=>Cd@QBg{+gEBMw-;=B(o8J1b@TIE_IbEJxCI_< zUfV3dc6vee<`XoJN24_V?Ipde2#%neiYg+m=vcTPRl==X6-807Ct!h~F*{K>ED$zm zDWZZ{V9+KmLyPs5{;|uZO)UAtW>kB|`wzcxVrQ`JM zY4TwtR=nqHGbtlJr|zx_*Q7UVrQp$QKG(gSv3!7^zd_r3%^Zw5;#%GS60)BA#u%~In)8EZ1t*m?6MD~Vy>EmPc0K#9IJxE4*K_PFMgU44 zxdA5LShW<-XxCvz7agpV4*gk{v_m^wueGW7*c68aBH7gk$M{H!zxP7I2lG#o5}1uM zcpyxnBLIB6`0(lp7`zVM*q%F3=i=w)hg=*%4n~NjY;2edgXW0-7i(`B5JwlR2~U&+ zLU0C$;I6?fzyQH5xVyUy4hbQ+yC=B2JHb7;LxMZO8G>vNdEdQv_q%&{e|*jS7-pvX zoUU`K>UpZ_oW?x92w`Or%D;+)w4k!4_@S@)Z;A&$qF% zd6cMHs7v4sIyS?l0Vf6rs1&hxQ08GGNRmP30aOsuZ2uU0=lqDtW zt$dw#<+jkXN3$jiga_B_F^7#gbJtcDDWgd2IRY_-no0L(N~SdkmCvi@Zu)+8>Uw@# zFsUL0ATHNr_vi9E|6zo)`7_UVG@7}~Kh$h~t|djl_i>P>A}6Q7I_0uWFjrvI$( zn+Ox@W@1_iF(JR>$BZZ0~y3!3?t-mjh=-p|xpTXXBpgecu!W$d>Nheu+v(LzXRQ_qv zu>6LNS^X@3OsIb}jxJf=;rRLN2SBWnd74Mkii5Wi(vmWxdml>-|5kr{f6ti+DCCc? z0T_?hA3)JKHR*vTqov~c+YR$Nt5}}X=~TU;@$%B0_+1|q~G(-QYp&A2!L~q zS>tM&K|?~CcOJLg;)-}LoWZoc9(+xkBZyWhuHAn#^}(k$OK|1ali+yaOb)CoN!S~) zFWmExo{;))9&I14sHL#^Q>Uvg%!0s^1Xv!W)$NG{_D$|M631VUqvAQx0V;wwf>^#& zSWdY{l~KB zlIA77PstPUfrd&v-dJOVy8T$W_|7W8OQiq4g_>=c&-zCTJf`;mYu#Pw{)D~6W z(I7sGBhc3WU|fgY%y5`I!|^%JK{KT3=mj!-iNo)W-Ve=yv-R>qBs17}PKzQ=;G$$yU|4|lz6p>-3hOB)g-mv_7ta2NUMVL7`W8KfgvbBJ0tVbr;jsYiKEvB2 z>|MoO*h^ji{!mYno!~;0BBXIT^0vEKSFS<38seO?*G? z;Lh1l%UNCq4;1p44D^nHEoE4|SS4@x;(u9_5$mWwLkWQyAd-y+mpm9woX8*VqYUQr6elC-}Vcf)it9L?0QUriKVy>nPJ+*(gW ze?iS6m?t*}5CMHWBHG(jc%>D^c~#|Kc=Khe2av=K!PZNPKdD2FTNIv0+13yjf*{dJ+CPJ^0%g7@qy8hCge34Tx7CNe{)VM z9+>4aBN>7|HS>nP7DCmQDf!CYAA&QhYtvb5I+(Wbs{hs`I~iu3ulM8kueTVTi1uid zOk2Nj1$2k;a>GwFIs@OpB2@xFn@k&@WZ@~L8WkH6YDsuO4|!V)eA%e}{ohQJ)qpGc zMs4)^sDESV)}+Sz>+#n=pGXdk!g931M{wfoOIVhZlQS>kYt72eu6*$3-4sbo1tM2? zXICj+0+KU(hCs`IE`Ah%7fIJ%?-%!OyzZg6EdjiVHh*Z~`@icc^|@ze2_ojZY^yA>?DKXwu(i2^>gw%!yo9;60meyJiKgD;^b z7kPOA0&o-gvF!q=i_~)&6L4KI- z_~q`KH_QG+iW>NB*+3S^2;QSL@ikr9Yp71Fi+TF1PY zLpZmW)m1MIF?8sf(X>xivGIM@X~Mtp<)QMSChMVu{O{CNb;g;%`GyUr3mZvRF2UPu zqDccLTU%Shmq(+^O#pSaH3P$0vO#O0YV5pPLG5%Wp{+G?BN( z7+iPJkKtIu3tI5ZNNLhjR47oy`=>e+htX()$oe}K*hzs8;5n4*s86!|uM^~yKlo|$ zIWt4e>*>JV(Y+Y{{9?@)-}AM(hc@LqZQ=6Md?;5ydG!Il6@upDvC>@}T-@RdR6TaN zg#(1m&7PS4(W*Is-q^Uf>?}d&(s;wCRbu+Dbi;Ty3j7+*k>}4CMBYhQcUrw3&oeX6 zc9lmGnrlI`#*Sm;WRpY^M=P+W4+uj8T!v@8R0tmy<~8kL-WCUKf24pG4Utn-`0Anr z17q$CVit=!e_1ffHg|M`v^d-Zq@dD00{PB=HUq!I{XfE2c-3Zy9|9dQ73@4%on^&+ zB!5ok zhqQ4*$h_F%7G6KhDNFTm?ndC4FPS3h(|P-Eyu5wH7v2}jn4Kt*03D+t7G6z39{0_| zrBf=|)c;AEiiip~ZzPU?7M27C@+4}?`I4(+hL}iH5P?Pi1R#FWhV7_-QNu(-!}!kP zP}tq(`evO&x-t4DU9x*M$Ca7bhVAK4U|=8$xwb-+Zf0gGq`%CW0Y0dzD1&nBgT_jQ ze?m@);r8uoZK$4$4x@XH13}dX55Dr?6i(Z_n=L_NLPBNCoO#2K8UgT-jY(C*l!aGN z1$cKieQ&$Zzfnb7E(R>TUgJmr&a2sSVS(=lqweQoD**{Uuct<*dEv4_*9|6TE7W`} zp*lGNqc9NW!j;@sZcLq2{U+J+?S?;&{;7ofi?Gwc%8FuD1gUM2+#k82m z;l*`XEdTsTf);!v%s_qr>>01>*v#M{lPDxeLr5Sh$iSUGk-I;W zYr8$Lb+naB{PrRWa;Ieo)d6naMnWktPFEJG^?{+@xDEu zIdJ(iS7pk8P5w>z5&RJ%{8#PQ8GrcSYd$zP4O9L}F-VFoS~1NzHkUtb_^{QpzXd>R-mFFF46Ny7;KT2nBppR;gv5l>?iLLvXtzcg=O` zHr0Vke`b7K@!(B+_{YY-52FBiC|nlhmpukGVPtAgu>jBt9$yCzKFt4siXc5Hl6hr9 zGBQ7SI311}M1+cg4q0IQ^GFN$hl+@p#3DIanSG6V2(69m>`?CTQ+>m0TVY!o|V4*ye20R{b!xG8gQxK_f^pQ4w*Fb^z96?{Zcr*0@1*2(pzqYGgy0G~rI&aES z!8gXFbjdO-z6mmQ>rwK^#)*&VAEnoP!wIEHQ2k)WR#H5Ihs0Y1JKG69z7j;4-x+xz^rH-1c&r{T?dvAYr{Xw&BKu@$mTEq!M z3=m{lMh`BFY))_dq7)`$UY31D{Y?8!eqz)NwCwjT(<|%UadLO}v#G*MRy0r%0vp=b42%^sMpS7Bn>wq< zI5vM0Kyd4fPV?l*!dqosXwgRSOm(9y&;!BDrwWxDmLCsM5M(|A^~D85tBtH=K&t6b z=p&Zem`LX1+T;UXkocXdmM${V)0dR_ymyK)i`5S__Q{$^gRO=fAKN=)Z&k6ds>*wB zA{MS4qa}psdGdUu>mN4Ekve8O;bBN$hoaXHqPVisNxX6)J8vgDYXR+ zH8+%F=h=Aag$E5y)YLsPb* zSTjhpn5ey#mGu4gm|qjLx2I>FCiTeIuUTIr`up-e8YxPRWVFM3Id1~HYr<9%G&IYj zcyiz?ouWLcAU(HyWukI|uZGd&&r%1ZgcAH8pI9lDswQcsIqV15%cHm*1nH?F4RR#j znA>N&N{1qyUzJ!HezDe^sV)9^cM|L!z`|{j@Nz*cz6CN6rXWIuk?HvoQo-!WER_*r&lqIhNu+mj zB)$(P?0)9KFZp6%`!}8X2YVBWCCMN=w0?Vfr6(z=upF`UxBm5&*1RM%-*uduI&>o9 ztfl)06xR%n$MyYEJ#~#uZH$wACk&HVmmdreGjVIJ2C;OwY8WyWX{RL(Eh=RZ5i)-w zK^ts$MC<68!^^SKMKhbjzH@9n+QHzEwwWLDUiWwBbgD!GuBd-*PJ1-#bn**;gNBYy zi85&^nw&7}$&M+KDdjdRkMtvM%(pQx6&$1fdNEBM28kM zK!FPI%MNcgN79m8TTg;KHlF(l^{%^%|AstO2tK*-`q*Y(@e@Rb3OJs*?ept_;9%m4 zeKrvhOFVo!TH3xkQ1Nu!qti-aB zRICr$-2(=09$STN0B$C-IP?3NV?@kChw%k^G}dJB@#h{nn-_6fnbsU77cZCNRUlmx z#Hta3aNZlAM^O1IW?F-a#(~om}Qe(>ev!%BxwT-+J|IHaKp{W-PO!H1!kT z-V$;R)wesf#_bS$2%(Zjy%;_9_xBeS6}_U;r~Fh3!7WSD`LVzwLs6l%y}wUBuxI;7 z|Klv+EDDv26vgSLIjsv*^c%4qn$l~1?zVjH5`17_(!%0m&z+ovbhpiywJl%b5H$@%DeFJ&G2x*qkvf72U&DyY11e$`*vGyH59b^3EQaJ zoLxdm=WD2eK{FnV-*5+qgw7Fe8;5cvtGCkuehxDdTPq()Pa#S~*WRL0b)Z~21&3oG zjX02RqPie_T|SY6KDR|JJcc4C_Kj2gSQ;#LE zf26xhimG+O3}h(3f56()HB#*#D-S-GNtw0fcl7?bf0S>ow3K`9)KY4r%(tIo5{@Nk z=pMCHeRl`z$6F5={t<@HDR8|_mNjPkju*SP@Wxu* zip}A6`$w!kgl+ith2@ya#rb5JdzVK!D5VCvRu<80bt+h3jHM>`bo`vgMjpJ45#1K? z56uP}w4{X#larI=z5SBG>xnW;x$xusy~bmZ8v1oqT3vRM6-Qc!9V{ziJ@5Vgr{+(K zi~!){i{TftRJLb{(l`;Qxw|bn&0Y_jvbLZVvcK84i$*&^*mYrWxlK#EBGj5+-O>Ks z#n{Kz2ZxJl!IV_uG*K}*_0W4Bw5ch+n70}gccLy>+HKxx`8E^Rh?)I=pyEL)6{F+< zmXx;0sr()ne4N*loNZ>xDk^u|;)1Lx!vJnh-#*$OI>!d-(axVSlDi1$2-$!E|3Vr= z4K5>B7iE=BZa$}|bHEyGoy|S~+aK-Dttd?7UTsrza&>SFh~wDGEGN^uMJ-K2+IT&j zfAS^i7;&=G`0tk8A402X6i)80k0NK|4CX40S8flX8D1CaH$wy<5Oyr_%`x%dNArg! zAD*5TmDJ2`ccC)gH&ta?Mq6f1lq*9-o;nSy2 zTDE{oCz<-9svDQ3{UA~^_#@!jG1O};luPU2Ko+-?S@0%C5Oy<3^FP~pD9w-<<5-L( zFL3C5e(<6ZqdhvnOx5NsXItDJ!`~mYj|UVp_K5_#Y=}8Jia%Toen=_Z8QJ2BiCg+C zsTNLP;k|MvTy+omLLxbab1#qHwmdeZsxkt*4s`iv=?1+qFt?;w@09m0Rnagsb+~oP zS6f>ldQOlRt_+CLI_OBBgBEZ2>v_R;_r-I@FC2e6$$N|a^7;wEhV*U&R< zX)yj_ZB@f^AHh!m19oC2j?E+iV3OZjYCTLu0H2U>7?>^~)_2856`Ilg0+Cb}O}EAr zgW~a=fkUwwV|pDSJHg_T_=RR>VJr7FQ#`7Jr1Nq3x3_75E(~^SF)`qPfFmp{{sO%hs<-YuQX7PK8c2ca~6z85wB!z3Vul4 z><0V-Y@ePDe8~&9J`Q1tLE_lP`3q+TWKzTWCQt42*#t7^;gB*iQ>xL^J`$o`+Oo2Y zA3KtvJyIJRKE3vJM@tw_-^?_n$XQ9HOikc_$awC-KV6Hh;rT-w;ZyhkHbnI3w{P!7Lwn}+`ec3s1i*15sogyQI@-4~ zMzE0pXJ_lYD{fgLZ$m79-)-RekvVElyFHZ#mC}GOV-L>c=nZPx4nweFyPZVmJKC;d zW~-wDb`;A4VTH)t% z=%^`_rc@d6!zo@=w)oh#mjVF=UR1V%0s%h$grNJ`&%>pP3YK9$lo|`AkX5ordAc$j zmFmx%^|=@Nwg>oVwkze|Nvc!J42UMd5M~We$PH}=rq>g)eJ3V1)&c`h3AdvhvsOh0 zQnM2=7sgHE3{^4r&$$)=h@X&zr*7#^KtqJFCd}`EN$VW*It$%cia*vUO4l)^tTGfFZ0`Fu&@=A@m-=ij7FT2^qE^&8~p?dSi%zi@RrZC8|uGPd<;JkMX6oP3$ z0gA+UP8g#z9vhV%uyzAz$j|RTZ$Db1*e<0tUv1p_;5I`Y-#XZDFAD}7i5h02c0!d- zElxVpG!yP<*2?-3po)|sq03)Ws!EgLc)p`@b@hn-EgxdQsBXh|Rn=aB`{v{667Y2K zUkc)Z$SIAfpP@RE-Seemd8i7&ojj%F)p31o+$H4Y~tnV<@Rf7QSwOziED7^%5LHX0{FQO0$bn@iTps0L3 z=Isz9WDGQx?@~D|#|n^8F#{ATN`o=8o*FUP`?DWo@;3z=_uQVRqp!8U#F85n0{jvwgJBr<4LpG z2*wgLQlIccc$UCqTkmKpWqr`-yjNIMBqb?1o{QkYAM4r5SQ=GBnQimK$1+= zl4Y1`F%@ECWh{jfq9+A|tR5P*+w~rl6pBl@-S6LGQp3 z%|?kTZCjx@BnUCkJGb>3|%-_(yzpw zDocVBI7!_MKq;oCg8CMBtDXGoFS?#q@$wn5v1+}uV24djR*1R0(^iMgqg&cSX>}z` z-znC1!5aBSTrQiF?-W)~7BMj$u{_zT?fPhwE9b#L$=`NF8xCiX!N zQdbrbsL^_wncBn7_uD+sEW>y-sJ-CsBYsnng=xb~3Bt;(<7%1`)wS%=vf61!e-*@I zd8LNkdAf(;&-Ua?9_NebEc19ywRg1m>G%yN3&&%c$5F;~MRaX7JLW6kF-G5F0F3Pd zjM-|w>(oPll$N?AhDARYjj?R<4x>ZSlTE7$wk6*hsMI`8 zg1g)1pI+1Cn5}|3X3I+HAsdMSC-Zsj$(qI(#SfDTG%!m`DpHFx7hEr)riIkjO82dG z&H;b-J`ef@-Y05CuB|6UW!}QN8}7vL2yy<~Eg`v=QCrU{-bJpPC1A#o>jXJ=6G!%q zR@mElG}b)@0O5;W3T(&4}Xyx0zjPU zw(olU>&#vPgQkj(j*gaAD)z3st zH_JzZ$K6lg^n~!qDSUJl3OylZ3T!6nekze@Umaqx(HZJjXN$UYwM#j+nV=hwf-=yH z!=PEKV12u3j>2Z5?Q?n5HYbePXcy1X1`}UkGY-(^fqr^>Nr9NQ*rb0Sj{FB|<$8Jc z+i;Ohb)axYxtM(*f^M2$^J1vj&oAOpgLcE%;$qYuLp#RArtNUf&Pnr$PETqncj8~> z5rR#OVL&Paftiti-%AYY?>8eyUo*tOxHh9F?Yc@NdCA7#|Ngi$6g-NOl7IiWW?x32 zr{10pt>q?-veE9M;x!w(^1+SB;Fvs#{X5oQ-^ZqJ#e>k}_RG-F%!@XeIGmZ@uC%d0 z$fvw75l$V&Ax-}fmv}h;r|?Mx#xxxqeD*0D9P~y2n|=G~xRfWo#g8EAkFux|=q5x5 ziYRQ}*Fwnt`8#&wEMh#zBjFgkT|d?cO;W$VEg=Gb%N!3bG|iy;Lc^%ZEeM7DL#RlI zH$*lZBF~{NjJIa0^eXaSi`2DwxYfHtqDgiNLxSCOep2L`;gSV*Z6lH^q;?0_IP6Xb zfyOpDW5QV|GZp^vI2qnNl~vvfZzYDlCEK>~Wz>mO({Wz^;k8RdgSUds-X)3ML_vJ# z+w9=sv}!x5gRwpx8ciNVE)h-LAAuW0PMVApVbtuhekO-Ph>RAMT5Zhj;5MTYOl%^( z*OSlfq1IIUh3KAnjox4OaLG>5d)Ddd_d*j`)pJ;0jjyaOWi&-d%g2Z6Z`!0hA6`v@ zgutZ3J8{|HcV46YO))s2I_#_%>zU5t<%wpZ$AJ4UXI#(n z%-4Di%gQ%WS6;eaTx@c=-1BO3bhPXfPS`^R4F%lYg#)j%UJzS=peS$x%{3ae`ua65 zuVc$IkZ<1Of7)~eR8Y`+BRyBw&iNV&QBfX3hc~CP;s|V~f}%)Ua=a!c zDX?yZ&~0*2ijEg09i5pf(W($Gn;AWy z{=}FY0(gwM1|3(%XWF60?SJZ?=9Vmc^0WHq?8 z-j71=>*w(PW`yd>%Rd>HVPjwTcR~*V9;jbBz2(W#gO%#dw{2i0AnVm( z|F=>PQPGX_a||BspfT5i=9?p~!;8gd&4B0av7)NY8Q$HIfh4>CXU?hKqAwAhU7kRI zuzrQHRfS8K>r0N5=q{|aONd@CkHVc6`?i-x7vIi3_6l=r?}Te1P9D5f#S%L9OKu3| znqVDSN^zF=t5&3duu-iCLZhdW)jwU+3n!U>=Ju_jfs9ChQeb5BCXTKS2}x>ij~IQ4 z49^(HU~XmG$+Y##z|)hDg(+Q!Vv7eDjNy$+nkNGxwXQg{G?uiQHmVN)K@TYyj~)FW zUHX1Jkf!`NcXBptDKu$Ft1NTB*a) z!`_eQQ-_Cz?GW?3+g%>c&L;9au(;uplYV`|dyt1T&_Y}1>_VYe5a2*hw2Dl3>ES}A zMM$Qe#g{8Wyl_t~F|jZz+4;rDI7ud+T`wQ8GQg3`umi=Jl27T*Y6za!P^;}&mx~bT zHdI;s@h%t3G|Za0{}Hz@fp9z>2;@7BUZnL}Y5Pd)dgYnu(T&{k;XUf%eZ=gHI2F+n znkdT*?M=4)d~sxmBqg?G4n#OM^mJ~L%y+t$=4hn0dh8>rsVRV(M^x(E+2|}2MD)X#zb;r& zMrWzLCUuZida|5M-Gt@DqJ82m%~`~d zV3@>fYqThdmrwvn+VH}x#3=5%ITHIukgNJULbH{vA8LU zio@7G^mF{T7GU`I!%iXD!o^SZ5GO90tPZymf89gm3^&oq_!__JstiDmB%|`vUq#s5 z*;bsb#Kp#%MPubgSa)M!u4Ysbc(YfKY#TJrw%P8%_^r_lCI7sCf%IIK^|8^{i5-*A9N8Ql)y0fO`@SaAzP&i`Y)FeQ;p2! z|7d2T%ovuDD@`0_%Oy@l`rtFL1&jnn*hF^XXJ;AEGl#M|-aD;cdnu8lM^!%(uhL9r zr0eQj*esUb7VyRfgAmfHt(*hROM#6GvB2x14>BT(PO-@+}&a;u>$H1m<(a}{` zI3|ntGBGogF*Fnv6$MCvgv3jXQ3;cSrAOfv)N={|{x94Za*MO%agt@1({9QM zBY17vj3fM=4hnpAH|U^HmY0tbx)AiUtZA z94tknqr{Zy#epX+qs?3Zu=h+-O^>7WI}9JxnX*=6GJr(9O+l6({TY7BBND z9^1+2iIFW##^&Y)I%T8hIwZZQ2Ls@3%9sCuAQ*@W_YsIh_aQt^25QH+?m8H`I>Sn! z11|vA=mRwXKroUC?sa~zQywjc-H!_lpSS+Bf7|AN#{epS`=-v)<;Um)20l^W8}%Xb zv7%q2XCbnJm8a==Mgou5u^pOB5N?}K2CmlE zw`NM0VzYUF{XTVerc*8cv3K6E9INu9+o=LDm??W<(iGbU^iP(1myCaOt5K6Q3_G^K za~!UG^NrfKgoIb`+wuX}z6wPJ#goJPdhNCmaopb@(%A_`LZVZ8@c$EDxTe;8*s zCo`$TBni2Yfp7TmX>29vDC`kP?~QOZo$l9^_2Rz&68C(6?OMTLts-YjIz9>5lA7`X zk-Uilx3IolWT|L!|CV(w67dYKjNxtOXXNVblNhUtN0IFSo!!aK=9Y!c`%Ywa<#FjI z^v*GwIwLy_j3@KOR{$0R*K zBhHFKH!@Joqb|DD=-dg$h1f_>#Qlrrhgj@MEPzdfzUdwLD!<-(<={=X@Lnh(+7RpF zwc4bi&)uVoL~`eapi@G5*7C3BQ>kUS zwft3)kH(kPnNk0rpirk30ENC_u`6(qwsj^tT(Ee3o_!ue5c$MaxX%HOF4eyOFnYBr zpF>3Aw-wfdkidxS-x)o|MJs_q%onKB+~<87X1>IeCW}uN&z3Oz9OE1i4gFSC!J9Xh z_zGl}6an2+v<<^9yl4qGu^MUd%R;MP@(nclx?0S9ZMdxC9Yw{k$ zqjroSRh?3`rVB|fPfminH-joFABHU9RR)c-R1rx1bQA;AT@xs88?Ycj^iK}Tr|@mI zLQiS{Fko{w7y8;~05Qn(%h!+!*Jz!M`IyIwL8XR4Y3G!c=#yR=N}c-iZ&6|F0M)9; zQMFrM)#mC?WcnfFpyI>>Pj`CvRpug~ATsJM+ii`+&(AyWO)IOaCd9^O%b;Ai_f58= zqxDl=erh?#f&lEUYvf2~xMlpjSA(79%%yefMV)hV5a#9sCq*=Uw` zVO)$Kp^?v`qgbzuO5uusUq)c4Z@%eCHbMN`g%%aL%v=2*#)FD@I*h+53a0kc`U7x> z5A8G~#;~$uF#=OZ<4>S%HyiRRCYneo`VjBJ8l&$Q)_V}-_ZgvL+G;7L9c zi;$nWF?cE_XinXtq{XQ*E#JM3?|sbKu#67kYZaY0va&cvv42#_928*^gkqpbIvF=< zQ9Q=*EY;}z%bHhv@spP02z8?x%EPE{N$TjR^R zz3)*i z(B!hLwm^6wlD+kTbr3k$%!G2ng)jzbEI$bU*rP6)X2SIQ5FoRfdmK0;$eGzwRsC?I zH$j=cg@l9@5*!>Yq8+PpCMnSH9s)U`5$3o{4Gi4xm)k%ZFOzW-hM3eD$+}aj)(z0_ ztgh3oalW+_V?R|ok_x(|&@N8PTo&S;*pFW~J&?^EH04~FtB#{ND2n-Y0g-I*0uW^) z((P>;*90=C!T8^dHmRQlE0TX7&LN|&D*wesUm7n=rLzdeaAy0FLI_^l7)mYhW5>oa zB{U3vm|Kjw<|{`prjDANJv*>*{9*jfmpn;=@D1rb2tS@YKJb*#E|Qa;f;FX5MqslF zx5@Lu2HL(Ok!qqKPz7L5(Uv)1PWrhySN8R4tSZ7|r9B9zVzUZsKh;xB!1P)!RP3}0 zY^uaCbg|p<7vJJ^J5sLef!SZH^B?byNYsCOM3-^_vvT>=LS(7QmF_jBcXBzB?>-VE zQVj=IbSwW+j+FSf9LargVo#Dm1hWVM0EU?tGhP)NaWv}MKF3rQ=1f}3N>{-LgD1+$ zq7+vnMu(!#-JU|`GP*0Of-s5FOV+YvULIhQ_;UYFl<5K5JaJv^$l?gc8&CG57$}!! zQBP^b%%f@9$ezrX+r%9Tx(dG_AEr67+Dyz zRkNko7qP&jK~~Hd-IvjT9$OTwSC<-A#gvH8@d-WbTm|xVQ`BSbI_swK^C@q;X1Z^_ z@VT8!zKke=9f{9e-8l_=9441$%-q0y3SblWT5H@|r!L~dm-h!JQG2RXR6T5rNOFvs zbd1a-SfEV+B8}wrTCq+8WY&V8ek4H=2afl}l@z@O`f-!+)N(v4+`Sz73zJH5oVxb} z^58w3UQTmTbQmx(*=3(EHN=e%1^dflhP-ZE&otWMA6UQSj=1gpr|dnE>Nz1VWmyH-xhQx>iSqh!ERR&KeON-rqVUM0Lpt%NGEbD`R2a>j zX_a^TmrI?n*Q6cPq0`HZZGAX|-o{1)SZjo>^q7(83S<%U%F;B}8Os({Kf3!iPPCOi zuUB%gNfl=-I)|>mk01L*6+z)`yP>TyITE(`1H`R4oa7#hHtcxMa&u+i@*e@~^mi8T zMPtc@GW!#8f)JnkwbuV&MnfZO{(y%;EZSv8eqm=oiXCR6W%&@WmPxg)AZTbVy6}Tu z5;eYqcq|JZ&WgRgIUd!JOShi$I6)D=XvL1)vWm;gfZ6q0KC%ElYdNTaa84oxQ48b` zDX@1{f}qLm-e+&dKeO%Q*~^OE?l5C^9Jh(LIS3`08MJ}z-8&U4xfAh{k+h4Bd3)-%)rmU0e$7{npsO^FuZ;kBFH--gn zS5-YCoj(m&unZF5t-SyFl0A|AK}?5B%ns`(r6mh4=i1BLOTR~GD6&PfWmS&29Io>M z!oBUxw}fCELFN#M6V1;2uLz%M_v4%27xP`8^8&{3E!wIMcJD8XVvpyKY-aEgH}#)H z+6vg49;Vy{53-N)_G=QRZFoSi6p*|HI|DgNddf6GpHM{P^OJle>%U zhQtRBK2C>?y0xsjRWbl!sd`&Z+#G;T`q!75j(a;ZJQeQ;=(rbOWe+&VRL}>hBQ0B9 ze@R-JBt4j;;gnZ z??ZNUrKbeK+1e-pnXKm_!Ye9Sk#-VFN@^}=bpyT$st61B1BRfJV_KOVEiI?L1NjjJ z*lOV-t;&;5?vwtmj#(@EHHm=yr7&9#k|OoTXjuzD2CD4O!W-Os=rTzeH6q zTYrwGjn6Groo7ylwuI9f>0o~_pKP_4D<|vn%WUtC5dY$6w*20dI8^@jg7`>Dm-~3+ zA@g_jyK1gAj!IFbrPQEA!CR~1aIVsHa}AXO1cH-t5Qs#VWDpAwngC@NBsuV8?EU8% z7L1sfvG?RXy_A$^V``AVV-_KF6OZVqK(mDlPR-X|?kf0o(I{-sN7Cj*O`i;~h_S~= zc@#vq$4OkT8__s7neBC~c_GwH9aa%UdIrNq<6{{3zVP-CW%IZ;5~{fC(w&iM18%<& zu~BW^K04|QIj(J#$wm!?;qL{EC5ihE5!U=al*F9aSLt%LufC%tCMq zX9hnSR}t>~ywRIXB~w8@D5*W3LjO8mGhvw>6O|o1d&+nU6>W^1)_AsASn3_g1dA9c z&*|}wJ}K#ZZPC%mG1(v1QTKshNxH&xuU3oBkZxl-$I3^27%|YJ9v}0JO?O=o>;<44 zV=F63f6FW1J@@=4MW|8L=y^U+86Ca4J7qi-2e|r#4`qyHIxU~Zz>=9)Tv9WK%N10{ z?*)cjN$n*0d)`B;t!JXVAm3u{5Bvb|2WYU{r$Bnak;IP_a=GmtWDcMI+ET)iTK}l5 zl0Pk`>%9phX(XA$Ol^D_LE4qcwryIcic?JFfdT#BHh#0gTY*mM2Bm>@qVH+U}af5N7mc4_a)3? zFzS+{PT(OqncyNuiCGeShU-N7@mgoV9)ZpK}2j;-2~SJWQtSI7%3{I` z7Eo=5O}A)TiWDjC1&X^vaVhTZ?(XhV+>1LDch}-Yi#rr|3+@g#q2G7zf9^T!zJx^< zNqBT-_TDqk3*$U{c9cCN>UaQM|L)dIh}0(Qn5p4ry{egR^*#GB?BF4#BC2cv9ofOq zot;B5_5ReVY&(TFwsByCYsiwvCz3f3w)#W9Q&tMbPN%P{F-0%e%aT60qclxdutm<$~fj3Lq$VQpUL;j#5QAAD9| zuA2%mQ>JK_mB^Gojzk=mod<*Tr5D7BL&Wiu^8HH4S%iOt!Cn8D7GLC0u~myBp*$iD zLCN0q(#AJ!MFGOLUu}I#vaF6+sh`)<>`1SyUY-!8J;guEz>hE?`Zk(~Q^Wi); zo6K_=XnN%}zy;QT{2p-;KX~2_2V-~jg}LiPxX{pIu_8-WoY#xZKHv4`SIe#b+FB+e zg>DfaA|eMUk|qxKKS1eBqid>hj`-=V^M45s%2>j(44lL#FNPgu$fYS0=PPji80GIu zJMO=;R1GM39Z7oss>pgBzyj1nMTeD(D=K8&wa~5r&y3564D_c!cCK`%u^*sG;cWg! zlmx}mS=YeT@sni1`zvv>TKB2dY0|CU0j#}?1g^gNj`%}ASYOr4VUCQRdugdsDxzk= zy5c08Us6W`SJ-oUbI!M_A$^b!@4pL)ySt7y>8NFzU-I|zH^bzI;>?8^kH{6XFn$P$ zk8cq(vT|~=vXY8&skyNklyLx*foaa5YnMK(*op~kO9~wk5uJ5l=pVs~xNWlBpTh$0 z#F@aUPVaA?mQ})^zROSS<^7a=lmf5l4Ol9A6Wb|~j~o=Ye$2*Wu!axxf>U>kE;Prq zk9ZdK~kR_N`4R#4fMn8755OQK_VNve=OtWVD4sME3e{hPtO^|>fLDab@|6c zQxKQbTsAj)bRCxiDNrWawzhmB8-?admO7Pd{rsjF$NFAlo(szmG360N0p_9?3Pyo0=UymGyO@^#*d z5RyhV&JSB5*w0`_9vN$ye7RuuBi{6F7`anx3-^K4EKk?;rB0A}1qgYh&hfzt{*%Nr zkb_wMld?Dxr)cw0NvukY55c-mqlzulJ%fY3EgsHVaWAo3HnPg!$r?T}NfGZ$P%Uzk zj+v&PFBif60@;_3j=O=o{rT|W{HurEnd;};%`{d5MEK=LVA&ouwWWo{OfMa1#Zm}u zEtASAt>IfqxgfRS4GB&89mx5nMMnQeog}So(Y&BfIJsHscN<4yN>iEuI+4*)16--? zWW+BrA^)k8#L=2VGBus0jUP8rLjCh29z^yT;G7M0!8Y%h*SMssQtM^p9`I+R+MZ*( zA*IqSzdk2Cc<%05SF^&gwOPykS99~-t6I|u&A>InryEKisZ9P+MYrY{9xdLnKWc$;pq2_;2}nYgE4UTlM*QO#XQ-Xa4ig(gU$1r||?0 z?jgmwRXnn#ce=wgYq!gS{}H$Momz&_snc+A-U|wPBNB+%ta#{O0~;*oRo*lwl3n!$ zk+?0X?L-K12M$^rGr!PLmbm=bh6lWkpDWg6n_eB?JO!&FmTkaN3WEchlX-T5p623y zmp@%+9S{DI#8Xi3U`_GefxughTni3KQ|gFI)vTF)1C=ixly)Pbr)MGkcdd2FXHCVA zDXhg!O|H;dk)xQPpkNg+xR%c9lSIK(m{kbE8A4zG+)JNd=z`_Esb7wJs~&J`iL`Q= znVI#Drj@QWW>_MkWmqOo?mPn8437U>(Y!uFm0LXHuZs(pB!s}8-#LVrig0cqgEn6j zH)&#dOzRbAO`9%d;mQ;jwoHhz{Dzt5)1{~x=Uhf`BcRof=qZ$MEsjC2k>^ziicWc- zYvQ=##KXot2HmkFAefps_6=r`FhLHLacE%qbGLZEmw!V2!qnllGCF!vaPTbrTVNTChO7=Ic`XHUksT`tw^d? zGM;FTHO1wFPDC?|j1h&eIQc=VL>pw*)MEeY@Zk+FOF{@a zK!Nm^R+!{>x(LzAXM;;T*8C3Wukrn-R2jX;mO5w?_4``5|^9mUOMCu_!M$Y%9Sf9-aOu@znVL85 zVKbu>PE&VINwJB<@2e=p%oHBZB0Pz(=r4{+AL3m;IlEamOW2 zkf2cHx!Ao@`~)eBU8@E1xVsYmzmcXfi{M{=zgQfSK_G{re9V2)6-Nq74#f<`ETE9} z){T6fttpFN^I^nn4TdDlrKV#WF{UxV9e#O;p!XTIAEnXEo$gDIw5})-XTg@N%*~Db zF@Q?1xZJ;>PR+5+?C-*bymxrcwG_{rZ#FjFJNQf5Dj>`wm`T}mFBt02f(_YD0ufuW zcFFGqAAg0sg|SaJ7G*4&>Yl)F1K7e@apb+0GL9fD@Sh~d<^~-rU1650ROMGxSywq( z&PFNwX)Uk|1E)m|@wtW5Mrsx$hgreki+R%Xok%!P^(jk6^~Yg5U?lY00E{_$E0(wi z`xv4xGd?OwyH1mV`|o*Ia>F*IU%A_dlVM^~Omm5FjJ)Ky!A0Og`^R}^woOg>0gPnw z#C;U(_HS&-?OdiaMl^Yp>A^cks6+29#FI$HCEJm6wSRd2OV?I2yw%YBt_lqc-^z|a ze+-vUA&Wx>VARj}1yP897m8jV4!BdIxlFf$l-i?a3R;OVf|95t#!fAJ!l`_~hQ0rw0%63@D6ao1h+D z|DfzbK`89VHP(>%Z5^!Dz}%T&rN#BTLe3M)-4fN&y0!|IL4Y zLFaRkNn@{=_pM+P8?inOztO5y{aIRNi zGLbwZPK1nzn}3Y-FOlKZ_~e+|c3Z+0yZY;%afN>R&YF<@qa49i=6@#y1}xt#-il;j zD6FpsyUHS3sz`d6cY4h#1@pZu1iQ*i?y`Bt+zu|WPrAPB%sJVuDBWmpepf;4W=Cg(>C}YEqCxIQG*y%cOKk> zae>rTC0ZD8@N9qg6+`k>TU

a4s@Jo(kWz@7~HGrsfVCP4p?`27D`t7jMn+Q_{2_ z$dmBEHhz3FAIs>+CYbLOm_QUE1FQlSOnNz~FFGWkuP<4cCe{D1{#7h46+Y`sE9CGp zc{cERJON2Gj7*wo@sDXbZR|rQyA+bCSv$4aa$IYy&**wT0UM7OPB|SOIJF29R?7Xp1#^pS+AZfc!FlU&plFE#wK(Z1+9>nb8t z*yNfQiTf@s)L>~DO5ylDF$0}dx?}42kdSEc>09^MXy5(Ixj$iBi8c7B|25F>X`+qr)~`YXX-{dwVKX znT~4B90gyc+O5?Bb6sRIEiY(MIchA$nOaR>P*LVq+xdOc{+;jz@Y5YgHX`N42ocYd z`L?-a*0i;88zy>;z41oyEjO6eX02{NT@fuqUPi=xWQ--t^DcQOe3FJ7 z(N+bjKB#8Oil;c~R^fxs{qN8V26^E_XK9gHu(u=l&)FPtyya$Ng294TUM}1}E|Kya z7aT$LTrv&q>fqI#JiyMZylLf2d7cG0Lj9}O_S5=5i?&KAxp^83Xb)J3`O{v0@ecmE zd_N8+?2*Gy4|IMH*6{@Vbv6y<17ujx_CLgu=mX7ExnbjT2-igh9x;eGuNOnIW77sn zO*xR|xtFN720N~dY7)wDROhLXbK$amO2aNP?(dwEBCBu-yl71MW>0*0bb5Hp?l_lR zD1-J)O%8vv-5^bdxo(o)?DRwyjrq8p2sIi;3Mna1iwQXaj|zJKo(&Y$L2lu@dYb=l z@*jaGvLAVf+5FMZ?6>9OMu0!>>+1^&3c^Nh#fN^=M%o?guxP}eGcz4qzYs*AqwQO$ zB+r%8>9*IF=jS(jIIBAwFVyak&Xx_AsaEM-1;tVD{>E!O=B$kgeGeU@mHTk~dVXfI z!-zat5c5g<%i`1S$yK~}a$6N-=-a^!%P%2ts+_ zxZH@Ir!!d_?Gu6%v;I~yA`;!$pDv)o>H1v(Hqbcv^A_VN%;U)*i?^E55a5s z_4akStNYP$LD~JyFzdMYYYiP_3iJLTJJxi@^wbHY@msCgT&vy)XphqeB$-w6Jo;O%O)wBPL2d{PvG z!nShTzqAxOX4Gbwbjct|2Mx+SJoUEw^63;-QIs%X)%y6_ zfWSBSmL9Vf((Yj(?EQ%^cCA0SwIOOx-LrLigTRgR5lXBlVt(w(o5|rBI5S-eoWo3} zk;GjEtId`0(~1Lc=PRUKm5)#6A6<$NP1TJ==#|0e>&8;)nBs@SD3)Hz6jW9{&fM01 zm&;NfK8`v~)9BWWEJ3K1g9`w~#67uVh+@}1A@X(FtkiOFs{kV6y?&^_=!!pL0RZcR z=qk@e=)(hWu&}UjaEiLjt)z}mvD;%#9G0g^EZ^unoATQ=B(m5=HKG3e^irO6q;F@s zKgKM|Qqig{_nO_pi_<)N%S(m9Z-rek0#XpcM{BR`94_iMHn1l79G2%;Evf!ftEVIa z#sk5aB6+HQknkWnRIP{pc7dn{K(_SXF%Yd&qN1s~O28M)A7$@4z5Q*Sai6*Fi{M8hb`H6jP7#+2|CL6tcA!zn9YxVFT?6H8SssFf z*YsFpFMENDE#q@jVUi*gFzz~BYd{sktzxCbAS&p_xULCZ^~k}3&95&ifQ*=|@qol| zkS&f_5GAdiM3RXVd6OCjiGKWfa)o~@@e3sK&%4J2OQ?OHhl3D>cmdyg&#bKUh|2R1 zsakGxQVUZA5Lw2K{&ru7G6w2W*l`noaN}gLDk>0gTNWy$sPh_^-QVg+Sqm*R-(g#2 zICb=PZQ3ffb`OZ9HOC3BQ27QKGFQHHB>5f9Jf`M}^;EWVWAavaPeOU-}xDJEGg#`ZYMD-5%9#t3W&Ua(n|e(0KO&00xdAj-V-z zn$5yh`?_d?FD`-xt+QKsqBJ%DwjDpIOuMfZAIjJ5{NhPyIjAK#Ap!hPZVVjWbhMUE z0Ke$k-d0I`12U-Aar3#F&xUL;`l_!Vp`f4#+=J=NZf5u<_=X%JSGuBpcloXIDEt|N zvo$aFzg;+ z1TSg0gqg`R@@#zgiytHoKLD0>7DdJSGs0x~g6iF9P4gmYM33;xh&z6&YMd^>j+#~A zixjy7G+2eDl_A`_5mci^YuoNsPC)uXfV{dqAXR}@v#zuQ9hb`* zWNK_nP7)MU;teTEN%?cz23{5o#igk}1H^Zrk@SE^5(`uEt-k6w{YX~|(%ech|wyQc1Zc2eTGX(#ENG30) z6zNnYf^$$~c2oshjB+KYcR#eo&!hM{cScf~2TnKa>PHa}5qoM3`|u$>e&{bY@ZND( zSsR3CJYTK0`*N{fe;g-RY=2a&ay@B1&9X8xGdGV#cOjLm6xv*{^2R+1{Odj^C2tcy zy$2kf{8;XI?UBWb+itLuqMqE*?U~i5@Kld^<;`+-RE)cP;>NFXHW;b5UzfJ8gQHja zb0zl}AV>{b^ZnIpcm#A$7#M3IRn_?t#iDQ?SS2@YZEaK78T3N!!+=}Wr9gokv*NPD zNeiCo=^{)_L1t!XT->FlrS$Z4YHDic&lBS5%NXVr)Jd5JSQYp*h8ZhAGzxp`8qamO zdYZYpS!-3uIiSS{WPi(gZUt$0(9)tA`}^octum|1*?-N1%;1Fpb&^ZotZ$)sIUbv> zS8rVIMWu9m?d2{H@XyqUN~@~qZ;<3R?w?--oP)-VgeaH`6c+L)u^JXd!XJ)rZg@Oz zVB|4{jWuXPO|gb!%A0a#c?;(x!4(x7Qt{LV%FstJvSv%l(-lNlv>O2QVP zZN;wFAQNgI*uX z@Hn1vd6^XbgT{R;%h|Gu1@!-T1i}QkITyl&L?pN8h@l}d5(OO{9eMd!H0Q}k$rmAZ zbAPvc8>n7UHVgBg<~8m~F4$Z(@fnh81z(eGtBab%EVC>{hmxU#d)4AxNxk2tB8u?@ z5MCd~eVs^c6`(+%gxuvx=XzqH= zsvLWn|GV;vlKD!%k$zfEGv04d(|rSK(!IOh();WMc4t(NJoi1f!4DHH5=h==q_-g_ z{`fP6UF#rG(pI8`42*W%=+`X=UH0&%J$=+j0=E!_+F%!n0)BI`QILuXowu`#u{*Y< z{=^)*Hg8dRsY*gw@qQ_+((u~rYMWq@j zSMm|+{q&x1UfONb{9IfghqdyranCVaHJ|N!LoQt0LJ~q{(I-rYDrl|g)#*bn%ddXPvKKSItWnA zG8)xEh;$6x0njtmNufvqv2=b8)$em*q9Lw)O^=6tSd@rtpV1Xj{TTo%X-RchcT8&yf+_ z7f2G==EQ;{I*c_mW+!J}M*FNzT>uTO(B28ks}(f5HV?D=#-%KTKL7wz;JN7gn--EDrxO?F}e+)s31IQZT0*7OUw7T;wQ}_`UbTI@-6fu~8{w z9wXlx5M7z;a1K;;vh|&^5(&K6*&CMuuZW!N=@h{1CY*9^TYZ(jVe*JaX#VlOE@fd7^SXaS(3)-QuUCl~y)<=MvWg#QNW$0eAnlhQ6_wX~jpmfn@+{OoQ)0_HwsH z-*HET)pok$3bN(Kjt<>kUEiBj?U%;h!4OUsq31*2XLV%gfVV(BRY6BDiq2TeK##(U+?=vlE(jAdIVs7)!UABn8|XMgt0HUv6#y6$iJIUw7%y9nFogzfL*(FHbr)Cw zdpa_AAeNu$C})!45n%mhidSH6AMwyqu7e`9coukZaS<7$jr)xm!Xq574x^B*-r5|v z2v~o3`s~MPY{=tXtocN!R;2bw=7u zudXhe(OV2c5-@8`Nx|wKjD*RFyEsFI?$k-SmDXN_i``#Y2O4)wc$tdm=&`D#*uZn@SrI8r7B{fi(S+SgMkB%T_X^sHbnW_g4Itcltel- zVI%|6p2~2^|70j3lVa3l%&52C(i(B3MO)Ks8|2ZK`sdQKQ?UB$;Rux!W|Wm%ihK?? zr%+zgeamA4>4I||HM}2x_t4VPf>0hdA|nUSbDjup@~wnA6c?cj2+SrdZD0MW2apxX zzQDIWnUWiLk3tmfx%p?W<(B$57@z1uS|p@NL`fuGn@sE7s!NAm3Eyv*sw;PCdM)(^9>BK9Mzm*x1y>#>S?qqGG~P9M7@A zayVk8U_`o?x%*DfYX;%r-MadcTUDmM7Je4aJ3pDl?Z#>lG6kH`aP=`@KmK`tXo=6j zBPa-YTGw{4HggPH|gpL0(pz*B2V0*=RE>84-ATXyqXdE z&;$khC2eP2mW-6f2Y}x%>UhkbkNjR`+1VO7TtSqP%)e9hb_gH%*|bvHHhJJ41f9I7 zwyxnY*ZBj6WZ475Rm}BABe9lx(#`%E2EYv!MeD&IP!}{~=4WW>>>+moui+4fWQ~fww zI@j5zy5pP``Fuw?yXKUriaLna$vm)Azm`+;33aUW7eo@>XMNrCdeq2m%m4Eeb=(ORfeL zbQM-7FH%*Vh?G6el|=0fVgf2jPV7$uGCbvj74y*$>G{ zwvg2xURR-g2(#!T(z7V~ z;D@ty6r7OA1@Enbl?pQFMN42ZC(GZy9bU5v-qnzjHBktD+s;8EXQA60!C-r${|@_B zl5x6nPQ`Vaj!J6|iJ~lBRYimnvI_&IZNghHfkXvEyJUq?ckS%{SaT){mydE)?au{} z3O$0B0?ifXe850bQgUc#C#V2)krEznE_{Py_YTZ)Ps+?qMIDoGLehEX_f7375wuE4 z#4ZaRSAQsf5#QqrX3w&Jh2)3e(S0D7y3KV?pniFz!f%hs^3R-8H(xL~dEB({k1TVC62Sn~e|ya#?2oSdSw-V<%$ zDtlJ;?1uH?rbUsHm%vt5hE|?6-a(KKw?qeaW@LHPPzbs!6lvb=rkiKS>^u1gU|?dX zjAs|wu1uXSp!zZqgJRDT)1R9btl*q?afOHWUrU_{ZPzI+IKW6PpqJTqnwNtz=DoD~#ZCbTV`Vi2CL^S@$%KGPBz;vceEONQToju&WJ3v^R zC@P{u;94b68K_Lw+ny> zF1oM9WBu>=$*nJB1~5lWM`vJYV_G&NfWvds&^09G%$Fs||4hSdrF%n6-KpSj9zP_= z4nB$!1pzBy8bEz5>M=&3M8$f&S__%yuI?y!65X}6JWQveDmz))m;0!$Tuf{XYQCuR zu@dGIJ5jrVp0dfsaZkb_2boLb<=4*f0$IXmKk2}okqBnVZ zZOHL)NfWJ7Gk7s0P1Oo`Ynr{hei~+Ie>IE+k!f7v)XWb5UI~4Ju+%o!eh`uhr0?Cn z64%EZ(D*XR^B?lNQYMU27BvDgl|FnJs(ieS`}=(rnbuNEbpP6xgs8`?849#7yD%RB z015!ni)|#5z)y|5r#%qD-B;wZuvltc2oMoQp_rdJ$p|K`{GG%&vkwh6iRyf zs^a2MQEkBH2O)LGG<#%9Ql?(lh3OlA9%EAr(Ls0@f$bu(1ydvssq$G;F6Bj-9Z^Yd z>`<@Fsypm$=>o#DF=V`9Mi;@0`S^_y6p(S@iAkOzQ6+_i5oU~pf-R_ic7=OU@pWMj zWa#=qEq@Ka1<7L|ly*z5;YI}kt6|Jl)l;d;rP_&JcPvK>A*cYM$f5m#ucVV$LNG$P zNMW(FFc}?KcbBND-(&C=pBVEDK2pv!lp64ID1k$$K5b5@i46NF=TKw6#2w0*2=;Hm z3-j;^4{NLT`>-(mHx8N8oV69?>mzAqyc2$#&hv<0Qd}O%xArloJDi1OIrpdg{UXS? zBdK-~h^b&8!)B_q(sPQ%v@OhMg3&i>Ax^i`zqM@=C$uDddh z0Az3uSlDnn^#~4zUD9Vjy1O}C6Ed~Yxmr7L+tgbb^C)0Cn2Y%bR3BPq?PL4*@N%MB z&6!I09)`(MI$90KsZ`vojg2Suo`)KO^wu9S;eG|m*9c6^JQ0bACGazRhN}=!rYdOB zYCs7OBFg9dtof-=MR21pG4Tv&ar24q^;Fas7}n`|KfY@9c*(YkEo(jdyqo???sYYU zySF}@o$2H4yV

y6St2eRrl>)n+dQIgmWgUjs`2%DWy;scv)`4BgZY0sBJ`3t0z>;lNuOu_ICLkLNY8 ztWbmqZX+G`Z@81@S5;&|0VUM9aEE!ceeh@y1Cq= zKnqo&*f0UbmaqvX_sitP{!sK;8&w;N;5Yp|Itrb|L@JCZ5yMhD5{&R4SYhQN!-D!K zu%ZIUC>l{gJ!QY;gjwQ@Ngr_qBuF9EbUU6G593{BIz2D209wyiF^{X+2|Frmyjqqt z27GJaS-JMk%4d;~XdrRzeI@XH-5Sr14N{RFsLcX#yEV1wBi-@rSrt)AxZO$pfPK`biyUC0#mjJb_YPAKg71?a zle?(eDw1qnek$VKs5%XskHgX2k=5|QbOW_x0~NXq{GvcEV=YeDh$u10J|Q!@uvDqc zRatOQF@WLye!0C3EkyD#qJ$^`V(>)rp+dRXG40+io1Xzrt}L*ph@CIH<9u!LH3uF? zO;4%k0ofkBcbBrh4nkRW1{aPxmK9IbH|gHopFDVtPdWvN#FL&45sgb=fQ%e(3fFQ%nC2nkrA!y7Ys%NV5SJgqI4iPT&Qv0_v;aen@!j;-<(u2se$$;SW? z*{G2&RuaO&>7aH}NAdt9NTfQ^poH~*k@$iWU=|tpF)Wlr^$D_4XPt?Tzbb=jp39A+K_ITU40b+81jg2shvz#oC&2{e?j5 zKZD8fl9qx8VHMC80-P6@HRc%#=M>Kzbd*#)TV{1KvtdS=ya=DRGjVu>_E{)&WI}2p zhT_hE=x>XlNqhW22ar=b=aAOB25mxQ2*5cWVPNyo4Sa=89cm0Z2;8DUrAVzZ()qx~ zQ+j_1)SFReLG1~8x^;4P=iu~Z19qaeGo!xgC5**#qqKB%w6yR1&U%SA48ou#1OUPg zAEbhLso4W9LvbBb9z4zOA%R%>%rr1o)o`kWgq1NzGUv4z_!x84{Y%d0z(FiH2pMXE+f;;_MQ+ z>Qi*=PgB$@o5PN$SM4rNYnHxG8^@1KBj>le3%84t-c{o2iQ9je`A&Im$3oW17k=*| zG|bGhoKDss2F|DPAkH5FDNfw}VOKDeJ55Mdb#s1g}&GDNVq1hu9Vpb1WJD~SheQf)GAmlve zRhL}d$b-z6tMA%j$BvKTHweOG=ogML%~SuRiXMr14lS$~E~l2Jj>Z zh*P3f$Z~5Q)x2rN=n#a%Wo4H&DFo|Z318H#%+1ArwYAyZRw{jh0IetpWcN~00sLkb zG1N)n1TT-)%{pU{1i0r$g6L5WbadfcJm~T zzrx=@88_5pVb)6|$TFrlSLkU_O({x!*B*p7ytNFIvq_m+PmK~Kl#4!OmdaG9Bt*QS zoJgcmND_NiDuJw+NSVv{MSbX(Z8l0oX1 z?bq!_x1um(&!10lKuq(MGI#S|AlJIRBWL1;L4y@u8GG;^$3r;wJknI&x#)>G=D3>4 z;_*y-%Q4k`o*B%r^N6w(E^-3#P%b7S$ucP?a)6y-v{pzTi06OGn>;j9pkuKac?W7M zvwjed-qC12Z4l6p-t3%*dBLg#vm+U9&*pP;T1gS;zPsxdt8aQQ|IF`7sb4n_u z>A03@xE7@@N?+OLKo9vL2b2h74v)=b(bx59TmZmsE8;R9a0YzoQD1E2eGaezxSitW z?=?mjOMJHruhaQ`7@f2ZQ|K11mpFJdeJ zHGX|3@mYie4f5%(ShIYQiBm5MSQ+)x^HG{($YLTuphO9TM+n?s)UIPZ2zW27xPiG2 z<>QjfbTO;B!+36!?a%8jlJh_O?Y|3)%FkdKRU9*2siQi2{+=)m%KxL*vRr}R`VA{U zxmlj( z%-wkK_Y`;S{@}6d$WwRu3^*>+ndN- z99-PjJihP`0plI#{r;G`fv;x-+n(sKePb;xduE(nmzaCI^>uYIO^uCBP2`C^PE%yJ z`|RTrS7@hDNchI&W!Cm&nLp-$znQw3pn{>+)f(dm6$1MfoG|Pj;JfPb!uH7Co92o1 zy9bZ8I#3g^Y}I1cc8(JECi5uh3qP?Aefz(uaFdY{q4WqY2BDoq=6IwH01!G#gzm5L6_sp z>FkvbA5z!4!p3&sP-*?Bs17@5mPSOKxG(1lOs5)8nzT60#g`UA{w~Xh(%Q08k%ja& ze$M(~!4V$)jgRrLD>zhI?a)dT)PBpmXOuoo%UWGoD48@%OG}Fz(g!C9l#23b^q5ll z5dl#B9J$l-7}Xkm4=94!vt~2$81d74wT~GlZxSa6!IIs3*+ewMmE&(R`60O=H0M7D z^OiAsF7GfXOkL5&PbcetB{t2A`~;X-sPA1(ZDG6QXEH)GgHxnRR8~G{vic>CDI>58 zM*~swBtduoeRBah#90q+w*n@|6YTq~y{GeJpDFJC<}8oSBq}#tOQ$oF)K@q;J7;n_ zmx4HSK|xvB;mBf47Fe!P*hzKlqf8tUiP~L&fM!bW$)8K+FI-H@pGuh7wNHgrQ?OJ} zfVFUlBvLHfX3kG)?M*i+%m21C%cF(7KsS;PwXjB{6sJ(wKd@#HtNJ2AdR$su4&tDi zNAf?dD>^zlK)bD=@1LU5MMf5E$3!f!|AIWXhk}p3=J<5ik^N*enn7(NxWfP@zeD9p zQ*@v?r|`wqwDmDCa5FGq*9qX|q7QMYsJ z37#+${l}E;kyPd)8E150g0^;1r7E97@#+LbmG!}9D)Yd}t$Is~jJ`Fd#K!F-+s2|G zOpf8en3FU5Q2<6bm*eh8iS$!IVwFLbCE3>5+4K1EJ=u&DugBwfS?=?30`G)z`V?dk zg>}MmwwAItVQQq+rWtbor-dwj&h+*MJp?l6*E;VD)%KK+{gVaN7 zXJ-su7%9?)s|9>Q^F41#!Ehdogw(aus<(SVQs3~)y<7LVgvqJMt*eqW`tt#qTgax&yVVCF;$b>pg?VrtenE4UInR|a#yWQjZVrLlC+uj~T zzKmDFS~>Hy|0Z@E@(Iy|c?_729|vVCeI6(?c-zAQz^cH`MvFFXz@ZCag1TKlm-_}M zpbOMBEN32y_x@d&x?YT&oSe+eif@==QHLUY@$smx4<8boRwo-ER+0atwiG0n#p2nD zSWmhtv7tDtp{$>dJFGRdVa4oW(}>_jRk-*Q+NG)>m|+Bj|sr3)FrK zNfj)3hE`%uF^qys3@^xEjJU-H5SD0?0hKedh|E;5bG_Gi79A1 z_XSxa`$%88T?64u1w>NI%kzjjl4bAWCnwd-&AVIFF(aY3zL)be++8MY> z5{sqa6$m+;uY#z@`&;%7W^C;mVrIHEt|w_d($&G?g66dIG+?bC2M5RJX^Q|C9xAd0 zT)z;SD7RlWoSdwx62}WcTwn0v`|nHDs#RM0`H8E^eQjtIz_59v-j$9~GoSA-gd;^hvn*DtSS+&O|f;8D_=+PeL zXftR=VJctPsrti~YocN;(OtP{eWa<40C*s{vJ%#?qkl5A9dy_|2d>nx zd9F-qUx5y!j8v`6*m<6C`RQ3j#=eEF8*yX7;@Own&3U8tSJ_TkSy`6v*~!=UwNkqk zWb~lDCq`oQ;a`RdlL7C~7G{56Pn}6PRaYkWc$(y0*|JRFuv=wr?*E58)=~Ont}NL) zM3Tl8GKQ3NCPM+%{}IRYUSR`=hrmaHYIxZBPvdFM80~g3Vxgk+wwckOz+9oSaKPWv zd8LMDz}r_x{OQoot#uI8;FS7uEu9)TDRGyfbMALV3yPGfPNES=8X<9FtqENCy4v0_ zFkv*KzHIYoa@aE#titkP7-7Dp1%H zQJ27wIyOjNJi#n9Zl|JU(6)ypG>IoNP#SJ8e2dWG6}PNt!Bkfr?8(PYuJUz4LiNw( z^1Q#uytn}Vj}((e&fU{yAODvxUpLj6jq4WT==c|u&9@X5Nh(|K3XnQK#8s8#H&c@y z0ZmhU#1N}NL@ho&8wKZAMb_PpS@m9d_w?$(jlsq9QV{iL=CZZ zRrm@o0AnqCeSK|geD`M_T1a;M{9gw0C)N&w0W$3Qbqo*%`McUN$aM%nk z6e^f1q)44V+S!a)GLg!}=3J3t4`_4^hRTERDm{u1PA?;AxS5~Hnd@?a-;bTy*?YAS zM7wk(Uz*1H`g|=Non}v05b>KE1C#lfS=yI^!NPU+d;v1(tB<&m0d@j+hZrvQUy0rF zyUX)Coj??g};M)Fi*R?Ncre-3O`v9o;6{mqq0$qE_*=-e zP$$!X4#PKk5sf|rGw1z2M|9`TN+>9_d_WVLv2b>GcmIvAO#M`7TF#L9FB_*MW|`bG zG4j!TR=xEddwO%rkMRT6H1$=zTeYAT8cadc(%8Y0_^;y5#GB8Z2?_RwpVS^r+UuIu zxcbkJVE*_LWR_hC%lVOf*=btOtf%C-=TEPcsCdayS>opNeZJTM5!bVMUDvUZ&miV+ zZeCJSGU%iAls0C26Ws>SXxx#5hPHT3R_8!$VZHqT2N;^e;jiMeXi4R(csa z1B($}{{~n;ctIC}d_JvH!$elI{lm-EBTA~n2wC97BAJAR86dJ^#uxwD#hAid{GRH> zJ}w#QN4eq8{TD?FG_FHnR-XBDx4=SyZRO znbil8H#-(*Ot4pFV~;H1OEWY1QniKxhD1yt^c>Ff0Thh=qLO-y>Q`~F{U~`aErh#S z>e?g};l1a!f0?LD=x(3bQxavd;{LA7lKW(hQlPN#bMh&rFk87K+R3FquQCG>hKWI@ zdY>X3C!nE9Q~#wxUQ2@d_JU*V(FPes_6`Y5*8n6U)Xakv;}e?ajt+|a-PEBOS(wE&wt4DYf! z+1ZLRGrijy8rs`=G&$h^R|(Qx@zRX%`!AHNakGEe=Q-KN)1p3=g-lR-!;l+5m1Asu zS)v|6-%@8Tb6#MEG=yrEd{LqBMm9}3FIQ*lFBnjmqN$=`I|mUid!r0fGb{pdnX-Xw z-ZL*IvvD4iu(o2G=GxxSU))6{5ZjZ_bHC~G{~yGZ)TS>^H|+nR>n+3LSh}#?AtXQ& z0>LdnaCg@sxVyW%yF-Gz1qdG8-2#IJ4eoBi9fA%zbB64_-|suubx!|bW}5Em?y9c! z+_j#r20L~85iy)dwZ4|+XJ#3GGL$wr0Q)IZ^~RU_4V{=?yfbTKf=@8;j;NHfKwEpK zS&Ejz!t5H_!Dcr!5&q1sNTGVmYrPZi<;_oep z(O;R3Mz*gKJYPjE=jGFH+LVVayhGqSU!bp8>=&AohS$5^PW1(P4gN|-r6Px10y&HuF2VMbPd#z@qwFcM{E;g7bONBF9^6rzYG zX1pyw+M^_`b^Q6eaxQs7znDR-#OL?ImO7gGA1K@PDQIjGQ(FsWel4h+ePvUPD{xOR zsejbuZ9GGEW4oA2{R-jBB6~L5g^mPCuVOMe<+8qg!^QVCR~be@eXd>Wly3(lg= z;`X@?daD%Xf%D$}GK**aFR5vIO9BY&yVE?0z58C)x&Z&F&{)FLAHrCq_Y87=iG?Hd zI?IpP*3WAEB@9&F1G+{t1j;6awdgfrCz+`DPXaW+f&ND5U&9AdB>`+}IDjbWyJqw6 z{&(qL40*=gi$5mZC)==bl}Z*=Etq`z*HF=5|IM9*ywz*Eff>hAJDqXhO|@MGJ-)4W zw*C)-TgZdSzk`dDpx?rFcs( zS2GDueJuU-me=b6P~+OL|7<9hLChz@)Ppeu1NN)wc2+!ks0U`4d#p;o=0Lcf=*12D2$ye0#R zw<3bv_>PjL3)|rS_OpT4Zsl8~CoU|mwV{y{K~y@9frA>^s~?w%g2pX5W(T0vi%V`zs=k^ ze6Rh&F`B*Fb3Q4HpdEErtKPnW_$;rvBqEn2bL0mc3?5#=e?GX}Q@yMwOka{oW%4<@ zC-%B2Dauv4NlGyJYcfR`+x_u_rzi0RC+rTaT63x&+idaOw$QmyFQ=hkNKI{<+F3gN4`1HNcI{8tSUlm=x?! zFLECl5P~{8oW&~Dp>x>+N&Erc)`vWmO;Y)T=$@c?K3FH1h>?c%wWm+<3SP2cshQN{@Ki(6B46yl|# zjs)2*6_SB?&~Ar949#rs9A_N74pZO?&|gOr*?AvtdFNAWgq|mfkdE5p$d{UTWAp zCEI;cbNi}nJVPNOMq{R^CQxpFId7Sv{dH-qlm73;z*4HXNV09YI@d;NoI|eQRzlRRJDfTUG5a)>DdKUx!Uu5d5 zrm-I}Iy@`vOI0sdYeFp`_yh~>m`ozs97putMrKTIl2RGogHzPC-4AO6FP%y^D$K1F$Ig2xf#t zT8w@bdi3gA>;(&>!rJDtt$8GCJx^#EF?9>^dnBxtzgEE-vxcTt8+JbXvx!hFtUe-{ z(zkRo&E<`a>1C^+RhwpUq}&tH@Yd6mR2$2CX|Fr090yJh-uT-JP=}wEQ&R!zY@MLz zT;|nhJ_uU6G*nlfLeP#X?*Hvn^lP)GIEg;D+k}IKra-jID$<9m3o|pZzW@6Huoq@# z0Rxv)c7%Z5YV5@iXSYD{+fG^?<%@4GNZ^N$}54KD!zb{FA_>`3VM_mRNMkpnOH2~zUkg2k#xZ-{7^ zaJJ~0Qw2YTM-46}eRlGeIYfLZ{ECHz<=+NOYe$>hX@%qFAt4dn%G7s;5`jXUkcn)_pmK1Ms=V@HRUWUnt2)j(Bm9B^zCX2H?}b_ z3GMWx*t1rY(n;JY0%Oy~dkZb~vlFF4w@`*W-1|t;ZMtbDgrG=8%fYi$`y-+B1SLZB>yl_49x{A(b(ulJ7~`{}1Oa5yvm*B_%H3s)~^uAN~bFY>&Q9 zoI5LrP!zNEGQe-Zta^ABW*bnGpc?BP0;+39S|5 z7pThmo#GnpPq(Nv!bkvZ9fh!AYvr<5$g`>J@hspmveoZN+L9u^au0E#Oqh_S+#VJd zk3WA5RxIWI{}~ey)8dJ4YoK5`_*CJNp!SpeWSDuC#IGYri0HXFYDLPMs!^?c>)GZf z@nbH=)2J#n<;-1{)5uT=tiV7IMq^rdR zth{*%+3gOQh#`oxW{+6r)k;$}mbs|ZqOyBIa?8$)%%Gb9FXiE%X1@{~l>#Fzm&_go zpF+-a8;wI6f4jlHYHF5^L~#X=B6(L#mm&@gL^i23W)h-u_KI_*W__7r(=ixf8t~di zdK6b4k`;J#dxSM~#qx)&q4Pf6>pv9-ctd(42AkLWN8V!To=-EnsU@G5u4`La?>MaJ zYU;M(Mvhrs+aaPhH#E%5%$V}`ZeRWKPf9`z%6jko0s+IS`PgFge%I;kbk@L}(@Wt( z)cKR8Kv<;xUcqR#)j`E^FOvSG#|QQ}SqZS*gNRH;Rb@S(p7?HmH(yUm54+-kJ|2x@ zKQ>3P9_PLNYGdtT%<(}ONeW3zUoR`J?-9`a`v2HrK^|K>%!AXI=t)H3s~>%bD1tpJ z?B5PkoXI3{u9J*SSYSCo@6MGEh}RZPB_!(#AhR!$Byc(0nC!HZG%+rue{3LoEjWiBGoVKjKZ$bo+PWzQ&izuurx zDz4}Oy?wYrPxrlML`@{DCdO?Nh>5W-t%mjkJy9uh-B}=ZiRy`c_2y)rQ=OypPKW4U z(r{W8B6HknFe6*Dt{<}b@Rz^~&1FM7VZ_TW`=tUtH|+oCxdD=Lp;4jR_5e{puD^-f z5&}S=g&jRA`xd&$mHg6n3MKQ!u{X{p4D_mdYTfyQC*Uh9WU|caYx<*hY#tqSjPY(7_249I z@@GQ9P?aYm)o>mF&}9g|jynu?9fRR{-SrlaPSdiw(dTN>pBlC}`C6R#V@HuTIX$#r zA{)p#+Xgc7$PmxBvbHX(s3<5oj^oV7OARY_HJ4<itrz}@{M0@>APkEI!j{7-G$ocxk$RXUQJ;U!>U?(m zN}U|pN@&J)hR}mHrKsUG-HHANLr=$!{R7QV;91V^?&HVnk(|xLB}+HEAYYki6+`^T0%1Wb8@7azyW4pYK5 z18_8igFsP&`-*;+*j$NRs3`yOi)Nk2F61Jo>|86r^E1;3n)UY2Al@y!m_Nb)fmc2)R#i7JRl z8OQ9|52>RD@2a?ECJn(nqrwB~s798795Ubc*ZgZVE8rOc?_J1H{+^qz75?*9Pz`1JYn ztjKW$NblgN7*>h5VYDj%cu58KhU#lGhrHZl@WUQ-lL`Ok1Vdi|`JEiHgO@3P|;9*o#yViBz%gWUB zMECal`swO3g{7&7p@*}>amY`Cv*>|1wr9tHdToH`-MGAV?0@#gXA_V|j@7Hcap=Qj zj`t>FxZRvkUP86PlNEQ(x4QO-k8UiH&>4a_>v|CNb35e=?+h zg0RuEcwBZ>UqgPP6#Jvcis#q6xCD$|;+WLlWN;BXSX(!a>Cn+BS1-SWq)`W~I1S}Tpb1;n_vKAmB6lZfQVXm1B+OF34w16t zK#z={u(suB!$%g&OK^-Ovd_ulMg#!%I&MkL%&G?h1l=#L3X{${?{2pV96me+DLDM{ z=m3wVc1MkOChQo?4Xg>=K{Ddt0d24vOx5S6=i3YdDxAXo?hotay;ni~`?Gv@hwH_O z#zxSf!^LeGO<~zJBA#&V996bdTTD%YVXP z#+qLtcKb~zJLWY$SJL&ud5FozpFcKbja0Et%hH1oYv8&4ZI z;P!plk$KhjSau!+=C>N4IPjlEI?Dq3T;pj$jVI<-C#lr3} zH@6m>I%V#hT>P#dJM&@n4^p8`j=>+TM?^7Y43m25l3`;ct?V@lKdUP~f%h32Tgl0M zchj4Rn(mbF)ej+eK=kYX<*?^Rh|2l2ri%aK?8D^qJQU;s0(fKe8~q>V;FKdhF7_cZ z?YhLW7Y-BG!?#(gt_Rn;eMD&9-@hu_;lSwi>dFuf+TTZ-V2PafGLI#^U-Dag_&1k6 z10niEztt)NgUpn2cV~8K`in*%%?}2M{L-g4uSVFl0_?v!0%55{^ ziT*J9>?`vE#>dqwiT~lBxLkPe{oaXlxgL7DZX^JcHOwc%NEAO`8-q!)W1hX7!rb`p zB#aY~D#S_9V=Bds6D;Y`DK@Ah%oRYvhqNa1XqG3Q{L`lW$Fau&UXPCh#Mxn7IXrFd zHULZhn+I{vv#U~@2)Qr=Z?QK+W9`#_eV$L}VP2>J>vXW?l3TaUXm*&5yW6(kzPPL` z^6ESUO&AFaYxIZY+7UC}@m;eRQZn-HFcUFLTHTJWfQZNsOPp4mZ|)?)ia$lWCmoU1 z)yc|p6`31a(UGe{h0Duxlaqg2b7Q`i=vG1>+?jwB5{Im9JigOfF zr7`aJhlu~lRi#7XgV*j}`(DSluRB_V<85vS+XpfZ5MA$;`E7z6|1<{=z=V5Em@+j@ zNZxgX#k|u(sI2VoEvtVfV_~k?69!{Fk1wh+CrGlRN2pWhn+<(aMvDp7P>ZxoOBC%c zrxlY`D+=!q6s<4N>t=^tkW>k9yL-dglhiNHG$mcbqn*TyZ25FL-s!ckPf1TAjiQDLy8*%i%V{Wg$Sm6j$zm|Uw z!bx!aQ6W1yrMWt#x%{KPs7`rxMRR&ZQKd1zuBEoAr8ZVMB}tQht5!IaLeNvm^TxP; zFq%v7aX-r`P$R&6@DFb9wUyt&{_q7Dqca+Ks1&`XznZh&_UlK=K(@WtRr8sf;lCq* zuBc7-YSy3dM5A|Y1M?LcmF zEQ`jbW)Yk^VDrFh4(DQesG2Ym<`$ zIlj53YsuhfJW-Dz z^NA98^WVmE&-R@E4V_;7rp|4!;i%!iM$JJ?O*Pgc(hU7~Wy#mdU||Ejj<&YCFU@X9 zxumqo4Rj3+o+roECUl=m2Nm|r&qVVlzasG46j4X!*{TzmncvCbVZvl0fkq~*b3@vh zn09G<_71{sk1`=iF*oIL^Fsn1Cu( z=_7hIQ~~=aTRTuw_*!XRS1hEc{i$x;V}8#kwupcof6-1)-fM-yjJtO~eoYcA7vV$u z*|n40!S?!gKcP1U2fpHQOy-ybqR!23#RU9#ftl%>S=j$<0VtC^f_L6cjmxDwp&_tBg2j;Rir6g1J^*8P#0XgU`H>wf zo)Z?id8PkM+hXqD*|{LH(7maoVJ9*0La0z4Ji0Rsmkni+8r$+m^%I{3L{oDfR%Hxx!w}=O=b`5jILbHO==;Jo_72sX>UMNOnT!7OWQrzWPOq zNJ=;W>LI%QJ?~^#TN;NlzDGimTlf_9cczGmio!ftqq619U_MWXQuw@WI-rC}LDVL0 z63C*H=Ty~Wr|a8PcznB^&*OwmX^}s|sk2ndI)#e7&p@A2mnRp5(F+Nc&cp!-5(rknXHN$ zIy@@L8RhVGlXhi4*u?kj>%cvYX&I&M0Bi?Bc088zZygz;7rkRcHNli}i-~etdABm; zLN7ee;_Lyd0HiPIeY+2IECEe_MYlM1d61^iM zGE1w`WS(Xd?u{oCEI(sx?#sOACM3hxe_-PC|UA#&`J+Znb1oPu9~7zTvD=eL;$p2dTWF-X1+P z!#FnJ^3H90RiCNzrba63u#9Mf>)s7wJ`n2aweuS%yGe5>4Ck6>6|cX^$zM1gOW zEGS%(=(QE9U@=p=4`$UYcK{=FMHd8GqC6ys$J`WCngE|}3#iJ1)Tqw1pe+61tG@Zs z2pEb|n3(L1qC8LZ|0dgw7tBO2ONs7Lx0q(@Zsad`z2@_HvRsvdy;U>D-9`IhP(?f} z9|Gw%RKO#Q759^m-QxBLFOz$5XChml5YqLs)?wkG$lnhK)(T)}rEYFT`PCAuwBZfr z;884&^fciD}Zf8cFfIJ=M{%kYu{c#5iiWnc#Dsvo7F~@qgx(+ zc5sPX?{Fa*K4Y3OjZ;{6P$j>nGTS%*5izsJZ^0AUFexqPq)w9_F++z}|M9SUbMv~H zQI3he(f522gG&B`fOkV~u2GD9)@F#~$`gR6P<|~bN3BFsjVUa-+_!Q@FX2U^a2xLA z_@sUqEANNOvVFDpJ?Dy+PwoKJcNo1y{X?tJ_;xT?T1%(a(^c3o_{_Y1@%jOFGPc2$ zvws&OF1~m|LvwR;H>`D_9a>bM^ZxIj)fa6x{v9_YU zz%wStvU;4+-KuvO#z6ARxJp-L&oO7ArN3*q#FD47+f=-#)i9Kz9dodJtmTTQQSJJb zQcP!jOon1!b_Y@R*U1gb4XR%O^j|56lNsya0R%tQF84cq?=JeHEV#~!_6+*B(Xzs69c!Ppget#51Q_sIuN=b)AG~T4H z3=Pnm)sN^uSa#(9ybEY(YQml?qkeMe+?KQ-w|3*QOKg)jU~dj;`tUpSHV6C;n#*L3 zMBaIRgHlTaRoXI8U632g0{Pw?Q~FQ5fQ86ZCi_l<hIoERgO2hU%z#sB+q@wVkc)iXjzG zS4#}Wqx(_~D!@G|{mDY(6k^~uhjj|6oEf?p<(ZFA9r_dV<-O^VpY2AUUI{&Ny3G*>=zwgmUfVlhBqyS$v=&M39U=Ja4<4=uxWvcos)6W&>QYg*YH>}e16 zOVj&o5YWvXe7ed76Tb_!CgVV8+iI-T_qaLucSr90B)9|{nfhhc^kuUBPwhWBr(yY+oMf zCI9mR_|~VttM_ot+9Y;pMd37+&Nw6E8{uzf1)WoWTq%L5TfBBXtDAQwj$?|~-w8{Yh9An)Cort=+*f(7nvIP{C z%T%sdH!X&n7gtfU&8)4-vkfJeYLPDg6d4tr@h>Ycml;jsm?=-ozEROUBLV>2i?j5f zON^PBnNbW4uWP72+Mmp~@pY((Mv-`WN;qU1hJ_JC^1^_myqAE$RnwCfmF5{S)TQl% za^WLs9m3i%nh&K_p?OIlOmo&3fMddvlNW#m(+`DqoH}}XdW+pvh(DvA7<1U`cyN{p zTS2uIG_Zg)xQ&cuUB_PU!WB`{KKdgrzkLgNU6#vXjocbIYeXeIwwgg=y{i)=mA&oi z>+Aa%$$I%KXdOXYTU+1%&g|3s_(NDBWQxy6Ze@KV0P^-RO5;=4(dl$Ai}LvKi;EQT z)u*&*47J9}(2t>EnH_F8cd$DKg!mi<4P7u(qUIwjl+Exdih;@~9G8!2j86tJi>2q~ zGj6m2uHtE$yL_`W(bIzmragENRUAFSoJa$bdDzF)CdH@Ga*YF3qrry^4G$+H4HJ_s zwsHQ;UJQlf-FNG7fbTEs^Z z1LEt8i0~3V*tPLDV24<4A^-rFcoTnkbc9OC+YkWthXn$6deGv3 z+6YzzXNWBhtex@yPecF!O*Ez;z`u(jSm>WaK>p{udxPEA6K(mzwRZm}$b~a!1_vK@ zVEbE)-shFSKO1Qx0+xTeFD5zBq&=<<5C`-xtcq?f-rR^FqE^**)j#)5z_)L72sd`) z;WPP&u){voJ+V_iujlixjla6__R?c z&L2csS3b6e#X^FqGQ+vap9qn`D&*DE5_kM5AAYZp&|ZxYGDy1(!r2#a1$63CRl+lg zqi++&d&i$WOOge`DJ}QCE(|>TxM-*cI-Lx$zT`K;zOg1qjeWf|PNcYh>##ZpJss~x z9E+1O@i&%{vi{gec0*aW1Ng~x*%PvtTJ&A7Ot(P*BD_lr*4>;4IVuH49r}0jdx&y! zP%Wj?kuh`Dv>06}BvujqXE_rrzP+LY(_jZj8;z;{odzDUzlcquS+Fm|R^YB38F{KB zTS6t08_z1EQIggb?m4p^zp(V98(qAUe1k?arTA+-CrS~;G4nLHI4hQ=-$Uhl z$?L5`lBjUP%_GdYV?81B*u%@j{y!QTR4u6xxns9}=#uIswCR5QPIOs@`kE)+r;w!p z6q%^k{!@R8Oorm>o<^`V{$?b4$K^!0MmZ#zl~>j;Z$YAvhNYu;97ByV+){W@Ab9pI zYYLLjRqBL1LH4TfBJsL+1kbxqA2rw~*pSm;1s|ad!^F2&H;!{YpMJC|ZB3c|F*n|L3M=YFZx^6*cz&-aA{>(bXN{P~HQuntY)aZI7<~25eQo z!&sl*Q_2C7$88^#ZT|xeYby7@hW2`4+N31xjK0NmW^ab*M{75|nd`TEZ_l-j$Q1tS z3seI$R{hg2M+e(3z`rlZJ$B6TuLMzY7-Yz$6C&Zxm?v_SN9DAvnj_XFRRSxvU@R4< zjf;gGv7uWg!KJK%=o!IW3eW$HPt(MM7~W6Xr_y+YW65f29Q0&fdDbLB5G|D(K zUcBZL*Xg%BJ7rwE-93$Eeo&%NF25#XGq^Y0Sgd-g?Q3x^Dsi%Cu6bLYDg2r?YDZcn zdD7_mz`SH=ipcT~Z@pFGBLKjkd3vhx-0S@QRG_16?=s^HHF+z7H|cIcAGyxRid3rR_WA|5{_T3WbYqn{^Pbwy`UhUd1& z8I1GGYf9{oOUi8&VX(7AxJnXvpQ$fJLh_CH)9#+&i!L&A|EBUu^9O;jt^Jji(W7~s z-93!}Flg-HVA}3^K}7lBxlnF%z-Uq@R~UcBGE;38cByPNYBR$j_ zQWjGEHaf(X`ZfH5mh$lM{91dRFVz2UUk~d%iYTG`896F96PpsF!#V7x*bMY?y(1{r z3P#u|O@%nxDL|_Z=p_5Ftp8<(d04}i8b<{iy7v=FGhda#YF79gm3Mqz3jU+`VzgRq z;``TOp$N!>Ro0n>EGwAOn#=lqplW5NQcAu>+_1BWqyy+s^l45YAak|*~~XW z09pb}wbm{h?B2}{4i510owz?FkV)X<<8#MOYya5{`BO7Jcn6Eb@it^Qdp`HS_AbE^ z;gZAT6t~?xaSoz$h09(n=x-e}xiZ7UjmbahTQDL7M4w|)w|BtcZd5NTJXpWe$5Qox ziT(YT2&w8M730@y82AZ6U+l?rNb{(1lwBakojEQpxhw56f|8X|OKY)tfO1GIG-YvVT;$ucoSae9Og!|cXK&i{l6*OiwU;k|wH3Hz<1{FsC&O#hM!=Zh2q#}WEt zQ8ZjFRnhM1a*lcLJndBvUQ=D*#8VJsF`@!8qD^d{&Jq|6I(*MJ7e_${cNzu^Y?))G ztfi{7S@QERgq@$q$&LVpeb5XrVulyHK$!>;5F`?OMx+a-ns->hp+p&(q_a*9Hjm== zpYA93*M&tQ2Dd}=#|&X^udBO7413~&5L0Ao5?~?tD%v}%qvRfr4QK2X{zPS;bODE- zYp&f;z>JAW(6Uj2QFRJ$U78tLIJsQIiWnH2QR7`U+sg}cG4uT*{+RJnO z`CN~Gd?xNL_exhffq+>)kCrJa>gO1%RXNw+-(OTjnK9Z#prR*A{?dfeEw|emCI)y` zJd7NQTLJEo+f!5951o~1AfL9747;?g)l zzk1d!wr54HfTk|aA@`Hl!Zr6sGZQtFhwFm^@Xh zh2Q`Bq&X!eB|Ka*0m1ihsq{Xx`2%yuI83wLM9@H`6WW&g7nUSwc)qu5RDVR|cKG;v zhr3#pL{%f8b6BJ9>iK09T`8M=;T;X7`zNtIQE2Mds2^XJJG=#;zFcGkFyj&su=53H zS?@reMpoKKMzTh-4zAkyqN3hP$&4O%cW-WzqLr@SmCmZ%@i*}%*9^5ak-od7&NPgs z=x$qDmSbt8jdDIHx6JJ9(k$@QdrS5Sc|aom^lzvN)O+(>MAyq&#LHf`;?x^13QEdp z5Bp+^(=jIc{-iXXu%msP>^jXMpjEzLafb1%hT{baPALJ>c^-Ai16C=>md|f;#eS~U z&!1MWtazL|1MUCPqJ|g?_yk$w(90dNfv-9_uwD9o8yex&Jt@wyv9aNE{4KP|nC(da z!9xSo24Bi?cKqVqwgscIk;?JAF`wN&|5OG1MIqF`I}FTv0Xxz_IYU^VN@VSSQEnh3 zaMu@SjeiO}@58Xj2L7*Co!g(G(MK9s#d5C-SD-x%T@n?I#Ei$>?2{a+zS$L+TzM%j zwzMy-3sXX2!URX~e|KMl@!VShx)_ZbwNDtrI{$?2QN{|+U1)+Fp6?Mo0zKt8rvz$d2 zYxgCcQgMBu1OTS7<}H7=wt@^e_+I|~d7&sC#*2Yj#pw}+ ze8O_0Bef>5=AdSWL9Tu#?j84`gApY>e||O?D!WWj7VVQ(%0XQa9J8$ zTl=%N_R^;D_|)GGr}=R|zxL-(;hWr&`QN{PYvaI`Ox2o9lEJ9hZdm!`Cy$LtX#IPV zjmGP5$!0ce!*UP1={jqWM^2BUx%p9)=Xb~fh=ySIAw#k9IRRHTzkge9$C~laFUEjf z+z;#(s%xtPnr3LDr#5%DTdM(&111f-wAVI8BY?7v{YOxd$b$vGLWTC>XslV>7HcMl zNh&g{jkT(F*E%pHmVczDgUknB0BU;Z$&)&>)61%>p?<~nRaK`` zy}f(MVQv}vd5Y{GXY@o8+Cp_QLkXWxbwtnN3qi2MmDCq6&W=Jbo`d09HS!1->^$OIYvbj=F`>ProKi zyl8oT8zdv?TqnjK1eW8PME5;zzovryef28uG2;;qu;6}$K~$deh@==}GQe0lM?_tA zcy9oGn014K1E5&oyV25_i$tx2Gc-DEomTe%on?x8c-UrAGpZUvqc^@168U`>=;K_R z9D_+oN91jssW2o$iQ9G7_z#K(&x*TwhT?{vajRtUdE{)XrB<8t199nBH&&D<)uoRt zyQo%pbXpfmnyO*G7?E`S(H>tZh(j=7o#(l4q|E!C^W3nq4FDkTB>tq;`RP8Zwe<-G zgzrbuM;$+$KUOoOGy@+Utp@*m_9y=?6TCNd;~aR2@IpWK5;Dp4SIvf~w&cR^U|h=^ z*n10;xSSRd=);`wH63yQvQhx({hmb8}392VaS@H!z3H5!xORyNHQzEF`WEK zmD30sTgc({*)OdR%jR|2FJ)`Nu|O4Y+nvCXU(WHJgZwz^3b?xlj*R=-OE35gDQC4G zyr(?_062eF9?e%?Uyr-F&Y+_ywf9XOxiZeqL6ntTds>D4RD?KDI%$zd-%zOaYnV|E z?@#NA4OR&%9kUgIRDBh4sLEvDC-9?R1T$?*(|WQfm$K$gO~9m!imx(>GUZlw2hqtF zVMP$pnd44%ZuYLvJ^$U?a{;rhmw_=Xz-6)MRRgWGVRMUcK?_^T3_V@lhP6&$z}ed7 zW?q$ExOb!I4^!XoqFaxz`bh)8;1+z^%6*xW_m>j0D9%DMGgRF~l@__Tw1-Ki`fcxT zO73pI3psbmv8Y30#j|`j&iBu-N|L~;@*ZM-^0KBc0SookHa6;&O?g4k>zofy>(JF& z=t+S8F%=HcgMt6;w<`zYha8xQ+lUx}zx2RhTxx1V3IXiE50BLJS>v)!Ud97_IUv9s$ z5ulwx$!beqrhSl|?D*suCe1rcMsm`!dnFcirkM?^sy|s`X?M=9Yk(60 z4=i}k6xj!#+ZbkENUJM3F;v-rjFXT)?#y$$84;`f?u*JnH9zferBOaphNj7WF-3pq zt*Ges>=a|iv?qtyMeA0`8&-g)>IihL?jPXuCw1DnzrLExFYkQN+q=3t7$EvbHgx5; z)!%=YVouN?udZj$+IdY?rj2ha9N~TYmRyD;GBN40R6@^LQHb^}05C*1R$z)Z%q(4H zu0ofVj$d9`WzLf`+awMD3eJaqmk{h6gU9K!C&!ru{dWJ3YInZIEyNAhW=FkAgW$+h z8yQiqC#^rzzg z9%hWQHvTAESvbGKl4BfswTmcWi`xYeezt1(9Px`GvYjx02=3cA&VdBVXFp*LGvW2q ztDQiXAJwf&lmPw@mo^}J?BU!X#Ll71s=K=-oB8ZEAMkOl36*>%xA&DLO!Y`zHXh2% z&kp)Dh(dyu7t~jFemCwJr0ur6j*e`&krjv4n+U`|Ayq;+B)wA9Giwm0KLFl~vXn`M zv#y-U=5*x;$;dL5bu-eu$>ycW$3utGtjS{q8pCdW=LD%$?d}IlHo#j(G^KfPX8`PT z>YK$vrl-DNHr7EhEvh(^h^YY;9pQTZd;z(r-3tC^Vfj}lIc?8drHXeg7pI|ExQyK)u_iK?_!ehV1P>2tf3t4S-Va=%Al!G01MeES*83}7+)efj4XsG z^W@i5zEQw__MO!bROY~6MK@9HAV&sp4n5l9puyk=8}wwB4V9J~jmpZpvmhNf=+sgh z7G5O@u&oqU$(?u5EL;o3VG17H+vc{XKAnucdJwUX-9o@jbuTC$&u0iJsS-S!+qFp5 zXX5f%=2=NK{FG~%XSy>O-RcIaahwm0iFp?r^DdE3)1di*$Nj9O_qSyN?l8bT>xT>H zO^-)9XKg@vQ2~jD=!K|t&!-0oA_%scjT8Us!b%x%%5&dxc&oUH`8iQBV%$YS%Dl&&RiAs6^37r zJmbft_ogfw_7%GyPU+I@O0_-qi;E_>t3_LryJyhrA0;Q~Xhgr1peSX9WD(59;L|Z2 zy#lDQ1W@J=!HR8K?sPs><;|)pFE6jI<|=6QWa$9I?}Dr*v=sa-1?eykoU6L*sUn%U4uY%}Zm)M@ggk2p5gefy_Hj z+yFY3RPEsheF(U#Bpc{ZD|xm2;={au>%;y2`Yvii&M75I5;h!wGba7deNbrVMNjKy zZM?rBg(`kJR@^czYFY5dVbp$PcsAPT(JK-5)kNX}O`HM==m@u*WRJKTBTW3qzo}N34Txrf4t;8!w zhbL`OM|WV$n#~kM7?~yhUx>|4ignEp#0Wg6)gZg9vLKS=8X_HNnMBZyD+V_ z@Mxd2=2r*o4bGQ?Lfo&4p@#}H*DW1SN%IZfwKxX%QQ6;G3+8XZ9pJ_@ycG0hbi~-~ z8e)$z|HO}^4-r%-4cRNLKJb9!cery0=bIrl^MkL9XHOI;5xKegaOVOLJUy4GVTb`x zEId8^R4=k%dN4a;osyz4MOUi2)XhMZL{~av?d|5Z*jkr9R8geCMt>>9hSzz8Ll)pJ zpEIpg%;FA;MI$_No{lpC5<k;At!%nn6R$%CZ498>)g71ZVE_Ao zj_Yfj*{^d6E&)$VJb5|+4;t%tYd)f)`PH50H!>Zp!&U;kC&i#WdpY!4lW|`&x-(dm z@ljq(uWH;cp91{O{kZ&!uj{wrIeQX}hRh7$RXMrCQQz0d6;7wQ@~SwDGTWqZOIKIT zXtJ7`9n2=<%cPVyn%4EQX4KlJ@-`~cRVqK-2CcVU#5Bq0Dcv93B6i@oB;h%viDNq;XVAIp)OB9xBZu|Y>&nz@GTxg?An1x=3lgVO?BDtH3u7F8 zU=iiR(mm)Ibi1%&Sndw+3l-K&(PucC=tR)euv)@2e2}cJnw!&JLOD~QJet-@F-pn5 zZh|#^b6r2O)IoHMQnSV5o^{F9n8~N0m7CTf|RS1Hd;P z?Ylk+`~5o5BJgz*(Cc8s-eY?u0G#C^Za@rOTi5g57$2K>sOG=xP)BkngN#w5wT#oWi$Qz>*@t@}ft&d=JxJ!{abARB{+8?e8sWra+uU1d6N#%qt~L7BkHFaJxod1y7! zWj)=V$Uy(Vpk!z?w!vcoe@^or+@hfmx{8E!sdU&>-$|$IwcfmYS~gj~ua{XL>YSdN zW%WEK2xSay-f?gm@kD!K$flbo`a3?N0^?@BXn$YOaDOYHCY6JO*z5joUBUlccE`La zw7+PVOa}uU1_G}v#~=gcNxx7@*!e`?Lh9TWD2VB&8s zu|{QdWaJy+i(_Z(diehmgMbD0U+!@Ke(pN`Y>V^Xienp)P`K9aw6%yqg@1HNkBylH1Kv~DyNewS1Haj0YD2=k@f<2%i|3+2X_d2Xp$>rOUfFSo1e3KCvQ-?Q6HQA7) zJzmeK`uRPb@nubtELZ>M1#ok7OQoa~WRmk#lS6UTmnwCYOvP0pXDS9#A^za^!+AOn z)cvZ>){z9C$;eSCsV_4AxB-_#*Z<{9t{5ct&O{rP z_TXTclqVJjEUIlx>OQA*V()!kolx98sd7t*{x1voFP0uE^`mdxN)}cm!G!$76Nw)| zz%xaU5D!sQm<~!9DSaf(d)XP!SR7Zb4ESL_kWB20>!z0qO2;6p;o&I;FdtAw{~RyPKiA z`Od)eymjCAyZ5g<|8Qnb?7dh1)?RBJb~g@%BatbA5H@KKF>EX(FzjdXN$88vuUGZW zn!2?N z4=+LZVXC{!-NMyRr`*=wUNoC-aI-(UJbX41FT9=g=FOXfJl6>|NY>=W>WFoP?PU%c zwBXqKIR7bwmpOKo#f-~RFxRZ}TB077h{q?i!!ih7Du5As4GzWd!X>0$R&aBaRaa-5 z5~OMtfF#5H#nGzi+m6Ki{KTKMU70v5QAH^yxs-03Pg1UaX|`#?9quFROg66#o8o(zb)LwqFk zmcn({lHJy`>|z5wdUtN*Ru$mmIR6&Xl>hqbwAn_p!HqQh-#|K0{_lE{ms$j)AB&;_ zE0Tq@@j(PJKvWsF7LAYRkwVu!!H7AdsdjNbl9!`il~g$u%*&B`tOCSr`w~9OVc(-H zZ7x#PIu)tEC|P9aSNjdSMRhmh%i0B9B#^XQ%VZ>jUoLj_%IXDC|03Itxeqf%RBP(S zF_J%WSas=5w>T0NWr}M$)_r{U7zBz83Pz11{beBeKkCg4A|>Iwxr|yr!SZP%W50YM% z8VjdKea`7*&tj20w~H2RBM8K0H^~rDvuOfAbM|5uAaj(dfX_DYEskYBohy62Q#Cwd z6&p#ETXQ?nzq+=Dx&i?&R~`^2I8jrdGFP3Xk<8c0OE+3dZruH6clGD72`NG!q6{2% zXfP|P2o=B%_D`2S*bAj4((yQ2(r{78dv!>AW(F zZq+g7aVnl#P>G3$+HFr>Z)^Q#r0V(Ed8Ye1CGme zN(#dJ(!7sJxQE2F90xj7q83Hz82dVnf^q7_N#bF3rrW`Ep)lxgxV99b z4hKm>H_~BsKBYw(=_apgsoS#MBnSXs@PPBOzmQo*!N3P97^bG$z_TWqA^#1v&S$<> zYim!33iIT0eJyyH{w`~$pI?iUKn(eZIb zWn~;G3TWi7%pt!{6%dupO;=klo>@a@JeE7czI}TfvSe2vWWg*fyd28*+3&Zw^g{Xj zq6@Q`C-I{)&2 z5{wpkLvSG8F%;b~69yQvGf_RrqdEeAMD9Lf8DWyb^*`B^2X#t1c)^=R%ujWkIyRQw z;HkRkt?>JN90=-bKNqbe;9l2v;^AVw^P^@ogQ(e{jPT}3*XL>c7Xiz?O!ynf$_@E> zjmgvDj7ka7z)i&x;Y0iT#w}qv`}_3U2|M}{9F&xCOywUxct*MA?aEC;vx#Gt{;kN! zs8Xad&<43k(8x$UYY6al$H&LtWY6mev~{e>DLPa>o(lZxBImOEqgAq=@K!keI_<2m zb!_>#-gXQt#)D6eTaD%c8{e`b(sO;!a`u132cTkJRpLG@$lq0NiG7)wG)s$-L?T3c zH9Cxx-$~}X-1g;#FV*l_;&m?~iO6XH?A+L!3xM5;FkY_4Eqy6>~HoLssOoTd2_-+{Ty zca?AyrJl`uP=vmto?B2*keA0GK)cK(r)tX(l}dPU(W?@4xDa@1dV_c0IyPJUz>HhtJs`B$aa%#62zFFZY!l~K0U_nDSGVPxy=r?ryOqXnO@03>9t zl28}8M@>yhCAD#dy^Qgsh+ELDd1wOe=Cx3{-< zbaXU2ZEd!7H98GPo?Vhv<DGQX0pa7es|2PR6qj)$9P!}$$|cSX710Ju{&UGI9@%QeU6 zur+?zFKAh{dqx-sPXkY6k%eyW-rPL-FgxX_(^~4dIk|u^Vi4ZjP2Nu%EpWNY1pr!y zM)Qd6+GNRk*QK^HTA5d)BdUyaZytKhXp7chC0E+pC7P_MZx1O9hjr^vqZq$*Z6|C{ z?fo{vTPw34TBYe9s+Ccw005J916NmDfo=O-NHhZP2%97IM3mIm*el!BnOb`o07XY8jZ~ntrH=xFhFpK*#hgiqr!K`MHCyes z+u!_b5Fc#huo*CD_07^Ui*TiDm@#a7KE;62L~tZBZ^tCNikjZjNPVRaF5jWm$H%r+ zyR+s{yBuTZ%ACy1wl9kK1bU@r)QL&m>4LUUw$GTAJ(V2}On3RF(h0NMtKa_CA~mnr z_QAeOelrcdSek%2@D1|4VjJbv;ob~w?byyFKzVuqK|sF0E^}b)ayku^*58mpo8%f1d$6 zVOiP`_Ln;VEqjNw%Y(o>i7vuVXnt8czNMj*Pfu~;wqEHXB1QPrFF|AImz^@p+HCok z-#)c2cT8A_-&pOv1C(3Boi(l;!o6;JY@rbeA)%q6T5<+t&U-LpV`Jy@m1x9wZ*x)Z zbWr-=VDx`vU816*%0&Z~R~~!@wOf;{MdGxCc}WYGy2$WK)V@#)wNbaPPYyQSdBiV0KWC$P=M3;l0#=Nu4-PsNI{gUQwA zhhrnShDYaB6r{l--uPIXYzDBu--dhK&W-95wIS^)Mo!WTP9{^ZVNv67Z(?5 z>gpem??b`o{a3L;e<5M|D)wt3c4LVQJVOIKe0+2g?(c9o-1a44*QCX z-2r@;XCufL8*{l9bP@osE1tB{GjVg1DmrVCJi+Mzum(o&|3$=-uthp&=_Z>d7R(k-uYhuB`E z0++pUM)#RUh!w{WNeY-Pl;Zj^!2O;rSDJ5}1rhXV&B($+G#9o&9UVn8cbhdLD{!%Q z>+b5XYO$f=A##v=+;!9BjZ1bHf^Xrj8ba^)`g?kN>vQN70s~9(lnn*Xmt&)%Dl1<@ zw8spFsIw_4`vWoCRCfJdZ@;)(&aQO9aDUd9_n%KqI4rm8&BL7&{|}KoA(2%#XJAt2F!vH zPpZ4wdj_rj*YtFT>DZ2}Y_fpc*>8Vru~0H|BO^LvW_Z$y6;A`e%j}tu)x# z+0UerWac4)Z7%J$&eb{XhA=N=NViGdT=3h}5lDRHUk(*17cvZ`wK&5QyLRwns{rpX zq!*xK!DsyQ>-hvTWvN<$*p@?8i*?LWgWHvpz(}igLSf{a(?6sK?E#HrtF7WaE4DTy zYazbao3*OfH`)C;yGFh$J&5*rFA>o(TB}UwWDw81|G&vxSFl*NHCY#IA3i}S*|#k%H1VwEp#^`NL11y zB*W@7EKEObgHxVLUB)Zc@&zhLM@M1vc4 z0F-feuV)((IY*r5gcpPV5c&x5Y*_Y!cb)XvPl?53yV4TP;bDG}X079xjrC(&+BhHu ze7hpU>8>H8>TAL18dqNT-M+;|ok97s+T!n11wQyJUwzZyRocQfUgDRBQJ7P#2QVF8vutggiVBxD6?F*7i z9{NzSNsD@bhA-m&FkGmP?y0_mDFx-rGN@FI)bUYk2@N%TL^De`z#|ojR2{L;{+NUa z+S@ZQFz7+k-X$XDZ8VMADdl|qCi!-aoSFG$G}Q*n#@@60$1i!R%shAD$WkBLkl7Go(KEbT5sI1&h|M0X4?ng|I*A-mdppw zXW*FyqltBn$OhmLY$FHgP-R-ZkC-bEdG=H|fa-%E@r8#tfQn_voqrKu^4#ID%BS#= z(RJ)OA@Qnx!&~rPvdq_Ib#XHBq^*^@|Gm1X(}GD9h&bpIhNLo(Sv0p!FQ;Yt*7h&? zg@x<96X3OhK&X@C7y28guh&PMzg)CbDy&XMD}oL{qhU#@FtH`{L+m?S!zTm>=zM-Y zHD*H%HB_Y#;&MxSiyg93h`vg}=zCvu&wYlO6-U#7-gOo;=hV3;t>RVQ0T-d+q~L&4 z75b{s0BbNvvnuoLKq6P&>^-ndD-VWaukm*R*X4hgHFwC!$4iXnGkcuGPHnxd%t4wg z5J9sNsZ)7>x4n77J$yF}yV{kLSELngSLYsLQ7vV5?s!oanm0}t3e1TDMh=Wn3G3jy zP6E(R0H)3(xL@QLdN^!!Eb5WItQ%E`mmsSV{t#ZKG%odTHB-eF|Ay0n z&(!e!_UX;S#c``1dwg%)Uo(eKUVMsrs^Yu!&C>8NmTseb1aDbcth50~VXn9)^K-%4 z6KDdZa}Cn1J6(A6p=4L4=p#_^!=Qg;@9spqgsBvQ(z#remAMIndCqO*=jA~Gly#m- zUFYW~j%HR=Cl%`yfNfq&W8*bMoru%fy@GqpO2Re!dru~;E@7vjA**4)s~=bQUCMfr zTA)VOV7HN&6I=K?G1<6Gqa$dX|GUtAZD2)A^0vGJ1oidQAt`AvUbhtA-1sn+tc-=h zFR3S`ejS#56=az3B7dSz+9JS*0v>ft^WxfLhKKU6y-OR@b7uJF=E5W0AhxI{?P4#% zdh}^6%cnzoMiiJUa+fr}mWK`$0N+(ihcovhr%^(L=;^s`P)Upw?4!$9Km1FG0CKAh zsQA3CtuLPRZdxES1;CNb)_TmSY29jwi7{bfj;J%%%dE+pZ?oX)8yicQrUTT(cw%HP zRU@C~rmxVz-T4u%)mldD)u|G%Lbm+Vj*Af3hzITi))NJ2Cqf_b69Vt9xt#Bz@>5Q? zbn|F(!)vc*hrjQ>9km9Qg;9b(Wr5fv(j-edNT3g%dyw^N1SI-o$Pdcwd`` zA*>ktoKl}XDe&hNb?S}gyI_hpe7O-k;V322^MA8GR5Ex1;kyrAq>N#iYN=69m5<(F zxFl0w46{qO_?UhkaB)?pmiPD)$xKPE| z9R(=U=VX%A=jG zi<{^`QYXZ*Tn~E5S&Y)3#tk*#x8f zyfT%Z+c!_|qG?}t!Kq`){@cYCbk7vJ8NRtsCDZ@hzce-F@EBEQ@FihB*!va-?~h2q zz?YwMzQ9o(2!GpJt`U-A>t$=oe+?7Kef)9t+w$|lrzvloWdR=Pv&-Cgd>$r=l8yZn zSE$M;VxmAq02cNT>a{XHJ=jZih;^&Yo9y{f_!;oY2aS)EJ-_aOI)AY`S6n94=rZIk`Jta;@)>^{gdTHmod#I^OP+hss&FmxOET z%Nqa+YiTj9LVXdL%6B@h%Y=lkRxoNarbJbwuwfW!;*>{;R6WR|>A);<@WwXpL!lI! zl|^nT)1A$DyXt9Q*KgpOlBR26vGYMBR!t)aQvc?%leWLSyu6}f<0Lhh-@g-_M;*KCDafV_{d(kI0pOw!T|NECiev3Br3to{`6naV>;Ywzds@R2 zvNTQ6rPYir!y5HuZB70FObO_>7l@iD$IidvZcf_I`7o8EVH1B-UxB|)*Z zjV^>h1^L}C_7?up(47*1Vt0^aWI=By60Wzo%&&%LDCEDX4xkF3Z$Y{bqrJ!E-+~!x zv_G@IAvxYl+)NbJn+eO^<9C0>$C@tdfO}w4tAT@wiQFtaSIqGo8rtV%AzoGHSP5QscC z2(%~8H*diNHgEbB7-s)6X4Fz{b@T#}$R33&Y6>x9`ZXQ#gi1z_5>tk21&(FD{Ml5_ zY9keSj@IVyLwe?S&)R*9%~|2TlUd*6F7*z>gwAYRk*rp;kP9Zs+FNVv$1$$#=}@gI z=S6a7$x^^yuyDY`6G9w7ELHjSlMrun zvItp95Kzw74^C5fGSXq-df4xLZ`4}uCZjMkI{Nj|!PuHp$m11bPTYX+%bNl;JPUB?T}^zWzM0e(Q!q4ILdv6sbb(`u18Wrx+}y zT@=+toQHE0M|AVuRLFm z%4A@BM82*>a$hGxe;?42Yr;E=RW*TE0eSiNHmF|NL~h=ui|{iBkBCbdSIhZUl!a>7 zmb{u}`um24s(jC9puOz6j>B#gl*W${D`ruC2ha*W^D2A?Q#Pf`O}hg!dD%ocTbft4-DLsI%QgYODLBf@w)YQW_>^eLIyzs0Aa5l4)|yvGOQO zPgy@pCVl8vJ~u-N`!XfXM0Gu_*dSQ+GmJ0i8y6J$z3`B^n9DrPY^*ZuHX)&Ewu=tT zlvH}Sr}LHnECgIfFcH~^3-bDKVg;=LeuMAWsFb^xDUSaT`QV644ei?cB43Ky_4u`t zs%~D?V!hhvxQhM@N4S6Xnn46069~isu2AoeBQEav?3G`Lw?Xl;kv#A-A6Dw71A0y| zElOD24iOP66?AkOQKS)7@|ZYJaXMF|Q8~~<7k3*!RRrEmiBe(E*2)kl`Rk6x_;-7( zO?t51(bCn&jPR(=JbOn{rJOuarf^4c%0dsKf2uctd0#{XHpY+m^_p(PBENK2iOHv4 zO}wf^@&;diocr4&x$8*oV_vSV@X(ix=6Br%yoBxJM6gnrMuXe=VryBvTEWiKY*0~pd82)-&cC7gd_{{3LSpXOoPYT`7W{G4Dd zt=mf(LkMIh!{5KZ>iGgSQjho)&I~xLu7>Xir8CbA4-m3BUnoY9u#$0U4(!RG5nOD# zZd%^gnA6o}jZ%(DxONAI3D50;4j_Neh(Gp!08o)%-H(Kd1mEz*^}hn*v+MdVC*fBf zFB4vPDm9AyT?_C}5X!^wpCI(UEPb$QKieH!`{1tvaGZeMP8H#0e;i{vAlz!xDbzq( zg!iE27UKNXQ4RV8_hl}y3wu-dYg~o$b=Z6R^?atIK8(#T>s@!+za=8oNDYAS_Su}_Lhz)Uh`r0N^QRI~6PZm6H z>7F`nDDAic{pco7L3#Ir9}MSXZWhrmLe{!7{j69Ar+1jN!0@jUZFa)bqvJhOjZ}=E z6jHPi^>lwt)$6>c-$B(+exuw&|KeZ3<|fg%Y~?)3a6QV!RzIcrWn@%iu%19`>$PScyRH*7c!Hq@3C}hOy?A`9Rt?Cb3x*0wqe4GANu}RbeGDg819w z9W9Qz`WilV(Rh&x8@IO;(9`+sK90H5{!NRS>ZhOIM!i)rA$%mW1eNWl^pw+#VBG>+x7}!zin__9V*G@vdN|iN61t-c3PxC0J}O%L zc})Hs@e^ozgXaEESBx7@2x>M55~y56}m{9 zd3|DSA8=kabX{9csX;1x$tQSBPr*pI_l6CF2L}umBORWeb~`d6xaC%=F&!&x7UL(A zwX`gn+Ln=)mX?%!>R+2sLH)TP6GL<9X7Y`xRAu*Um?IWSR#%r~7{v|J!ysi5A9*>p z3rD_Bi>TMT&ndg~ZeV5F?>Qjiz!=&%nDr2%v;l7Yt_VU711eftUkCdSjB^&J&0R>d zEv!+o=B}n{`MU1?eUssJy0B9jwc)$1eGn`2#qJa*je+{iS5CbcbNgKLRGQGIOXpAb zM(%e6Fqyu%{Ph+LuXf?d`@6ix-~In^q#bu9g@=O!L@{;;MS*nSk01X`=R4l_Kt7jT z|L))~uBH~pJSOsLbA9~}^j?86IFBTN`TD6Jaf>0o2?S&(72g^3i_bd91Hpu+fQAoBlG<mgXs8c z-WWUX{)*|XfeJF|?30rdmd2}t3BzRf&73S8kpU>l{X7&XQ>*gU45Wte$ApCo-3Nq+ zagl0kYx@#-Y`4Zs;<+q0At)eWa+d^hgv3_hhW!_mF3`sk5S8jzdAB)@Gp0@2AFOm$ zd=E9GcI$p+s8WtK7}eVJpH5b=#1&4X2%Jyie^B1>sf;l8WsL=t`fzIQ<~0Y$Va-~S z)Q1(v*P#7CvNegfcPqZ~>nWESTHqVA;c(Vo7-T%G8;)1jOA&0{+_)`xZogn-8+Q`; zZu8f#j8)pTL{sAnp{LOXOc1)U($c{PC1Zp6KOdQG{OYsiC%kzsy>?2tR;bkoFBqw- ztJCj}qNb&VLC`?!KY`UM?EVtEZB%rL#x5)GTO1u7T}yJcn5}bmiGB#M)E}$USUGz* zR+ZAG;4n%2z{}fsb;ZYE`>mQyX-7T7S^|A{ud3?c0-xgwaJEO)m@>Sg{LkD>WO&5% zi_h<`Y!EdZoyD+#HdPM{epgmiax zsnr&jZFJT5K}o}-43eT@aJ|1R50-f4dSW&j4r)>vSb}SK&_z>I7w&ZVquB^m{^|h z<7#EKDfE1-;Y=v%gaxVQ1Th%$!?-Jgehd2e&L#q~mgtd;vbT6CB#cZUak@~H6MlnA4e4l+k~C(du2 z#AJTB$-uP7;+tWvQr~?Edfu~c4TmW-A!x>9-ZHyEIf?w~5CZRrv>_ps#;j{eE)A zq5tM2Gu{2P;@!%c__OYxwL`Uy4bJbap@wiB{5k{-sOXqA3;sl<07*RExFeYwuog<2 zCDHwBSI7oB3+>>7PYRWj%U~na?bc$9YtHNs6c6--!zJMb$({NR$Rw9b2{UV5bQW0F zm63Twj=FQU9{%}RE23B*@J{a|YA)}@^(TkZk@DS!TIXKd^Fi4oW@ON>P_i{~(K{u5 z_D4JV!V5OW<#xH97!>q_Lw>hcoHh1YKuGIzET=k?D70Cmi>}NTW|@xbc8mXe-o^NQ=E-|h#3=Dr&j$1c1^A&?$SrO6h%d0 zeRQ=WB{UG*#z981o&nj1VtASRw_Wx^ z7PA~%Cn9F}=0DR_+XX6$U+)PGne9RVg;_Q=(p)V8!shklo#ogW-}$nX zOEfUc-xQm`k8hWMR+-ujTw=Q&?QlN^`MFJ>!-oy?pZ$kG!#!P7+I(LlT$-hi9D@6; z@?HanhJRh^U2f`jW=wYP5yHd%3Iv}!e0OLKOihKr2fK5s3*yj4#CW8;tdW<~+yCn2 za9IFi!0876eELP7n;Y^byQan&OVa--gHk@X>q-7Bm@i^^^vg#Ufz|r{{}bLT8-_OZlGFBNg%lhR`f&@x!#+O}yEng4 zYSlmjcay+CU*Eph%ePz4;YXo?kwJHtr9+llWDh~0XG*H7IgaoW1}}8zc#!PT&Lwtz zeVn0r*gd?ZJQWyS>(XUpwP5M*Z2<18m=ZH~}dE{{CevNYnr2 zXg@VIRcIIM{s$Tos2O}PDXjlGSZE;cE%4{L&3A`jbiv+-AXWm{3IhDJiX#S#itd9w z`oGBjPpN`St&>K+-XpjaJl`fF_lQFReJTdPRlOAa3b*lA1GiMix#WMLHb5k=j(7j^ z4CT7<3e)I+iry$`5IO^=*Lv$3{(mLMzY+!)7x$mSF|Mx*45k(SUk7v2_zzk0YF1%E zho5e)^>%6|!uFEA6Pe!+|Au84yl|u4w4_7*;*P||V`qCqd?1iFSV`$+%afa|veZv-v4maU$RuXD^0peF;v(T3 ze5gev2EwJ*LJ0Jq!n*I+x4*#B^7d%)5al;V1667OH{Tq-jiW4;$TfMdnLYJF#lfK#GZ^-tjr zx7b&t?o%VyKUn-@77^4WoRgbNv>@*6e7+oYXHjCFxJ5`UEZniYJ+VB;0a@pzrhXAr1s?eu8SDGL|7;H(a0OX%ZZ6!+IPN5j z!N52oyEdS8FHabAz0IZ{<&RrV z=e_x6DlJSuYQf8ieofcy3fr|l|Blt(cmRK~b8r~%K3M!{Yg;x;{X6r^mj`z=d%`9; z=_CHp>S%pQR(@byMNaYP><~1NQJ6u!u`_d+|&rSuXcryZK;kT_d* z7TmJEKu7(6>Ev>S#WRQW+}HCA$zAFJt7v1RO)E!siIhT}Qwin4C4(|e<4cgsMC)oK zTsd{8p~F?=9xVrb$lLpIj-=#$p3_fdc2%#2w2GX^_7^g@D3UgJQkQ197`MBTYcLYu zNM~Zls%{3w`Xke%QS|KyseJrcW4%=J^PyM>3G&uQNR3YG!!W0*;>jiOrG`bu;p`^y zm?3lqfaB8nx%~nt9&tMCh~)I13qBG>@U;97JvU?J%LOjR-DMBE{gy~d%B<5m>&)v& zR-6)p;8#h;a}kM5Hnkgrah%#QSYE@11}MeKnJ7b@^H6uYj+>=Mz+ShImA%C_Upe?`-wP*~#FAR)xJTyxZ&UJZl?~Tg8!@Yg zqZ|A;`koDu!P~xbd!*yGE_*{5B1JfyWCBc-S@Fw}$~M>0CE@;82Zr|sadhgqKoXkODJ zBH76i_;lm85L@bMZQ5G{@mVzM&IU|rXL;PzCed#fNu9^6_ZLOlp%d(T8*fpPSZasu zYOnWb<*V7PSY3yF;nzD2?C->Bc`iz2$!K)lw9mirZYw9hY2~dUH}-jCFxYpoUV*)< z6899iblpjLc3`lAUobM1`7t?i%~wCOi+0Dc4pVYSos)IDBtoh%#K1tuWU?TKhxvW@ zY{he|nrEF=nJZM8nInSxUuP>o*fQV|N6%B}SSZ=bEWDe|nlk8A@5o-_`e=-jGMryf zS*GqVuw^^E-gv0%vn*2Q>`}ng@SqCLL0pj(L$Pd(Up~EyfO@>!I@`7(k!+n3_uhj^ zRg}^(@paRzc#nc(bEe8VTOnqMIr#zBTe}U`*kNZv$1DR^+%#Z1HqN+1GdU=AgtF6Y z!LAR*p4XBXo8yKNqmvoIvjZ51ZHH1aCs!Ig12+{N7`>_h)6X_C97*xH^x=vy$gEa0 z7IM;J$*Ae3(+dqj=R$RQV-ynUQ&iCDA)vl&I`?_V^~&`tT<3nIND+0%grU;WI4CpN zu;iXuQ*uash!Oai2TPu_4tCK|6J121*6J0Pl9h~Q*B+txazq$DgFGZ-pm(*r39dIq zp!wr@dA;k1iyL{h%7q&oET~p4u6@c3H-B7(vxSlIvyekr^5c`DH}$l|myv#c%YFT$ zae2bRljyrV)65g`0>gMXXijgIw|F1xf10fA9Qx2mmXiI4ZQ{^&W$c4)Z$6%05zm5F z)40dk-p?VWTg$07ZiVGM03i?qIt)SPKqApN@*cig$&q?$z(gNYp?987-F=M?d{GrJ z-7g&$5fpc4_q@=$Ih(i+QLl|ah1gMNcICgS&jZnXgh&NW!LA2VMJRRH35?)x?DRug zQf~^c-+1p^r>$D2;(9SDhF_*1x*MsiseU!o+8D)IR9`77Oy%03!WcNWkKQdndSJ(h zuU@k;Bg+`oy4zt|gqr*vm8i^S2x`hG2+7yiGMyzozIGdK7#F;#2z`y}a`K%3p?l%D!)J_hSPQRFw*&GF25fL@Pv8g_u8+TvqTpX001mALgcts=RyiX^!i ziAr4a{-%CfZlS?8d^M@KYhDW}TlaoXIk^!_X?R-Ku+${3>}jcR@l*aZI^-GX2mh zUxnEpt2Y`L-Cu~IugV?aFv6R4_6M6#{j}znBj>vz0j4kau zwXU3;)Q$*5L;KTCYKLb99E;Sqw+~NhE?it@$WB>#C$t2w@Zi$OGmVCM zBqp`>3oX}o-^bKHUIl0SD40SQyP6D}oudx7Io0 z&&yA48A&sT%@mju7Y0AiO~DYC;X_Wyu}jpv@Vv=J8W+#EXR$n#0hw{&1diM z?D#xiqf}M+_pIB6&>;e5*w(pPd33`<3s*AvC0|Qi;^9$5xpT8vW=|aNWoL$V43Qt1 zH^5Id*Rc*>9ysF34Ra8A^3sT3o-4kWRmI>yaB;Dk%ojU7km5+; zho~7kwSpN9&_6UcV2a6|%-Xfi-J)n}$=+2lTI~4Q4~Ncx59&|RNzAY?d2VlN$L7eZ z{lRA>g4Oy1?=T6g-AB5>mIX8CHw!4PqVb>jGE8bBX^hC3Z^^VNjvt{_&XGmb^meK- zup42Qge5dsi3^W~ znB2!0`FH$=mfHX2OII*)C?Y900KMgIm%4Bn$oxo17t0Bj_jBEus|KAdkAq=lzLx@k z_ry>ahf?Cm;s5I1KB%r6oLSp}ZQBz^>?9>M%xXqYjm(&D*&e%SSil!r7A{BSI^tT8 zCu~9L-crToHq@tJ$aT&YgPt~@PA`1%O*wzJ(Iv$hX2cPcHas6;B4G@>89Y(2EE)rV9mrH2?UdI0OG{D#_|pm+JCuq6)UIZQh@Mgi8MS^*8c7m~tZ~W@jRY zu-nkw;;V1|O3V|CC-0F&$zB!8yLXd`O=0#lHjd{_O1?MWUN|?^y3{(gcQuBQynnVo z`*3RSQm7t9%zbK#h5mS3lU!6{NPZ~!;@w5+O6QQFkG+m?Y)g&7F7_dB=89dq-f>K( zGtLV+Wj;B+fRgrC+cGvv?MEb*qN|O|amUQa@Gv=eaB9V-X7%@J8y?5hB+YGVj*KA| zz^|@t8)_;7_El-vhJ=kPIMgI2K4QzkbvifvmB_x62pd(l<}Rxtmq&5!z*wN&bhThG^S- zf?e7B5w$w)@$u+xR_jejmWH9#thOs{{Oa4hXycAssx~(5;i$LOD?R((zM9wNKkb*E zhL!oEzxK!3(X0>>Zo8PhgiO`g+F!=gIx=F0m3?r)q-X3x7t@WVY1(zI_`4Qh$#r4; zh-@IAnS+Ckb9;1{q)2BNinrdQFW$h(L<>p3@h@B?<~m{q;=@l5g2Nq-kB)jSm&j?e zB06x^EXmoH9K=o=Io-DhEPAtZbCngr$GMZbBDi4TTBwUJpR&3L!ML21ULH##q1s9A zsoL5w=u%yvHoZqf59gHu{eWVj=jE`3n*U*EHUbm~}GSZvR zBp$c*ojUGl)DJlt9WuO6w@j%S-?OwDJ{8FJBH#8{{nOWkPqjsy8jJO#g^Ms%*0(dg zue+L;Gd>%Is7R-l*S)p!dE;QUzimwBzYxVZ31f`33Xe19q`X5-?zC}Wb9 z9BHzarXeDZWipXj?TuD2c%CmARuu*h=Ef#f>}{-RiubE=1F&;ZkH4-Oo~wPyN^#?Q zBE-4W84{5{?|pj}VmgdH#Ezv!cWxr8<|5w}ft-g{8$06;F4Vf{9Ldv;EpTr6_T|f$ zVre)oV&0M`XK}#A-GDqedi8?o8W>^yeD)yBmpV&2HtaRRsoF63&o$orXPb-a5q#V^U>E`%lfOMMqTbu#7;TyhTSwrir$mHyLeob+_1;|KaBZ-gm0F z%_S?U23x!S-UeSz+Z^bO(Yh7|#f83*JSGY^j5$Nb0Eo!$F-nMxj0t+~68kK`@J|RN zAXi}Brpj|_ryH^s(jt3*O4kk%8l_%b#hZ`~^~RNcs4hFeqp4>cxVV z`Gm9P@;z1pV!z~G@?93(x#b&IP9xLr1+Hpb1|f!f0V$HC-Ph!OJI?OypPM*5bG&D5 zIut32PP8ELFIfjq4XPTP0sTU-VDzu8Y|^wRzQ%6_$~z|+Q_pTLTbLVq$L zD+-lJ2A+)7NqD#WfK}op5%DoI0_dk;QTx(e^4MzV<=G!1T&A=|!QuzSOjIXLX55-)-CULeD89s(pbA`XgggWg zW|^-4Zbw%zt)Kwsuj`Edo%8wcerE0*-_r`lOFa7*6uckz0p2~eLaQSAqR}A9ojZ_a#K-;hlMdwQcmQ}UaGWtzTcYQk)69ZkcE(P zJ^UMdEhRkxmUt275d8J)lL7daKYYhi`E$0Ms%p)-9^A^EWlG@h^muVTJ;hSQ8r6C2zNU(cC-=-N6PYPqJ9($4%z;J9Eej5;(q@ zqOzS`j93Z_S282lENymyTW*W4M!BM?sz3Dxe8_u@Hmt)72Vy+#c@n~-C$x^ShaAFv z-Jekm+Y=nl_4V?lS#XT8E<;2d%$t||5YeUNN~3Vyov*Cs-;S12%BhqCYgoj*%Le_1 zSws025B$29QUNn(=FzQ)F#<5Q6@r)vkkTBBbg!<~-_ z&DoZ|ZG~0-Q7bW)TB!9FlWF9Ml0qYMtFLb?U^HSVoDY9o?aoxJ9%XsUf{8rC13PPG z3PgKMexz^GjA!IO!fnL!(+pBd>FRIBKb{`x0=NP-OSN09fs%Lu$9J1ob*{=&!c_Ln z3PWqbIE)YAhWlju0qA*1HH0i$x%P6}y}q8m-hGCjA2@J#ub-LWcQ4ee0-zKyWwp+; z9(B~oD9yDw!L7OS?y4Z`&Zl#~_>E1>Y6J$U0QP#+fzdc21kS@&-W+Ag$b6b5y0@L9 zGnNIU&H+5C*AJs2Or{J_2}&Khn@7300z3AB6$YNYsS$E_Hzko9`;4x{;=*5SU*9-< zO)FS=AvS(H*HYCcp!GdpUnHP8o8Vb&f5VwLHhdTO0o<%D`u)G6Au{{9LR?-TPNGB- z*fU=#tY9HM`*fT-rd-53PDQCZ?&&U)0!AB04`w%6Z*CyjZ1QP_j-kKcf1xZa+B+5% z;bDdw_P)r&MaeBu!{$oqc@41(V#bO5B|Ka~Q;R1Yf2XB>;&c&V>3SJS{E!R5N%7wR z5`P~bFk89cauh%Ooy*gmWOEm*9rQw^)8j%!FNVbh8O&4l^-8KwVnez+3V2bWuF(k{egUkqnXsHh*sASv&n`}{d~7qPheb@ z^^H6BOyoE{3yy**A#LIwON%6JuuAIc8W>F({qa*N>gyJM#xMH)%R zHr9&~IWG8!Z;`5aYi|oSOhX+^MZw_uQ~;!mkTK+DQx49IToNd&)L8c`U4}e7A%&?Y zUCHZhpGIFgh7MNRSelseFx=MaW>q#vxwlhZ0tPhtn{-&i0xs;beS7i;%-6F*zsFld z4~XxO%7Ei6&oU;=iCUMK571XqlIo6z^(BYbiM-0YN2HTiUAfJtAsQu1y}d{R+;;Qc zRb`HiRU5mqeYbYUd6Tczu}X(V0ZT?aIH!qE_vtI7rF=hcR?XD&c4X|D)FdsK+=rg+ zJggt^G=8W7xw$Xurl+Shtn9A1nnQ3UMSRrcQXFv?Fr{`8U*zEsy2-Y=dh*Sjl4sRg zYABF9)a*H|TXmsQFgGeXow z({wQ8TrcY!Ej))V)_Q*7N8a!b@tR0wWPYfKZI#n>x7JYLHI+I@m>Pa5MbJ(9lF&AS zVblaOj2)^LsjeQbtfpl!#+-*bx7suG_~;NFgu(j%z(^+@rW=$WFLSCYf?FOxX*h-V zmg+o$C;GsO>5j;Mh9ag#NSS)O9MNa0Eawu#Oga*Za!ouZSL&uI&ta5MSeJapq{xJ! zMP8{Nw@7+*wZ2xt5SHI>MsThg^{X(17gCb3Ska{FfHyFOWZYFQ#gJ^t3;qkDGK`O` zneex8%u?Ps&x>Y{Vn#99vKh5tDTp@7ON|(Q^Dv9M>wWU6?PwHToQ>FRjbu%W+>T({ zt=uO&&pGhkc|*y{3UxD5{)oI*9M|-*`$3g?H%oy%->ULm)hC9oI8;=^kBi*1dx+F#ql=Y0YnD7o;7M}c zCuEK=|0o3uzV5{#fO;LtNCb@*P-(>JyS+^M6ZQLFPQ(n)dm>b4%M+9c0M|7{cU zr;5cugNJVrO0=Uf@{KV#)QwsbAD^kX1SW3A26$9*td!8^)^`gO^oao=z~Q6!mUv9ODX=&A7|8Y+C#v%EvDP75wEca#RJL zl2yx}j7+fdl?7&3@{PqGXxn!g6^tinF}LzY@Zvm;NlrA+Ym)7x z#oxsA9mb8of@DlzaKfq5%B^U^uH&0)ASt(&LC>b&%u)f!l{F+%9mxCgWz+i?>j5gJ zru04HC01W{?gcu3xSZp+|MTwMyQjGwn8tqj&ANROh)zsQjE&_<|Iwvd{P;DX>Tl{i z%Fi2qBeYR12MY8czWJi=e0%(PMW4Wdso%@DJG$81;x6sAVLqHbYe1a%vdCvtA^T>A zi{zNfv?m^8z9(sZQjM{LI48|!6&F7S+?p-a;wE`dVCY;p+%wjhV!7}=M%drDyu>zR z;8rhepUTw}X`v?K&A{n>(u0PeQQokzNpYjc}rVY-r3s1tr0HEkuNGsl1Xi`DX=bJis$lt|K8ED ztNxonmra2>#(%0%g+ig(y;!cq7ySRFKyKVfBh3>V8aw&^1A6gcb;NTW#Gv5hRGP(j zMSJcEzhu)N-B8WznXP1NC?DngV2aJ|E=v55$93ZYEOL~pMaWqG6Jy&<{S3_0N5uE- zOeiULz*Nr6|7=Y1=0YMpC579L*Bp!6mSeKAfj3(Go>x>H5p&=rxC43kGSkF<%0)Gf9DLL3P?VJ=6WicgT~cuMlLVwD=(P!ywQ3HjiJmiHuj*|C&~A~* zvC;$LI1deWEv8O(ro|@@=ccIjpKK#RI5hZ4TB)yn@T6N`9tmek_NNCY^MGH%=tK=QPj#} zmqXMV5&UPJ%Q_syuauLZ5Y<2c(#d&jWr@Plw#dfjGOtf;60?v{tKXs*Pp=4u&=|+G z_{*0sEiEmdU^-9@g}EqQ-r;pKy)-MNuT=q3MT!mBgr6^XisgvBAB+Uwbe#XtwYq&A zVr7_c{u7BRQJHq;F4L@kCek=o_|jCk6Uvc1xnX05kZ)a5XJ!uY%wOVf7@)dy@)g<~ zA)|rO*_hWL99z2iJ`3Ai)3jrkg~nqVEBlO--YpE?P1QLyde8zJEwpOM{f$>jvF6=I!+1W-M*Wrg`2>BwRyTn zRRCQ;qQB+28p44xSyz)%E$5y7Bt3?o#d)35zVjXQMn5qc{v$g_=WILk;&=A_<|hRBQTmgWm&WZu za0ca?=Dh=AL%P*#?iIOq$AcCew&r&P1ZI8dqAg*6J`X3Xj3kVY%#S`0x~8||dX?Cu zRSxe)m({yn8I%QTkH&S>cPV#JdXR11aaOLUfNwq{b$pv;3aVE_lDH^+>Cj2B{Sq0X zH*{^V*bgzXAPK|`&I*Kv^Zl%DGZ-?W%w)6P*Rd%yOMP?bj1~Go`tP7UBjRaN$G%vh z0_zDyok(MOc`93*Vq1Hq5Z6S?3a6gdqh=1)P2Z7$cWh^Zy5gE$rg?z}rzPi~n*HvF zwO}_mNOaBRT94m*@pp3;N=f{`*r&S&SW^A@poo;}zWn`mm3qSGQYDqcvvy4qb%0CZ<2zyzTRwI9YC! zq?ncW!2pSuFK^vwNlY&;?#e)`jE%t9QS*n0aAB$l^Tr!!-R1pKC(}gXvH<_GN&u+? zH+E~kV8s%q0*OUIpagMo`#Q+0SFQp2j+H!A4Uko^#oY1_HY_BgJm(|Gba_;Gi~Lc% zu$RhZeyV2w9Pa%f?73|VI2Yhn{G2SB)Ai!4tVU%6OkZhvN;#dXwQjx$K6G&fp)SQ0 z(=Sv-!v`#$;X4}GMP0f^d7nH~h_fO#&8R8rq*-{% z#2!DW`<3l!pZ^qJWl^}NCDtRQ94vOr43Gxh)(90G3R;c2@pOb8l`oi6W{fIK+GxH= z_k@gu3y%k{_Vp+kDyGzQ@9!V34@sp~Oe!FyHsUrGk}GXdgp?R1m1FkKW>{RibJHrW zRR;^&IcO%-uf+lb>5elf1T^%ADzyOL-wHn^dHo&_tHih)3Ttb1Q=CYURU;IWTF7#d znJsSYd&M~G!+mB(RYr=_Icfcu1jW! zqIKhn$^vDJYux?_UK&dq>mcR6l%Z>$xe#o&8a>z4YS4#B zy(~0k;o{=TRml)rVru0*P9{QXSGk=W+2%u`Y!c;|{g@A(&{P*WrjcABxv-?cAcwB{ zhjspRSXKD|i-J`1vr0Joy~r-z1n&8LSSc)*;wah%9U@?gOtYd#h`U`GdOzPcP1QK7 ztEmMDGL2PM<+kc_S%sSPb|f?|NXir)zYuRPbhWWmPYOZGY&MWNg>!OGRxWF4jYS}_ z)e$WW*C7r60Sm=6QS-en@?6Bv|d)OMD0MT}vg0j_w72M};Nf?w{T*(})w*6EA zs266@_4GNC6Ti$>Pp1N?8oSkdxzGrhcqv6HBt|aK{<<8ojZ`?e$CIXGv$#%k8_T_1 zNDq}1J~$dfAEelia_Am@Ezm-Hpu7-WH*dTU36)+f6m+gXF^c-%%5b_Xg+@;Lul3CE zTf#G$$p9}JniXbX(IA!Pk;=L_9Sw@*F37o`!c|gVz$N}ooL_I{9mE|h1rUSW`or!& zF}SMowcbIp=$4s%&>ThkEC9ep3o__+aZ%3hbcQ$InHU)bJPv=%0AE;P++JDdvKioe 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 IkIDoZz@^TNQM!KUjDq2LYbq5!RaSCyP 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 PpLifGVhsYF7SR6#$dA4f literal 0 HcmV?d00001 diff --git a/memberflow-api/pom.xml b/memberflow-api/pom.xml new file mode 100644 index 0000000..ef0e6bb --- /dev/null +++ b/memberflow-api/pom.xml @@ -0,0 +1,137 @@ + + + 4.0.0 + + com.denniseckerskorn + memberflow-api + 1.0-SNAPSHOT + + + + + + com.denniseckerskorn + memberflow-data + 1.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + 3.4.4 + + + + org.springframework.boot + spring-boot-starter-data-jpa + 3.4.4 + + + + + org.springframework.boot + spring-boot-starter-security + 3.4.4 + + + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + + + + com.fasterxml.jackson.core + jackson-databind + 2.15.3 + + + com.fasterxml.jackson.core + jackson-annotations + 2.15.3 + + + com.fasterxml.jackson.core + jackson-core + 2.15.3 + + + + mysql + mysql-connector-java + 8.0.33 + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.8.6 + + + + org.hibernate.validator + hibernate-validator + 8.0.1.Final + + + + + + + 21 + 21 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 21 + 21 + + -parameters + + + + + + org.springframework.boot + spring-boot-maven-plugin + 3.4.4 + + + + repackage + + + + + + + + + \ No newline at end of file diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/MemberFlowApplication.java b/memberflow-api/src/main/java/com/denniseckerskorn/MemberFlowApplication.java new file mode 100644 index 0000000..6722e5d --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/MemberFlowApplication.java @@ -0,0 +1,11 @@ +package com.denniseckerskorn; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MemberFlowApplication { + public static void main(String[] args) { + SpringApplication.run(MemberFlowApplication.class, args); + } +} \ No newline at end of file diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/config/SecurityConfig.java b/memberflow-api/src/main/java/com/denniseckerskorn/config/SecurityConfig.java new file mode 100644 index 0000000..299f92a --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/config/SecurityConfig.java @@ -0,0 +1,71 @@ +package com.denniseckerskorn.config; + +import com.denniseckerskorn.security.CustomUserDetailsService; +import com.denniseckerskorn.security.JwtAuthFilter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@EnableMethodSecurity +@Configuration +public class SecurityConfig { + private final JwtAuthFilter jwtAuthFilter; + private final CustomUserDetailsService customUserDetailsService; + + public SecurityConfig(JwtAuthFilter jwtAuthFilter, CustomUserDetailsService customUserDetailsService) { + this.jwtAuthFilter = jwtAuthFilter; + this.customUserDetailsService = customUserDetailsService; + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { + return config.getAuthenticationManager(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + return http + .cors(cors -> cors.configure(http)) + .csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(auth -> auth + .requestMatchers( + "/api/v1/auth/**", + "/v3/api-docs/**", + "/swagger-ui/**", + "/swagger-ui.html" + ).permitAll() + .requestMatchers("/api/v1/users/me").permitAll() + .requestMatchers("/api/v1/admins/**").hasAuthority("FULL_ACCESS") + .requestMatchers("/api/v1/teachers/**").hasAnyAuthority("FULL_ACCESS", "VIEW_OWN_DATA") + .requestMatchers("/api/v1/students/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS", "VIEW_OWN_DATA") + .requestMatchers("/api/v1/users/**").hasAuthority("FULL_ACCESS") + .requestMatchers("/api/v1/notifications/**").hasAuthority("FULL_ACCESS") + .requestMatchers("/api/v1/studentHistories/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS", "VIEW_OWN_DATA") + .requestMatchers("/api/v1/roles/**").hasAuthority("FULL_ACCESS") + .requestMatchers("/api/v1/permissions/**").hasAuthority("FULL_ACCESS") + .requestMatchers("/api/v1/memberships/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS") + .requestMatchers("/api/v1/assistances/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS") + .requestMatchers("/api/v1/training-sessions/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS") + .requestMatchers("/api/v1/training-groups/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS") + .anyRequest().authenticated() + ) + .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class) + .build(); + } + + +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/config/SwaggerConfig.java b/memberflow-api/src/main/java/com/denniseckerskorn/config/SwaggerConfig.java new file mode 100644 index 0000000..e15e52d --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/config/SwaggerConfig.java @@ -0,0 +1,41 @@ +package com.denniseckerskorn.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI customOpenAPI() { + final String securitySchemeName = "bearerAuth"; + + return new OpenAPI() + .info(new Info() + .title("MemberFlow API") + .version("1.0.0") + .description(""" + Documentación de la API de MemberFlow. + **Usuarios de prueba:** + - Admin: admin@example.com / admin123 + - Teacher: teacher@example.com / 123456789 + - Student: student@example.com / 12345678 + """) + ) + .addSecurityItem(new SecurityRequirement().addList(securitySchemeName)) + .components(new Components() + .addSecuritySchemes(securitySchemeName, + new SecurityScheme() + .name(securitySchemeName) + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT") + .in(SecurityScheme.In.HEADER) + )); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/config/WebConfig.java b/memberflow-api/src/main/java/com/denniseckerskorn/config/WebConfig.java new file mode 100644 index 0000000..7cbf3fd --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/config/WebConfig.java @@ -0,0 +1,17 @@ +package com.denniseckerskorn.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("http://localhost:3000") + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/AuthController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/AuthController.java new file mode 100644 index 0000000..3475e29 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/AuthController.java @@ -0,0 +1,58 @@ +package com.denniseckerskorn.controllers; + +import com.denniseckerskorn.dtos.LoginRequest; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.security.JwtUtil; +import com.denniseckerskorn.services.user_managment_services.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/v1/auth") +@Tag(name = "Authentication", description = "Operations related to user authentication") +public class AuthController { + + private final AuthenticationManager authenticationManager; + private final JwtUtil jwtUtil; + private final UserService userService; + + public AuthController(AuthenticationManager authenticationManager, JwtUtil jwtUtil, UserService userService) { + this.authenticationManager = authenticationManager; + this.jwtUtil = jwtUtil; + this.userService = userService; + } + + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Successful login"), + @ApiResponse(responseCode = "401", description = "Unauthorized"), + @ApiResponse(responseCode = "500", description = "Internal server error") + }) + + @Operation(summary = "User login", description = "Authenticate a user and return a JWT token") + @PostMapping("/login") + public ResponseEntity login(@RequestBody LoginRequest loginRequest) { + authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken( + loginRequest.getEmail(), loginRequest.getPassword() + ) + ); + + User user = userService.findByEmail(loginRequest.getEmail()); + + String authority = user.getRole().getPermissions().stream() + .map(p -> p.getPermissionName().name()) + .findFirst() + .orElse("VIEW_OWN_DATA"); + + String token = jwtUtil.generateToken(user.getEmail(), authority); + + return ResponseEntity.ok().body("{\"token\": \"" + token + "\"}"); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/AssistanceController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/AssistanceController.java new file mode 100644 index 0000000..299952b --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/AssistanceController.java @@ -0,0 +1,81 @@ +package com.denniseckerskorn.controllers.class_management_controllers; + + +import com.denniseckerskorn.dtos.class_managment_dtos.AssistanceDTO; +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.services.class_managment_services.AssistanceService; +import com.denniseckerskorn.services.class_managment_services.TrainingSessionService; +import com.denniseckerskorn.services.user_managment_services.StudentService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/assistances") +@Tag(name = "Assistance Management", description = "Operations related to assistance management") +public class AssistanceController { + + private final AssistanceService assistanceService; + private final StudentService studentService; + private final TrainingSessionService trainingSessionService; + + public AssistanceController( + AssistanceService assistanceService, + StudentService studentService, + TrainingSessionService trainingSessionService + ) { + this.assistanceService = assistanceService; + this.studentService = studentService; + this.trainingSessionService = trainingSessionService; + } + + @Operation(summary = "Create a new assistance record") + @PostMapping("/create") + public ResponseEntity create(@RequestBody AssistanceDTO dto) { + Assistance assistance = dto.toEntity( + studentService.findById(dto.getStudentId()), + trainingSessionService.findById(dto.getSessionId()) + ); + Assistance saved = assistanceService.save(assistance); + return ResponseEntity.ok(AssistanceDTO.fromEntity(saved)); + } + + @Operation(summary = "Update an existing assistance record", description = "Update an existing assistance record") + @PutMapping("/update") + public ResponseEntity update(@RequestBody AssistanceDTO dto) { + Assistance existing = assistanceService.findById(dto.getId()); + existing.setDate(dto.getDate()); + existing.setStudent(studentService.findById(dto.getStudentId())); + existing.setTrainingSession(trainingSessionService.findById(dto.getSessionId())); + Assistance updated = assistanceService.save(existing); + return ResponseEntity.ok(AssistanceDTO.fromEntity(updated)); + } + + @Operation(summary = "Get all assistance records", description = "Retrieve a list of all assistance records") + @GetMapping("/getAll") + public ResponseEntity> getAll() { + List list = assistanceService.findAll() + .stream() + .map(AssistanceDTO::fromEntity) + .collect(Collectors.toList()); + return ResponseEntity.ok(list); + } + + @Operation(summary = "Get assistance records by student ID", description = "Retrieve assistance records for a specific student") + @GetMapping("/getById/{id}") + public ResponseEntity getAssistanceById(@PathVariable Integer id) { + Assistance assistance = assistanceService.findById(id); + return ResponseEntity.ok(AssistanceDTO.fromEntity(assistance)); + } + + @Operation(summary = "Delete an assistance record by ID") + @DeleteMapping("/delete/{id}") + public ResponseEntity delete(@PathVariable Integer id) { + assistanceService.deleteById(id); + return ResponseEntity.noContent().build(); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/MembershipController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/MembershipController.java new file mode 100644 index 0000000..6f287e8 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/MembershipController.java @@ -0,0 +1,76 @@ +package com.denniseckerskorn.controllers.class_management_controllers; + +import com.denniseckerskorn.dtos.class_managment_dtos.MembershipDTO; +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.services.class_managment_services.MembershipService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.transaction.Transactional; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * MembershipController handles requests related to membership management. + * It provides endpoints for creating, retrieving, updating, and deleting memberships. + */ +@RestController +@RequestMapping("/api/v1/memberships") +@Tag(name = "Memberships", description = "Operations related to membership management") +public class MembershipController { + + private final MembershipService membershipService; + + public MembershipController(MembershipService membershipService) { + this.membershipService = membershipService; + } + + @Operation(summary = "Create a new membership") + @PostMapping("/create") + public ResponseEntity createMembership(@RequestBody MembershipDTO membershipDTO) { + Membership membership = membershipDTO.toEntity(); + Membership savedMembership = membershipService.save(membership); + return ResponseEntity.status(HttpStatus.CREATED).body(MembershipDTO.fromEntity(savedMembership)); + } + + @Operation(summary = "Get all memberships", description = "Retrieve a list of all memberships") + @GetMapping("/getAll") + public ResponseEntity> getAllMemberships() { + List memberships = membershipService.findAll(); + if (memberships.isEmpty()) return ResponseEntity.noContent().build(); + + List dtos = memberships.stream() + .map(MembershipDTO::fromEntity) + .collect(Collectors.toList()); + + return ResponseEntity.ok(dtos); + } + + @Operation(summary = "Get a membership by ID", description = "Retrieve a membership by its ID") + @GetMapping("/getById/{id}") + public ResponseEntity getMembershipById(@PathVariable Integer id) { + Membership membership = membershipService.findById(id); + return ResponseEntity.ok(MembershipDTO.fromEntity(membership)); + } + + @Operation(summary = "Update a membership", description = "Update an existing membership") + @Transactional + @PutMapping("/update/{id}") + public ResponseEntity updateMembership(@PathVariable Integer id, @RequestBody MembershipDTO dto) { + dto.setId(id); + Membership updated = membershipService.update(dto.toEntity()); + return ResponseEntity.ok(MembershipDTO.fromEntity(updated)); + } + + @Operation(summary = "Delete a membership", description = "Delete a membership by its ID") + @Transactional + @DeleteMapping("/delete/{id}") + public ResponseEntity deleteMembership(@PathVariable Integer id) { + membershipService.deleteById(id); + return ResponseEntity.ok("Membership deleted successfully"); + } + +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingGroupController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingGroupController.java new file mode 100644 index 0000000..d6e2099 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingGroupController.java @@ -0,0 +1,161 @@ +package com.denniseckerskorn.controllers.class_management_controllers; + +import com.denniseckerskorn.dtos.class_managment_dtos.TrainingGroupDTO; +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.Teacher; + +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.services.class_managment_services.TrainingGroupService; +import com.denniseckerskorn.services.class_managment_services.TrainingSessionService; +import com.denniseckerskorn.services.user_managment_services.StudentService; +import com.denniseckerskorn.services.user_managment_services.TeacherService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.transaction.Transactional; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Controller for managing training groups. + * Provides endpoints for creating, updating, retrieving, and deleting training groups. + */ + +@RestController +@RequestMapping("/api/v1/training-groups") +@Tag(name = "Training Group Management", description = "Operations related to training group management") +public class TrainingGroupController { + + private final TrainingGroupService trainingGroupService; + private final TeacherService teacherService; + private final StudentService studentService; + private final TrainingSessionService trainingSessionService; + + + public TrainingGroupController(TrainingGroupService trainingGroupService, TeacherService teacherService, StudentService studentService, TrainingSessionService trainingSessionService) { + this.trainingGroupService = trainingGroupService; + this.teacherService = teacherService; + this.studentService = studentService; + this.trainingSessionService = trainingSessionService; + } + + @Operation(summary = "Create a training group with a teacher") + @PostMapping("/create") + public ResponseEntity createGroup(@RequestBody TrainingGroupDTO dto) { + Teacher teacher = teacherService.findById(dto.getTeacherId()); + + TrainingGroup group = new TrainingGroup(); + group.setName(dto.getName()); + group.setLevel(dto.getLevel()); + group.setSchedule(dto.getSchedule()); + group.setTeacher(teacher); + TrainingGroup createdGroup = trainingGroupService.save(group); + + TrainingSession trainingSession = new TrainingSession(); + trainingSession.setTrainingGroup(createdGroup); + trainingSession.setDate(createdGroup.getSchedule()); + trainingSession.setStatus(StatusValues.ACTIVE); + trainingSessionService.save(trainingSession); + + return ResponseEntity.status(HttpStatus.CREATED).body(new TrainingGroupDTO(createdGroup)); + + } + + @Operation(summary = "Assign a student to a group") + @PutMapping("/assign-student") + public ResponseEntity assignStudent(@RequestParam Integer groupId, @RequestParam Integer studentId) { + TrainingGroup group = trainingGroupService.findById(groupId); + Student student = studentService.findById(studentId); + + trainingGroupService.addStudentToGroup(group, student); + return ResponseEntity.ok().build(); + } + + @Operation(summary = "Remove a student from a group") + @PutMapping("/remove-student") + public ResponseEntity removeStudent(@RequestParam Integer groupId, @RequestParam Integer studentId) { + TrainingGroup group = trainingGroupService.findById(groupId); + Student student = studentService.findById(studentId); + + trainingGroupService.removeStudentFromGroup(group, student); + return ResponseEntity.ok().build(); + } + + @Operation(summary = "Update an existing training group", description = "Update an existing training group with the specified ID") + @Transactional + @PutMapping("/update/{id}") + public ResponseEntity update(@PathVariable Integer id, @RequestBody TrainingGroupDTO dto) { + dto.setId(id); + Teacher teacher = teacherService.findById(dto.getTeacherId()); + Set students = dto.getStudentIds().stream() + .map(studentService::findById) + .collect(Collectors.toSet()); + + TrainingGroup updated = trainingGroupService.update(dto.toEntity(teacher, students)); + + List sessions = updated.getTrainingSessions().stream().toList(); + if (!sessions.isEmpty()) { + TrainingSession session = sessions.get(0); + session.setDate(updated.getSchedule()); + trainingSessionService.save(session); + } + + return ResponseEntity.ok(new TrainingGroupDTO(updated)); + } + + @Operation(summary = "Find a training group by ID", description = "Retrieve a training group with the specified ID") + @GetMapping("findById/{id}") + public ResponseEntity findGroupById(@PathVariable Integer id) { + return ResponseEntity.ok(new TrainingGroupDTO(trainingGroupService.findById(id))); + } + + @Operation(summary = "Get all training groups", description = "Retrieve a list of all training groups") + @GetMapping("/getAll") + public ResponseEntity> getAll() { + return ResponseEntity.ok( + trainingGroupService.findAll().stream() + .map(TrainingGroupDTO::new) + .collect(Collectors.toList()) + ); + } + + @Operation(summary = "Delete a training group by ID", description = "Delete a training group with the specified ID") + @Transactional + @DeleteMapping("/delete/{id}") + public ResponseEntity delete(@PathVariable Integer id) { + TrainingGroup group = trainingGroupService.findById(id); + if (group == null) { + throw new EntityNotFoundException("Group not found"); + } + + for (TrainingSession session : group.getTrainingSessions()) { + trainingSessionService.deleteAllAssistancesBySession(session.getId()); + } + + for (TrainingSession session : group.getTrainingSessions()) { + trainingSessionService.deleteById(session.getId()); + } + + Set students = group.getStudents(); + if (students != null) { + for (Student student : students) { + student.getTrainingGroups().remove(group); + } + group.getStudents().clear(); + } + + trainingGroupService.update(group); + + trainingGroupService.deleteById(id); + + return ResponseEntity.noContent().build(); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingSessionController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingSessionController.java new file mode 100644 index 0000000..7b34dd3 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingSessionController.java @@ -0,0 +1,51 @@ +package com.denniseckerskorn.controllers.class_management_controllers; + +import com.denniseckerskorn.dtos.class_managment_dtos.TrainingSessionDTO; +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.class_managment.TrainingSession; + +import com.denniseckerskorn.services.class_managment_services.TrainingGroupService; +import com.denniseckerskorn.services.class_managment_services.TrainingSessionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/training-sessions") +@Tag(name = "Training Session Management", description = "Operations related to training session management") +public class TrainingSessionController { + private final TrainingSessionService trainingSessionService; + private final TrainingGroupService trainingGroupService; + + public TrainingSessionController(TrainingSessionService trainingSessionService, TrainingGroupService trainingGroupService) { + this.trainingSessionService = trainingSessionService; + this.trainingGroupService = trainingGroupService; + } + + @Operation(summary = "Find a training session by ID", description = "Retrieve a training session by its ID") + @GetMapping("findById/{id}") + public TrainingSessionDTO findTrainingSessionById(@PathVariable Integer id) { + return TrainingSessionDTO.fromEntity(trainingSessionService.findById(id)); + } + + @Operation(summary = "Get all training sessions", description = "Retrieve a list of all training sessions") + @GetMapping("/getAll") + public List getAll() { + return trainingSessionService.findAll() + .stream() + .map(TrainingSessionDTO::fromEntity) + .collect(Collectors.toList()); + } + + @Operation(summary = "Get all training sessions by group ID", description = "Retrieve a list of all training sessions by group ID") + @DeleteMapping("delete/{id}") + public void delete(@PathVariable Integer id) { + trainingSessionService.deleteById(id); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/AdminController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/AdminController.java new file mode 100644 index 0000000..509ef80 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/AdminController.java @@ -0,0 +1,122 @@ +package com.denniseckerskorn.controllers.user_managment_controllers; + +import com.denniseckerskorn.dtos.user_managment_dtos.AdminDTO; +import com.denniseckerskorn.dtos.user_managment_dtos.UserDTO; +import com.denniseckerskorn.entities.user_managment.users.Admin; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.services.user_managment_services.AdminService; +import com.denniseckerskorn.services.user_managment_services.RoleService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/admins") +@Tag(name = "Administrator Management", description = "Operations related to administrator management") +public class AdminController { + + private final AdminService adminService; + private final RoleService roleService; + + @Autowired + private PasswordEncoder passwordEncoder; + + public AdminController(AdminService adminService, RoleService roleService) { + this.adminService = adminService; + this.roleService = roleService; + } + + @Operation(summary = "Get all administrators") + @GetMapping("/getAll") + public ResponseEntity> getAllAdmins() { + List admins = adminService.findAll(); + List dtos = admins.stream() + .map(this::convertToDTO) + .collect(Collectors.toList()); + + return dtos.isEmpty() ? ResponseEntity.noContent().build() : ResponseEntity.ok(dtos); + } + + @Operation(summary = "Get administrator by ID") + @GetMapping("/getById/{id}") + public ResponseEntity getById(@PathVariable Integer id) { + Admin admin = adminService.findById(id); + return ResponseEntity.ok(convertToDTO(admin)); + } + + @Operation(summary = "Create a new administrator") + @PostMapping("/create") + public ResponseEntity create(@RequestBody AdminDTO dto) { + Admin admin = convertToEntity(dto, true); + Admin saved = adminService.save(admin); + return ResponseEntity.status(201).body(convertToDTO(saved)); + } + + @Operation(summary = "Update an existing administrator") + @PutMapping("/update/{id}") + public ResponseEntity update(@PathVariable Integer id, @RequestBody AdminDTO dto) { + dto.setId(id); + Admin admin = convertToEntity(dto, false); + Admin updated = adminService.update(admin); + return ResponseEntity.ok(convertToDTO(updated)); + } + + @Operation(summary = "Delete an administrator by ID") + @DeleteMapping("/delete/{id}") + public ResponseEntity delete(@PathVariable Integer id) { + adminService.deleteById(id); + return ResponseEntity.ok("Admin deleted"); + } + + // -------------------- Utils -------------------- + + private AdminDTO convertToDTO(Admin admin) { + return AdminDTO.fromEntity(admin); + } + + private Admin convertToEntity(AdminDTO dto, boolean isCreate) { + if (dto == null || dto.getUser() == null) { + throw new InvalidDataException("Admin and User data are required"); + } + + Admin admin; + + if (isCreate) { + admin = new Admin(); + } else { + admin = adminService.findById(dto.getId()); + if (admin == null) { + throw new InvalidDataException("Admin not found for update"); + } + } + + User user = dto.getUser().toEntity(); + if (isCreate) { + if (dto.getUser().getPassword() == null || dto.getUser().getPassword().isBlank()) { + throw new InvalidDataException("Password is required for new admin"); + } + user.setPassword(passwordEncoder.encode(dto.getUser().getPassword())); + user.setRegisterDate(user.getRegisterDate() != null ? user.getRegisterDate() : LocalDateTime.now()); + } else { + if (dto.getUser().getPassword() != null && !dto.getUser().getPassword().isBlank()) { + user.setPassword(passwordEncoder.encode(dto.getUser().getPassword())); + } + } + + if (dto.getUser().getRoleName() != null) { + user.setRole(roleService.findRoleByName(dto.getUser().getRoleName())); + } + + admin.setUser(user); + return admin; + } + +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/NotificationController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/NotificationController.java new file mode 100644 index 0000000..ecbba8a --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/NotificationController.java @@ -0,0 +1,127 @@ +package com.denniseckerskorn.controllers.user_managment_controllers; + +import com.denniseckerskorn.dtos.user_managment_dtos.NotificationDTO; +import com.denniseckerskorn.entities.user_managment.Notification; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.services.user_managment_services.NotificationService; +import com.denniseckerskorn.services.user_managment_services.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/notifications") +@Tag(name = "Notification Management", description = "Operations related to notifications") +public class NotificationController { + + private final NotificationService notificationService; + private final UserService userService; + + public NotificationController(NotificationService notificationService, UserService userService) { + this.notificationService = notificationService; + this.userService = userService; + } + + @Operation(summary = "Get all notifications", description = "Retrieve a list of all notifications") + @GetMapping("/getAll") + public ResponseEntity> getAll() { + List notifications = notificationService.findAll(); + if (notifications.isEmpty()) return ResponseEntity.noContent().build(); + + List dtos = notifications.stream().map(this::toDTO).collect(Collectors.toList()); + return ResponseEntity.ok(dtos); + } + + @Operation(summary = "Get a notification by ID", description = "Retrieve a notification by its ID") + @GetMapping("/getById/{id}") + public ResponseEntity getById(@PathVariable Integer id) { + Notification notification = notificationService.findById(id); + return ResponseEntity.ok(toDTO(notification)); + } + + @Operation(summary = "Create a new notification", description = "Create a new notification") + @PostMapping("/create") + public ResponseEntity create(@RequestBody NotificationDTO dto) { + Notification notification = toEntity(dto, false); + Notification saved = notificationService.save(notification); + + if (dto.getUserIds() != null) { + for (Integer userId : dto.getUserIds()) { + User user = userService.findById(userId); + notificationService.addNotificationToUser(saved, user); + } + } + + return ResponseEntity.status(201).body(toDTO(saved)); + } + + + @Operation(summary = "Update a notification by ID", description = "Update a notification by its ID") + @PutMapping("/update/{id}") + public ResponseEntity update(@PathVariable Integer id, @RequestBody NotificationDTO dto) { + dto.setId(id); + Notification notification = toEntity(dto, false); + Notification updated = notificationService.update(notification); + + Set existingUsers = updated.getUsers(); + if (existingUsers != null) { + for (User user : existingUsers) { + notificationService.removeNotificationFromUser(updated, user); + } + } + + if (dto.getUserIds() != null) { + for (Integer userId : dto.getUserIds()) { + User user = userService.findById(userId); + notificationService.addNotificationToUser(updated, user); + } + } + + return ResponseEntity.ok(toDTO(updated)); + } + + @Operation(summary = "Delete a notification by ID", description = "Delete a notification by its ID") + @DeleteMapping("/delete/{id}") + public ResponseEntity delete(@PathVariable Integer id) { + notificationService.deleteById(id); + return ResponseEntity.ok("Notification deleted successfully."); + } + + // -------------------- Mapping -------------------- + + private NotificationDTO toDTO(Notification notification) { + Set userIds = notification.getUsers() != null + ? notification.getUsers().stream().map(User::getId).collect(Collectors.toSet()) + : null; + + return new NotificationDTO( + notification.getId(), + notification.getTitle(), + notification.getMessage(), + notification.getShippingDate(), + notification.getType(), + notification.getStatus(), + userIds + ); + } + + private Notification toEntity(NotificationDTO dto, boolean includeUsers) { + Notification notification = (dto.getId() != null) + ? notificationService.findById(dto.getId()) + : new Notification(); + + notification.setTitle(dto.getTitle()); + notification.setMessage(dto.getMessage()); + notification.setShippingDate(dto.getShippingDate()); + notification.setType(dto.getType()); + notification.setStatus(dto.getStatus()); + + return notification; + } + +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/PermissionController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/PermissionController.java new file mode 100644 index 0000000..9640ab6 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/PermissionController.java @@ -0,0 +1,81 @@ +package com.denniseckerskorn.controllers.user_managment_controllers; + +import com.denniseckerskorn.dtos.user_managment_dtos.PermissionDTO; +import com.denniseckerskorn.entities.user_managment.Permission; +import com.denniseckerskorn.services.user_managment_services.PermissionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/permissions") +@Tag(name = "Permission Management", description = "Operations related to permissions") +public class PermissionController { + + private final PermissionService permissionService; + + public PermissionController(PermissionService permissionService) { + this.permissionService = permissionService; + } + + @Operation(summary = "Get all permissions", description = "Retrieve a list of all permissions") + @GetMapping("/getAll") + public ResponseEntity> getAll() { + List permissions = permissionService.findAll(); + if (permissions.isEmpty()) return ResponseEntity.noContent().build(); + + List dtos = permissions.stream() + .map(this::toDTO) + .collect(Collectors.toList()); + return ResponseEntity.ok(dtos); + } + + @Operation(summary = "Get permission by ID", description = "Retrieve a permission by its ID") + @GetMapping("/getById/{id}") + public ResponseEntity getById(@PathVariable Integer id) { + Permission permission = permissionService.findById(id); + return ResponseEntity.ok(toDTO(permission)); + } + + @Operation(summary = "Create a new permission", description = "Create a new permission") + @PostMapping("/create") + public ResponseEntity create(@RequestBody PermissionDTO dto) { + Permission permission = toEntity(dto); + Permission saved = permissionService.save(permission); + return ResponseEntity.status(201).body(toDTO(saved)); + } + + @Operation(summary = "Update an existing permission", description = "Update an existing permission") + @PutMapping("/update/{id}") + public ResponseEntity update(@PathVariable Integer id, @RequestBody PermissionDTO dto) { + dto.setId(id); + Permission updated = permissionService.update(toEntity(dto)); + return ResponseEntity.ok(toDTO(updated)); + } + + @Operation(summary = "Delete a permission", description = "Delete a permission by its ID") + @DeleteMapping("/delete/{id}") + public ResponseEntity delete(@PathVariable Integer id) { + permissionService.deleteById(id); + return ResponseEntity.ok("Permission deleted successfully."); + } + + // -------------------- Mapping -------------------- + + private PermissionDTO toDTO(Permission permission) { + return new PermissionDTO(permission.getId(), permission.getPermissionName()); + } + + private Permission toEntity(PermissionDTO dto) { + Permission permission = (dto.getId() != null) + ? permissionService.findById(dto.getId()) + : new Permission(); + + permission.setPermissionName(dto.getPermissionName()); + return permission; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/RoleController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/RoleController.java new file mode 100644 index 0000000..ffe3857 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/RoleController.java @@ -0,0 +1,116 @@ +package com.denniseckerskorn.controllers.user_managment_controllers; + +import com.denniseckerskorn.dtos.user_managment_dtos.RoleDTO; +import com.denniseckerskorn.entities.user_managment.Permission; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.services.user_managment_services.PermissionService; +import com.denniseckerskorn.services.user_managment_services.RoleService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/roles") +@Tag(name = "Role Management", description = "Operations related to roles") +public class RoleController { + + private final RoleService roleService; + private final PermissionService permissionService; + + public RoleController(RoleService roleService, PermissionService permissionService) { + this.roleService = roleService; + this.permissionService = permissionService; + } + + @Operation(summary = "Get all roles", description = "Retrieve a list of all roles") + @GetMapping("/getAll") + public ResponseEntity> getAll() { + List roles = roleService.findAll(); + if (roles.isEmpty()) return ResponseEntity.noContent().build(); + + List dtos = roles.stream().map(this::toDTO).collect(Collectors.toList()); + return ResponseEntity.ok(dtos); + } + + @Operation(summary = "Get role by ID", description = "Retrieve a role by its ID") + @GetMapping("/getById/{id}") + public ResponseEntity getById(@PathVariable Integer id) { + Role role = roleService.findById(id); + return ResponseEntity.ok(toDTO(role)); + } + + @Operation(summary = "Create a new role", description = "Create a new role") + @PostMapping("/create") + public ResponseEntity create(@RequestBody RoleDTO dto) { + Role role = new Role(); + role.setName(dto.getName()); + Role saved = roleService.save(role); + + if (dto.getPermissionIds() != null) { + for (Integer pid : dto.getPermissionIds()) { + Permission perm = permissionService.findById(pid); + roleService.addPermissionToRole(saved, perm); + } + } + + return ResponseEntity.status(201).body(toDTO(saved)); + } + + @Operation(summary = "Update a role", description = "Update an existing role") + @PutMapping("/update/{id}") + public ResponseEntity update(@PathVariable Integer id, @RequestBody RoleDTO dto) { + dto.setId(id); + Role role = roleService.findById(id); + role.setName(dto.getName()); + Role updated = roleService.update(role); + + if (dto.getPermissionIds() != null) { + for (Integer pid : dto.getPermissionIds()) { + Permission perm = permissionService.findById(pid); + roleService.addPermissionToRole(updated, perm); + } + } + + return ResponseEntity.ok(toDTO(updated)); + } + + @Operation(summary = "Delete a role", description = "Delete a role by its ID") + @DeleteMapping("/delete/{id}") + public ResponseEntity delete(@PathVariable Integer id) { + roleService.deleteById(id); + return ResponseEntity.ok("Role deleted successfully."); + } + + @Operation(summary = "Add permission to role", description = "Add a permission to a role") + @PostMapping("/permissions/add/{roleId}/{permissionId}") + public ResponseEntity addPermissionToRole(@PathVariable Integer roleId, @PathVariable Integer permissionId) { + Role role = roleService.findById(roleId); + Permission permission = permissionService.findById(permissionId); + roleService.addPermissionToRole(role, permission); + return ResponseEntity.ok("Permission added to role."); + } + + @Operation(summary = "Remove permission from role", description = "Remove a permission from a role") + @DeleteMapping("/permissions/remove/{permissionId}/{roleId}") + public ResponseEntity removePermissionFromRole(@PathVariable Integer roleId, @PathVariable Integer permissionId) { + Role role = roleService.findById(roleId); + Permission permission = permissionService.findById(permissionId); + roleService.removePermissionFromRole(role, permission); + return ResponseEntity.ok("Permission removed from role."); + } + + // -------------------- Mapping -------------------- + + private RoleDTO toDTO(Role role) { + Set permissionIds = role.getPermissions().stream() + .map(Permission::getId) + .collect(Collectors.toSet()); + + return new RoleDTO(role.getId(), role.getName(), permissionIds); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentController.java new file mode 100644 index 0000000..4bdc443 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentController.java @@ -0,0 +1,275 @@ +package com.denniseckerskorn.controllers.user_managment_controllers; + +import com.denniseckerskorn.dtos.class_managment_dtos.AssistanceDTO; +import com.denniseckerskorn.dtos.user_managment_dtos.StudentDTO; +import com.denniseckerskorn.dtos.user_managment_dtos.StudentRegisterDTO; +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.services.class_managment_services.MembershipService; +import com.denniseckerskorn.services.class_managment_services.TrainingSessionService; +import com.denniseckerskorn.services.user_managment_services.RoleService; +import com.denniseckerskorn.services.user_managment_services.StudentService; +import com.denniseckerskorn.services.user_managment_services.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/students") +@Tag(name = "Student Management", description = "Operations related to student management") +public class StudentController { + + private final StudentService studentService; + private final RoleService roleService; + private final UserService userService; + private final MembershipService membershipService; + private final TrainingSessionService trainingSessionService; + + @Autowired + private PasswordEncoder passwordEncoder; + + public StudentController(StudentService studentService, RoleService roleService, UserService userService, MembershipService membershipService, TrainingSessionService trainingSessionService) { + this.studentService = studentService; + this.roleService = roleService; + this.userService = userService; + this.membershipService = membershipService; + this.trainingSessionService = trainingSessionService; + } + + @Operation(summary = "Register a new Student", description = "Registers a new student with the provided details.") + @PostMapping("/register") + public ResponseEntity registerStudent(@RequestBody @Valid StudentRegisterDTO studentRegisterDTO) { + + User user = new User(); + user.setName(studentRegisterDTO.getName()); + user.setSurname(studentRegisterDTO.getSurname()); + user.setEmail(studentRegisterDTO.getEmail()); + user.setPassword(passwordEncoder.encode(studentRegisterDTO.getPassword())); // Encriptar + user.setPhoneNumber(studentRegisterDTO.getPhoneNumber()); + user.setAddress(studentRegisterDTO.getAddress()); + user.setStatus(StatusValues.valueOf(studentRegisterDTO.getStatus())); + user.setRegisterDate(LocalDateTime.now()); + + Role role = roleService.findRoleByName(studentRegisterDTO.getRoleName()); + user.setRole(role); + + User createdUser = userService.save(user); + + Student student = new Student(); + student.setUser(createdUser); + student.setDni(studentRegisterDTO.getDni()); + student.setBirthdate(studentRegisterDTO.getBirthdate()); + student.setBelt(studentRegisterDTO.getBelt()); + student.setProgress(studentRegisterDTO.getProgress()); + student.setMedicalReport(studentRegisterDTO.getMedicalReport()); + student.setParentName(studentRegisterDTO.getParentName()); + + if (studentService.existsByDni(student.getDni())) { + throw new InvalidDataException("A student with this DNI already exists"); + } + + if (studentRegisterDTO.getMembershipId() != null) { + Membership membership = membershipService.findById(studentRegisterDTO.getMembershipId()); + + if (membership == null) { + throw new InvalidDataException("Membership not found with id: " + studentRegisterDTO.getMembershipId()); + } + + student.setMembership(membership); + } + Student createdStudent = studentService.save(student); + + StudentDTO response = StudentDTO.fromEntity(studentService.findById(createdStudent.getId())); + return ResponseEntity.status(HttpStatus.CREATED).body(response); + } + + + @Operation(summary = "Get all Students", description = "Retrieves a list of all students.") + @GetMapping("/getAll") + public ResponseEntity> getAllStudents() { + List students = studentService.findAll(); + if (students.isEmpty()) return ResponseEntity.noContent().build(); + + List dtos = students.stream() + .map(this::convertToDTO) + .collect(Collectors.toList()); + + return ResponseEntity.ok(dtos); + } + + @Operation(summary = "Create a new Student", description = "Creates a new student with the provided details.") + @PostMapping("/create") + public ResponseEntity createStudent(@RequestBody StudentDTO dto) { + Student student = convertToEntity(dto, true); + Student saved = studentService.save(student); + return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved)); + } + + @Operation(summary = "Update an existing Student", description = "Updates the details of an existing student.") + @PutMapping("/update/{id}") + public ResponseEntity updateStudent(@PathVariable Integer id, @RequestBody StudentDTO dto) { + dto.setId(id); + Student student = convertToEntity(dto, false); + Student updated = studentService.update(student); + return ResponseEntity.ok(convertToDTO(updated)); + } + + @Operation(summary = "Find a Student by ID", description = "Retrieves a student by their ID.") + @GetMapping("/findById/{id}") + public ResponseEntity getStudentById(@PathVariable Integer id) { + Student student = studentService.findById(id); + return ResponseEntity.ok(convertToDTO(student)); + } + + @Operation(summary = "Delete a Student", description = "Deletes a student by their ID.") + @DeleteMapping("/delete/{id}") + public ResponseEntity deleteStudent(@PathVariable Integer id) { + studentService.deleteById(id); + return ResponseEntity.ok("Student deleted successfully"); + } + + @Operation(summary = "Add a Student History", description = "Adds a history record to a student by their ID.") + @PostMapping("/addStudentHistory/{id}") + public ResponseEntity addStudentHistory(@PathVariable Integer id, @RequestBody StudentHistory history) { + Student student = studentService.findById(id); + studentService.addStudentHistoryToStudent(student, history); + return ResponseEntity.ok("Student history added successfully"); + } + + @Operation(summary = "Remove a Student History", description = "Removes a history record from a student.") + @DeleteMapping("/removeStudentHistory/{id}") + public ResponseEntity removeStudentHistory(@PathVariable Integer id) { + studentService.deleteStudentHistory(id); + return ResponseEntity.ok("Student history removed successfully"); + } + + @Operation(summary = "Add a Membership to a Student", description = "Adds a membership to a student by their ID.") + @PostMapping("/addMembershipToStudent/{id}") + public ResponseEntity addMembershipToStudent(@PathVariable Integer id, @RequestBody Membership membership) { + Student student = studentService.findById(id); + studentService.addStudentToMembership(student, membership); + return ResponseEntity.ok("Membership added to student successfully"); + } + + @Operation(summary = "Remove a Membership from a Student", description = "Removes a membership from a student by their ID.") + @DeleteMapping("/removeMembershipFromStudent/{id}") + public ResponseEntity removeMembershipFromStudent(@PathVariable Integer id) { + studentService.deleteStudentMembership(id); + return ResponseEntity.ok("Membership removed from student successfully"); + } + + @Operation(summary = "Add an Assistance to a Student", description = "Adds an assistance record to a student by their ID.") + @PostMapping("/addAssistanceToStudent/{id}") + public ResponseEntity addAssistanceToStudent(@PathVariable Integer id, @RequestBody AssistanceDTO assistanceDTO) { + Student student = studentService.findById(id); + TrainingSession session = trainingSessionService.findById(assistanceDTO.getSessionId()); + Assistance assistance = assistanceDTO.toEntity(student, session); + studentService.addAssistanceToStudent(student, assistance); + return ResponseEntity.ok("Assistance added to student successfully"); + } + + @Operation(summary = "Remove an Assistance from a Student", description = "Removes an assistance record from a student by their ID.") + @DeleteMapping("/deleteAssistanceFromStudent/{id}") + public ResponseEntity deleteAssistanceFromStudent(@PathVariable Integer studentId, @PathVariable Integer assistanceId) { + studentService.deleteSingleAssistanceFromStudent(studentId, assistanceId); + return ResponseEntity.ok("Assistance removed from student successfully"); + } + + @Operation(summary = "Add a Training Group to a Student", description = "Adds a training group to a student by their ID.") + @PostMapping("/addGroupToStudent/{id}") + public ResponseEntity addGroupToStudent(@PathVariable Integer id, @RequestBody TrainingGroup group) { + studentService.addGroupToStudent(id, group); + return ResponseEntity.ok("Training group added to student successfully"); + } + + @Operation(summary = "Update a student's membership") + @PutMapping("/updateMembership/{studentId}") + public ResponseEntity updateMembership( + @PathVariable Integer studentId, + @RequestParam Integer membershipId) { + + Student student = studentService.findById(studentId); + Membership membership = membershipService.findById(membershipId); + + student.setMembership(membership); + studentService.update(student); + + return ResponseEntity.ok().build(); + } + + + + /* ----------------- Mapping Methods ------------------ */ + + private StudentDTO convertToDTO(Student student) { + return StudentDTO.fromEntity(student); + } + + + private Student convertToEntity(StudentDTO dto, boolean isCreate) { + if (dto == null || dto.getUser() == null) { + throw new InvalidDataException("User data is required"); + } + + User user; + + if (isCreate) { + user = new User(); + user.setRegisterDate(dto.getUser().getRegisterDate() != null ? dto.getUser().getRegisterDate() : LocalDateTime.now()); + } else { + Student existing = studentService.findById(dto.getId()); + user = existing.getUser(); + } + + user.setName(dto.getUser().getName()); + user.setSurname(dto.getUser().getSurname()); + user.setEmail(dto.getUser().getEmail()); + user.setPhoneNumber(dto.getUser().getPhoneNumber()); + user.setAddress(dto.getUser().getAddress()); + user.setStatus(dto.getUser().getStatus()); + + if (dto.getUser().getRoleName() != null) { + user.setRole(roleService.findRoleByName(dto.getUser().getRoleName())); + } + + if (isCreate) { + if (dto.getUser().getPassword() == null || dto.getUser().getPassword().isBlank()) { + throw new InvalidDataException("Password is required for new student"); + } + user.setPassword(passwordEncoder.encode(dto.getUser().getPassword())); + } else { + if (dto.getUser().getPassword() != null && !dto.getUser().getPassword().isBlank()) { + user.setPassword(passwordEncoder.encode(dto.getUser().getPassword())); + } + } + + Student student = isCreate ? new Student() : studentService.findById(dto.getId()); + student.setUser(user); + student.setDni(dto.getDni()); + student.setBirthdate(dto.getBirthdate()); + student.setBelt(dto.getBelt()); + student.setProgress(dto.getProgress()); + student.setMedicalReport(dto.getMedicalReport()); + student.setParentName(dto.getParentName()); + + return student; + } + +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentHistoryController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentHistoryController.java new file mode 100644 index 0000000..c7aade3 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentHistoryController.java @@ -0,0 +1,98 @@ +package com.denniseckerskorn.controllers.user_managment_controllers; + +import com.denniseckerskorn.dtos.user_managment_dtos.StudentHistoryDTO; +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.services.user_managment_services.StudentHistoryService; +import com.denniseckerskorn.services.user_managment_services.StudentService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/student-history") +@Tag(name = "Student History Management", description = "Operations related to student history") +public class StudentHistoryController { + + private final StudentHistoryService studentHistoryService; + private final StudentService studentService; + + public StudentHistoryController(StudentHistoryService studentHistoryService, StudentService studentService) { + this.studentHistoryService = studentHistoryService; + this.studentService = studentService; + } + + @Operation(summary = "Get all student histories", description = "Retrieve a list of all student histories") + @GetMapping("/getAll") + public ResponseEntity> getAll() { + List histories = studentHistoryService.findAll(); + if (histories.isEmpty()) return ResponseEntity.noContent().build(); + + List dtos = histories.stream().map(this::toDTO).collect(Collectors.toList()); + return ResponseEntity.ok(dtos); + } + + @Operation(summary = "find student history by ID", description = "Retrieve a student history by its ID") + @GetMapping("/findById/{id}") + public ResponseEntity findById(@PathVariable Integer id) { + StudentHistory history = studentHistoryService.findById(id); + return ResponseEntity.ok(toDTO(history)); + } + + @Operation(summary = "Create a new student history", description = "Create a new student history") + @PostMapping("/create") + public ResponseEntity create(@RequestBody StudentHistoryDTO dto) { + StudentHistory history = toEntity(dto, false); + StudentHistory saved = studentHistoryService.save(history); + return ResponseEntity.status(201).body(toDTO(saved)); + } + + @Operation(summary = "Update an existing student history", description = "Update an existing student history") + @PutMapping("/update/{id}") + public ResponseEntity update(@PathVariable Integer id, @RequestBody StudentHistoryDTO dto) { + dto.setId(id); + StudentHistory history = toEntity(dto, true); + StudentHistory updated = studentHistoryService.update(history); + return ResponseEntity.ok(toDTO(updated)); + } + + @Operation(summary = "Delete a student history", description = "Delete a student history by its ID") + @DeleteMapping("/delete/{id}") + public ResponseEntity delete(@PathVariable Integer id) { + studentHistoryService.deleteById(id); + return ResponseEntity.ok("Student history deleted successfully."); + } + + // -------------------- Mapping -------------------- + + private StudentHistoryDTO toDTO(StudentHistory history) { + return new StudentHistoryDTO( + history.getId(), + history.getStudent() != null ? history.getStudent().getId() : null, + history.getEventDate(), + history.getEventType(), + history.getDescription() + ); + } + + private StudentHistory toEntity(StudentHistoryDTO dto, boolean includeExistingStudent) { + StudentHistory history = (dto.getId() != null) + ? studentHistoryService.findById(dto.getId()) + : new StudentHistory(); + + history.setEventDate(dto.getEventDate()); + history.setEventType(dto.getEventType()); + history.setDescription(dto.getDescription()); + + if (!includeExistingStudent && dto.getStudentId() != null) { + Student student = studentService.findById(dto.getStudentId()); + history.setStudent(student); + } + + return history; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/TeacherController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/TeacherController.java new file mode 100644 index 0000000..2145c0c --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/TeacherController.java @@ -0,0 +1,137 @@ +package com.denniseckerskorn.controllers.user_managment_controllers; + +import com.denniseckerskorn.dtos.user_managment_dtos.TeacherDTO; +import com.denniseckerskorn.entities.user_managment.users.Teacher; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.services.user_managment_services.RoleService; +import com.denniseckerskorn.services.user_managment_services.TeacherService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/v1/teachers") +@Tag(name = "Teacher Management", description = "Operations related to teachers") +public class TeacherController { + + private final TeacherService teacherService; + private final RoleService roleService; + + @Autowired + private PasswordEncoder passwordEncoder; + + public TeacherController(TeacherService teacherService, RoleService roleService) { + this.teacherService = teacherService; + this.roleService = roleService; + } + + @Operation(summary = "Get all teachers", description = "Retrieve a list of all teachers") + @GetMapping("/getAll") + public ResponseEntity> getAllTeachers() { + List teachers = teacherService.findAll(); + if (teachers.isEmpty()) { + return ResponseEntity.noContent().build(); + } + + List dtos = teachers.stream() + .map(this::convertToDTO) + .collect(Collectors.toList()); + + return ResponseEntity.ok(dtos); + } + + @Operation(summary = "Create a new teacher", description = "Create a new teacher") + @PostMapping("/create") + public ResponseEntity createTeacher(@RequestBody TeacherDTO dto) { + Teacher teacher = convertToEntity(dto, true); + Teacher saved = teacherService.save(teacher); + return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved)); + } + + @Operation(summary = "Find a teacher by ID", description = "Retrieve a teacher by their ID") + @GetMapping("/findById/{id}") + public ResponseEntity findById(@PathVariable Integer id) { + Teacher teacher = teacherService.findById(id); + if (teacher == null) { + return ResponseEntity.notFound().build(); + } + return ResponseEntity.ok(convertToDTO(teacher)); + } + + @Operation(summary = "Update a teacher", description = "Update an existing teacher") + @PutMapping("/update/{id}") + public ResponseEntity updateTeacher(@PathVariable Integer id, @RequestBody TeacherDTO dto) { + dto.setId(id); + Teacher teacher = convertToEntity(dto, false); + Teacher updated = teacherService.update(teacher); + return ResponseEntity.ok(convertToDTO(updated)); + } + + + @Operation(summary = "Delete a teacher", description = "Delete a teacher by their ID") + @DeleteMapping("/delete/{id}") + public ResponseEntity deleteTeacher(@PathVariable Integer id) { + teacherService.deleteById(id); + return ResponseEntity.ok("Teacher deleted successfully"); + } + + // ----------------- Mapping ------------------ + + private TeacherDTO convertToDTO(Teacher teacher) { + return TeacherDTO.fromEntity(teacher); + } + + private Teacher convertToEntity(TeacherDTO dto, boolean isCreate) { + if (dto == null || dto.getUser() == null) { + throw new InvalidDataException("User data is required"); + } + + User user; + + if (isCreate) { + user = new User(); + user.setRegisterDate(dto.getUser().getRegisterDate() != null ? dto.getUser().getRegisterDate() : LocalDateTime.now()); + } else { + Teacher existing = teacherService.findById(dto.getId()); + user = existing.getUser(); + } + + user.setName(dto.getUser().getName()); + user.setSurname(dto.getUser().getSurname()); + user.setEmail(dto.getUser().getEmail()); + user.setPhoneNumber(dto.getUser().getPhoneNumber()); + user.setAddress(dto.getUser().getAddress()); + user.setStatus(dto.getUser().getStatus()); + + if (dto.getUser().getRoleName() != null) { + user.setRole(roleService.findRoleByName(dto.getUser().getRoleName())); + } + + if (isCreate) { + if (dto.getUser().getPassword() == null || dto.getUser().getPassword().isBlank()) { + throw new InvalidDataException("Password is required for new teacher"); + } + user.setPassword(passwordEncoder.encode(dto.getUser().getPassword())); + } else { + if (dto.getUser().getPassword() != null && !dto.getUser().getPassword().isBlank()) { + user.setPassword(passwordEncoder.encode(dto.getUser().getPassword())); + } + } + + Teacher teacher = isCreate ? new Teacher() : teacherService.findById(dto.getId()); + teacher.setUser(user); + teacher.setDiscipline(dto.getDiscipline()); + + return teacher; + } + +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/UserController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/UserController.java new file mode 100644 index 0000000..ef5acb3 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/UserController.java @@ -0,0 +1,203 @@ +package com.denniseckerskorn.controllers.user_managment_controllers; + +import com.denniseckerskorn.dtos.user_managment_dtos.NotificationMiniDTO; +import com.denniseckerskorn.dtos.user_managment_dtos.StudentMiniDTO; +import com.denniseckerskorn.dtos.user_managment_dtos.StudentHistoryMiniDTO; +import com.denniseckerskorn.dtos.user_managment_dtos.UserDTO; +import com.denniseckerskorn.entities.user_managment.Notification; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.security.JwtUtil; +import com.denniseckerskorn.services.user_managment_services.RoleService; +import com.denniseckerskorn.services.user_managment_services.UserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * UserController is responsible for handling user-related operations such as creating, updating, + * deleting, and retrieving user information. + */ +@RestController +@RequestMapping("/api/v1/users") +@Tag(name = "Users", description = "Operations related to user management") +public class UserController { + + private final UserService userService; + private final RoleService roleService; + private final JwtUtil jwtUtil; + + @Autowired + private PasswordEncoder passwordEncoder; + + public UserController(UserService userService, RoleService roleService, JwtUtil jwtUtil) { + this.userService = userService; + this.roleService = roleService; + this.jwtUtil = jwtUtil; + } + + @Operation(summary = "Get all users", description = "Retrieve a list of all users") + @GetMapping("/getAll") + public ResponseEntity> getAllUsers() { + List users = userService.findAll(); + if (users.isEmpty()) { + return ResponseEntity.noContent().build(); + } + + List userDTOs = users.stream() + .map(this::convertToDTO) + .collect(Collectors.toList()); + + return ResponseEntity.ok(userDTOs); + } + + @Operation(summary = "Find a User by ID", description = "Retrieve a user by their ID") + @GetMapping("/getById/{id}") + public ResponseEntity getUserById(@PathVariable Integer id) { + User user = userService.findById(id); + return ResponseEntity.ok(convertToDTO(user)); + } + + @Operation( summary = "Find a User by email", description = "Retrieve a user by their email") + @PostMapping("/create") + public ResponseEntity createUser(@RequestBody UserDTO userDTO) { + User user = convertToEntity(userDTO, true); + User saved = userService.save(user); + return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved)); + } + + @Operation(summary = "Update a user by ID", description = "Update an existing user") + @PutMapping("/update/{id}") + public ResponseEntity updateUser(@PathVariable Integer id, @RequestBody UserDTO userDTO) { + userDTO.setId(id); + User user = convertToEntity(userDTO, false); + User updated = userService.update(user); + return ResponseEntity.ok(convertToDTO(updated)); + } + + @Operation(summary = "Update a user by email", description = "Update an existing user") + @DeleteMapping("/delete/{id}") + public ResponseEntity deleteUser(@PathVariable Integer id) { + userService.deleteById(id); + return ResponseEntity.ok("User deleted successfully"); + } + + @Operation(summary = "Get current user", description = "Retrieve the currently authenticated user") + @GetMapping("/me") + public ResponseEntity getCurrentUser(HttpServletRequest request) { + String token = extractTokenFromRequest(request); + String email = jwtUtil.extractUsername(token); + + User user = userService.findByEmail(email); + return ResponseEntity.ok(convertToDTO(user)); + } + + // ------------------ UTILS ------------------ + + private String extractTokenFromRequest(HttpServletRequest request) { + String authHeader = request.getHeader("Authorization"); + if (authHeader == null || !authHeader.startsWith("Bearer ")) { + throw new InvalidDataException("Missing or invalid Authorization header"); + } + return authHeader.substring(7); // Remove "Bearer " + } + + private UserDTO convertToDTO(User user) { + UserDTO dto = new UserDTO( + user.getId(), + user.getName(), + user.getSurname(), + user.getEmail(), + null, + user.getPhoneNumber(), + user.getAddress(), + user.getRegisterDate(), + user.getRole() != null ? user.getRole().getName() : null, + user.getStatus() + ); + + if (user.getNotifications() != null && !user.getNotifications().isEmpty()) { + Set notificationDTOs = user.getNotifications().stream() + .map(this::convertNotificationToMiniDTO) + .collect(Collectors.toSet()); + dto.setNotifications(notificationDTOs); + } + + if (user.getStudent() != null) { + Student student = user.getStudent(); + StudentMiniDTO studentMiniDTO = new StudentMiniDTO(); + studentMiniDTO.setId(student.getId()); + + if (student.getHistories() != null && !student.getHistories().isEmpty()) { + Set historyDTOs = student.getHistories().stream() + .map(h -> new StudentHistoryMiniDTO( + h.getId(), + h.getEventDate(), + h.getEventType(), + h.getDescription() + )) + .collect(Collectors.toSet()); + studentMiniDTO.setHistories(historyDTOs); + } + dto.setStudent(studentMiniDTO); + } + + return dto; + } + + private NotificationMiniDTO convertNotificationToMiniDTO(Notification notification) { + return new NotificationMiniDTO( + notification.getId(), + notification.getTitle(), + notification.getMessage(), + notification.getShippingDate(), + notification.getType() + ); + } + + private User convertToEntity(UserDTO dto, boolean isCreate) { + User user; + + if (isCreate) { + user = new User(); + user.setRegisterDate(dto.getRegisterDate() != null ? dto.getRegisterDate() : LocalDateTime.now()); + } else { + user = userService.findById(dto.getId()); + } + + user.setName(dto.getName()); + user.setSurname(dto.getSurname()); + user.setEmail(dto.getEmail()); + user.setPhoneNumber(dto.getPhoneNumber()); + user.setAddress(dto.getAddress()); + user.setStatus(dto.getStatus()); + + if (dto.getRoleName() != null) { + user.setRole(roleService.findRoleByName(dto.getRoleName())); + } + + if (isCreate) { + if (dto.getPassword() == null || dto.getPassword().isBlank()) { + throw new InvalidDataException("Password is required when creating a user."); + } + user.setPassword(passwordEncoder.encode(dto.getPassword())); + } else { + if (dto.getPassword() != null && !dto.getPassword().isBlank()) { + user.setPassword(passwordEncoder.encode(dto.getPassword())); + } + } + + return user; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/LoginRequest.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/LoginRequest.java new file mode 100644 index 0000000..102a902 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/LoginRequest.java @@ -0,0 +1,25 @@ +package com.denniseckerskorn.dtos; + +public class LoginRequest { + private String email; + private String password; + + public LoginRequest() { + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/AssistanceDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/AssistanceDTO.java new file mode 100644 index 0000000..bde1a28 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/AssistanceDTO.java @@ -0,0 +1,76 @@ +package com.denniseckerskorn.dtos.class_managment_dtos; + + +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.user_managment.users.Student; + +import java.time.LocalDateTime; + +public class AssistanceDTO { + + private Integer id; + private Integer studentId; + private Integer sessionId; + private LocalDateTime date; + + public AssistanceDTO() { + } + + public AssistanceDTO(Integer id, Integer studentId, Integer sessionId, LocalDateTime date) { + this.id = id; + this.studentId = studentId; + this.sessionId = sessionId; + this.date = date; + } + + public static AssistanceDTO fromEntity(Assistance assistance) { + return new AssistanceDTO( + assistance.getId(), + assistance.getStudent() != null ? assistance.getStudent().getId() : null, + assistance.getTrainingSession() != null ? assistance.getTrainingSession().getId() : null, + assistance.getDate() + ); + } + + public Assistance toEntity(Student student, TrainingSession session) { + Assistance assistance = new Assistance(); + assistance.setId(this.id); + assistance.setStudent(student); + assistance.setTrainingSession(session); + assistance.setDate(this.date); + return assistance; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getStudentId() { + return studentId; + } + + public void setStudentId(Integer studentId) { + this.studentId = studentId; + } + + public Integer getSessionId() { + return sessionId; + } + + public void setSessionId(Integer sessionId) { + this.sessionId = sessionId; + } + + public LocalDateTime getDate() { + return date; + } + + public void setDate(LocalDateTime date) { + this.date = date; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/MembershipDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/MembershipDTO.java new file mode 100644 index 0000000..c71dc5d --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/MembershipDTO.java @@ -0,0 +1,88 @@ +package com.denniseckerskorn.dtos.class_managment_dtos; + +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.enums.MembershipTypeValues; +import com.denniseckerskorn.enums.StatusValues; + +import java.time.LocalDate; + + +public class MembershipDTO { + + private Integer id; + private LocalDate startDate; + private LocalDate endDate; + private MembershipTypeValues type; + private StatusValues status; + + public MembershipDTO() { + } + + public MembershipDTO(Integer id, LocalDate startDate, LocalDate endDate, MembershipTypeValues type, StatusValues status) { + this.id = id; + this.startDate = startDate; + this.endDate = endDate; + this.type = type; + this.status = status; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public LocalDate getStartDate() { + return startDate; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + + public void setEndDate(LocalDate endDate) { + this.endDate = endDate; + } + + public MembershipTypeValues getType() { + return type; + } + + public void setType(MembershipTypeValues type) { + this.type = type; + } + + public StatusValues getStatus() { + return status; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public static MembershipDTO fromEntity(Membership membership) { + MembershipDTO dto = new MembershipDTO(); + dto.setId(membership.getId()); + dto.setStartDate(membership.getStartDate()); + dto.setEndDate(membership.getEndDate()); + dto.setType(membership.getType()); + dto.setStatus(membership.getStatus()); + return dto; + } + + public Membership toEntity() { + Membership membership = new Membership(); + membership.setId(this.id); + membership.setStartDate(this.startDate); + membership.setEndDate(this.endDate); + membership.setType(this.type); + membership.setStatus(this.status); + return membership; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/TrainingGroupDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/TrainingGroupDTO.java new file mode 100644 index 0000000..d76102b --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/TrainingGroupDTO.java @@ -0,0 +1,109 @@ +package com.denniseckerskorn.dtos.class_managment_dtos; + +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.Teacher; + +import com.fasterxml.jackson.annotation.JsonFormat; + + +import java.time.LocalDateTime; +import java.util.Set; +import java.util.stream.Collectors; + +public class TrainingGroupDTO { + + private Integer id; + private String name; + private String level; + private LocalDateTime schedule; + private Integer teacherId; + private Set studentIds; + + public TrainingGroupDTO() { + } + + public TrainingGroupDTO(TrainingGroup group) { + this.id = group.getId(); + this.name = group.getName(); + this.level = group.getLevel(); + this.schedule = group.getSchedule(); + this.teacherId = group.getTeacher() != null ? group.getTeacher().getId() : null; + this.studentIds = group.getStudents().stream().map(Student::getId).collect(Collectors.toSet()); + } + + public TrainingGroup toEntity(Teacher teacher, Set students) { + TrainingGroup group = new TrainingGroup(); + group.setId(this.id); + group.setName(this.name); + group.setLevel(this.level); + group.setSchedule(this.schedule); + group.setTeacher(teacher); + group.setStudents(students); + return group; + } + + public static TrainingGroupDTO fromEntity(TrainingGroup group) { + if (group == null) return null; + + TrainingGroupDTO dto = new TrainingGroupDTO(); + dto.setId(group.getId()); + dto.setName(group.getName()); + dto.setLevel(group.getLevel()); + dto.setSchedule(group.getSchedule()); + dto.setTeacherId(group.getTeacher() != null ? group.getTeacher().getId() : null); + dto.setStudentIds(group.getStudents() != null + ? group.getStudents().stream().map(Student::getId).collect(Collectors.toSet()) + : null); + return dto; + } + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public LocalDateTime getSchedule() { + return schedule; + } + + public void setSchedule(LocalDateTime schedule) { + this.schedule = schedule; + } + + public Integer getTeacherId() { + return teacherId; + } + + public void setTeacherId(Integer teacherId) { + this.teacherId = teacherId; + } + + public Set getStudentIds() { + return studentIds; + } + + public void setStudentIds(Set studentIds) { + this.studentIds = studentIds; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/TrainingSessionDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/TrainingSessionDTO.java new file mode 100644 index 0000000..4c763f2 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/TrainingSessionDTO.java @@ -0,0 +1,71 @@ +package com.denniseckerskorn.dtos.class_managment_dtos; + +import com.denniseckerskorn.dtos.class_managment_dtos.TrainingGroupDTO; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.enums.StatusValues; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.NotNull; + +import java.time.LocalDateTime; + +public class TrainingSessionDTO { + + private Integer id; + + @NotNull + private Integer trainingGroupId; + + private LocalDateTime date; + + @NotNull + private StatusValues status; + + public Integer getId() { + return id; + } + + public Integer getTrainingGroupId() { + return trainingGroupId; + } + + public LocalDateTime getDate() { + return date; + } + + public StatusValues getStatus() { + return status; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setTrainingGroupId(Integer trainingGroupId) { + this.trainingGroupId = trainingGroupId; + } + + public void setDate(LocalDateTime date) { + this.date = date; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public static TrainingSessionDTO fromEntity(TrainingSession session) { + TrainingSessionDTO dto = new TrainingSessionDTO(); + dto.setId(session.getId()); + dto.setTrainingGroupId(session.getTrainingGroup().getId()); + dto.setDate(session.getDate()); + dto.setStatus(session.getStatus()); + return dto; + } + + public TrainingSession toEntity() { + TrainingSession session = new TrainingSession(); + session.setId(this.id); + session.setDate(this.date); + session.setStatus(this.status); + return session; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/AdminDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/AdminDTO.java new file mode 100644 index 0000000..eaa43cf --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/AdminDTO.java @@ -0,0 +1,54 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import com.denniseckerskorn.entities.user_managment.users.Admin; + +public class AdminDTO { + private Integer id; + private UserDTO user; + + public AdminDTO() { + } + + public AdminDTO(Integer id, UserDTO user) { + this.id = id; + this.user = user; + } + + public Integer getId() { + return id; + } + + public UserDTO getUser() { + return user; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUser(UserDTO user) { + this.user = user; + } + + // ------------ Métodos de conversión ------------ + + public static AdminDTO fromEntity(Admin admin) { + if (admin == null || admin.getUser() == null) { + return null; + } + + return new AdminDTO( + admin.getId(), + UserDTO.fromEntity(admin.getUser()) + ); + } + + public Admin toEntity() { + Admin admin = new Admin(); + admin.setId(this.id); + if (this.user != null) { + admin.setUser(this.user.toEntity()); + } + return admin; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationDTO.java new file mode 100644 index 0000000..e50e4be --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationDTO.java @@ -0,0 +1,84 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import com.denniseckerskorn.enums.StatusValues; + +import java.time.LocalDateTime; +import java.util.Set; + +public class NotificationDTO { + private Integer id; + private String title; + private String message; + private LocalDateTime shippingDate; + private String type; + private StatusValues status; + private Set userIds; + + public NotificationDTO() {} + + public NotificationDTO(Integer id, String title, String message, LocalDateTime shippingDate, String type, StatusValues status, Set userIds) { + this.id = id; + this.title = title; + this.message = message; + this.shippingDate = shippingDate; + this.type = type; + this.status = status; + this.userIds = userIds; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public LocalDateTime getShippingDate() { + return shippingDate; + } + + public void setShippingDate(LocalDateTime shippingDate) { + this.shippingDate = shippingDate; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public StatusValues getStatus() { + return status; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public Set getUserIds() { + return userIds; + } + + public void setUserIds(Set userIds) { + this.userIds = userIds; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationMiniDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationMiniDTO.java new file mode 100644 index 0000000..3386648 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationMiniDTO.java @@ -0,0 +1,63 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import java.time.LocalDateTime; + +public class NotificationMiniDTO { + private Integer id; + private String title; + private String message; + private LocalDateTime shippingDate; + private String type; + + public NotificationMiniDTO() { + } + + public NotificationMiniDTO(Integer id, String title, String message, LocalDateTime shippingDate, String type) { + this.id = id; + this.title = title; + this.message = message; + this.shippingDate = shippingDate; + this.type = type; + } + + // Getters y setters + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public LocalDateTime getShippingDate() { + return shippingDate; + } + + public void setShippingDate(LocalDateTime shippingDate) { + this.shippingDate = shippingDate; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/PermissionDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/PermissionDTO.java new file mode 100644 index 0000000..adcf450 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/PermissionDTO.java @@ -0,0 +1,32 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import com.denniseckerskorn.enums.PermissionValues; + +public class PermissionDTO { + private Integer id; + private PermissionValues permissionName; + + public PermissionDTO() { + } + + public PermissionDTO(Integer id, PermissionValues permissionName) { + this.id = id; + this.permissionName = permissionName; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public PermissionValues getPermissionName() { + return permissionName; + } + + public void setPermissionName(PermissionValues permissionName) { + this.permissionName = permissionName; + } +} \ No newline at end of file diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/RoleDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/RoleDTO.java new file mode 100644 index 0000000..1af07aa --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/RoleDTO.java @@ -0,0 +1,42 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import java.util.Set; + +public class RoleDTO { + private Integer id; + private String name; + private Set permissionIds; + + public RoleDTO() { + } + + public RoleDTO(Integer id, String name, Set permissionIds) { + this.id = id; + this.name = name; + this.permissionIds = permissionIds; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getPermissionIds() { + return permissionIds; + } + + public void setPermissionIds(Set permissionIds) { + this.permissionIds = permissionIds; + } +} \ No newline at end of file diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentDTO.java new file mode 100644 index 0000000..87a488e --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentDTO.java @@ -0,0 +1,217 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import com.denniseckerskorn.dtos.class_managment_dtos.AssistanceDTO; +import com.denniseckerskorn.dtos.class_managment_dtos.MembershipDTO; +import com.denniseckerskorn.dtos.class_managment_dtos.TrainingGroupDTO; +import com.denniseckerskorn.dtos.class_managment_dtos.TrainingSessionDTO; +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.user_managment.users.Student; + +import java.time.LocalDate; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class StudentDTO { + + private Integer id; + private UserDTO user; + private String dni; + private LocalDate birthdate; + private String belt; + private String progress; + private String medicalReport; + private String parentName; + private Integer membershipId; + + private List assistances; + private List trainingGroups; + private List trainingSessions; + + private MembershipDTO membership; + + public StudentDTO() { + } + + public StudentDTO(Integer id, UserDTO user, String dni, LocalDate birthdate, String belt, String progress, + String medicalReport, String parentName, Integer membershipId, + List assistances, List trainingGroups, List trainingSessions) { + this.id = id; + this.user = user; + this.dni = dni; + this.birthdate = birthdate; + this.belt = belt; + this.progress = progress; + this.medicalReport = medicalReport; + this.parentName = parentName; + this.membershipId = membershipId; + this.assistances = assistances; + this.trainingGroups = trainingGroups; + this.trainingSessions = trainingSessions; + } + + public static StudentDTO fromEntity(Student student) { + if (student == null || student.getUser() == null) { + return null; + } + + List assistanceDTOs = student.getAssistances().stream() + .map(AssistanceDTO::fromEntity) + .collect(Collectors.toList()); + + List groupDTOs = student.getTrainingGroups().stream() + .map(TrainingGroupDTO::fromEntity) + .collect(Collectors.toList()); + + Set allSessions = student.getAssistances().stream() + .map(Assistance::getTrainingSession) + .collect(Collectors.toSet()); + + List sessionDTOs = allSessions.stream() + .map(TrainingSessionDTO::fromEntity) + .collect(Collectors.toList()); + + return new StudentDTO( + student.getId(), + UserDTO.fromEntity(student.getUser()), + student.getDni(), + student.getBirthdate(), + student.getBelt(), + student.getProgress(), + student.getMedicalReport(), + student.getParentName(), + student.getMembership() != null ? student.getMembership().getId() : null, + assistanceDTOs, + groupDTOs, + sessionDTOs + ).withMembership(student.getMembership() != null ? MembershipDTO.fromEntity(student.getMembership()) : null); + } + + public StudentDTO withMembership(MembershipDTO membership) { + this.membership = membership; + return this; + } + + + public Student toEntity() { + Student student = new Student(); + student.setId(this.id); + if (this.user != null) { + student.setUser(this.user.toEntity()); + } + student.setDni(this.dni); + student.setBirthdate(this.birthdate); + student.setBelt(this.belt); + student.setProgress(this.progress); + student.setMedicalReport(this.medicalReport); + student.setParentName(this.parentName); + return student; + } + + // Getters y Setters... + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public UserDTO getUser() { + return user; + } + + public void setUser(UserDTO user) { + this.user = user; + } + + public String getDni() { + return dni; + } + + public void setDni(String dni) { + this.dni = dni; + } + + public LocalDate getBirthdate() { + return birthdate; + } + + public void setBirthdate(LocalDate birthdate) { + this.birthdate = birthdate; + } + + public String getBelt() { + return belt; + } + + public void setBelt(String belt) { + this.belt = belt; + } + + public String getProgress() { + return progress; + } + + public void setProgress(String progress) { + this.progress = progress; + } + + public String getMedicalReport() { + return medicalReport; + } + + public void setMedicalReport(String medicalReport) { + this.medicalReport = medicalReport; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Integer getMembershipId() { + return membershipId; + } + + public void setMembershipId(Integer membershipId) { + this.membershipId = membershipId; + } + + public List getAssistances() { + return assistances; + } + + public void setAssistances(List assistances) { + this.assistances = assistances; + } + + public List getTrainingGroups() { + return trainingGroups; + } + + public void setTrainingGroups(List trainingGroups) { + this.trainingGroups = trainingGroups; + } + + public List getTrainingSessions() { + return trainingSessions; + } + + public void setTrainingSessions(List trainingSessions) { + this.trainingSessions = trainingSessions; + } + + public MembershipDTO getMembership() { + return membership; + } + + public void setMembership(MembershipDTO membership) { + this.membership = membership; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryDTO.java new file mode 100644 index 0000000..d3d295c --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryDTO.java @@ -0,0 +1,62 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import java.time.LocalDate; + +public class StudentHistoryDTO { + private Integer id; + private Integer studentId; + private LocalDate eventDate; + private String eventType; + private String description; + + public StudentHistoryDTO() { + } + + public StudentHistoryDTO(Integer id, Integer studentId, LocalDate eventDate, String eventType, String description) { + this.id = id; + this.studentId = studentId; + this.eventDate = eventDate; + this.eventType = eventType; + this.description = description; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getStudentId() { + return studentId; + } + + public void setStudentId(Integer studentId) { + this.studentId = studentId; + } + + public LocalDate getEventDate() { + return eventDate; + } + + public void setEventDate(LocalDate eventDate) { + this.eventDate = eventDate; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryMiniDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryMiniDTO.java new file mode 100644 index 0000000..25aeedf --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryMiniDTO.java @@ -0,0 +1,53 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import java.time.LocalDate; + +public class StudentHistoryMiniDTO { + private Integer id; + private LocalDate eventDate; + private String eventType; + private String description; + + public StudentHistoryMiniDTO() { + } + + public StudentHistoryMiniDTO(Integer id, LocalDate eventDate, String eventType, String description) { + this.id = id; + this.eventDate = eventDate; + this.eventType = eventType; + this.description = description; + } + + // Getters y setters + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public LocalDate getEventDate() { + return eventDate; + } + + public void setEventDate(LocalDate eventDate) { + this.eventDate = eventDate; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentMiniDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentMiniDTO.java new file mode 100644 index 0000000..f55d990 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentMiniDTO.java @@ -0,0 +1,26 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import java.util.Set; + +public class StudentMiniDTO { + private Integer id; + private Set histories; // 🔥 mini DTO + + public StudentMiniDTO() {} + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Set getHistories() { + return histories; + } + + public void setHistories(Set histories) { + this.histories = histories; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentRegisterDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentRegisterDTO.java new file mode 100644 index 0000000..adbbf55 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentRegisterDTO.java @@ -0,0 +1,125 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import java.time.LocalDate; +import com.fasterxml.jackson.annotation.JsonFormat; + +public class StudentRegisterDTO { + + // Datos de usuario + private String name; + private String surname; + private String email; + private String password; + private String phoneNumber; + private String address; + private String roleName; // ejemplo: "ROLE_STUDENT" + private String status; // ejemplo: "ACTIVE" + + // Datos de estudiante + private String dni; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private LocalDate birthdate; + + private String belt; + private String progress; + private String medicalReport; + private String parentName; + private Integer membershipId; + + // --- Getters y Setters --- + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getSurname() { + return surname; + } + public void setSurname(String surname) { + this.surname = surname; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + public String getPhoneNumber() { + return phoneNumber; + } + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + public String getRoleName() { + return roleName; + } + public void setRoleName(String roleName) { + this.roleName = roleName; + } + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + public String getDni() { + return dni; + } + public void setDni(String dni) { + this.dni = dni; + } + public LocalDate getBirthdate() { + return birthdate; + } + public void setBirthdate(LocalDate birthdate) { + this.birthdate = birthdate; + } + public String getBelt() { + return belt; + } + public void setBelt(String belt) { + this.belt = belt; + } + public String getProgress() { + return progress; + } + public void setProgress(String progress) { + this.progress = progress; + } + public String getMedicalReport() { + return medicalReport; + } + public void setMedicalReport(String medicalReport) { + this.medicalReport = medicalReport; + } + public String getParentName() { + return parentName; + } + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Integer getMembershipId() { + return membershipId; + } + public void setMembershipId(Integer membershipId) { + this.membershipId = membershipId; + } + + +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/TeacherDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/TeacherDTO.java new file mode 100644 index 0000000..a8c34c9 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/TeacherDTO.java @@ -0,0 +1,67 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import com.denniseckerskorn.entities.user_managment.users.Teacher; + +public class TeacherDTO { + + private Integer id; + private UserDTO user; + private String discipline; + + public TeacherDTO() { + } + + public TeacherDTO(Integer id, UserDTO user, String discipline) { + this.id = id; + this.user = user; + this.discipline = discipline; + } + + // Getters y Setters + + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public UserDTO getUser() { + return user; + } + + public void setUser(UserDTO user) { + this.user = user; + } + + public String getDiscipline() { + return discipline; + } + + public void setDiscipline(String discipline) { + this.discipline = discipline; + } + + public static TeacherDTO fromEntity(Teacher teacher) { + if (teacher == null || teacher.getUser() == null) { + return null; + } + return new TeacherDTO( + teacher.getId(), + UserDTO.fromEntity(teacher.getUser()), + teacher.getDiscipline() + ); + } + + public Teacher toEntity() { + Teacher teacher = new Teacher(); + teacher.setId(this.id); + if (this.user != null) { + teacher.setUser(this.user.toEntity()); + } + teacher.setDiscipline(this.discipline); + return teacher; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/UserDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/UserDTO.java new file mode 100644 index 0000000..f58c83c --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/UserDTO.java @@ -0,0 +1,173 @@ +package com.denniseckerskorn.dtos.user_managment_dtos; + +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.enums.StatusValues; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.time.LocalDateTime; +import java.util.Set; + +public class UserDTO { + private Integer id; + private String name; + private String surname; + private String email; + private String password; + private String phoneNumber; + private String address; + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime registerDate; + private String roleName; + private StatusValues status; + + // 🔥 Nuevos campos para el perfil completo + private Set notifications; + private StudentMiniDTO student; + + public UserDTO() { + } + + public UserDTO(Integer id, String name, String surname, String email, String password, String phoneNumber, + String address, LocalDateTime registerDate, String roleName, StatusValues status) { + this.id = id; + this.name = name; + this.surname = surname; + this.email = email; + this.password = password; + this.phoneNumber = phoneNumber; + this.address = address; + this.registerDate = registerDate; + this.roleName = roleName; + this.status = status; + } + + // Getters y Setters + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public LocalDateTime getRegisterDate() { + return registerDate; + } + + public void setRegisterDate(LocalDateTime registerDate) { + this.registerDate = registerDate; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public StatusValues getStatus() { + return status; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public Set getNotifications() { + return notifications; + } + + public void setNotifications(Set notifications) { + this.notifications = notifications; + } + + public StudentMiniDTO getStudent() { + return student; + } + + public void setStudent(StudentMiniDTO student) { + this.student = student; + } + + // Conversión (opcional) + public static UserDTO fromEntity(User user) { + if (user == null) return null; + + return new UserDTO( + user.getId(), + user.getName(), + user.getSurname(), + user.getEmail(), + null, + user.getPhoneNumber(), + user.getAddress(), + user.getRegisterDate(), + user.getRole() != null ? user.getRole().getName() : null, + user.getStatus() + ); + } + + public User toEntity() { + User user = new User(); + user.setId(this.id); + user.setName(this.name); + user.setSurname(this.surname); + user.setEmail(this.email); + user.setPassword(this.password); + user.setPhoneNumber(this.phoneNumber); + user.setAddress(this.address); + user.setRegisterDate(this.registerDate); + user.setStatus(this.status); + return user; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/exceptions/GlobalExceptionHandler.java b/memberflow-api/src/main/java/com/denniseckerskorn/exceptions/GlobalExceptionHandler.java new file mode 100644 index 0000000..fbf96e7 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/exceptions/GlobalExceptionHandler.java @@ -0,0 +1,166 @@ +package com.denniseckerskorn.exceptions; + +import com.denniseckerskorn.security.core.AuthenticationException; +import org.hibernate.PropertyValueException; +import org.hibernate.exception.ConstraintViolationException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.TypeMismatchException; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.http.converter.HttpMessageConversionException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.*; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; + +import jakarta.persistence.EntityNotFoundException; +import jakarta.persistence.PersistenceException; +import org.springframework.web.servlet.resource.NoResourceFoundException; + +import java.util.HashMap; +import java.util.Map; + +@ControllerAdvice +public class GlobalExceptionHandler { + + private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + // 🔹 Custom application exceptions + + @ExceptionHandler(EntityNotFoundException.class) + public ResponseEntity handleEntityNotFound(EntityNotFoundException ex, WebRequest request) { + return buildErrorResponse("Entity not found: " + ex.getMessage(), HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(DuplicateEntityException.class) + public ResponseEntity handleDuplicateEntity(DuplicateEntityException ex, WebRequest request) { + return buildErrorResponse("Duplicate entity: " + ex.getMessage(), HttpStatus.CONFLICT); + } + + @ExceptionHandler(BadRequestException.class) + public ResponseEntity handleBadRequest(BadRequestException ex, WebRequest request) { + return buildErrorResponse("Bad request: " + ex.getMessage(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(InvalidDataException.class) + public ResponseEntity handleInvalidData(InvalidDataException ex, WebRequest request) { + return buildErrorResponse("Invalid data: " + ex.getMessage(), HttpStatus.UNPROCESSABLE_ENTITY); + } + + @ExceptionHandler(AuthenticationException.class) + public ResponseEntity handleAuthentication(AuthenticationException ex, WebRequest request) { + return buildErrorResponse("Unauthorized: " + ex.getMessage(), HttpStatus.UNAUTHORIZED); + } + + // 🔹 Validation errors + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleValidationErrors(MethodArgumentNotValidException ex) { + Map errors = new HashMap<>(); + ex.getBindingResult().getFieldErrors().forEach(err -> + errors.put(err.getField(), err.getDefaultMessage()) + ); + return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(MissingServletRequestParameterException.class) + public ResponseEntity handleMissingParams(MissingServletRequestParameterException ex) { + return buildErrorResponse("Missing required parameter: " + ex.getParameterName(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(MissingPathVariableException.class) + public ResponseEntity handleMissingPathVariable(MissingPathVariableException ex) { + return buildErrorResponse("Missing path variable: " + ex.getVariableName(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(MissingRequestHeaderException.class) + public ResponseEntity handleMissingHeader(MissingRequestHeaderException ex) { + return buildErrorResponse("Missing request header: " + ex.getHeaderName(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(ServletRequestBindingException.class) + public ResponseEntity handleServletBinding(ServletRequestBindingException ex) { + return buildErrorResponse("Request binding failed: " + ex.getMessage(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(NoResourceFoundException.class) + public ResponseEntity handleNoResourceFound(NoResourceFoundException ex, WebRequest request) { + return buildErrorResponse("Invalid resource path or missing ID in request URL.", HttpStatus.NOT_FOUND); + } + + // 🔹 JPA / Hibernate exceptions + + @ExceptionHandler(PropertyValueException.class) + public ResponseEntity handlePropertyValueException(PropertyValueException ex) { + return buildErrorResponse("Missing required field: " + ex.getPropertyName(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(ConstraintViolationException.class) + public ResponseEntity handleConstraintViolation(ConstraintViolationException ex) { + return buildErrorResponse("Database constraint violation: " + ex.getConstraintName(), HttpStatus.CONFLICT); + } + + @ExceptionHandler(PersistenceException.class) + public ResponseEntity handlePersistenceException(PersistenceException ex) { + return buildErrorResponse("Persistence error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + + @ExceptionHandler(DataIntegrityViolationException.class) + public ResponseEntity handleDataIntegrityViolation(DataIntegrityViolationException ex) { + return buildErrorResponse("Data integrity violation: " + ex.getMostSpecificCause().getMessage(), HttpStatus.CONFLICT); + } + + // 🔹 Java & Spring Core exceptions + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleIllegalArgument(IllegalArgumentException ex) { + return buildErrorResponse("Illegal argument: " + ex.getMessage(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(IllegalStateException.class) + public ResponseEntity handleIllegalState(IllegalStateException ex) { + return buildErrorResponse("Illegal state: " + ex.getMessage(), HttpStatus.CONFLICT); + } + + @ExceptionHandler(TypeMismatchException.class) + public ResponseEntity handleTypeMismatch(TypeMismatchException ex) { + return buildErrorResponse("Invalid parameter type: " + ex.getMessage(), HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + public ResponseEntity handleInvalidJson(HttpMessageNotReadableException ex) { + return buildErrorResponse("Malformed JSON request body", HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(HttpMessageConversionException.class) + public ResponseEntity handleConversion(HttpMessageConversionException ex) { + return buildErrorResponse("Error converting request body: " + ex.getMessage(), HttpStatus.BAD_REQUEST); + } + + // 🔹 HTTP-related + + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public ResponseEntity handleMethodNotSupported(HttpRequestMethodNotSupportedException ex) { + return buildErrorResponse("HTTP method not supported: " + ex.getMethod(), HttpStatus.METHOD_NOT_ALLOWED); + } + + // 🔹 Fallback + + @ExceptionHandler(Exception.class) + public ResponseEntity handleAllUncaught(Exception ex, WebRequest request) { + logger.error("Unhandled exception", ex); + return buildErrorResponse("Internal server error", HttpStatus.INTERNAL_SERVER_ERROR); + } + + private ResponseEntity buildErrorResponse(String message, HttpStatus status) { + Map error = new HashMap<>(); + error.put("status", status.value()); + error.put("error", status.getReasonPhrase()); + error.put("message", message); + return new ResponseEntity<>(error, status); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/security/CustomUserDetails.java b/memberflow-api/src/main/java/com/denniseckerskorn/security/CustomUserDetails.java new file mode 100644 index 0000000..0f64c86 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/security/CustomUserDetails.java @@ -0,0 +1,107 @@ +package com.denniseckerskorn.security; + +import com.denniseckerskorn.entities.user_managment.users.User; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Custom implementation of UserDetails to represent user-specific data. + */ +public class CustomUserDetails implements UserDetails { + private final User user; + + /** + * Constructor to initialize the CustomUserDetails with a User object. + * + * @param user the User object containing user information + */ + public CustomUserDetails(User user) { + this.user = user; + } + + /** + * Returns the authorities granted to the user. + * + * @return a collection of GrantedAuthority objects representing user permissions + */ + @Override + public Collection getAuthorities() { + return user.getRole().getPermissions().stream() + .map(p -> new SimpleGrantedAuthority(p.getPermissionName().toString())) + .collect(Collectors.toSet()); + } + + /** + * Returns the password of the user. + * + * @return the user's password + */ + @Override + public String getPassword() { + return user.getPassword(); + } + + /** + * Returns the username of the user. + * + * @return the user's email + */ + @Override + public String getUsername() { + return user.getEmail(); + } + + /** + * Returns the account's expiration status. + * + * @return true if the account is not expired, false otherwise + */ + @Override + public boolean isAccountNonExpired() { + return true; + } + + /** + * Returns the account's lock status. + * + * @return true if the account is not locked, false otherwise + */ + @Override + public boolean isAccountNonLocked() { + return true; + } + + /** + * Returns the credentials' expiration status. + * + * @return true if the credentials are not expired, false otherwise + */ + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + /** + * Returns the account's enabled status. + * + * @return true if the account is enabled, false otherwise + */ + @Override + public boolean isEnabled() { + return user.getStatus().name().equals("ACTIVE"); + } + + /** + * Returns the User object associated with this CustomUserDetails. + * + * @return the User object + */ + public User getUser() { + return user; + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/security/CustomUserDetailsService.java b/memberflow-api/src/main/java/com/denniseckerskorn/security/CustomUserDetailsService.java new file mode 100644 index 0000000..3d4470e --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/security/CustomUserDetailsService.java @@ -0,0 +1,41 @@ +package com.denniseckerskorn.security; + +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +/** + * Custom implementation of UserDetailsService to load user-specific data. + */ +@Service +public class CustomUserDetailsService implements UserDetailsService { + private final UserRepository userRepository; + + /** + * Constructor to initialize the UserRepository. + * + * @param userRepository the UserRepository to be used for fetching user data + */ + public CustomUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + /** + * Loads user by username (email in this case). + * + * @param username the username (email) of the user to load + * @return UserDetails object containing user information + * @throws UsernameNotFoundException if the user is not found + */ + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userRepository.findByEmail(username); + if (user == null) { + throw new UsernameNotFoundException("User not found with username: " + username); + } + return new CustomUserDetails(user); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/security/JwtAuthFilter.java b/memberflow-api/src/main/java/com/denniseckerskorn/security/JwtAuthFilter.java new file mode 100644 index 0000000..7488e18 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/security/JwtAuthFilter.java @@ -0,0 +1,105 @@ +package com.denniseckerskorn.security; + + +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.JwtException; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +/** + * JwtAuthFilter is a filter that checks for the presence of a JWT token in the request header. + * If a valid token is found, it sets the authentication in the security context. + */ +@Component +public class JwtAuthFilter extends OncePerRequestFilter { + private final JwtUtil jwtUtil; + private final CustomUserDetailsService customUserDetailsService; + + /** + * Constructor to initialize JwtUtil and CustomUserDetailsService. + * + * @param jwtUtil the JWT utility class + * @param customUserDetailsService the custom user details service + */ + public JwtAuthFilter(JwtUtil jwtUtil, CustomUserDetailsService customUserDetailsService) { + this.jwtUtil = jwtUtil; + this.customUserDetailsService = customUserDetailsService; + } + + /** + * This method is called for every request to check if the user is authenticated. + * It extracts the JWT token from the request header, validates it, and sets the authentication in the security context. + * + * @param request the HTTP request + * @param response the HTTP response + * @param filterChain the filter chain + * @throws ServletException if an error occurs during filtering + * @throws IOException if an I/O error occurs + */ + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + String authHeader = request.getHeader("Authorization"); + + if (authHeader == null || !authHeader.startsWith("Bearer ")) { + filterChain.doFilter(request, response); + return; + } + + String token = authHeader.substring(7); + + try { + String username = jwtUtil.extractUsername(token); + + if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { + var userDetails = customUserDetailsService.loadUserByUsername(username); + + if (jwtUtil.validateToken(token)) { + var authToken = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities() + ); + authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authToken); + } + } + + filterChain.doFilter(request, response); + + } catch (ExpiredJwtException e) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json"); + response.getWriter().write("{\"message\": \"Session expired. Please Login again\"}"); + } catch (JwtException e) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json"); + response.getWriter().write("{\"message\": \"Token is invalid or corrupt.\"}"); + } + } + + + /** + * This method checks if the filter should not be applied to certain paths. + * + * @param request the HTTP request + * @return true if the filter should not be applied, false otherwise + * @throws ServletException if an error occurs during filtering + */ + @Override + protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { + String path = request.getServletPath(); + return path.startsWith("/api/v1/auth") + || path.startsWith("/v3/api-docs") + || path.startsWith("/swagger-ui") + || path.equals("/swagger-ui.html"); + } +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/security/JwtUtil.java b/memberflow-api/src/main/java/com/denniseckerskorn/security/JwtUtil.java new file mode 100644 index 0000000..b47b4f5 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/security/JwtUtil.java @@ -0,0 +1,95 @@ +package com.denniseckerskorn.security; + +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.security.Key; +import java.util.Date; + +/** + * Utility class for generating and validating JWT tokens. + */ +@Component +public class JwtUtil { + + @Value("${jwt.secret}") + private String secretKey; + + @Value("${jwt.expiration}") + private long expirationTime; + + /** + * Generates a signing key using the secret key. + * + * @return the signing key + */ + private Key getSigningKey() { + return Keys.hmacShaKeyFor(secretKey.getBytes()); + } + + /** + * Generates a JWT token for the given username. + * + * @param username the username to include in the token + * @return the generated JWT token + */ + public String generateToken(String username, String authority) { + Date now = new Date(); + Date expiryDate = new Date(now.getTime() + expirationTime); + + return Jwts.builder() + .setSubject(username) + .claim("role", authority) + .setIssuedAt(now) + .setExpiration(expiryDate) + .signWith(getSigningKey(), SignatureAlgorithm.HS256) + .compact(); + } + + /** + * Extracts the username from the given JWT token. + * + * @param token the JWT token + * @return the username extracted from the token + */ + public String extractUsername(String token) { + return Jwts.parserBuilder() + .setSigningKey(getSigningKey()) + .build() + .parseClaimsJws(token) + .getBody() + .getSubject(); + } + + /** + * Validates the given JWT token. + * + * @param token the JWT token to validate + * @return true if the token is valid, false otherwise + */ + public boolean validateToken(String token) { + try { + extractUsername(token); + return true; + } catch (JwtException e) { + return false; + } + } + + /** + * Checks if the given JWT token is expired. + * + * @param token the JWT token to check + * @return true if the token is expired, false otherwise + */ + public Claims getAllClaimsFromToken(String token) throws ExpiredJwtException { + return Jwts.parserBuilder() + .setSigningKey(getSigningKey()) + .build() + .parseClaimsJws(token) + .getBody(); + } + +} diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/security/core/AuthenticationException.java b/memberflow-api/src/main/java/com/denniseckerskorn/security/core/AuthenticationException.java new file mode 100644 index 0000000..aa656b1 --- /dev/null +++ b/memberflow-api/src/main/java/com/denniseckerskorn/security/core/AuthenticationException.java @@ -0,0 +1,7 @@ +package com.denniseckerskorn.security.core; + +public class AuthenticationException extends RuntimeException { + public AuthenticationException(String message) { + super(message); + } +} diff --git a/memberflow-api/src/main/resources/Checklist.txt b/memberflow-api/src/main/resources/Checklist.txt new file mode 100644 index 0000000..e0e1dbf --- /dev/null +++ b/memberflow-api/src/main/resources/Checklist.txt @@ -0,0 +1,7 @@ +1. Comprobar seguridad y permisos en cada endpoint. +2. Comprobar o arreglar el tema de los ID automáticos y los DTOs. +3. Documentar los endpoints. +4. Crear javadoc de cada metodo. +5. Crear un README.md con la información del proyecto. +7. Comprobar como funciona logger en cada endpoint. +8. Mejorar excepciones y mensajes de error. \ No newline at end of file diff --git a/memberflow-api/src/main/resources/application.properties b/memberflow-api/src/main/resources/application.properties new file mode 100644 index 0000000..7fb9427 --- /dev/null +++ b/memberflow-api/src/main/resources/application.properties @@ -0,0 +1,24 @@ +# Configuracin de la base de datos +spring.datasource.url=jdbc:mysql://mysql:3306/mf_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=1234 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +# Configuracin de JPA/Hibernate +spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect +spring.jpa.hibernate.ddl-auto=validate +spring.jpa.show-sql=false +spring.jpa.properties.hibernate.current_session_context_class=thread +jwt.secret=c2VjdXJlc2VjdXJlc2VjdXJlc2VjdXJlMTIzNDU2 +jwt.expiration=7200000 +#logging.level.org.springdoc=DEBUG +springdoc.api-docs.path=/v3/api-docs +springdoc.swagger-ui.url=/v3/api-docs +#logging.level.org.springframework.web=DEBUG +#logging.level.org.springframework.boot.autoconfigure=DEBUG +#spring.profiles.active=dev + + + + + + diff --git a/memberflow-data/.gitignore b/memberflow-data/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/memberflow-data/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/memberflow-data/.idea/.gitignore b/memberflow-data/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/memberflow-data/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/memberflow-data/.idea/encodings.xml b/memberflow-data/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/memberflow-data/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/memberflow-data/.idea/misc.xml b/memberflow-data/.idea/misc.xml new file mode 100644 index 0000000..d38e0fb --- /dev/null +++ b/memberflow-data/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/memberflow-data/.idea/uiDesigner.xml b/memberflow-data/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/memberflow-data/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/memberflow-data/.idea/vcs.xml b/memberflow-data/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/memberflow-data/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/memberflow-data/README.md b/memberflow-data/README.md new file mode 100644 index 0000000..49b246c --- /dev/null +++ b/memberflow-data/README.md @@ -0,0 +1,179 @@ +# MemberFlow-Data + +## Diagrama Entidad-Relación + +A continuación, se presenta el diagrama entidad-relación que describe la estructura de la base de datos del proyecto **MemberFlow-Data**. **Nota**: El diagrama debe ser actualizado para reflejar los cambios recientes en las relaciones y el uso de composición en lugar de herencia. + +![Diagrama Entidad-Relación](src/main/resources/mysql_db_init_script/DB_Diagram_MemberFlow.png) + +--- + +## Descripción del Proyecto + +**MemberFlow-Data** es el módulo de acceso a datos y servicios de la aplicación **MemberFlow**, un sistema diseñado para la gestión de membresías, usuarios, clases y finanzas en un entorno organizacional. Este proyecto actúa como la capa de persistencia y lógica de negocio, proporcionando las entidades, configuraciones y servicios necesarios para interactuar con la base de datos. + +El proyecto está diseñado para trabajar en conjunto con otro módulo llamado **MemberFlow-API**, que será responsable de exponer los controladores, manejar excepciones y proporcionar la interfaz de interacción con la web y otros clientes. + +Actualmente, el proyecto se encuentra en desarrollo y se prueba de manera local utilizando el módulo de `user_managment` hasta que se implemente la API y se pueda interactuar con una interfaz web. + +--- + +## Estructura del Proyecto + +El proyecto está organizado en paquetes que agrupan las entidades, configuraciones, servicios y excepciones. A continuación, se detalla la estructura principal: + +### 1. **Configuraciones** +- **`HibernateConfig`**: Configuración de Hibernate para la conexión y manejo de la base de datos. + +### 2. **Entidades** +Las entidades representan las tablas de la base de datos y están organizadas en diferentes dominios: + +#### a) **Gestión de Clases (`class_managment`)** +- **`Assistance`**: Representa la asistencia de un estudiante a una sesión de entrenamiento. +- **`Membership`**: Define las membresías de los estudiantes, incluyendo detalles como tipo, duración y beneficios. +- **`TrainingGroup`**: Representa un grupo de entrenamiento al que pueden pertenecer varios estudiantes y que está liderado por un profesor. +- **`TrainingSession`**: Define una sesión de entrenamiento específica, asociada a un grupo y con un horario determinado. + +#### b) **Gestión de Usuarios (`user_managment`)** +- **`User`**: Representa un usuario genérico del sistema. Está asociado a roles, notificaciones y facturas. +- **`Student`**: Es un usuario con atributos específicos relacionados con su rol de estudiante, como historial, membresías y grupos de entrenamiento. +- **`Teacher`**: Es un usuario con atributos específicos relacionados con su rol de profesor, como los grupos que lidera. +- **`Admin`**: Es un usuario con permisos administrativos específicos. +- **`Notification`**: Representa notificaciones enviadas a los usuarios. +- **`Role`**: Define los roles de los usuarios (e.g., ADMIN, TEACHER, STUDENT). +- **`Permission`**: Define los permisos asociados a los roles. +- **`StudentHistory`**: Registra el historial de actividades de los estudiantes. + +#### c) **Gestión Financiera (`finance`)** +- **`Invoice`**: Representa una factura generada para un usuario. +- **`InvoiceLine`**: Detalla los elementos de una factura. +- **`Payment`**: Registra los pagos realizados por los usuarios. +- **`ProductService`**: Define productos o servicios ofrecidos por la organización. +- **`IVAType`**: Define los tipos de IVA aplicables. + +--- + +## Relaciones entre Entidades + +A continuación, se describen las relaciones principales entre las entidades: + +### 1. **Relaciones en Gestión de Clases (`class_managment`)** + +#### a) **`Membership` ↔ `Student`** +- **Relación**: *Uno a Uno*. +- **Descripción**: + - Cada estudiante tiene una única membresía activa. + - Una membresía está asociada a un único estudiante. + +#### b) **`TrainingGroup` ↔ `TrainingSession`** +- **Relación**: *Uno a Muchos*. +- **Descripción**: + - Un grupo de entrenamiento puede tener múltiples sesiones asociadas. + - Cada sesión pertenece a un único grupo. + +#### c) **`TrainingSession` ↔ `Assistance`** +- **Relación**: *Uno a Muchos*. +- **Descripción**: + - Una sesión de entrenamiento puede registrar múltiples asistencias. + - Cada asistencia está asociada a un único estudiante y una única sesión. + +#### d) **`TrainingGroup` ↔ `Student`** +- **Relación**: *Muchos a Muchos*. +- **Descripción**: + - Un estudiante puede pertenecer a varios grupos de entrenamiento. + - Un grupo puede tener múltiples estudiantes inscritos. + +--- + +### 2. **Relaciones en Gestión de Usuarios (`user_managment`)** + +#### a) **`User` ↔ `Role`** +- **Relación**: *Muchos a Uno*. +- **Descripción**: + - Cada usuario tiene un rol asignado. + - Un rol puede estar asociado a múltiples usuarios. + +#### b) **`Role` ↔ `Permission`** +- **Relación**: *Muchos a Muchos*. +- **Descripción**: + - Un rol puede tener múltiples permisos asociados. + - Un permiso puede estar asociado a múltiples roles. + +#### c) **`Student` ↔ `StudentHistory`** +- **Relación**: *Uno a Muchos*. +- **Descripción**: + - Cada estudiante tiene un historial único que registra sus actividades. + +#### d) **`Notification` ↔ `User`** +- **Relación**: *Muchos a Uno*. +- **Descripción**: + - Un usuario puede recibir múltiples notificaciones. + - Cada notificación está asociada a un único usuario. + +#### e) **`User` ↔ `Student`, `Teacher`, `Admin`** +- **Relación**: *Uno a Uno* (por composición). +- **Descripción**: + - Un usuario puede estar asociado a un estudiante, profesor o administrador. + - Estas relaciones permiten extender los atributos específicos de cada tipo de usuario sin usar herencia directa. + +--- + +### 3. **Relaciones en Gestión Financiera (`finance`)** + +#### a) **`Invoice` ↔ `InvoiceLine`** +- **Relación**: *Uno a Muchos*. +- **Descripción**: + - Una factura puede contener múltiples líneas de detalle. + - Cada línea pertenece a una única factura. + +#### b) **`Invoice` ↔ `Payment`** +- **Relación**: *Uno a Muchos*. +- **Descripción**: + - Una factura puede estar asociada a múltiples pagos parciales. + - Cada pago pertenece a una única factura. + +#### c) **`ProductService` ↔ `InvoiceLine`** +- **Relación**: *Uno a Muchos*. +- **Descripción**: + - Un producto o servicio puede aparecer en múltiples líneas de factura. + - Cada línea de factura está asociada a un único producto o servicio. + +#### d) **`ProductService` ↔ `IVAType`** +- **Relación**: *Muchos a Uno*. +- **Descripción**: + - Un producto o servicio tiene un único tipo de IVA asociado. + - Un tipo de IVA puede aplicarse a múltiples productos o servicios. + +--- + +## Servicios Implementados + +### Servicios de Gestión de Clases +- **`MembershipService`**: Proporciona lógica para gestionar las membresías de los estudiantes, incluyendo creación, actualización y cancelación. + +### Servicios de Gestión de Usuarios +- **`AdminService`**: Gestiona las operaciones relacionadas con los administradores del sistema. +- **`NotificationService`**: Maneja el envío y la gestión de notificaciones para los usuarios. +- **`PermissionService`**: Administra los permisos asociados a los roles de los usuarios. +- **`RoleService`**: Gestiona los roles de los usuarios, incluyendo asignación y modificación. +- **`StudentHistoryService`**: Proporciona lógica para registrar y consultar el historial de actividades de los estudiantes. +- **`StudentService`**: Gestiona las operaciones relacionadas con los estudiantes, como inscripción y actualización de datos. +- **`TeacherService`**: Administra las operaciones relacionadas con los profesores, incluyendo asignación de grupos. +- **`UserService`**: Proporciona lógica general para la gestión de usuarios, como autenticación y actualización de perfiles. + +--- + +## Estado Actual del Proyecto + +- **Pruebas Locales**: Actualmente, el proyecto se prueba utilizando el módulo de `user_managment` de manera local. Esto incluye la gestión de usuarios, roles, permisos y notificaciones. +- **Base de Datos**: La configuración de la base de datos está definida en el archivo `HibernateConfig`. +- **Servicios**: Los servicios implementados hasta ahora incluyen lógica básica para la gestión de usuarios y clases. + +--- + +## Instalación y Ejecución + +1. Clonar el repositorio: + ```bash + git clone https://github.com/tu-usuario/memberflow-data.git + cd memberflow-data \ No newline at end of file diff --git a/memberflow-data/pom.xml b/memberflow-data/pom.xml new file mode 100644 index 0000000..3a22e38 --- /dev/null +++ b/memberflow-data/pom.xml @@ -0,0 +1,67 @@ + + 4.0.0 + + com.denniseckerskorn + memberflow-data + 1.0-SNAPSHOT + + + + + mysql + mysql-connector-java + 8.0.33 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + 3.4.4 + + + + + org.springframework.boot + spring-boot-starter-security + 3.4.4 + + + + + org.springframework.boot + spring-boot-starter + 3.4.4 + + + + + org.springframework.boot + spring-boot-starter-validation + 3.4.4 + + + + org.springframework.boot + spring-boot-starter-test + 3.4.4 + test + + + + + com.fasterxml.jackson.core + jackson-annotations + 2.19.0 + + + + + 21 + 21 + UTF-8 + + + \ No newline at end of file diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/config/HibernateConfig.java b/memberflow-data/src/main/java/com/denniseckerskorn/config/HibernateConfig.java new file mode 100644 index 0000000..5c228cf --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/config/HibernateConfig.java @@ -0,0 +1,59 @@ +package com.denniseckerskorn.config; + +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.sql.DataSource; +import java.util.Properties; + +@Configuration +@EnableTransactionManagement +public class HibernateConfig { + + private final Environment env; + + public HibernateConfig(Environment env) { + this.env = env; + } + + @Bean + public DataSource dataSource() { + HikariDataSource dataSource = new HikariDataSource(); + dataSource.setJdbcUrl(env.getProperty("spring.datasource.url")); + dataSource.setUsername(env.getProperty("spring.datasource.username")); + dataSource.setPassword(env.getProperty("spring.datasource.password")); + dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); + return dataSource; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); + emf.setDataSource(dataSource); + emf.setPackagesToScan("com.denniseckerskorn.entities"); + emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + + Properties jpaProperties = new Properties(); + jpaProperties.put("hibernate.dialect", env.getProperty("spring.jpa.database-platform")); + jpaProperties.put("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto")); + jpaProperties.put("hibernate.show_sql", env.getProperty("spring.jpa.show-sql")); + jpaProperties.put("hibernate.current_session_context_class", env.getProperty("spring.jpa.properties.hibernate.current_session_context_class")); + emf.setJpaProperties(jpaProperties); + + return emf; + } + + @Bean + public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(emf.getObject()); + return transactionManager; + } +} \ No newline at end of file diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/Assistance.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/Assistance.java new file mode 100644 index 0000000..cd61182 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/Assistance.java @@ -0,0 +1,86 @@ +package com.denniseckerskorn.entities.class_managment; + +import com.denniseckerskorn.entities.user_managment.users.Student; +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.Objects; + +@Entity +@Table(name = "ASSISTANCE") +public class Assistance { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @ManyToOne + @JoinColumn(name = "fk_training_session", nullable = false) + private TrainingSession trainingSession; + + @ManyToOne + @JoinColumn(name = "fk_student", nullable = false) + private Student student; + + @Column(name = "date_time", nullable = false) + private LocalDateTime date; + + public Assistance() { + + } + + public Integer getId() { + return id; + } + + public TrainingSession getTrainingSession() { + return trainingSession; + } + + public Student getStudent() { + return student; + } + + public LocalDateTime getDate() { + return date; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setTrainingSession(TrainingSession trainingSession) { + this.trainingSession = trainingSession; + } + + public void setStudent(Student student) { + this.student = student; + } + + public void setDate(LocalDateTime date) { + this.date = date; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Assistance that = (Assistance) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Assistance{" + + "id=" + id + + ", trainingSessionId=" + (trainingSession != null ? trainingSession.getId() : "null") + + ", studentId=" + (student != null ? student.getId() : "null") + + ", date=" + date + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/Membership.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/Membership.java new file mode 100644 index 0000000..10e6d3c --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/Membership.java @@ -0,0 +1,108 @@ +package com.denniseckerskorn.entities.class_managment; + +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.enums.MembershipTypeValues; +import com.denniseckerskorn.enums.StatusValues; +import jakarta.persistence.*; + +import java.time.LocalDate; +import java.util.Objects; + +@Entity +@Table(name = "MEMBERSHIPS") +public class Membership { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @Enumerated(EnumType.STRING) + @Column(name = "type", nullable = false, length = 50) + private MembershipTypeValues type; + + @Column(name = "start_date", nullable = false) + private LocalDate startDate; + + @Column(name = "end_date", nullable = false) + private LocalDate endDate; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false, length = 20) + private StatusValues status; + + @OneToOne(mappedBy = "membership") + private Student student; + + public Integer getId() { + return id; + } + + public MembershipTypeValues getType() { + return type; + } + + public LocalDate getStartDate() { + return startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + + public StatusValues getStatus() { + return status; + } + + public Student getStudent() { + return student; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setType(MembershipTypeValues type) { + this.type = type; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public void setEndDate(LocalDate endDate) { + this.endDate = endDate; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public void setStudent(Student student) { + this.student = student; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Membership that = (Membership) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Membership{" + + "id=" + id + + ", type='" + type + '\'' + + ", startDate=" + startDate + + ", endDate=" + endDate + + ", status=" + status + + ", student=" + (student != null ? student.getId() : "null") + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/TrainingGroup.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/TrainingGroup.java new file mode 100644 index 0000000..d4efed4 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/TrainingGroup.java @@ -0,0 +1,122 @@ +package com.denniseckerskorn.entities.class_managment; + +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.Teacher; +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "TRAINING_GROUPS") +public class TrainingGroup { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @ManyToOne + @JoinColumn(name = "fk_teacher", nullable = false) + private Teacher teacher; + + @Column(name = "name", nullable = false, length = 45) + private String name; + + @Column(name = "level", length = 45) + private String level; + + @Column(name = "schedule", nullable = false) + private LocalDateTime schedule; + + @OneToMany(mappedBy = "trainingGroup", cascade = CascadeType.ALL, orphanRemoval = true) + private Set trainingSessions = new HashSet<>(); + + @ManyToMany(mappedBy = "trainingGroups") + private Set students = new HashSet<>(); + + public TrainingGroup() { + + } + + public Integer getId() { + return id; + } + + public Teacher getTeacher() { + return teacher; + } + + public String getName() { + return name; + } + + public String getLevel() { + return level; + } + + public LocalDateTime getSchedule() { + return schedule; + } + + public Set getTrainingSessions() { + return trainingSessions; + } + + public Set getStudents() { + return students; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setTeacher(Teacher teacher) { + this.teacher = teacher; + } + + public void setName(String name) { + this.name = name; + } + + public void setLevel(String level) { + this.level = level; + } + + public void setSchedule(LocalDateTime schedule) { + this.schedule = schedule; + } + + public void setTrainingSessions(Set trainingSessions) { + this.trainingSessions = trainingSessions; + } + + public void setStudents(Set students) { + this.students = students; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TrainingGroup group = (TrainingGroup) o; + return Objects.equals(id, group.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Group{" + + "id=" + id + + ", teacherId=" + (teacher != null ? teacher.getId() : "null") + + ", name='" + name + '\'' + + ", level='" + (level != null ? level : "null") + '\'' + + ", schedule='" + schedule + '\'' + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/TrainingSession.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/TrainingSession.java new file mode 100644 index 0000000..33f813d --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/class_managment/TrainingSession.java @@ -0,0 +1,102 @@ +package com.denniseckerskorn.entities.class_managment; + +import com.denniseckerskorn.enums.StatusValues; +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "TRAINING_SESSIONS") +public class TrainingSession { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @ManyToOne + @JoinColumn(name = "fk_group", nullable = false) + private TrainingGroup trainingGroup; + + @Column(name = "date_time") + private LocalDateTime date; + + @Enumerated(EnumType.STRING) + @Column(name = "status", length = 50) + private StatusValues status; + + //TODO: Control the assitances history, at the moment when group is removed, the assistances are removed too + @OneToMany(mappedBy = "trainingSession", cascade = CascadeType.ALL, orphanRemoval = true) + private Set assistances = new HashSet<>(); + + public TrainingSession() { + + } + + public Integer getId() { + return id; + } + + public TrainingGroup getTrainingGroup() { + return trainingGroup; + } + + public LocalDateTime getDate() { + return date; + } + + public StatusValues getStatus() { + return status; + } + + public Set getAssistances() { + return assistances; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setTrainingGroup(TrainingGroup trainingGroup) { + this.trainingGroup = trainingGroup; + } + + public void setDate(LocalDateTime date) { + this.date = date; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public void setAssistances(Set assistances) { + this.assistances = assistances; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TrainingSession that = (TrainingSession) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "TrainingSession{" + + "id=" + id + + ", groupId=" + (trainingGroup != null ? trainingGroup.getId() : "null") + + ", date=" + date + + ", status=" + status + + '}'; + } + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/IVAType.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/IVAType.java new file mode 100644 index 0000000..6855d2e --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/IVAType.java @@ -0,0 +1,72 @@ +package com.denniseckerskorn.entities.finance; + +import jakarta.persistence.*; + +import java.math.BigDecimal; +import java.util.Objects; + +@Entity +@Table(name = "IVA_TYPE") +public class IVAType { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @Column(name = "percentage", nullable = false) + private BigDecimal percentage; + + @Column(name = "description", length = 50) + private String description; + + public IVAType() { + + } + + public Integer getId() { + return id; + } + + public BigDecimal getPercentage() { + return percentage; + } + + public String getDescription() { + return description; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setPercentage(BigDecimal percentage) { + this.percentage = percentage; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + IVAType ivaType = (IVAType) o; + return Objects.equals(id, ivaType.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "IvaType{" + + "id=" + id + + ", percentage=" + percentage + + ", description='" + description + '\'' + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/Invoice.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/Invoice.java new file mode 100644 index 0000000..d8a0a82 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/Invoice.java @@ -0,0 +1,127 @@ +package com.denniseckerskorn.entities.finance; + +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.enums.StatusValues; +import jakarta.persistence.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "INVOICES") +public class Invoice { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @ManyToOne + @JoinColumn(name = "fk_user", nullable = false) + private User user; + + @Column(name = "date", nullable = false) + private LocalDateTime date; + + @Column(name = "total", nullable = false) + private BigDecimal total; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private StatusValues status; + + @OneToOne(mappedBy = "invoice", cascade = CascadeType.ALL, orphanRemoval = false) + private Payment payment; + + @OneToMany(mappedBy = "invoice", cascade = CascadeType.ALL, orphanRemoval = true) + private Set invoiceLines = new HashSet<>(); + + public Invoice() { + } + + public Integer getId() { + return id; + } + + public User getUser() { + return user; + } + + public LocalDateTime getDate() { + return date; + } + + public BigDecimal getTotal() { + return total; + } + + public StatusValues getStatus() { + return status; + } + + public Payment getPayment() { + return payment; + } + + public Set getInvoiceLines() { + return invoiceLines; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUser(User user) { + this.user = user; + } + + public void setDate(LocalDateTime date) { + this.date = date; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public void setPayment(Payment payment) { + this.payment = payment; + } + + public void setInvoiceLines(Set invoiceLines) { + this.invoiceLines = invoiceLines; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Invoice invoice = (Invoice) o; + return Objects.equals(id, invoice.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Invoice{" + + "id=" + id + + ", userId=" + (user != null ? user.getId() : "null") + + ", date=" + date + + ", total=" + total + + ", status='" + status + '\'' + + ", paymentId=" + (payment != null ? payment.getId() : "null") + + ", invoiceLines= [size hidden for lazy loading safety]" + + '}'; + } + +} \ No newline at end of file diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/InvoiceLine.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/InvoiceLine.java new file mode 100644 index 0000000..8da7ecc --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/InvoiceLine.java @@ -0,0 +1,122 @@ +package com.denniseckerskorn.entities.finance; + +import jakarta.persistence.*; + +import java.math.BigDecimal; +import java.util.Objects; + +@Entity +@Table(name = "INVOICE_LINES") +public class InvoiceLine { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @ManyToOne + @JoinColumn(name = "fk_invoice", nullable = false) + private Invoice invoice; + + @ManyToOne + @JoinColumn(name = "fk_product_service", nullable = false) + private ProductService productService; + + @Column(name = "description", columnDefinition = "TEXT") + private String description; + + @Column(name = "quantity", nullable = false) + private Integer quantity; + + @Column(name = "unit_price", nullable = false) + private BigDecimal unitPrice; + + @Column(name = "subtotal", nullable = false) + private BigDecimal subtotal; + + public InvoiceLine() { + + } + + public Integer getId() { + return id; + } + + public Invoice getInvoice() { + return invoice; + } + + public ProductService getProductService() { + return productService; + } + + public String getDescription() { + return description; + } + + public Integer getQuantity() { + return quantity; + } + + public BigDecimal getUnitPrice() { + return unitPrice; + } + + public BigDecimal getSubtotal() { + return subtotal; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setInvoice(Invoice invoice) { + this.invoice = invoice; + } + + public void setProductService(ProductService productService) { + this.productService = productService; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + public void setUnitPrice(BigDecimal unitPrice) { + this.unitPrice = unitPrice; + } + + public void setSubtotal(BigDecimal subtotal) { + this.subtotal = subtotal; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + InvoiceLine that = (InvoiceLine) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "InvoiceLine{" + + "id=" + id + + ", invoiceId=" + (invoice != null ? invoice.getId() : "null") + + ", productServiceId=" + (productService != null ? productService.getId() : "null") + + ", quantity=" + quantity + + ", unitPrice=" + unitPrice + + ", subtotal=" + subtotal + + ", description='" + description + '\'' + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/Payment.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/Payment.java new file mode 100644 index 0000000..b9540f9 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/Payment.java @@ -0,0 +1,114 @@ +package com.denniseckerskorn.entities.finance; + +import com.denniseckerskorn.enums.PaymentMethodValues; +import com.denniseckerskorn.enums.StatusValues; +import jakarta.persistence.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Objects; + +@Entity +@Table(name = "PAYMENTS") +public class Payment { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @OneToOne + @JoinColumn(name = "fk_invoice", nullable = false) + private Invoice invoice; + + @Column(name = "payment_date", nullable = false) + private LocalDateTime paymentDate; + + @Column(name = "amount", nullable = false) + private BigDecimal amount; + + @Enumerated(EnumType.STRING) + @Column(name = "payment_method", nullable = false, length = 50) + private PaymentMethodValues paymentMethod; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false, length = 20) + private StatusValues status; + + public Payment() { + + } + + public Integer getId() { + return id; + } + + public Invoice getInvoice() { + return invoice; + } + + public LocalDateTime getPaymentDate() { + return paymentDate; + } + + public BigDecimal getAmount() { + return amount; + } + + public PaymentMethodValues getPaymentMethod() { + return paymentMethod; + } + + public StatusValues getStatus() { + return status; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setInvoice(Invoice invoice) { + this.invoice = invoice; + } + + public void setPaymentDate(LocalDateTime paymentDate) { + this.paymentDate = paymentDate; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public void setPaymentMethod(PaymentMethodValues paymentMethod) { + this.paymentMethod = paymentMethod; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Payment payment = (Payment) o; + return Objects.equals(id, payment.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Payment{" + + "id=" + id + + ", invoiceId=" + (invoice != null ? invoice.getId() : "null") + + ", paymentDate=" + paymentDate + + ", amount=" + amount + + ", paymentMethod='" + paymentMethod + '\'' + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/ProductService.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/ProductService.java new file mode 100644 index 0000000..041d738 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/finance/ProductService.java @@ -0,0 +1,122 @@ +package com.denniseckerskorn.entities.finance; + +import com.denniseckerskorn.enums.StatusValues; +import jakarta.persistence.*; + +import java.math.BigDecimal; +import java.util.Objects; + +@Entity +@Table(name = "PRODUCTS_SERVICES") +public class ProductService { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @ManyToOne + @JoinColumn(name = "fk_iva_type", nullable = false) + private IVAType ivaType; + + @Column(name = "name", nullable = false, length = 100) + private String name; + + @Column(name = "description", length = 250) + private String description; + + @Column(name = "price", nullable = false) + private BigDecimal price; + + @Column(name = "type", nullable = false, length = 45) + private String type; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false, length = 20) + private StatusValues status; + + public ProductService() { + + } + + public Integer getId() { + return id; + } + + public IVAType getIvaType() { + return ivaType; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public BigDecimal getPrice() { + return price; + } + + public String getType() { + return type; + } + + public StatusValues getStatus() { + return status; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setIvaType(IVAType ivaType) { + this.ivaType = ivaType; + } + + public void setName(String name) { + this.name = name; + } + + public void setDescription(String description) { + this.description = description; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public void setType(String type) { + this.type = type; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ProductService that = (ProductService) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "ProductService{" + + "id=" + id + + ", ivaTypeId=" + (ivaType != null ? ivaType.getId() : "null") + + ", name='" + name + '\'' + + ", price=" + price + + ", type='" + type + '\'' + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Notification.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Notification.java new file mode 100644 index 0000000..947e73d --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Notification.java @@ -0,0 +1,151 @@ +package com.denniseckerskorn.entities.user_managment; + +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.enums.StatusValues; +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "NOTIFICATIONS") +public class Notification { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @Column(name = "title", length = 200, nullable = false) + private String title; + + @Column(name = "message", columnDefinition = "TEXT") + private String message; + + @Column(name = "shipping_date", nullable = false) + private LocalDateTime shippingDate; + + @Column(length = 100) + private String type; + + @Enumerated(EnumType.STRING) + @Column(length = 50) + private StatusValues status; + + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable( + name = "USERS_NOTIFICATIONS", + joinColumns = @JoinColumn(name = "fk_notification"), + inverseJoinColumns = @JoinColumn(name = "fk_user"), + uniqueConstraints = @UniqueConstraint( + name = "uk_notification_user", + columnNames = {"fk_notification", "fk_user"} + ) + ) + private Set users = new HashSet<>(); + + public Notification() { + } + + public Integer getId() { + return id; + } + + public Set getUsers() { + return users; + } + + public String getTitle() { + return title; + } + + public String getMessage() { + return message; + } + + public LocalDateTime getShippingDate() { + return shippingDate; + } + + public String getType() { + return type; + } + + public StatusValues getStatus() { + return status; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUsers(Set users) { + this.users = users; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setMessage(String message) { + this.message = message; + } + + public void setShippingDate(LocalDateTime shippingDate) { + this.shippingDate = shippingDate; + } + + public void setType(String type) { + this.type = type; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public void addUser(User user) { + if (this.users == null) { + this.users = new HashSet<>(); + } + this.users.add(user); + if (user.getNotifications() == null) { + user.setNotifications(new HashSet<>()); + } + user.getNotifications().add(this); + } + + public void removeUser(User user) { + if (this.users != null) { + this.users.remove(user); + if (user.getNotifications() != null) { + user.getNotifications().remove(this); + } + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Notification that = (Notification) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Notifications{" + + "id=" + (id != null ? id : "null") + + ", title='" + (title != null ? title : "null") + '\'' + + ", message='" + (message != null ? message : "null") + '\'' + + ", shippingDate=" + (shippingDate != null ? shippingDate : "null") + + ", type='" + (type != null ? type : "null") + '\'' + + ", status=" + (status != null ? status : "null") + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Permission.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Permission.java new file mode 100644 index 0000000..c7157e5 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Permission.java @@ -0,0 +1,83 @@ +package com.denniseckerskorn.entities.user_managment; + +import com.denniseckerskorn.enums.PermissionValues; +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "PERMISSIONS") +public class Permission { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @Enumerated(EnumType.STRING) + @Column(name = "name", nullable = false, length = 45) + private PermissionValues permissionName; + + @ManyToMany(mappedBy = "permissions", fetch = FetchType.LAZY) + private Set roles = new HashSet<>(); + + public Permission() { + } + + public Integer getId() { + return id; + } + + public PermissionValues getPermissionName() { + return permissionName; + } + + public Set getRoles() { + return roles; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setRoles(Set roles) { + this.roles = roles; + } + + public void setPermissionName(PermissionValues permissionName) { + this.permissionName = permissionName; + } + + public void addRole(Role role) { + this.roles.add(role); + role.getPermissions().add(this); + } + + public void removeRole(Role role) { + this.roles.remove(role); + role.getPermissions().remove(this); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Permission that = (Permission) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Permission{" + + "id=" + id + + ", privilegeName=" + permissionName + + '}'; + } + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Role.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Role.java new file mode 100644 index 0000000..d8f7a4c --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/Role.java @@ -0,0 +1,100 @@ +package com.denniseckerskorn.entities.user_managment; + +import jakarta.persistence.*; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "ROLES") +public class Role { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @Column(name = "name", nullable = false, length = 45) + private String name; + + @ManyToMany(fetch = FetchType.LAZY) + @Fetch(FetchMode.JOIN) + @JoinTable( + name = "ROLES_PERMISSIONS", + joinColumns = @JoinColumn(name = "fk_role"), + inverseJoinColumns = @JoinColumn(name = "fk_permission"), + uniqueConstraints = @UniqueConstraint( + name = "uk_role_permission", + columnNames = {"fk_role", "fk_permission"} + ) + ) + private Set permissions = new HashSet<>(); + + public Role() { + } + + public Role(String name) { + this.name = name; + } + + public Integer getId() { + return id; + } + + public String getName() { + return name; + } + + public Set getPermissions() { + return permissions; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public void setPermissions(Set permissions) { + this.permissions = permissions; + } + + public void addPermission(Permission permission) { + if (this.permissions == null) { + this.permissions = new HashSet<>(); + } + this.permissions.add(permission); + } + + public void removePermission(Permission permission) { + if (this.permissions != null) { + this.permissions.remove(permission); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Role role = (Role) o; + return Objects.equals(id, role.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Role{" + + "id=" + id + + ", name='" + (name != null ? name : "null") + '\'' + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/StudentHistory.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/StudentHistory.java new file mode 100644 index 0000000..6ad84f4 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/StudentHistory.java @@ -0,0 +1,98 @@ +package com.denniseckerskorn.entities.user_managment; + +import com.denniseckerskorn.entities.user_managment.users.Student; +import jakarta.persistence.*; + +import java.time.LocalDate; +import java.util.Objects; + +@Entity +@Table(name = "STUDENT_HISTORY") +public class StudentHistory { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @ManyToOne + @JoinColumn(name = "fk_student", nullable = false) + private Student student; + + @Column(name = "event_date") + private LocalDate eventDate; + + @Column(name = "event_type") + private String eventType; + + @Column(name = "description") + private String description; + + public StudentHistory() { + + } + + public Integer getId() { + return id; + } + + public Student getStudent() { + return student; + } + + public LocalDate getEventDate() { + return eventDate; + } + + public String getEventType() { + return eventType; + } + + public String getDescription() { + return description; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setStudent(Student student) { + this.student = student; + } + + public void setEventDate(LocalDate eventDate) { + this.eventDate = eventDate; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + StudentHistory that = (StudentHistory) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "StudentHistory{" + + "id=" + (id != null ? id : "null") + + ", student=" + (student != null ? "Student{id=" + student.getId() + "}" : "null") + + ", eventDate=" + (eventDate != null ? eventDate : "null") + + ", eventType='" + (eventType != null ? eventType : "null") + '\'' + + ", description='" + (description != null ? description : "null") + '\'' + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Admin.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Admin.java new file mode 100644 index 0000000..1e4f4de --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Admin.java @@ -0,0 +1,59 @@ +package com.denniseckerskorn.entities.user_managment.users; + +import jakarta.persistence.*; + +import java.util.Objects; + +@Entity +@Table(name = "ADMINS") +public class Admin { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @OneToOne + @JoinColumn(name = "fk_user", nullable = false, unique = true) + private User user; + + public Admin() { + } + + public Integer getId() { + return id; + } + + public User getUser() { + return user; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUser(User user) { + this.user = user; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + + Admin admin = (Admin) o; + return Objects.equals(id, admin.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Admin{" + + "id=" + id + + ", userId=" + (user != null ? user.getId() : "null") + + ", userEmail=" + (user != null ? user.getEmail() : "null") + + '}'; + } + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Student.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Student.java new file mode 100644 index 0000000..bf12e50 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Student.java @@ -0,0 +1,185 @@ +package com.denniseckerskorn.entities.user_managment.users; + +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import jakarta.persistence.*; + +import java.time.LocalDate; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "STUDENTS") +public class Student { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @OneToOne + @JoinColumn(name = "fk_user", nullable = false, unique = true) + private User user; + + @Column(name = "dni", nullable = false, length = 10, unique = true) + private String dni; + + @Column(name = "birthdate", nullable = false) + private LocalDate birthdate; + + @Column(name = "belt", length = 20) + private String belt; + + @Column(name = "progress", columnDefinition = "TEXT") + private String progress; + + @Column(name = "medical_report", length = 500) + private String medicalReport; + + @Column(name = "parent_name", length = 50) + private String parentName; + + @OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true) + private Set histories = new HashSet<>(); + + @OneToOne + @JoinColumn(name = "fk_membership") + private Membership membership; + + @OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true) + private Set assistances = new HashSet<>(); + + @ManyToMany + @JoinTable(name = "STUDENTS_GROUPS", joinColumns = @JoinColumn(name = "fk_student"), inverseJoinColumns = @JoinColumn(name = "fk_group")) + private Set trainingGroups = new HashSet<>(); + + public Student() { + } + + public Integer getId() { + return id; + } + + public User getUser() { + return user; + } + + public String getDni() { + return dni; + } + + public LocalDate getBirthdate() { + return birthdate; + } + + public Set getHistories() { + return histories; + } + + public Membership getMembership() { + return membership; + } + + public String getMedicalReport() { + return medicalReport; + } + + public String getParentName() { + return parentName; + } + + public String getBelt() { + return belt; + } + + public String getProgress() { + return progress; + } + + public Set getAssistances() { + return assistances; + } + + public Set getTrainingGroups() { + return trainingGroups; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUser(User user) { + this.user = user; + } + + public void setMedicalReport(String medicalReport) { + this.medicalReport = medicalReport; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public void setDni(String dni) { + this.dni = dni; + } + + public void setBirthdate(LocalDate birthdate) { + this.birthdate = birthdate; + } + + public void setBelt(String belt) { + this.belt = belt; + } + + public void setProgress(String progress) { + this.progress = progress; + } + + public void setHistories(Set histories) { + this.histories = histories; + } + + public void setMembership(Membership membership) { + this.membership = membership; + } + + public void setAssistances(Set assistances) { + this.assistances = assistances; + } + + public void setTrainingGroups(Set trainingGroups) { + this.trainingGroups = trainingGroups; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + + Student student = (Student) o; + return Objects.equals(id, student.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Student{" + + "dni='" + (dni != null ? dni : "null") + '\'' + + ", birthdate=" + (birthdate != null ? birthdate : "null") + + ", belt='" + (belt != null ? belt : "null") + '\'' + + ", progress='" + (progress != null ? progress : "null") + '\'' + + ", medicalReport='" + (medicalReport != null ? medicalReport : "null") + '\'' + + ", parentName='" + (parentName != null ? parentName : "null") + '\'' + + ", membershipId=" + (membership != null ? membership.getId() : "null") + + //", trainingGroups=" + (trainingGroups != null ? trainingGroups.size() : "null") + + //", assistances=" + (assistances != null ? assistances.size() : "null") + + //", histories=" + (histories != null ? histories.size() : "null") + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Teacher.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Teacher.java new file mode 100644 index 0000000..9366961 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/Teacher.java @@ -0,0 +1,84 @@ +package com.denniseckerskorn.entities.user_managment.users; + + +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "TEACHERS") +public class Teacher { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @OneToOne + @JoinColumn(name = "fk_user", nullable = false, unique = true) + private User user; + + @Column(name = "discipline", length = 50) + private String discipline; + + @OneToMany(mappedBy = "teacher", cascade = CascadeType.ALL, orphanRemoval = true) + private Set trainingGroups = new HashSet<>(); + + public Teacher() { + } + + public Integer getId() { + return id; + } + + public User getUser() { + return user; + } + + public String getDiscipline() { + return discipline; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUser(User user) { + this.user = user; + } + + public Set getTrainingGroups() { + return trainingGroups; + } + + public void setDiscipline(String discipline) { + this.discipline = discipline; + } + + public void setTrainingGroups(Set trainingGroups) { + this.trainingGroups = trainingGroups; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + + Teacher teacher = (Teacher) o; + return Objects.equals(id, teacher.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "Teacher{" + + "discipline='" + (discipline != null ? discipline : "null") + '\'' + + ", super=" + super.toString() + + '}'; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/User.java b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/User.java new file mode 100644 index 0000000..fbc0840 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/entities/user_managment/users/User.java @@ -0,0 +1,235 @@ +package com.denniseckerskorn.entities.user_managment.users; + +import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.user_managment.Notification; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.enums.StatusValues; +import jakarta.persistence.*; +import com.fasterxml.jackson.annotation.JsonIgnore; + + +import java.time.LocalDateTime; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Table(name = "USERS") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Integer id; + + @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) + @JsonIgnore + private Student student; + + @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) + @JsonIgnore + private Teacher teacher; + + @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) + @JsonIgnore + private Admin admin; + + @Column(name = "name", nullable = false, length = 50) + private String name; + + @Column(name = "surname", nullable = false, length = 50) + private String surname; + + @Column(name = "phone_number", nullable = false, length = 30) + private String phoneNumber; + + @Column(name = "email", nullable = false, unique = true, length = 100) + private String email; + + @Column(name = "password", nullable = false, length = 255) + private String password; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false, length = 20) + private StatusValues status; + + @Column(name = "register_date", nullable = false) + private LocalDateTime registerDate; + + @Column(name = "address", nullable = false, length = 100) + private String address; + + @ManyToOne + @JoinColumn(name = "fk_role", nullable = false) + private Role role; + + @ManyToMany(mappedBy = "users", fetch = FetchType.LAZY) + private Set notifications = new HashSet<>(); + + @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST) + private Set invoices = new HashSet<>(); + + public User() { + } + + public Integer getId() { + return id; + } + + public Student getStudent() { + return student; + } + + public Teacher getTeacher() { + return teacher; + } + + public Admin getAdmin() { + return admin; + } + + public String getName() { + return name; + } + + public String getSurname() { + return surname; + } + + public String getEmail() { + return email; + } + + public String getPassword() { + return password; + } + + public StatusValues getStatus() { + return status; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public String getAddress() { + return address; + } + + public LocalDateTime getRegisterDate() { + return registerDate; + } + + public Role getRole() { + return role; + } + + public Set getNotifications() { + return notifications; + } + + public Set getInvoices() { + return invoices; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setStudent(Student student) { + this.student = student; + } + + public void setTeacher(Teacher teacher) { + this.teacher = teacher; + } + + public void setAdmin(Admin admin) { + this.admin = admin; + } + + public void setName(String name) { + this.name = name; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public void setEmail(String email) { + this.email = email; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setStatus(StatusValues status) { + this.status = status; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public void setAddress(String address) { + this.address = address; + } + + public void setRegisterDate(LocalDateTime registerDate) { + this.registerDate = registerDate; + } + + public void setRole(Role role) { + this.role = role; + } + + public void setNotifications(Set notifications) { + this.notifications = notifications; + } + + public void setInvoices(Set invoices) { + this.invoices = invoices; + } + + public void addNotification(Notification notification) { + this.notifications.add(notification); + notification.getUsers().add(this); + } + + public void removeNotification(Notification notification) { + this.notifications.remove(notification); + notification.getUsers().remove(this); + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + + User user = (User) o; + return Objects.equals(id, user.id); + } + + @Override + public int hashCode() { + return Objects.hashCode(id); + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + (name != null ? name : "null") + '\'' + + ", surname='" + (surname != null ? surname : "null") + '\'' + + ", phoneNumber='" + (phoneNumber != null ? phoneNumber : "null") + '\'' + + ", email='" + (email != null ? email : "null") + '\'' + + ", password='******'" + + ", status='" + (status != null ? status : "null") + '\'' + + ", registerDate=" + (registerDate != null ? registerDate : "null") + + ", address='" + (address != null ? address : "null") + '\'' + + ", role=" + (role != null ? role.getName() : "null") + + ", studentId=" + (student != null ? student.getId() : "null") + + ", teacherId=" + (teacher != null ? teacher.getId() : "null") + + ", adminId=" + (admin != null ? admin.getId() : "null") + + '}'; + } + +} \ No newline at end of file diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/enums/MembershipTypeValues.java b/memberflow-data/src/main/java/com/denniseckerskorn/enums/MembershipTypeValues.java new file mode 100644 index 0000000..6da3cd6 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/enums/MembershipTypeValues.java @@ -0,0 +1,9 @@ +package com.denniseckerskorn.enums; + +public enum MembershipTypeValues { + BASIC, + ADVANCED, + PREMIUM, + NO_LIMIT, + TRIAL, +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/enums/PaymentMethodValues.java b/memberflow-data/src/main/java/com/denniseckerskorn/enums/PaymentMethodValues.java new file mode 100644 index 0000000..a458413 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/enums/PaymentMethodValues.java @@ -0,0 +1,7 @@ +package com.denniseckerskorn.enums; + +public enum PaymentMethodValues { + CASH, + CREDIT_CARD, + BANK_TRANSFER +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/enums/PermissionValues.java b/memberflow-data/src/main/java/com/denniseckerskorn/enums/PermissionValues.java new file mode 100644 index 0000000..f1f2242 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/enums/PermissionValues.java @@ -0,0 +1,7 @@ +package com.denniseckerskorn.enums; + +public enum PermissionValues { + FULL_ACCESS, + MANAGE_STUDENTS, + VIEW_OWN_DATA +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/enums/StatusValues.java b/memberflow-data/src/main/java/com/denniseckerskorn/enums/StatusValues.java new file mode 100644 index 0000000..28ea354 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/enums/StatusValues.java @@ -0,0 +1,13 @@ +package com.denniseckerskorn.enums; + +public enum StatusValues { + ACTIVE, + INACTIVE, + SUSPENDED, + DELETED, + PAID, + NOT_PAID, + SENT, + NOT_SENT, + PENDING +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/BadRequestException.java b/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/BadRequestException.java new file mode 100644 index 0000000..35833a8 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/BadRequestException.java @@ -0,0 +1,7 @@ +package com.denniseckerskorn.exceptions; + +public class BadRequestException extends RuntimeException { + public BadRequestException(String message) { + super(message); + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/DuplicateEntityException.java b/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/DuplicateEntityException.java new file mode 100644 index 0000000..d72b273 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/DuplicateEntityException.java @@ -0,0 +1,19 @@ +package com.denniseckerskorn.exceptions; + +public class DuplicateEntityException extends RuntimeException { + public DuplicateEntityException(String message) { + super(message); + } + + public DuplicateEntityException(String message, Throwable cause) { + super(message, cause); + } + + public DuplicateEntityException(Throwable cause) { + super(cause); + } + + public DuplicateEntityException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/EntityNotFoundException.java b/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/EntityNotFoundException.java new file mode 100644 index 0000000..8c77ba3 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/EntityNotFoundException.java @@ -0,0 +1,20 @@ +package com.denniseckerskorn.exceptions; + +public class EntityNotFoundException extends RuntimeException { + + public EntityNotFoundException(String message) { + super(message); + } + + public EntityNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public EntityNotFoundException(Throwable cause) { + super(cause); + } + + public EntityNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/InvalidDataException.java b/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/InvalidDataException.java new file mode 100644 index 0000000..3f2f96e --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/exceptions/InvalidDataException.java @@ -0,0 +1,19 @@ +package com.denniseckerskorn.exceptions; + +public class InvalidDataException extends RuntimeException { + public InvalidDataException(String message) { + super(message); + } + + public InvalidDataException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidDataException(Throwable cause) { + super(cause); + } + + public InvalidDataException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/AssistanceRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/AssistanceRepository.java new file mode 100644 index 0000000..b261b09 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/AssistanceRepository.java @@ -0,0 +1,20 @@ +package com.denniseckerskorn.repositories.class_managment_repositories; + +import com.denniseckerskorn.entities.class_managment.Assistance; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.time.LocalDateTime; +import java.util.List; + +public interface AssistanceRepository extends JpaRepository { + Assistance findByTrainingSessionId(Integer trainingSessionId); + + Assistance findByStudentId(Integer studentId); + + @Query("SELECT a FROM Assistance a WHERE a.date BETWEEN :start AND :end") + List findAllByDateRange(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end); + + Assistance findByTrainingSessionIdAndStudentId(Integer trainingSessionId, Integer studentId); +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/MembershipRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/MembershipRepository.java new file mode 100644 index 0000000..f7aaf03 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/MembershipRepository.java @@ -0,0 +1,21 @@ +package com.denniseckerskorn.repositories.class_managment_repositories; + +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.enums.MembershipTypeValues; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDate; + +public interface MembershipRepository extends JpaRepository { + Membership findByType(MembershipTypeValues type); + + Membership findByStartDate(LocalDate startDate); + + Membership findByEndDate(LocalDate endDate); + + Membership findByStatus(String status); + + Membership findByStudentId(Integer studentId); + + boolean existsByType(MembershipTypeValues type); +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingGroupRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingGroupRepository.java new file mode 100644 index 0000000..1b82567 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingGroupRepository.java @@ -0,0 +1,7 @@ +package com.denniseckerskorn.repositories.class_managment_repositories; + +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TrainingGroupRepository extends JpaRepository { +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingSessionRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingSessionRepository.java new file mode 100644 index 0000000..211b83e --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingSessionRepository.java @@ -0,0 +1,16 @@ +package com.denniseckerskorn.repositories.class_managment_repositories; + +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDateTime; + +import java.util.List; + +public interface TrainingSessionRepository extends JpaRepository { + TrainingSession findByDate(LocalDateTime date); + + List findAllByDateBetween(LocalDateTime start, LocalDateTime end); + + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/IVATypeRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/IVATypeRepository.java new file mode 100644 index 0000000..59c5245 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/IVATypeRepository.java @@ -0,0 +1,11 @@ +package com.denniseckerskorn.repositories.finance_repositories; + +import com.denniseckerskorn.entities.finance.IVAType; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.math.BigDecimal; + +public interface IVATypeRepository extends JpaRepository { + boolean existsByPercentage(BigDecimal percentage); + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceLineRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceLineRepository.java new file mode 100644 index 0000000..ad579c0 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceLineRepository.java @@ -0,0 +1,7 @@ +package com.denniseckerskorn.repositories.finance_repositories; + +import com.denniseckerskorn.entities.finance.InvoiceLine; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface InvoiceLineRepository extends JpaRepository { +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceRepository.java new file mode 100644 index 0000000..e2cc959 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceRepository.java @@ -0,0 +1,7 @@ +package com.denniseckerskorn.repositories.finance_repositories; + +import com.denniseckerskorn.entities.finance.Invoice; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface InvoiceRepository extends JpaRepository { +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/PaymentRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/PaymentRepository.java new file mode 100644 index 0000000..5ffd2f7 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/PaymentRepository.java @@ -0,0 +1,8 @@ +package com.denniseckerskorn.repositories.finance_repositories; + +import com.denniseckerskorn.entities.finance.Payment; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PaymentRepository extends JpaRepository { + boolean existsByInvoiceId(Integer invoiceId); +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/ProductServiceRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/ProductServiceRepository.java new file mode 100644 index 0000000..51470bd --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/ProductServiceRepository.java @@ -0,0 +1,10 @@ +package com.denniseckerskorn.repositories.finance_repositories; + +import com.denniseckerskorn.entities.finance.ProductService; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProductServiceRepository extends JpaRepository { + boolean existsByName(String name); + + boolean existsByIvaTypeId(Integer ivaTypeId); +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/AdminRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/AdminRepository.java new file mode 100644 index 0000000..1336fd4 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/AdminRepository.java @@ -0,0 +1,11 @@ +package com.denniseckerskorn.repositories.user_managment_repositories; + +import com.denniseckerskorn.entities.user_managment.users.Admin; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AdminRepository extends JpaRepository { + boolean existsByUserEmail(String email); + + Admin findByUserEmail(String email); + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/NotificationRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/NotificationRepository.java new file mode 100644 index 0000000..039bd94 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/NotificationRepository.java @@ -0,0 +1,12 @@ +package com.denniseckerskorn.repositories.user_managment_repositories; + +import com.denniseckerskorn.entities.user_managment.Notification; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDateTime; +import java.util.List; + +public interface NotificationRepository extends JpaRepository { + boolean existsByTitleAndShippingDate(String title, LocalDateTime shippingDate); + List findNotificationsById(Integer id); +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/PermissionRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/PermissionRepository.java new file mode 100644 index 0000000..7e47c07 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/PermissionRepository.java @@ -0,0 +1,11 @@ +package com.denniseckerskorn.repositories.user_managment_repositories; + +import com.denniseckerskorn.entities.user_managment.Permission; +import com.denniseckerskorn.enums.PermissionValues; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PermissionRepository extends JpaRepository { + Permission findByPermissionName(PermissionValues permissionName); + boolean existsByPermissionName(PermissionValues permissionName); + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/RoleRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/RoleRepository.java new file mode 100644 index 0000000..4b5c97c --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/RoleRepository.java @@ -0,0 +1,8 @@ +package com.denniseckerskorn.repositories.user_managment_repositories; + +import com.denniseckerskorn.entities.user_managment.Role; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RoleRepository extends JpaRepository { + Role findByName(String name); +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentHistoryRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentHistoryRepository.java new file mode 100644 index 0000000..78df28d --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentHistoryRepository.java @@ -0,0 +1,9 @@ +package com.denniseckerskorn.repositories.user_managment_repositories; + +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface StudentHistoryRepository extends JpaRepository { + boolean existsByEventType(String eventType); + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentRepository.java new file mode 100644 index 0000000..31f9ba0 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentRepository.java @@ -0,0 +1,11 @@ +package com.denniseckerskorn.repositories.user_managment_repositories; + +import com.denniseckerskorn.entities.user_managment.users.Student; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface StudentRepository extends JpaRepository { + boolean existsByDni(String dni); + Student findByDni(String dni); + boolean existsByUserEmail(String email); + Student findByUserEmail(String email); +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/TeacherRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/TeacherRepository.java new file mode 100644 index 0000000..46f7f8a --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/TeacherRepository.java @@ -0,0 +1,13 @@ +package com.denniseckerskorn.repositories.user_managment_repositories; + +import com.denniseckerskorn.entities.user_managment.users.Teacher; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TeacherRepository extends JpaRepository { + + boolean existsByUserEmail(String mail); + + Teacher findByUserEmail(String email); + + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/UserRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/UserRepository.java new file mode 100644 index 0000000..720045a --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/UserRepository.java @@ -0,0 +1,15 @@ +package com.denniseckerskorn.repositories.user_managment_repositories; + +import com.denniseckerskorn.entities.user_managment.Notification; +import com.denniseckerskorn.entities.user_managment.users.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface UserRepository extends JpaRepository { + boolean existsByEmail(String email); + + User findByEmail(String email); + + List findAllByRoleName(String userRole); +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/seeder/TestDataSeeder.java b/memberflow-data/src/main/java/com/denniseckerskorn/seeder/TestDataSeeder.java new file mode 100644 index 0000000..8ae44a5 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/seeder/TestDataSeeder.java @@ -0,0 +1,371 @@ +package com.denniseckerskorn.seeder; + +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.finance.*; +import com.denniseckerskorn.enums.MembershipTypeValues; +import com.denniseckerskorn.enums.PaymentMethodValues; +import com.denniseckerskorn.enums.PermissionValues; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.entities.user_managment.Notification; +import com.denniseckerskorn.entities.user_managment.Permission; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import com.denniseckerskorn.entities.user_managment.users.Admin; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.Teacher; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.services.class_managment_services.AssistanceService; +import com.denniseckerskorn.services.class_managment_services.MembershipService; +import com.denniseckerskorn.services.class_managment_services.TrainingGroupService; +import com.denniseckerskorn.services.class_managment_services.TrainingSessionService; +import com.denniseckerskorn.services.finance_services.*; +import com.denniseckerskorn.services.user_managment_services.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Profile; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Component +@Profile("dev") +public class TestDataSeeder implements CommandLineRunner { + + @Autowired + private PasswordEncoder passwordEncoder; + + private final AdminService adminService; + private final NotificationService notificationService; + private final PermissionService permissionService; + private final RoleService roleService; + private final StudentHistoryService studentHistoryService; + private final StudentService studentService; + private final TeacherService teacherService; + private final UserService userService; + private final MembershipService membershipService; + private final AssistanceService assistanceService; + private final TrainingGroupService trainingGroupService; + private final TrainingSessionService trainingSessionService; + private final InvoiceService invoiceService; + private final InvoiceLineService invoiceLineService; + private final IVATypeService ivaTypeService; + private final ProductServiceService productServiceService; + private final PaymentService paymentService; + + + @Autowired + public TestDataSeeder(AdminService adminService, + NotificationService notificationService, + PermissionService permissionService, + RoleService roleService, + StudentHistoryService studentHistoryService, + StudentService studentService, + TeacherService teacherService, + UserService userService, + MembershipService membershipService, + AssistanceService assistanceService, + TrainingGroupService trainingGroupService, + TrainingSessionService trainingSessionService, + InvoiceService invoiceService, + InvoiceLineService invoiceLineService, + IVATypeService ivaTypeService, + ProductServiceService productServiceService, + PaymentService paymentService) { + this.adminService = adminService; + this.notificationService = notificationService; + this.permissionService = permissionService; + this.roleService = roleService; + this.studentHistoryService = studentHistoryService; + this.studentService = studentService; + this.teacherService = teacherService; + this.userService = userService; + this.membershipService = membershipService; + this.assistanceService = assistanceService; + this.trainingGroupService = trainingGroupService; + this.trainingSessionService = trainingSessionService; + this.invoiceService = invoiceService; + this.invoiceLineService = invoiceLineService; + this.ivaTypeService = ivaTypeService; + this.productServiceService = productServiceService; + this.paymentService = paymentService; + } + + @Override + public void run(String... args) throws Exception { + // Roles + Role studentRole = new Role(); + studentRole.setName("ROLE_STUDENT"); + this.roleService.save(studentRole); + + Role teacherRole = new Role(); + teacherRole.setName("ROLE_TEACHER"); + this.roleService.save(teacherRole); + + Role adminRole = new Role(); + adminRole.setName("ROLE_ADMIN"); + this.roleService.save(adminRole); + + // Permisos + for (PermissionValues value : PermissionValues.values()) { + Permission p = new Permission(); + p.setPermissionName(value); + this.permissionService.save(p); + } + + // Obtener permisos de la base de datos + Permission fullAccess = this.permissionService.findPermissionByName(PermissionValues.FULL_ACCESS); + Permission manageUsers = this.permissionService.findPermissionByName(PermissionValues.MANAGE_STUDENTS); + Permission viewOwnData = this.permissionService.findPermissionByName(PermissionValues.VIEW_OWN_DATA); + + // Asignar permisos a roles + studentRole.addPermission(viewOwnData); + teacherRole.addPermission(manageUsers); + teacherRole.addPermission(viewOwnData); + adminRole.addPermission(fullAccess); + + + // Guardar roles actualizados + this.roleService.update(studentRole); + this.roleService.update(teacherRole); + this.roleService.update(adminRole); + + + // Membresías + Membership basicMembership = new Membership(); + basicMembership.setType(MembershipTypeValues.BASIC); + basicMembership.setStartDate(LocalDate.now()); + basicMembership.setEndDate(LocalDate.now().plusMonths(1)); + basicMembership.setStatus(StatusValues.ACTIVE); + this.membershipService.save(basicMembership); + + Membership advancedMembership = new Membership(); + advancedMembership.setType(MembershipTypeValues.ADVANCED); + advancedMembership.setStartDate(LocalDate.now()); + advancedMembership.setEndDate(LocalDate.now().plusMonths(3)); + advancedMembership.setStatus(StatusValues.ACTIVE); + this.membershipService.save(advancedMembership); + + Membership premiumMembership = new Membership(); + premiumMembership.setType(MembershipTypeValues.PREMIUM); + premiumMembership.setStartDate(LocalDate.now()); + premiumMembership.setEndDate(LocalDate.now().plusMonths(6)); + premiumMembership.setStatus(StatusValues.ACTIVE); + this.membershipService.save(premiumMembership); + + Membership noLimitMembership = new Membership(); + noLimitMembership.setType(MembershipTypeValues.NO_LIMIT); + noLimitMembership.setStartDate(LocalDate.now()); + noLimitMembership.setEndDate(LocalDate.now().plusYears(1)); + noLimitMembership.setStatus(StatusValues.ACTIVE); + this.membershipService.save(noLimitMembership); + + // Usuarios + User studentUser = new User(); + studentUser.setName("Student"); + studentUser.setSurname("One"); + studentUser.setPhoneNumber("600123456"); + studentUser.setEmail("student@example.com"); + studentUser.setPassword(passwordEncoder.encode("12345678")); + studentUser.setStatus(StatusValues.ACTIVE); + studentUser.setRegisterDate(LocalDateTime.now()); + studentUser.setAddress("Calle Estudiante 123"); + studentUser.setRole(studentRole); + this.userService.save(studentUser); + + + Student student = new Student(); + student.setUser(studentUser); + student.setBirthdate(LocalDate.of(2005, 5, 20)); + student.setDni("12345678A"); + student.setBelt("Blanco"); + student.setParentName("Padre Estudiante"); + student.setMedicalReport("Apto"); + student.setProgress("Buena evolución"); + this.studentService.save(student); + + StudentHistory history = new StudentHistory(); + history.setStudent(student); + history.setEventDate(LocalDate.now()); + history.setDescription("Primera clase"); + history.setEventType("Clase de prueba"); + this.studentHistoryService.save(history); + + this.studentService.addStudentToMembership(student, basicMembership); + + User teacherUser = new User(); + teacherUser.setName("Teacher"); + teacherUser.setSurname("Uno"); + teacherUser.setPhoneNumber("611123456"); + teacherUser.setEmail("teacher@example.com"); + teacherUser.setPassword(passwordEncoder.encode("123456789")); + teacherUser.setStatus(StatusValues.ACTIVE); + teacherUser.setRegisterDate(LocalDateTime.now()); + teacherUser.setAddress("Calle Maestro 1"); + teacherUser.setRole(teacherRole); + this.userService.save(teacherUser); + + + Teacher teacher = new Teacher(); + teacher.setUser(teacherUser); + teacher.setDiscipline("Jiu-Jitsu"); + this.teacherService.save(teacher); + + User adminUser = new User(); + adminUser.setName("Admin"); + adminUser.setSurname("Root"); + adminUser.setPhoneNumber("622123456"); + adminUser.setEmail("admin@example.com"); + adminUser.setPassword(passwordEncoder.encode("admin123")); + adminUser.setStatus(StatusValues.ACTIVE); + adminUser.setRegisterDate(LocalDateTime.now()); + adminUser.setAddress("Central"); + adminUser.setRole(adminRole); + this.userService.save(adminUser); + + + Admin admin = new Admin(); + admin.setUser(adminUser); + this.adminService.save(admin); + + Notification notification = new Notification(); + notification.setShippingDate(LocalDateTime.now()); + notification.setType("Bienvenida"); + notification.setTitle("Bienvenido a MemberFlow"); + notification.setMessage("Gracias por registrarte"); + notification.setStatus(StatusValues.ACTIVE); + this.notificationService.save(notification); + + notification.addUser(studentUser); + notification.addUser(teacherUser); + notification.addUser(adminUser); + this.notificationService.update(notification); + + // Grupo de entrenamiento + TrainingGroup trainingGroup = new TrainingGroup(); + trainingGroup.setName("Grupo JiuJitsu Avanzado"); + trainingGroup.setSchedule(LocalDateTime.now().plusDays(1)); + trainingGroup.setTeacher(teacher); + this.trainingGroupService.save(trainingGroup); + + // Asignar grupo al estudiante + this.studentService.addGroupToStudent(student.getId(), trainingGroup); + + // Sesión de entrenamiento + TrainingSession trainingSession = new TrainingSession(); + trainingSession.setTrainingGroup(trainingGroup); + trainingSession.setDate(LocalDateTime.now().plusDays(2)); + trainingSession.setStatus(StatusValues.ACTIVE); + this.trainingSessionService.save(trainingSession); + + + // Crear asistencia con sesión válida + Assistance validAssistance = new Assistance(); + validAssistance.setDate(LocalDateTime.now()); + validAssistance.setStudent(student); + validAssistance.setTrainingSession(trainingSession); + this.studentService.addAssistanceToStudent(student, validAssistance); + + // Factura para el estudiante + Invoice invoice = new Invoice(); + invoice.setUser(studentUser); + invoice.setDate(LocalDateTime.now().minusDays(1)); + invoice.setStatus(StatusValues.NOT_PAID); + invoice.setTotal(new BigDecimal("59.99")); + this.invoiceService.save(invoice); + this.userService.addInvoiceToUser(studentUser, invoice); + + // IVA TYPE + IVAType ivaGeneral = new IVAType(); + ivaGeneral.setPercentage(new BigDecimal("21.00")); + ivaGeneral.setDescription("IVA General"); + this.ivaTypeService.save(ivaGeneral); + + // PRODUCTO / SERVICIO + ProductService jiuJitsuClass = new ProductService(); + jiuJitsuClass.setName("Clase de JiuJitsu"); + jiuJitsuClass.setType("Servicio"); + jiuJitsuClass.setPrice(new BigDecimal("50.00")); + jiuJitsuClass.setIvaType(ivaGeneral); + jiuJitsuClass.setStatus(StatusValues.ACTIVE); + this.productServiceService.save(jiuJitsuClass); + + // LÍNEA DE FACTURA + InvoiceLine line = new InvoiceLine(); + line.setInvoice(invoice); + line.setProductService(jiuJitsuClass); + line.setQuantity(1); + line.setUnitPrice(jiuJitsuClass.getPrice()); + line.setSubtotal(jiuJitsuClass.getPrice().multiply(BigDecimal.valueOf(line.getQuantity()))); + this.invoiceService.addLineToInvoice(invoice, line); + + + // PAGO (PAYMENT) + Payment payment = new Payment(); + payment.setInvoice(invoice); + payment.setAmount(invoice.getTotal()); // Debe incluir el IVA si se calcula externamente + payment.setPaymentMethod(PaymentMethodValues.CREDIT_CARD); + payment.setPaymentDate(LocalDateTime.now()); + payment.setStatus(StatusValues.PAID); + this.paymentService.save(payment); + + + // Mostrar todo + System.out.println("--- ROLES ---"); + this.roleService.findAll().forEach(System.out::println); + + System.out.println("--- PERMISOS ---"); + this.permissionService.findAll().forEach(System.out::println); + + System.out.println("--- USUARIOS ---"); + this.userService.findAll().forEach(System.out::println); + + System.out.println("--- ESTUDIANTES ---"); + this.studentService.findAll().forEach(System.out::println); + + System.out.println("--- HISTORIAL ESTUDIANTES ---"); + this.studentHistoryService.findAll().forEach(System.out::println); + + System.out.println("--- PROFESORES ---"); + this.teacherService.findAll().forEach(System.out::println); + + System.out.println("--- ADMINISTRADORES ---"); + this.adminService.findAll().forEach(System.out::println); + + System.out.println("--- NOTIFICACIONES ---"); + this.notificationService.findAll().forEach(System.out::println); + + System.out.println("--- MEMBRESÍAS ---"); + this.membershipService.findAll().forEach(System.out::println); + + System.out.println("--- GRUPOS DE ENTRENAMIENTO ---"); + this.trainingGroupService.findAll().forEach(System.out::println); + + System.out.println("--- SESIONES DE ENTRENAMIENTO ---"); + this.trainingSessionService.findAll().forEach(System.out::println); + + System.out.println("--- ASISTENCIAS ---"); + this.assistanceService.findAll().forEach(System.out::println); + + System.out.println("--- FACTURAS ---"); + this.invoiceService.findAll().forEach(System.out::println); + + System.out.println("--- LÍNEAS DE FACTURA ---"); + this.invoiceLineService.findAll().forEach(System.out::println); + + System.out.println("--- TIPOS DE IVA ---"); + this.ivaTypeService.findAll().forEach(System.out::println); + + System.out.println("--- PRODUCTOS/SERVICIOS ---"); + this.productServiceService.findAll().forEach(System.out::println); + + System.out.println("--- PAGOS ---"); + this.paymentService.findAll().forEach(System.out::println); + + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/AbstractService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/AbstractService.java new file mode 100644 index 0000000..902bbea --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/AbstractService.java @@ -0,0 +1,153 @@ +package com.denniseckerskorn.services; + +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.transaction.Transactional; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +/** + * Abstract service class providing common CRUD operations for entities. + * + * @param the type of the entity + * @param the type of the entity's identifier + */ +public abstract class AbstractService { + + protected final JpaRepository repository; + + @PersistenceContext + private EntityManager entityManager; + + /** + * Constructor for AbstractService. + * + * @param repository the repository to be used for CRUD operations + */ + public AbstractService(JpaRepository repository) { + this.repository = repository; + } + + /** + * Saves a new entity in the database. + * + * @param entity the entity to save + * @return the saved entity + * @throws DuplicateEntityException if the entity already exists + * @throws IllegalArgumentException if the entity is null + */ + public T save(T entity) throws IllegalArgumentException, DuplicateEntityException { + if (entity == null) { + throw new IllegalArgumentException("Entity cannot be null"); + } + + ID id = getEntityId(entity); + if (id != null && exists(entity)) { + throw new DuplicateEntityException("Entity with ID " + id + " already exists"); + } + + return repository.save(entity); + } + + /** + * Updates an existing entity in the database. + * + * @param entity the entity to update + * @return the updated entity + * @throws EntityNotFoundException if the entity does not exist + * @throws IllegalArgumentException if the entity is null + * @throws InvalidDataException if the entity is invalid + */ + @Transactional + public T update(T entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { + if (entity == null) { + throw new IllegalArgumentException("Entity cannot be null"); + } + + ID id = getEntityId(entity); + if (id == null) { + throw new InvalidDataException("Cannot update entity: ID is null"); + } + + if (!repository.existsById(id)) { + throw new EntityNotFoundException("Entity with ID " + id + " does not exist"); + } + + return entityManager.merge(entity); + } + + /** + * Retrieves the ID of the entity. + * + * @param entity the entity from which to retrieve the ID + * @return the ID of the entity + * @throws IllegalStateException if the ID cannot be accessed + */ + @SuppressWarnings("unchecked") + protected ID getEntityId(T entity) throws IllegalStateException { + try { + var idField = entity.getClass().getDeclaredField("id"); + idField.setAccessible(true); + return (ID) idField.get(entity); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new IllegalStateException("Unable to access entity ID", e); + } + } + + /** + * Finds an entity by its ID. + * + * @param id the ID of the entity to find + * @return the found entity + * @throws EntityNotFoundException if the entity does not exist + * @throws InvalidDataException if the ID is null + */ + public T findById(ID id) throws InvalidDataException, EntityNotFoundException { + if (id == null) { + throw new InvalidDataException("ID cannot be null"); + } + return repository.findById(id) + .orElseThrow(() -> new EntityNotFoundException("Entity with ID " + id + " not found")); + } + + /** + * Deletes an entity by its ID. + * + * @param id the ID of the entity to delete + * @throws EntityNotFoundException if the entity does not exist + * @throws InvalidDataException if the ID is null + */ + public void deleteById(ID id) throws InvalidDataException, EntityNotFoundException { + if (id == null) { + throw new InvalidDataException("ID cannot be null"); + } + if (!repository.existsById(id)) { + throw new EntityNotFoundException("Entity with ID " + id + " not found"); + } + repository.deleteById(id); + } + + /** + * Finds all entities in the database. + * + * @return a list of all entities + */ + public List findAll() { + return repository.findAll(); + } + + /** + * Checks if an entity exists in the database. + * + * @param entity the entity to check + * @return true if the entity exists, false otherwise + */ + protected boolean exists(T entity) { + ID id = getEntityId(entity); + return id != null && repository.existsById(id); + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/AssistanceService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/AssistanceService.java new file mode 100644 index 0000000..e52efe6 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/AssistanceService.java @@ -0,0 +1,107 @@ +package com.denniseckerskorn.services.class_managment_services; + +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.class_managment_repositories.AssistanceRepository; +import com.denniseckerskorn.services.AbstractService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * Service class for managing assistance records. + */ +@Service +public class AssistanceService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(MembershipService.class); + private final AssistanceRepository assistanceRepository; + + /** + * Constructor for AssitanceService. + * + * @param assistanceRepository the assistance repository + */ + public AssistanceService(AssistanceRepository assistanceRepository) { + super(assistanceRepository); + this.assistanceRepository = assistanceRepository; + } + + @Override + public Assistance save(Assistance entity) throws IllegalArgumentException, DuplicateEntityException { + logger.info("Saving assistance: {}", entity); + if (entity == null) { + throw new IllegalArgumentException("Entity cannot be null"); + } + validateAssistance(entity); + return super.save(entity); + } + + @Override + public Assistance update(Assistance entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { + logger.info("Updating assistance: {}", entity); + validateAssistance(entity); + return super.update(entity); + } + + @Override + protected Integer getEntityId(Assistance entity) throws IllegalStateException { + return super.getEntityId(entity); + } + + @Override + public Assistance findById(Integer id) throws InvalidDataException, EntityNotFoundException { + logger.info("Finding assistance by ID: {}", id); + if (id == null) { + logger.error("Assistance ID cannot be null"); + throw new InvalidDataException("Assistance ID cannot be null"); + } + return super.findById(id); + } + + @Override + public void deleteById(Integer id) throws InvalidDataException, EntityNotFoundException { + logger.info("Deleting assistance by ID: {}", id); + Assistance assistance = findById(id); + if (assistance == null) { + logger.error("Assistance with ID {} not found", id); + throw new EntityNotFoundException("Assistance with ID " + id + " not found"); + } + super.deleteById(id); + } + + @Override + public List findAll() { + logger.info("Finding all assistance records"); + return super.findAll(); + } + + @Override + protected boolean exists(Assistance entity) { + logger.info("Checking if assistance exists: {}", entity); + return super.exists(entity); + } + + /** + * Validates the assistance entity. + * + * @param assistance the assistance to validate + * @throws InvalidDataException if the assistance is invalid + */ + private void validateAssistance(Assistance assistance) throws InvalidDataException { + if (assistance.getStudent() == null) { + throw new InvalidDataException("Student cannot be null"); + } + if (assistance.getTrainingSession() == null) { + throw new InvalidDataException("Training session cannot be null"); + } + if (assistance.getDate() == null) { + throw new InvalidDataException("Date cannot be null"); + } + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/MembershipService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/MembershipService.java new file mode 100644 index 0000000..7e367bd --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/MembershipService.java @@ -0,0 +1,159 @@ +package com.denniseckerskorn.services.class_managment_services; + +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.class_managment_repositories.MembershipRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Service class for managing memberships. + */ +@Service +public class MembershipService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(MembershipService.class); + private final MembershipRepository membershipRepository; + + /** + * Constructor for MembershipService. + * + * @param membershipRepository the membership repository + */ + public MembershipService(MembershipRepository membershipRepository) { + super(membershipRepository); + this.membershipRepository = membershipRepository; + } + + /** + * Saves a new membership in the database. + * + * @param membership the entity to save + * @return the saved entity + * @throws DuplicateEntityException if the membership already exists + * @throws InvalidDataException if the membership is invalid + */ + @Override + public Membership save(Membership membership) throws DuplicateEntityException, InvalidDataException { + logger.info("Saving membership: {}", membership); + validateMembership(membership); + boolean exists = membershipRepository.existsByType(membership.getType()); + if (exists) { + logger.error("Membership with type {} already exists", membership.getType()); + throw new DuplicateEntityException("Membership with this type already exists"); + } + + return super.save(membership); + } + + /** + * Updates an existing membership in the database. + * + * @param membership the entity to update + * @return the updated entity + * @throws EntityNotFoundException if the membership does not exist + * @throws InvalidDataException if the membership is invalid + */ + @Override + @Transactional + public Membership update(Membership membership) throws EntityNotFoundException, InvalidDataException { + logger.info("Updating membership: {}", membership); + validateMembership(membership); + return super.update(membership); + } + + /** + * Deletes a membership by its ID. + * + * @param id the ID of the membership to delete + * @throws EntityNotFoundException if the membership does not exist + */ + @Override + @Transactional + public void deleteById(Integer id) throws EntityNotFoundException { + logger.info("Deleting membership by ID: {}", id); + Membership membership = findById(id); + + // Verificar si está asignado a un estudiante + Student student = membership.getStudent(); + if (student != null) { + logger.error("Cannot delete membership. It is assigned to student ID {}", student.getId()); + throw new InvalidDataException("Cannot delete membership because it is assigned to a student"); + } + + super.deleteById(id); + logger.info("Membership with ID {} deleted", id); + } + + /** + * Checks if a membership exists in the database. + * + * @param membership the entity to check + * @return true if the membership exists, false otherwise + */ + @Override + protected boolean exists(Membership membership) { + return membership.getType() != null && + membershipRepository.findByType(membership.getType()) != null; + } + + /** + * Finds a membership by its ID. + * + * @param id the ID of the membership to find + * @return the found membership + * @throws EntityNotFoundException if the membership does not exist + * @throws InvalidDataException if the ID is invalid + */ + @Override + public Membership findById(Integer id) throws EntityNotFoundException { + logger.info("Finding membership by ID: {}", id); + if (id == null) { + logger.error("ID cannot be null"); + throw new InvalidDataException("ID cannot be null"); + } + logger.info("Membership found: {}", id); + return super.findById(id); + } + + /** + * Finds all memberships in the database. + * + * @return a list of all memberships + */ + @Override + public List findAll() { + logger.info("Finding all memberships"); + return super.findAll(); + } + + /** + * Validates the membership entity. + * + * @param membership the membership to validate + * @throws InvalidDataException if the membership is invalid + */ + private void validateMembership(Membership membership) throws InvalidDataException { + if (membership.getType() == null || membership.getType().toString().isEmpty()) { + logger.error("Membership type cannot be null or empty"); + throw new InvalidDataException("Membership type cannot be null or empty"); + } + if (membership.getStartDate() == null || membership.getEndDate() == null) { + throw new InvalidDataException("Start and end date cannot be null"); + } + if (membership.getStartDate().isAfter(membership.getEndDate())) { + throw new InvalidDataException("Start date must be before end date"); + } + if (membership.getStatus() == null) { + throw new InvalidDataException("Status must be provided"); + } + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupService.java new file mode 100644 index 0000000..7f2bf1a --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupService.java @@ -0,0 +1,149 @@ +package com.denniseckerskorn.services.class_managment_services; + +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.class_managment_repositories.TrainingGroupRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +public class TrainingGroupService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(TrainingGroupService.class); + private final TrainingGroupRepository trainingGroupRepository; + + public TrainingGroupService(TrainingGroupRepository trainingGroupRepository) { + super(trainingGroupRepository); + this.trainingGroupRepository = trainingGroupRepository; + } + + @Override + public TrainingGroup save(TrainingGroup entity) throws IllegalArgumentException, DuplicateEntityException { + logger.info("Saving training group: {}", entity); + if (entity == null) { + throw new IllegalArgumentException("TrainingGroup cannot be null"); + } + validateTrainingGroup(entity); + return super.save(entity); + } + + @Override + public TrainingGroup update(TrainingGroup entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { + logger.info("Updating training group: {}", entity); + validateTrainingGroup(entity); + return super.update(entity); + } + + @Override + protected Integer getEntityId(TrainingGroup entity) { + return super.getEntityId(entity); + } + + @Override + public TrainingGroup findById(Integer id) throws InvalidDataException, EntityNotFoundException { + logger.info("Finding training group by ID: {}", id); + return super.findById(id); + } + + @Override + public void deleteById(Integer id) throws InvalidDataException, EntityNotFoundException { + logger.info("Deleting training group by ID: {}", id); + TrainingGroup group = findById(id); + if (group == null) { + logger.error("Training group with ID {} not found", id); + throw new EntityNotFoundException("Training group with ID " + id + " not found"); + } + super.deleteById(id); + } + + @Override + public List findAll() { + logger.info("Finding all training groups"); + return super.findAll(); + } + + @Override + protected boolean exists(TrainingGroup entity) { + logger.info("Checking if training group exists: {}", entity); + return super.exists(entity); + } + + private void validateTrainingGroup(TrainingGroup group) throws InvalidDataException { + if (group.getTeacher() == null) { + throw new InvalidDataException("Teacher cannot be null"); + } + if (group.getName() == null || group.getName().trim().isEmpty()) { + throw new InvalidDataException("Group name is required"); + } + if (group.getSchedule() == null) { + throw new InvalidDataException("Schedule cannot be null"); + } + } + + @Transactional + public void addStudentToGroup(TrainingGroup group, Student student) throws InvalidDataException, EntityNotFoundException { + if (group == null || student == null) { + throw new InvalidDataException("Group and student cannot be null"); + } + + TrainingGroup managedGroup = findById(group.getId()); + + if (!managedGroup.getStudents().contains(student)) { + managedGroup.getStudents().add(student); + student.getTrainingGroups().add(managedGroup); // bidireccional + trainingGroupRepository.save(managedGroup); + } + } + + @Transactional + public void removeStudentFromGroup(TrainingGroup group, Student student) throws InvalidDataException, EntityNotFoundException { + if (group == null || student == null) { + throw new InvalidDataException("Group and student cannot be null"); + } + + TrainingGroup managedGroup = findById(group.getId()); + + if (managedGroup.getStudents().contains(student)) { + managedGroup.getStudents().remove(student); + student.getTrainingGroups().remove(managedGroup); + trainingGroupRepository.save(managedGroup); + } + } + + @Transactional + public void addTrainingSessionToGroup(TrainingGroup group, TrainingSession session) throws InvalidDataException, EntityNotFoundException { + if (group == null || session == null) { + throw new InvalidDataException("Group and session cannot be null"); + } + + TrainingGroup managedGroup = findById(group.getId()); + session.setTrainingGroup(managedGroup); + managedGroup.getTrainingSessions().add(session); + trainingGroupRepository.save(managedGroup); + } + + @Transactional + public void removeTrainingSessionFromGroup(TrainingGroup group, TrainingSession session) throws InvalidDataException, EntityNotFoundException { + if (group == null || session == null) { + throw new InvalidDataException("Group and session cannot be null"); + } + + TrainingGroup managedGroup = findById(group.getId()); + if (managedGroup.getTrainingSessions().contains(session)) { + managedGroup.getTrainingSessions().remove(session); + session.setTrainingGroup(null); + trainingGroupRepository.save(managedGroup); + } + } + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingSessionService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingSessionService.java new file mode 100644 index 0000000..b35922a --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingSessionService.java @@ -0,0 +1,119 @@ +package com.denniseckerskorn.services.class_managment_services; + +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.class_managment_repositories.TrainingSessionRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Set; + +/** + * Service class for managing training sessions. + */ +@Service +public class TrainingSessionService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(TrainingSessionService.class); + private final TrainingSessionRepository trainingSessionRepository; + + public TrainingSessionService(TrainingSessionRepository trainingSessionRepository) { + super(trainingSessionRepository); + this.trainingSessionRepository = trainingSessionRepository; + } + + @Override + public TrainingSession save(TrainingSession entity) throws IllegalArgumentException, DuplicateEntityException { + logger.info("Saving training session: {}", entity); + if (entity == null) { + throw new IllegalArgumentException("TrainingSession cannot be null"); + } + validateTrainingSession(entity); + return super.save(entity); + } + + @Override + public TrainingSession update(TrainingSession entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { + logger.info("Updating training session: {}", entity); + validateTrainingSession(entity); + return super.update(entity); + } + + @Override + protected Integer getEntityId(TrainingSession entity) throws IllegalStateException { + return super.getEntityId(entity); + } + + @Override + public TrainingSession findById(Integer id) throws InvalidDataException, EntityNotFoundException { + logger.info("Finding training session by ID: {}", id); + return super.findById(id); + } + + @Override + public void deleteById(Integer id) throws InvalidDataException, EntityNotFoundException { + logger.info("Deleting training session by ID: {}", id); + TrainingSession session = findById(id); + if (session == null) { + logger.error("Training session with ID {} not found", id); + throw new EntityNotFoundException("Training session with ID " + id + " not found"); + } + super.deleteById(id); + } + + @Override + public List findAll() { + logger.info("Finding all training sessions"); + return super.findAll(); + } + + @Override + protected boolean exists(TrainingSession entity) { + logger.info("Checking if training session exists: {}", entity); + return super.exists(entity); + } + + /** + * Validates the training session entity. + * + * @param session the training session to validate + * @throws InvalidDataException if the session is invalid + */ + private void validateTrainingSession(TrainingSession session) throws InvalidDataException { + if (session.getTrainingGroup() == null) { + throw new InvalidDataException("Training group cannot be null"); + } + if (session.getStatus() == null) { + throw new InvalidDataException("Status cannot be null"); + } + } + + public Set getStudentsFromSession(TrainingSession session) throws EntityNotFoundException, InvalidDataException { + if (session == null || session.getId() == null) { + throw new InvalidDataException("Session cannot be null"); + } + + TrainingSession managedSession = findById(session.getId()); + return managedSession.getTrainingGroup().getStudents(); + } + + @Transactional + public void deleteAllAssistancesBySession(Integer sessionId) { + TrainingSession session = findById(sessionId); + + if (session.getAssistances() != null && !session.getAssistances().isEmpty()) { + session.getAssistances().clear(); + update(session); + } + } + + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/IVATypeService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/IVATypeService.java new file mode 100644 index 0000000..14e3e44 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/IVATypeService.java @@ -0,0 +1,79 @@ +package com.denniseckerskorn.services.finance_services; + +import com.denniseckerskorn.entities.finance.IVAType; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.IVATypeRepository; +import com.denniseckerskorn.repositories.finance_repositories.ProductServiceRepository; +import com.denniseckerskorn.services.AbstractService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +@Service +public class IVATypeService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(IVATypeService.class); + private final IVATypeRepository ivaTypeRepository; + private final ProductServiceRepository productServiceRepository; + + public IVATypeService(IVATypeRepository ivaTypeRepository, ProductServiceRepository productServiceRepository) { + super(ivaTypeRepository); + this.ivaTypeRepository = ivaTypeRepository; + this.productServiceRepository = productServiceRepository; + } + + @Override + public IVAType save(IVAType entity) throws DuplicateEntityException { + logger.info("Saving IVAType: {}", entity); + validate(entity); + if (ivaTypeRepository.existsByPercentage(entity.getPercentage())) { + throw new DuplicateEntityException("IVA type with this percentage already exists"); + } + return super.save(entity); + } + + @Override + public IVAType update(IVAType entity) throws InvalidDataException, EntityNotFoundException { + logger.info("Updating IVAType: {}", entity); + validate(entity); + return super.update(entity); + } + + @Override + protected boolean exists(IVAType entity) { + return entity != null && entity.getId() != null && ivaTypeRepository.existsById(entity.getId()); + } + + @Override + protected Integer getEntityId(IVAType entity) { + return entity.getId(); + } + + @Override + public List findAll() { + logger.info("Retrieving all IVA types"); + return super.findAll(); + } + + @Override + public void deleteById(Integer id) throws InvalidDataException, EntityNotFoundException { + if (productServiceRepository.existsByIvaTypeId(id)) { + throw new InvalidDataException("Cannot delete IVA type in use by a product"); + } + super.deleteById(id); + } + + private void validate(IVAType ivaType) { + if (ivaType.getPercentage() == null || ivaType.getPercentage().compareTo(BigDecimal.ZERO) < 0) { + throw new InvalidDataException("IVA percentage must be >= 0"); + } + if (ivaType.getDescription() != null && ivaType.getDescription().length() > 50) { + throw new InvalidDataException("Description is too long"); + } + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceLineService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceLineService.java new file mode 100644 index 0000000..9a61858 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceLineService.java @@ -0,0 +1,79 @@ +package com.denniseckerskorn.services.finance_services; + +import com.denniseckerskorn.entities.finance.InvoiceLine; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.InvoiceLineRepository; +import com.denniseckerskorn.services.AbstractService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +/** + * Service class for managing InvoiceLine entities. + * This class provides methods to perform CRUD operations on InvoiceLine entities. + */ +@Service +public class InvoiceLineService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(InvoiceLineService.class); + private final InvoiceLineRepository invoiceLineRepository; + + public InvoiceLineService(InvoiceLineRepository invoiceLineRepository) { + super(invoiceLineRepository); + this.invoiceLineRepository = invoiceLineRepository; + } + + @Override + public InvoiceLine save(InvoiceLine entity) throws IllegalArgumentException, DuplicateEntityException { + logger.info("Saving invoice line: {}", entity); + validateInvoiceLine(entity); + return super.save(entity); + } + + @Override + public InvoiceLine update(InvoiceLine entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { + logger.info("Updating invoice line: {}", entity); + validateInvoiceLine(entity); + return super.update(entity); + } + + @Override + public List findAll() { + logger.info("Retrieving all invoice lines"); + return super.findAll(); + } + + @Override + protected boolean exists(InvoiceLine entity) { + return entity != null && entity.getId() != null && invoiceLineRepository.existsById(entity.getId()); + } + + @Override + protected Integer getEntityId(InvoiceLine entity) { + return entity.getId(); + } + + private void validateInvoiceLine(InvoiceLine line) { + if (line.getInvoice() == null) { + throw new InvalidDataException("InvoiceLine must be linked to an invoice"); + } + if (line.getProductService() == null) { + throw new InvalidDataException("InvoiceLine must be linked to a product/service"); + } + if (line.getQuantity() == null || line.getQuantity().intValue() <= 0) { + throw new InvalidDataException("Quantity must be greater than 0"); + } + if (line.getUnitPrice() == null || line.getUnitPrice().compareTo(BigDecimal.ZERO) <= 0) { + throw new InvalidDataException("Unit price must be greater than 0"); + } + + // Validación automática de subtotal + BigDecimal expected = line.getUnitPrice().multiply(new BigDecimal(line.getQuantity())); + line.setSubtotal(expected); + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceService.java new file mode 100644 index 0000000..5a375a4 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceService.java @@ -0,0 +1,171 @@ +package com.denniseckerskorn.services.finance_services; + +import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.finance.InvoiceLine; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.InvoiceRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; + +@Service +public class InvoiceService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(InvoiceService.class); + private final InvoiceRepository invoiceRepository; + + public InvoiceService(InvoiceRepository invoiceRepository) { + super(invoiceRepository); + this.invoiceRepository = invoiceRepository; + } + + @Override + public Invoice save(Invoice entity) throws IllegalArgumentException, DuplicateEntityException { + logger.info("Saving invoice: {}", entity); + if (entity == null) { + throw new IllegalArgumentException("Invoice cannot be null"); + } + validateInvoice(entity); + return super.save(entity); + } + + @Override + public Invoice update(Invoice entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { + logger.info("Updating invoice: {}", entity); + validateInvoice(entity); + return super.update(entity); + } + + @Override + public Invoice findById(Integer id) throws InvalidDataException, EntityNotFoundException { + logger.info("Finding invoice by ID: {}", id); + return super.findById(id); + } + + @Override + public void deleteById(Integer id) throws InvalidDataException, EntityNotFoundException { + logger.info("Deleting invoice by ID: {}", id); + Invoice invoice = findById(id); + if (invoice == null) { + throw new EntityNotFoundException("Invoice not found"); + } + super.deleteById(id); + } + + @Override + public List findAll() { + logger.info("Retrieving all invoices"); + return super.findAll(); + } + + @Override + protected boolean exists(Invoice entity) { + return entity != null && entity.getId() != null && invoiceRepository.existsById(entity.getId()); + } + + @Override + protected Integer getEntityId(Invoice entity) { + return entity.getId(); + } + + /** + * Obtiene todas las facturas de un usuario específico. + */ + public List findAllInvoicesByUserId(Integer userId) throws InvalidDataException { + if (userId == null) { + throw new InvalidDataException("User ID cannot be null"); + } + return invoiceRepository.findAll().stream() + .filter(invoice -> invoice.getUser() != null && invoice.getUser().getId().equals(userId)) + .toList(); + } + + + /** + * Validates the invoice before saving/updating. + */ + private void validateInvoice(Invoice invoice) throws InvalidDataException { + if (invoice.getUser() == null) { + throw new InvalidDataException("Invoice must be linked to a user"); + } + if (invoice.getDate() == null || invoice.getDate().isAfter(LocalDateTime.now())) { + throw new InvalidDataException("Invoice date must be valid and not in the future"); + } + if (invoice.getTotal() == null || invoice.getTotal().compareTo(BigDecimal.ZERO) <= 0) { + throw new InvalidDataException("Invoice total must be greater than 0"); + } + if (invoice.getStatus() == null) { + throw new InvalidDataException("Invoice status must not be null"); + } + } + + @Transactional + public void addLineToInvoice(Invoice invoice, InvoiceLine line) { + if (invoice == null || line == null) { + throw new InvalidDataException("Invoice and line must not be null"); + } + line.setInvoice(invoice); + invoice.getInvoiceLines().add(line); + updateInvoiceTotal(invoice); + invoiceRepository.save(invoice); + } + + @Transactional + public void removeLineFromInvoice(Invoice invoice, InvoiceLine line) { + if (invoice == null || line == null) { + throw new InvalidDataException("Invoice and line must not be null"); + } + invoice.getInvoiceLines().remove(line); + line.setInvoice(null); + updateInvoiceTotal(invoice); + invoiceRepository.save(invoice); + } + + public void updateInvoiceTotal(Invoice invoice) { + BigDecimal total = invoice.getInvoiceLines().stream() + .map(InvoiceLine::getSubtotal) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + invoice.setTotal(total); + } + + + @Transactional + public void addLineToInvoiceById(Integer invoiceId, InvoiceLine line) { + Invoice invoice = findById(invoiceId); + addLineToInvoice(invoice, line); + } + + @Transactional + public void removeLineFromInvoiceById(Integer invoiceId, Integer lineId) { + Invoice invoice = findById(invoiceId); + InvoiceLine line = invoice.getInvoiceLines().stream() + .filter(l -> l.getId().equals(lineId)) + .findFirst() + .orElseThrow(() -> new EntityNotFoundException("InvoiceLine not found")); + removeLineFromInvoice(invoice, line); + } + + public void recalculateTotal(Invoice invoice) { + updateInvoiceTotal(invoice); + invoiceRepository.save(invoice); + } + + + @Transactional + public void clearInvoiceLines(Invoice invoice) { + invoice.getInvoiceLines().clear(); + updateInvoiceTotal(invoice); + invoiceRepository.save(invoice); + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/PaymentService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/PaymentService.java new file mode 100644 index 0000000..dbfd7dd --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/PaymentService.java @@ -0,0 +1,103 @@ +package com.denniseckerskorn.services.finance_services; + +import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.finance.Payment; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.PaymentRepository; +import com.denniseckerskorn.services.AbstractService; +import com.denniseckerskorn.services.finance_services.InvoiceService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Service +public class PaymentService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(PaymentService.class); + private final PaymentRepository paymentRepository; + private final InvoiceService invoiceService; + + public PaymentService(PaymentRepository paymentRepository, InvoiceService invoiceService) { + super(paymentRepository); + this.paymentRepository = paymentRepository; + this.invoiceService = invoiceService; + } + + @Override + @Transactional + public Payment save(Payment entity) throws DuplicateEntityException { + logger.info("Saving payment: {}", entity); + validate(entity); + if (paymentRepository.existsByInvoiceId(entity.getInvoice().getId())) { + throw new DuplicateEntityException("A payment already exists for this invoice"); + } + updateInvoiceStatus(entity); + return super.save(entity); + } + + @Override + public Payment update(Payment entity) throws EntityNotFoundException, InvalidDataException { + logger.info("Updating payment: {}", entity); + validate(entity); + updateInvoiceStatus(entity); + return super.update(entity); + } + + @Override + protected boolean exists(Payment entity) { + return entity != null && entity.getId() != null && paymentRepository.existsById(entity.getId()); + } + + @Override + protected Integer getEntityId(Payment entity) { + return entity.getId(); + } + + @Override + public List findAll() { + logger.info("Retrieving all payments"); + return super.findAll(); + } + + private void validate(Payment payment) { + if (payment.getInvoice() == null) { + throw new InvalidDataException("Payment must be linked to an invoice"); + } + if (payment.getAmount() == null || payment.getAmount().compareTo(BigDecimal.ZERO) <= 0) { + throw new InvalidDataException("Payment amount must be greater than 0"); + } + if (payment.getPaymentDate() == null || payment.getPaymentDate().isAfter(LocalDateTime.now())) { + throw new InvalidDataException("Payment date must not be in the future"); + } + if (payment.getStatus() == null) { + throw new InvalidDataException("Payment status must not be null"); + } + if (payment.getPaymentMethod() == null) { + throw new InvalidDataException("Payment method must be specified"); + } + } + + private void updateInvoiceStatus(Payment payment) { + Invoice invoice = payment.getInvoice(); + invoice.setStatus(StatusValues.PAID); + invoiceService.update(invoice); + } + + @Transactional + public void removePayment(Integer paymentId) { + Payment payment = findById(paymentId); + Invoice invoice = payment.getInvoice(); + super.deleteById(paymentId); + invoice.setStatus(StatusValues.NOT_PAID); + invoiceService.update(invoice); + } + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/ProductServiceService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/ProductServiceService.java new file mode 100644 index 0000000..3286a46 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/ProductServiceService.java @@ -0,0 +1,77 @@ +package com.denniseckerskorn.services.finance_services; + +import com.denniseckerskorn.entities.finance.ProductService; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.ProductServiceRepository; +import com.denniseckerskorn.services.AbstractService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +@Service +public class ProductServiceService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(ProductServiceService.class); + private final ProductServiceRepository productServiceRepository; + + public ProductServiceService(ProductServiceRepository productServiceRepository) { + super(productServiceRepository); + this.productServiceRepository = productServiceRepository; + } + + @Override + public ProductService save(ProductService entity) throws IllegalArgumentException, DuplicateEntityException { + logger.info("Saving product/service: {}", entity); + validateProduct(entity); + if (productServiceRepository.existsByName(entity.getName())) { + throw new DuplicateEntityException("Product/Service with this name already exists"); + } + return super.save(entity); + } + + @Override + public ProductService update(ProductService entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { + logger.info("Updating product/service: {}", entity); + validateProduct(entity); + return super.update(entity); + } + + @Override + public List findAll() { + logger.info("Retrieving all products/services"); + return super.findAll(); + } + + @Override + protected boolean exists(ProductService entity) { + return entity != null && entity.getId() != null && productServiceRepository.existsById(entity.getId()); + } + + @Override + protected Integer getEntityId(ProductService entity) { + return entity.getId(); + } + + private void validateProduct(ProductService product) { + if (product.getName() == null || product.getName().isBlank()) { + throw new InvalidDataException("Product name cannot be null or blank"); + } + if (product.getType() == null || product.getType().isBlank()) { + throw new InvalidDataException("Product type cannot be null or blank"); + } + if (product.getPrice() == null || product.getPrice().compareTo(BigDecimal.ZERO) <= 0) { + throw new InvalidDataException("Product price must be greater than 0"); + } + if (product.getIvaType() == null) { + throw new InvalidDataException("Product must have an IVA type assigned"); + } + if (product.getStatus() == null) { + throw new InvalidDataException("Product status cannot be null"); + } + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/AdminService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/AdminService.java new file mode 100644 index 0000000..130b81e --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/AdminService.java @@ -0,0 +1,129 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.users.Admin; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.AdminRepository; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Service class for managing Admin entities. + * This class provides methods to perform CRUD operations on Admin entities. + */ +@Service +public class AdminService extends AbstractService { + + private final static Logger logger = LoggerFactory.getLogger(AdminService.class); + private final AdminRepository adminRepository; + private final UserRepository userRepository; + + /** + * Constructor for AdminService. + * + * @param adminRepository the admin repository + */ + public AdminService(AdminRepository adminRepository, UserRepository userRepository) { + super(adminRepository); + this.adminRepository = adminRepository; + this.userRepository = userRepository; + } + + /** + * Checks if an admin exists in the database. + * + * @param entity the entity to check + * @return true if the admin exists, false otherwise + */ + @Override + protected boolean exists(Admin entity) { + return entity != null && entity.getId() != null && adminRepository.existsById(entity.getId()); + } + + /** + * Saves a new admin in the database. + * + * @param admin the entity to save + * @return the saved entity + * @throws DuplicateEntityException if the admin already exists + * @throws InvalidDataException if the admin or its user is null + */ + @Override + public Admin save(Admin admin) throws DuplicateEntityException, InvalidDataException { + logger.info("Saving admin: {}", admin); + if (admin == null) { + throw new InvalidDataException("Admin cannot be null."); + } else if (admin.getUser() == null) { + throw new InvalidDataException("Admin must be associated with a user."); + } + + userRepository.save(admin.getUser()); + + return super.save(admin); + } + + /** + * Updates an existing admin in the database. + * + * @param entity the entity to update + * @return the updated entity + * @throws EntityNotFoundException if the entity is not found + * @throws InvalidDataException if the entity is invalid + */ + @Transactional + @Override + public Admin update(Admin entity) throws EntityNotFoundException, InvalidDataException { + logger.info("Updating admin: {}", entity); + if (entity == null) { + throw new InvalidDataException("Admin cannot be null."); + } + logger.info("Admin updated successfully: {}", entity); + return super.update(entity); + } + + /** + * Finds an admin by ID. + * + * @param id the ID of the entity to find + * @return the found entity + * @throws EntityNotFoundException if the entity is not found + */ + @Override + public Admin findById(Integer id) throws EntityNotFoundException { + logger.info("Fetching admin by ID: {}", id); + return super.findById(id); + } + + /** + * Deletes an admin by ID. + * + * @param id the ID of the entity to delete + * @throws EntityNotFoundException if the entity is not found + */ + @Transactional + @Override + public void deleteById(Integer id) throws EntityNotFoundException { + logger.info("Deleting admin by ID: {}", id); + super.deleteById(id); + } + + /** + * Finds all admins in the database. + * + * @return a list of all admins + */ + @Override + public List findAll() { + List admins = super.findAll(); + logger.info("Found {} admins", admins.size()); + return admins; + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/NotificationService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/NotificationService.java new file mode 100644 index 0000000..9536fa6 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/NotificationService.java @@ -0,0 +1,190 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.Notification; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.NotificationRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Service class for managing Notification entities. + * This class provides methods to perform CRUD operations on Notification entities. + */ +@Service +public class NotificationService extends AbstractService { + private final static Logger logger = LoggerFactory.getLogger(NotificationService.class); + private final NotificationRepository notificationRepository; + + /** + * Constructor for AbstractService. + * + * @param notificationRepository the JPA repository + */ + public NotificationService(NotificationRepository notificationRepository) { + super(notificationRepository); + this.notificationRepository = notificationRepository; + } + + /** + * Saves a new notification in the database. + * + * @param entity the entity to save + * @return the saved entity + * @throws DuplicateEntityException if the notification already exists + */ + @Override + public Notification save(Notification entity) throws DuplicateEntityException, InvalidDataException { + logger.info("Saving notification: {}", entity); + if (entity == null) { + throw new InvalidDataException("Notification cannot be null"); + } + if (entity.getTitle() == null || entity.getShippingDate() == null) { + throw new InvalidDataException("Notification title and shipping date cannot be null"); + } + return super.save(entity); + } + + + /** + * Finds a notification by its ID. + * + * @param id the ID of the notification + * @return the found notification + * @throws EntityNotFoundException if the notification is not found + * @throws InvalidDataException if the ID is null + */ + @Override + public Notification findById(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Finding notification by ID: {}", id); + return super.findById(id); + } + + @Transactional + @Override + public Notification update(Notification entity) throws EntityNotFoundException { + logger.info("Updating notification: {}", entity); + if (entity == null) { + logger.error("Notification entity cannot be null"); + throw new EntityNotFoundException("Notification entity cannot be null"); + } + logger.info("Notification updated: {}", entity); + return super.update(entity); + } + + /** + * Deletes a notification by its ID. + * + * @param id the ID of the notification to delete + * @throws EntityNotFoundException if the notification is not found + * @throws InvalidDataException if the ID is null + */ + @Transactional + @Override + public void deleteById(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Deleting notification by ID: {}", id); + if (id == null) { + logger.error("Notification ID cannot be null"); + throw new EntityNotFoundException("Notification ID cannot be null"); + } + if (!notificationRepository.existsById(id)) { + logger.error("Notification with ID {} not found", id); + throw new EntityNotFoundException("Notification with ID " + id + " not found"); + } + logger.info("Notification with ID {} deleted", id); + super.deleteById(id); + } + + /** + * Finds all notifications. + * + * @return a list of all notifications + */ + @Override + public List findAll() { + logger.info("Finding all notifications"); + return super.findAll(); + } + + /** + * Finds notifications by user ID. + * + * @param id the ID of the user + * @return a list of notifications for the user + */ + public List findNotificationsByUserId(Integer id) throws InvalidDataException { + logger.info("Finding notifications by user ID: {}", id); + if (id == null) { + throw new InvalidDataException("User ID cannot be null"); + } + return notificationRepository.findNotificationsById(id); + } + + /** + * Checks if a notification exists. + * + * @param entity the notification to check + * @return true if the notification exists, false otherwise + */ + @Override + protected boolean exists(Notification entity) { + return entity != null && + entity.getTitle() != null && + entity.getShippingDate() != null && + notificationRepository.existsByTitleAndShippingDate(entity.getTitle(), entity.getShippingDate()); + } + + /** + * Adds a notification to a user. + * + * @param notification the notification to add + * @param user the user to add the notification to + */ + @Transactional + public void addNotificationToUser(Notification notification, User user) { + logger.info("Adding notification to user: {}", user); + if (notification == null || user == null) { + throw new InvalidDataException("Notification and user cannot be null"); + } + + Notification managedNotification = findById(notification.getId()); + if (!managedNotification.getUsers().contains(user)) { + managedNotification.addUser(user); + notificationRepository.save(managedNotification); + logger.info("Notification added to user"); + } else { + logger.warn("User already has this notification"); + } + } + + /** + * Removes a notification from a user. + * + * @param notification the notification to remove + * @param user the user to remove the notification from + */ + @Transactional + public void removeNotificationFromUser(Notification notification, User user) { + logger.info("Removing notification from user: {}", user); + if (notification == null || user == null) { + throw new InvalidDataException("Notification and user cannot be null"); + } + + Notification managedNotification = findById(notification.getId()); + if (managedNotification.getUsers().contains(user)) { + managedNotification.removeUser(user); + notificationRepository.save(managedNotification); + logger.info("Notification removed from user"); + } else { + logger.warn("User does not have this notification"); + } + } + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/PermissionService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/PermissionService.java new file mode 100644 index 0000000..9c98a44 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/PermissionService.java @@ -0,0 +1,174 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.Permission; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.enums.PermissionValues; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.PermissionRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Service class for managing Permission entities. + * This class provides methods to perform CRUD operations on Permission entities. + */ +@Service +public class PermissionService extends AbstractService { + private final static Logger logger = LoggerFactory.getLogger(PermissionService.class); + private final PermissionRepository permissionRepository; + + /** + * Constructor for PermissionService. + * + * @param permissionRepository the JPA repository + */ + public PermissionService(PermissionRepository permissionRepository) { + super(permissionRepository); + this.permissionRepository = permissionRepository; + } + + /** + * Saves a new permission in the database. + * + * @param entity the entity to save + * @return the saved entity + * @throws DuplicateEntityException if the permission already exists + * @throws InvalidDataException if the permission is null or invalid + */ + @Override + public Permission save(Permission entity) throws DuplicateEntityException, InvalidDataException { + logger.info("Attempting to save permission: {}", entity); + + if (entity == null) { + logger.error("Permission entity is null"); + throw new InvalidDataException("Permission entity cannot be null"); + } + + validatePermission(entity); + + if (permissionRepository.existsByPermissionName(entity.getPermissionName())) { + logger.error("Permission {} already exists", entity.getPermissionName()); + throw new DuplicateEntityException("Permission already exists: " + entity.getPermissionName()); + } + + Permission saved = permissionRepository.save(entity); + logger.info("Permission saved successfully: {}", saved); + return saved; + } + + + /** + * Updates an existing permission in the database. + * + * @param entity the entity to update + * @return the updated entity + * @throws EntityNotFoundException if the permission is not found + */ + @Transactional + @Override + public Permission update(Permission entity) throws EntityNotFoundException { + logger.info("Updating permission: {}", entity); + if (entity == null) { + throw new InvalidDataException("Permission cannot be null"); + } + validatePermission(entity); + return super.update(entity); + } + + /** + * Finds a permission by its ID. + * + * @param id the ID of the permission + * @return the found permission + * @throws EntityNotFoundException if the permission is not found + * @throws InvalidDataException if the ID is null + */ + @Override + public Permission findById(Integer id) throws EntityNotFoundException { + logger.info("Finding permission by ID: {}", id); + return super.findById(id); + } + + /** + * Deletes a permission by its ID. + * + * @param id the ID of the permission to delete + * @throws EntityNotFoundException if the permission is not found + * @throws InvalidDataException if the ID is null + */ + @Override + public void deleteById(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Deleting permission by ID: {}", id); + if (id == null) { + logger.error("Permission ID cannot be null"); + throw new InvalidDataException("Permission ID cannot be null"); + } + logger.info("Permission with ID {} deleted successfully", id); + super.deleteById(id); + } + + /** + * Finds all permissions in the database. + * + * @return a list of all permissions + */ + @Override + public List findAll() { + logger.info("Finding all permissions"); + return super.findAll(); + } + + /** + * Checks if a permission exists in the database. + * + * @param entity the permission entity to check + * @return true if the permission exists, false otherwise + */ + @Override + protected boolean exists(Permission entity) { + return permissionRepository.existsByPermissionName(entity.getPermissionName()); + } + + /** + * Finds a permission by its name. + * + * @param permissionName the name of the permission + * @return the found permission + * @throws EntityNotFoundException if the permission is not found + * @throws InvalidDataException if the permission name is null + */ + public Permission findPermissionByName(PermissionValues permissionName) throws EntityNotFoundException { + if (permissionName == null) { + logger.error("Permission name cannot be null"); + throw new InvalidDataException("Permission name cannot be null"); + } + + Permission permission = permissionRepository.findByPermissionName(permissionName); + if (permission == null) { + logger.error("Permission not found: {}", permissionName); + throw new EntityNotFoundException("Permission not found"); + } + return permission; + } + + + /** + * Validates the permission entity. + * + * @param permission the permission entity to validate + * @throws InvalidDataException if the permission is invalid + */ + private void validatePermission(Permission permission) throws InvalidDataException { + if (permission.getPermissionName() == null || permission.getPermissionName().toString().isEmpty()) { + logger.error("Permission name cannot be null or empty"); + throw new InvalidDataException("Permission name cannot be null or empty"); + } + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/RoleService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/RoleService.java new file mode 100644 index 0000000..1664cf0 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/RoleService.java @@ -0,0 +1,191 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.Permission; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.RoleRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Service class for managing Role entities. + * This class provides methods to perform CRUD operations on Role entities. + */ +@Service +public class RoleService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(RoleService.class); + private final RoleRepository roleRepository; + + /** + * Constructor for RoleService. + * + * @param roleRepository the role repository + */ + public RoleService(RoleRepository roleRepository) { + super(roleRepository); + this.roleRepository = roleRepository; + } + + /** + * Saves a new role in the database. + * + * @param role the role to save + * @return the saved role + * @throws InvalidDataException if the role already exists + */ + @Override + public Role save(Role role) throws InvalidDataException { + logger.info("Saving role: {}", role); + validateRole(role); + return super.save(role); + } + + + /** + * Finds a role by its ID. + * + * @param id the ID of the role to find + * @return the found role + * @throws EntityNotFoundException if the role is not found + */ + @Override + public Role findById(Integer id) throws EntityNotFoundException { + return super.findById(id); + } + + /** + * Finds a role by its name. + * + * @param roleName the name of the role to find + * @return the found role + */ + public Role findRoleByName(String roleName) { + return roleRepository.findByName(roleName); + } + + /** + * Deletes a role by its ID. + * + * @param id the ID of the role to delete + * @throws EntityNotFoundException if the role is not found + * @throws InvalidDataException if the ID is null + */ + @Transactional + @Override + public void deleteById(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Deleting role by ID: {}", id); + if (id == null) { + logger.error("Role ID cannot be null"); + throw new InvalidDataException("Role ID cannot be null"); + } + logger.info("Role with ID {} deleted successfully", id); + super.deleteById(id); + } + + /** + * Finds all roles in the database. + * + * @return a list of all roles + */ + @Override + public List findAll() { + return super.findAll(); + } + + /** + * Checks if a role already exists in the database. + * + * @param role the role to check + * @return true if the role already exists, false otherwise + */ + @Override + protected boolean exists(Role role) { + return roleRepository.findByName(role.getName()) != null; + } + + /** + * Validates the role data. + * + * @param role the role to validate + * @throws InvalidDataException if the role data is invalid + */ + private void validateRole(Role role) throws InvalidDataException { + if (role.getName() == null || role.getName().isEmpty()) { + logger.error("Role name cannot be null or empty"); + throw new InvalidDataException("Role name cannot be null or empty"); + } + } + + /** + * Adds a permission to a role. + * + * @param role the role to which the permission will be added + * @param permission the permission to add + */ + @Transactional + public void addPermissionToRole(Role role, Permission permission) { + logger.info("Adding permission {} to role {}", permission, role); + + if (role == null || permission == null) { + logger.error("Role or Permission cannot be null"); + throw new InvalidDataException("Role or Permission cannot be null"); + } + + Role managedRole = findById(role.getId()); + + if (managedRole.getPermissions().contains(permission)) { + logger.warn("Role already has this permission"); + return; + } + + managedRole.addPermission(permission); + roleRepository.save(managedRole); + logger.info("Permission successfully added to role"); + } + + /** + * Removes a permission from a role. + * + * @param role the role from which the permission will be removed + * @param permission the permission to remove + */ + @Transactional + public void removePermissionFromRole(Role role, Permission permission) { + logger.info("Removing permission {} from role {}", permission, role); + + if (role == null || permission == null) { + logger.error("Role or Permission cannot be null"); + throw new InvalidDataException("Role or Permission cannot be null"); + } + Role managedRole = findById(role.getId()); + + if (!managedRole.getPermissions().contains(permission)) { + logger.warn("Role does not have this permission"); + return; + } + + managedRole.removePermission(permission); + roleRepository.save(managedRole); + logger.info("Permission successfully removed from role"); + } + + /** + * Updates an existing role in the database. + * + * @param entity the entity to update + * @return the updated entity + * @throws EntityNotFoundException if the entity is not found + */ + @Transactional + @Override + public Role update(Role entity) throws EntityNotFoundException { + return super.update(entity); + } +} \ No newline at end of file diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentHistoryService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentHistoryService.java new file mode 100644 index 0000000..a8f7965 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentHistoryService.java @@ -0,0 +1,125 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.StudentHistoryRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Service class for managing StudentHistory entities. + * This class provides methods to perform CRUD operations on StudentHistory entities. + */ +@Service +public class StudentHistoryService extends AbstractService { + private final Logger logger = LoggerFactory.getLogger(StudentHistoryService.class); + private final StudentHistoryRepository studentHistoryRepository; + + /** + * Constructor for StudentHistoryService. + * + * @param studentHistoryRepository the student history repository + */ + public StudentHistoryService(StudentHistoryRepository studentHistoryRepository) { + super(studentHistoryRepository); + this.studentHistoryRepository = studentHistoryRepository; + } + + /** + * Saves a new student history in the database. + * + * @param entity the entity to save + * @return the saved entity + */ + @Override + public StudentHistory save(StudentHistory entity) throws DuplicateEntityException { + logger.info("Saving student history: {}", entity); + if (entity == null || entity.getEventType() == null) { + throw new InvalidDataException("Student history or event type cannot be null."); + } + logger.info("Student history saved: {}", entity); + return super.save(entity); + } + + /** + * Updates an existing student history in the database. + * + * @param entity the entity to update + * @return the updated entity + * @throws EntityNotFoundException if the entity is not found + */ + @Transactional + @Override + public StudentHistory update(StudentHistory entity) throws EntityNotFoundException, InvalidDataException { + logger.info("Updating student history: {}", entity); + if (entity == null || entity.getEventType() == null) { + throw new InvalidDataException("Student history or event type cannot be null."); + } + logger.info("Student history updated: {}", entity); + return super.update(entity); + } + + + /** + * Finds a student history by its ID. + * + * @param id the ID of the entity to find + * @return the found entity + * @throws EntityNotFoundException if the entity is not found + */ + @Override + public StudentHistory findById(Integer id) throws EntityNotFoundException { + logger.info("Finding student history by ID: {}", id); + return super.findById(id); + } + + /** + * Deletes a student history by its ID. + * + * @param id the ID of the entity to delete + * @throws EntityNotFoundException if the entity is not found + * @throws InvalidDataException if the ID is null + */ + @Transactional + @Override + public void deleteById(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Deleting student history by ID: {}", id); + if (id == null) { + logger.error("ID cannot be null"); + throw new InvalidDataException("ID cannot be null"); + } + logger.info("Student history with ID {} deleted successfully", id); + super.deleteById(id); + } + + /** + * Finds all student histories in the database. + * + * @return a list of all student histories + */ + @Override + public List findAll() { + logger.info("Finding all student histories"); + return super.findAll(); + } + + /** + * Checks if a student history exists in the database. + * + * @param entity the entity to check + * @return true if the entity exists, false otherwise + */ + @Override + protected boolean exists(StudentHistory entity) { + logger.info("Checking if student history exists: {}", entity); + return studentHistoryRepository.existsByEventType(entity.getEventType()); + } + +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentService.java new file mode 100644 index 0000000..f8c7901 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentService.java @@ -0,0 +1,298 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.class_managment_repositories.AssistanceRepository; +import com.denniseckerskorn.repositories.user_managment_repositories.StudentRepository; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Service class for managing Student entities. + * This class provides methods to perform CRUD operations on Student entities. + */ +@Service +public class StudentService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(StudentService.class); + private final StudentRepository studentRepository; + private final UserRepository userRepository; + private final AssistanceRepository assistanceRepository; + + /** + * Constructor for StudentService. + * + * @param studentRepository the student repository + */ + public StudentService(StudentRepository studentRepository, UserRepository userRepository, AssistanceRepository assistanceRepository) { + super(studentRepository); + this.studentRepository = studentRepository; + this.userRepository = userRepository; + this.assistanceRepository = assistanceRepository; + } + + @Override + public Student save(Student entity) throws DuplicateEntityException, InvalidDataException { + logger.info("Saving student: {}", entity); + if (entity == null || entity.getUser() == null || entity.getDni() == null || entity.getBirthdate() == null) { + logger.error("Student or DNI cannot be null"); + throw new InvalidDataException("Student or DNI cannot be null"); + } + logger.info("Student saved: {}", entity); + userRepository.save(entity.getUser()); + return super.save(entity); + } + + @Transactional + @Override + public Student update(Student entity) throws EntityNotFoundException, InvalidDataException { + logger.info("Updating student: {}", entity); + if (entity == null || entity.getDni() == null || entity.getBirthdate() == null) { + logger.error("Student or DNI cannot be null"); + throw new InvalidDataException("Student or DNI cannot be null"); + } + logger.info("Student updated: {}", entity); + return super.update(entity); + } + + /** + * Finds all students in the database. + * + * @return a list of all students + */ + @Override + public List findAll() { + logger.info("Fetching all students"); + return super.findAll(); + + } + + /** + * Checks if a student exists in the database. + * + * @param entity the student entity to check + * @return true if the student exists, false otherwise + */ + @Override + protected boolean exists(Student entity) { + return studentRepository.existsByDni(entity.getDni()); + } + + /** + * Finds a student by ID. + * + * @param id the ID of the student to find + * @return the found student + * @throws EntityNotFoundException if the student is not found + */ + @Override + public Student findById(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Finding student by ID: {}", id); + if (id == null) { + logger.error("ID cannot be null"); + throw new InvalidDataException("ID cannot be null"); + } + logger.info("Student found: {}", id); + return super.findById(id); + } + + /** + * Deletes a student by ID. + * + * @param id the ID of the student to delete + * @throws EntityNotFoundException if the student is not found + */ + @Transactional + @Override + public void deleteById(Integer id) throws EntityNotFoundException, InvalidDataException { + Student student = findById(id); + logger.info("Deleting related history and membership for student ID {}", id); + + deleteStudentHistory(id); + deleteStudentMembership(id); + + super.deleteById(id); + logger.info("Student with ID {} deleted successfully", id); + } + + + /** + * Adds a student history to a student. + * + * @param student the student to add the history to + * @param studentHistory the history to add + */ + @Transactional + public void addStudentHistoryToStudent(Student student, StudentHistory studentHistory) throws EntityNotFoundException, InvalidDataException { + logger.info("Adding student history to student: {}", student); + if (student == null || studentHistory == null) { + logger.error("Student or student history cannot be null"); + throw new InvalidDataException("Student or student history cannot be null"); + } + Student managedStudent = findById(student.getId()); + if (managedStudent.getHistories().contains(studentHistory)) { + logger.warn("Student already has this history"); + return; + } + managedStudent.getHistories().add(studentHistory); + super.update(managedStudent); + logger.info("Student history successfully added to student: {}", student); + } + + /** + * Adds a membership to a student. + * + * @param student the student to add the membership to + * @param membership the membership to add + */ + @Transactional + public void addStudentToMembership(Student student, Membership membership) throws EntityNotFoundException, InvalidDataException { + logger.info("Adding student to membership: {}", student); + if (student == null || membership == null) { + logger.error("Student or membership cannot be null"); + throw new InvalidDataException("Student or membership cannot be null"); + } + Student managedStudent = findById(student.getId()); + if (managedStudent.getMembership() != null && managedStudent.getMembership().getId().equals(membership.getId())) { + logger.warn("Student already has this membership"); + return; + } + managedStudent.setMembership(membership); + super.update(managedStudent); + logger.info("Student successfully added to membership: {}", membership); + } + + @Transactional + public void addAssistanceToStudent(Student student, Assistance assistance) throws EntityNotFoundException, InvalidDataException { + logger.info("Adding assistance to student: {}", student); + if (student == null || assistance == null) { + throw new InvalidDataException("Student or assistance cannot be null"); + } + + Student managedStudent = findById(student.getId()); + assistance.setStudent(managedStudent); + managedStudent.getAssistances().add(assistance); + + super.update(managedStudent); + logger.info("Assistance successfully added to student."); + } + + + @Transactional + public void addGroupToStudent(Integer studentId, TrainingGroup group) throws EntityNotFoundException, InvalidDataException { + Student student = findById(studentId); + if (student == null || group == null) { + throw new InvalidDataException("Student or group cannot be null"); + } + + if (!student.getTrainingGroups().contains(group)) { + student.getTrainingGroups().add(group); + group.getStudents().add(student); + super.update(student); // o studentRepository.save(student); + } + } + + /** + * Removes a student history from a student. + * + * @param id the ID of the student + */ + @Transactional + public void deleteStudentHistory(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Deleting all histories for student ID: {}", id); + Student student = findById(id); + + if (student.getHistories() != null && !student.getHistories().isEmpty()) { + student.getHistories().forEach(history -> history.setStudent(null)); + student.getHistories().clear(); + super.save(student); + logger.info("All histories deleted for student ID: {}", id); + } else { + logger.warn("No histories found for student ID: {}", id); + } + } + + /** + * Removes a membership from a student. + * + * @param id the ID of the student + */ + @Transactional + public void deleteStudentMembership(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Removing membership for student ID: {}", id); + Student student = findById(id); + + if (student.getMembership() != null) { + student.setMembership(null); + super.save(student); + logger.info("Membership removed for student ID: {}", id); + } else { + logger.warn("No membership found for student ID: {}", id); + } + } + + @Transactional + public void deleteSingleAssistanceFromStudent(Integer studentId, Integer assistanceId) throws EntityNotFoundException { + logger.info("Deleting assistance ID {} from student ID {}", assistanceId, studentId); + + Student student = findById(studentId); + + Assistance toRemove = student.getAssistances().stream() + .filter(a -> a.getId().equals(assistanceId)) + .findFirst() + .orElseThrow(() -> new EntityNotFoundException("Assistance not found in student")); + + student.getAssistances().remove(toRemove); + assistanceRepository.delete(toRemove); + super.update(student); + + logger.info("Assistance ID {} removed from student ID {}", assistanceId, studentId); + } + + @Transactional + public void removeGroupFromStudent(Integer studentId, TrainingGroup group) throws EntityNotFoundException, InvalidDataException { + Student student = findById(studentId); + if (student == null || group == null) { + throw new InvalidDataException("Student or group cannot be null"); + } + + if (student.getTrainingGroups().contains(group)) { + student.getTrainingGroups().remove(group); + group.getStudents().remove(student); + super.update(student); + } + } + + + public Student findByDni(String dni) throws EntityNotFoundException, InvalidDataException { + logger.info("Finding student by DNI: {}", dni); + if (dni == null) { + logger.error("DNI cannot be null"); + throw new InvalidDataException("DNI cannot be null"); + } + Student student = studentRepository.findByDni(dni); + if (student == null) { + logger.error("Student with DNI {} not found", dni); + throw new EntityNotFoundException("Student with DNI " + dni + " not found"); + } + logger.info("Student found: {}", student); + return student; + } + + public boolean existsByDni(String dni) { + logger.info("Checking if student exists by DNI: {}", dni); + return studentRepository.existsByDni(dni); + } +} \ No newline at end of file diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/TeacherService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/TeacherService.java new file mode 100644 index 0000000..fbf47fa --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/TeacherService.java @@ -0,0 +1,146 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.Teacher; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.TeacherRepository; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * Service class for managing Teacher entities. + * This class provides methods to perform CRUD operations on Teacher entities. + */ +@Service +public class TeacherService extends AbstractService { + + private final static Logger logger = LoggerFactory.getLogger(TeacherService.class); + private final TeacherRepository teacherRepository; + private final UserRepository userRepository; + + /** + * Constructor for TeacherService. + * + * @param teacherRepository the teacher repository + */ + public TeacherService(TeacherRepository teacherRepository, UserRepository userRepository) { + super(teacherRepository); + this.teacherRepository = teacherRepository; + this.userRepository = userRepository; + } + + /** + * Saves a new teacher in the database. + * + * @param entity the entity to save + * @return the saved entity + * @throws DuplicateEntityException if the entity already exists + * @throws InvalidDataException if the entity is invalid + */ + @Override + public Teacher save(Teacher entity) throws DuplicateEntityException, InvalidDataException { + logger.info("Saving teacher: {}", entity); + if (entity == null || entity.getUser() == null || entity.getUser().getEmail() == null) { + throw new InvalidDataException("Teacher or user email cannot be null."); + } + logger.info("Teacher saved: {}", entity); + userRepository.save(entity.getUser()); + return super.save(entity); + } + + + /** + * Updates an existing teacher in the database. + * + * @param entity the entity to update + * @return the updated entity + * @throws EntityNotFoundException if the entity is not found + * @throws InvalidDataException if the entity is invalid + */ + @Transactional + @Override + public Teacher update(Teacher entity) throws EntityNotFoundException, InvalidDataException { + logger.info("Updating teacher: {}", entity); + if (entity == null || entity.getUser() == null || entity.getUser().getEmail() == null) { + throw new InvalidDataException("Teacher or user email cannot be null."); + } + logger.info("Teacher updated: {}", entity); + return super.update(entity); + } + + /** + * Checks if a teacher with the same email already exists in the database. + * + * @param entity the entity to check + * @return true if the entity exists, false otherwise + */ + @Override + protected boolean exists(Teacher entity) { + return entity != null && entity.getUser() != null && + entity.getUser().getEmail() != null && + teacherRepository.existsByUserEmail(entity.getUser().getEmail()); + } + + + /** + * Finds a teacher by their ID. + * + * @param id the ID of the entity to find + * @return the found entity + * @throws EntityNotFoundException if the entity is not found + * @throws InvalidDataException if the ID is invalid + */ + @Override + public Teacher findById(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Fetching teacher by ID: {}", id); + if (id == null) { + throw new InvalidDataException("ID cannot be null"); + } + logger.info("Teacher found: {}", id); + return super.findById(id); + } + + /** + * Deletes a teacher by their ID. + * + * @param id the ID of the entity to delete + * @throws EntityNotFoundException if the entity is not found + * @throws InvalidDataException if the ID is invalid + */ + @Transactional + @Override + public void deleteById(Integer id) throws EntityNotFoundException, InvalidDataException { + logger.info("Deleting teacher by ID: {}", id); + if (id == null) { + throw new InvalidDataException("ID cannot be null"); + } + Teacher teacher = findById(id); + if (!teacher.getTrainingGroups().isEmpty()) { + logger.error("Cannot delete teacher with ID {} because they are associated with training groups", id); + throw new InvalidDataException("Cannot delete teacher with ID " + id + " because they are associated with training groups"); + } + super.deleteById(id); + } + + /** + * Finds all teachers in the database. + * + * @return a list of all teachers + */ + @Override + public List findAll() { + logger.info("Fetching all teachers"); + return super.findAll(); + } +} diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/UserService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/UserService.java new file mode 100644 index 0000000..2387fc8 --- /dev/null +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/UserService.java @@ -0,0 +1,220 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import com.denniseckerskorn.services.AbstractService; +import jakarta.transaction.Transactional; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +/** + * Service class for managing User entities. + * This class provides methods to perform CRUD operations on User entities. + */ +@Service +@Primary +public class UserService extends AbstractService { + + private static final Logger logger = LoggerFactory.getLogger(UserService.class); + private final UserRepository userRepository; + + /** + * Constructor for UserService. + * + * @param userRepository the user repository + */ + public UserService(UserRepository userRepository) { + super(userRepository); + this.userRepository = userRepository; + + + } + + /** + * Checks if a user exists in the database. + * + * @param entity the entity to check + * @return true if the user exists, false otherwise + */ + @Override + protected boolean exists(User entity) { + return userRepository.existsByEmail(entity.getEmail()); + } + + /** + * Saves a new user in the database. + * + * @param entity the entity to save + * @return the saved entity + * @throws DuplicateEntityException if the entity already exists + * @throws InvalidDataException if the entity is invalid + */ + @Override + public User save(User entity) throws DuplicateEntityException, InvalidDataException { + logger.info("Saving user: {}", entity); + validateUser(entity); + return super.save(entity); + } + + /** + * Updates an existing user in the database. + * + * @param entity the entity to update + * @return the updated entity + * @throws EntityNotFoundException if the entity is not found + * @throws InvalidDataException if the entity is invalid + */ + @Transactional + @Override + public User update(User entity) throws EntityNotFoundException, InvalidDataException { + logger.info("Updating user: {}", entity); + validateUser(entity); + return super.update(entity); + } + + /** + * Finds a user by ID. + * + * @param userId the ID of the user to find + * @throws EntityNotFoundException if the user is not found + * @throws InvalidDataException if the user ID is invalid + */ + @Transactional + @Override + public void deleteById(Integer userId) throws EntityNotFoundException, InvalidDataException { + User user = userRepository.findById(userId) + .orElseThrow(() -> new EntityNotFoundException("User not found with ID: " + userId)); + + logger.info("Deleting user with ID: {}", userId); + super.deleteById(userId); + } + + /** + * Finds all user by role name. + * + * @param roleName the name of the role + * @return a list of users with the specified role + */ + public List findAllUserByRoleName(String roleName) { + logger.info("Fetching all users with role: {}", roleName); + return userRepository.findAllByRoleName(roleName); + } + + /** + * Finds a user by email. + * + * @param email the email of the user to find + * @return the found user + * @throws EntityNotFoundException if the user is not found + */ + public User findByEmail(String email) throws EntityNotFoundException, InvalidDataException { + logger.info("Fetching user by email: {}", email); + User user = userRepository.findByEmail(email); + if (user == null) { + throw new EntityNotFoundException("User not found with email: " + email); + } + return user; + } + + /** + * Assigns a role to a user. + * + * @param userId the ID of the user + * @param role the role to assign + * @throws EntityNotFoundException if the user is not found + * @throws InvalidDataException if the role is null + */ + @Transactional + public void assignRoleToUser(Integer userId, Role role) throws EntityNotFoundException { + if (role == null) { + throw new InvalidDataException("Role cannot be null when assigning to user"); + } + User user = findById(userId); + logger.info("Assigning role {} to user with ID: {}", role, userId); + user.setRole(role); + userRepository.save(user); + } + + /** + * Checks if a user exists by email. + * + * @param email the email of the user to check + * @return true if the user exists, false otherwise + */ + public boolean existsByEmail(String email) { + logger.info("Checking if user exists with email: {}", email); + return userRepository.existsByEmail(email); + } + + @Transactional + public void addInvoiceToUser(User user, Invoice invoice) throws InvalidDataException { + if (user == null || invoice == null) { + throw new InvalidDataException("User and invoice cannot be null"); + } + + invoice.setUser(user); + user.getInvoices().add(invoice); + userRepository.save(user); + } + + @Transactional + public void removeInvoiceFromUser(User user, Invoice invoice) throws InvalidDataException { + if (user == null || invoice == null) { + throw new InvalidDataException("User and invoice cannot be null"); + } + + user.getInvoices().remove(invoice); + invoice.setUser(null); + userRepository.save(user); + } + + + /** + * Validates the user data. + * + * @param user the user to validate + * @throws InvalidDataException if the user data is invalid + */ + private void validateUser(User user) throws InvalidDataException { + if (user == null) { + throw new InvalidDataException("User cannot be null"); + } + if (user.getRole() == null) { + throw new InvalidDataException("User role cannot be null"); + } + if (user.getName() == null || user.getName().isEmpty()) { + throw new InvalidDataException("User name cannot be null or empty"); + } + if (user.getSurname() == null || user.getSurname().isEmpty()) { + throw new InvalidDataException("User surname cannot be null or empty"); + } + if (user.getEmail() == null || user.getEmail().isEmpty()) { + throw new InvalidDataException("User email cannot be null or empty"); + } + if (!user.getEmail().matches("^[A-Za-z0-9+_.-]+@(.+)$")) { + throw new InvalidDataException("Invalid email format"); + } + if (user.getPhoneNumber() == null || user.getPhoneNumber().isEmpty()) { + throw new InvalidDataException("User phone number cannot be null or empty"); + } + if (user.getPassword() == null || user.getPassword().isEmpty()) { + throw new InvalidDataException("User password cannot be null or empty"); + } + if (user.getPassword().length() < 8) { + throw new InvalidDataException("User password must be at least 8 characters long"); + } + if (user.getStatus() == null) { + throw new InvalidDataException("User status cannot be null"); + } + } +} \ No newline at end of file diff --git a/memberflow-data/src/main/resources/mysql_db_init_script/DB_Diagram_MemberFlow.png b/memberflow-data/src/main/resources/mysql_db_init_script/DB_Diagram_MemberFlow.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f92b8b4f8fcce0cda0a8feccd5b394ea447d53 GIT binary patch literal 156419 zcma&N1yo#3vo1^$T!JOIJHg!{z~B~wy95dDgF}L4un^oKxO;F95P}DH*TJ3OcTe)Z z=YHq>XRZHsvKBM5d-v|$T~%H6JXN7@lw~kbiBRF-;4tK5L2u#U5LMvd;2V&i0>5ww z{iFc?Aet)3fZ!fs|Gu^s#KOT*z{!Ec)jiVo7yZ>^-P_o1Mq-1E0w7dj6jjH$$Y5(5 ztE<`IsvL==Ml_5|3U!*X9edIP+du`MIP{g}9yyd0 z5l-vSzC6-}9Pk>L=HJF4jt716?-w{`f?R`tzhDV{0snjD_5SNQgnutoJ+s39_jC92 z|GeSFDmM`Uf%d*rM=6<@9|@Ea=+=?Vz{nVSjs?5JR7TqhpBc$=c;(6%4(0)2j*Hl}DjX^WVPOO9@?bGZ0-XDKo`OF9Qz;x&FR=#2`hdtQE#ieHB z=LGMQPrQ8Y2pN+Lo20Ss7uvrF3iPu}uFGQ2H@$al>{OmsgAKM>e>s9==Lc`ix^6xzTA5Z31Vh7~Wh7Abztwjoact-py+uDtU9|x{< zMW7RMuQ2#I^OUsC^rnS#jw`T*zH zjGsL8kh$0Fq`#LxWxLz8Ub>r-8@bMqbVy9VR?Tq6#|W_p)36>jmER7)5<@DH_O>Z46w%Y zI?=Y<7V-vjI;Xa##NSSlJ#N@habTa>J>R!ZZ{3NnzHHzoqNd6Yh?GBh%9VycBQ031 zGvpcZ?+hykhnNmvx8<&gTx<=c@;PX>YaREU=+ZLs#dvI##X7XBmgH7@?a5?Nr!EWf zW!kiyT=v!TIxO7{bOt~V$M|a_t1lz#+kI48J2a zUAUwP>}ysQm0tK?O7R`r#wxM;(!<{_7wO+cfy3skXfmkWXuGwS%Kh~3%V8mW0ZV=K zzIyBTc$+301+!AHMuAFkpnG_@s373Znz((U{O=%xtW&$-9sHacGB#K<@ zGfaIcEQTDlY;p|-@U#DDB*fY>|B(b3@tC{V+snd(r}UeRsp*>0Du5iR6>_(|;$?ar()?`R{z-;QoiTiT8qCfINe#qaf6~ZZF4w&gsyf)F-FC zjXB^QFvJHbz)F~=NpPgajwdIuDk#4BXoxjHyc*M`mE)N{=sKapr+O4$Cr2eU#*NloII;Mqz4diIrLk_{J6G75XtXnJF_c z#^O8sWj~QIN#KD=vA||b1Uj5gZ`ZcvkTHAQZuG@I@Y@1ndf{z^gFQN*c|M(p5%PZB zht^Dn?X7H2TSK{jMChOhkA%HRKy-ogLc&;}nn8n)v=Yrn`bpck_tMW4)v*%=4_ zv1Oq7w`j^uOy1%7Qe{YH7y{!^NL1FLnW`y&_B5B?ePi908ZG0+%rQ)>KqfyhlD$XF zn{>1=3i9Fyx{jl1yYkH3Bp(IWD-1vwR2st(TiI^#+z;lkiQNWat*Koot*^@P?A}7V$N5@ zTDMa!x_M?pmn*InZc<8f<6egIHqC6r(Yl~m&CaGT``yOowXg!iYwb_Obd?$=m|6yi z&wv@vWc910$b-E^R2ugHli6(DTJIVsN^Wb{s-qX~EduN$2z`tdB5nn(J_*tgM?y0i z{L%+8A)uoA2!Rk#b)Fg3Qy@RhGynN`_o*Vod-GPOF*U*K*QkRq2et17^$i$Wo@8{K zdOm5@#dI1FqXbbvANlDiHJ3}pLdn6U0On%6HYzvL8{2miH`Zj+;^6G0ur;qG_s!RI z@QYgVyFIWcqHQIx6YL1o$lpsNy}Z1J(-?IEM&Xzt z_;tQc{&``RProlpk z2U(BV)5MFJ%K|ahQLj&FBxiHBJ@?<9?rQ}X0T+0{_e-R#O|VUo2}j5@o}3h+rTr~s zvkI6ekQegnc2?$yKN`=gaW!~O{9+0$j{f#1fnUF+lr$DuluO{%4}%tp!~xAbx&=>u z=vvUA2BUijJqfFLeClv>0|eb;Hig8O-FblQG*6?^*4gXzCJ`UC7PH1j$~cR_WU0D@ zg*#(SndtXv#&Fn9Oe`#8l7J}j2Lt-7;kdts2XFXQE^&T!<0Y!6bGGUCRj{K(%D{d1 zDp*iIik?nid7Hb{&A07LDg693G)t0v+QKvQf(R`t<5G0?42oiqyit1ETJYIn>)j(4=LK~8YCwIW0b{s^Fw)#3VbGFF@I$R6e7&y+cbjfliA05@ z_tW^~+=6rV^OKWb$wnEwbaQ7=dyZtUMzDj`K+$2y8NQACr%a8-HpjeFNPms6LPtM1 zQ_%I{GOewxCnouE;n$?tXUydbQk^O>Jocup-sAMv}tDLA4$-R^7j!TdQC ztX6MRc_e{^t&tFiJ$kQ43i`&wH*#C-TozN9$}D2wBHQfDYk_N!|5?o&O(oQu#>M(R zm7F@<#JT>UVQzF+=u5L5lGM$WR-8q+-T)w419nTB)AI;}+~qYO9$_N##gyNr7!Hi4v#jOx zZ+%>3OSBWywij3s2Td&gs;v1KQ0yx;(eLI-NURanR*S7Fy;Q?A%|tCirOKRWK`eNt z++_k~KIMMC|55lXD8Dtkp8OHnS44{!bAK2`c+^F6rJkyx1X@8{owqT+L)zlb4wH%c z!3qDu>vmh4K9(;%>63bxb&sXG0*kio#G@c=1B2(~1h@ePeo_k{b z#`XXgffMm>#e0>rArzJ=dhG?z(~Z9CHOO>Fgb=ly9Ha?22-bkZu4P5PWk3m6c^K;G z$Z28fJO*`a;GgaeT7Wtqvkv#5-7yOh4qRmjwq1sQ&nXa6_8qM?(Av`LqopmsOi^+i zi`MYH1J!afoEVtu{9LSiw{hu4MY$b3O(l|G)njZ`Cz6@*D;^`=vtZS6VAO~K(^sE~ z?9u|yus%@Lt6wFZVtP`kiJ_(tIoB?FdSA3G2MBbGX^6 zh1>MD(DFBu^54Sq#KcOWFOG1d9l!>*OGeAi)(&U7P;d99W-TpEMG$^-o{3JC{R&9# z?BNE_sDbbXBM*(za(ZGsaLc5k>iE6ys=N63!@1?Q5gQr=RFK^25+=B27tkYIKY!0I z;1S3U*y!$OI=M)2l_37l+x(((!}LEFoe4)8(@+UBDe(Cd)hJz54L|^QO>jbmW zR_K#Ls}vP6nxF88)Nw>VSpqF9;=-a>CWbCRd=lROm+B&EtM13 z{)5rC=h&*s2PE`zopY7ox-fCc>oYbv(e3R7Q5B4Bwzo(480XedbVfZ*@RR6<^eHaN znqr%9Mz)eT$j`S%4gQucY}l%^m%CU3-+#GJLm+X)zKO@(ou*TCuNceF2iqC;A4CY~ z+~=P|KmNOnmtO`ql09N_MDoUhReNY}ncMA1n-=Fhy^Ngt&@KO2!$lHQNQkePXhvxy zFlbLj0@8-j`0!F=cmWC`uxwZ*FvV^V6Fw1Za`5v!xzzG+@?Je%^uHZX&lsqG{Jkxd z_~^5@SK;7$HdOEbaC6h$Kwa8qSnltRiCs%_FSUooSnn@c)`c?jxs}JcTFker zF+ZbeLl}>@NR5AFdAOs(j<>sFnccI0Kcmy&zb$041a`4LTuFa5M!4C$mWnrbWpDXr zw4^0lYk);$sI}ngpfrPHA4{uTu7XPWl>8R&)T6C@M3TiWwJCBM_cc7jydOJ50dl=R zc~wH%Zx4aV7(EX(juI)gcW)kzl-gs0qSkJg92?&4bzZJyYq2G2f-{94djtgeUBb8l zo9P8sa=M*A3c&PS<0`71bWne*u$`RxAZc<*9`ZZc7+6fWDpbH%H*`EqHApwYSZv~O zsVQAh>SJWeCt;mm6sXiYZPDg)l;ArUhYsW1m)3x-$F00R2tYc=Yzvkb*ffuxGuM&o z*AMvj%-yyZ@=q>~dFI#gSBk?FmCU|!|Js#r^g5ZfXyM_c18g<)`|q&}=w^0}q3+X# z)A^|bHY6?9RIhNv5$lTAI=~#s{A%iDs$a6UJmh6(0|%QPL`US}k|_IE{nHt*%6rS% zvfDj9K&=kSo;O8H=$vHmMP;xqd&|plS=NrXWQ`A&cesdL6~^Oec_T2+`&G8AO1RfO z{&cNz|BY3?;;<$+iuiq%WR_?^pdY^>HcfmcS!h0 z1+XrCH{<3Xl}jDZ2UddL0rnd$Co_vHgH}stvRB2m&ReVBHT|meo)K6t$868J0Hut0 z{lMiLya|uXk8L;BE0`KOCuG%W_9vnk_5MYLg|t`ac&3_(MlYb#!=?6kQ|GG_W+{)?!y`7XD^LWl6Yg6fC1wM45O#~we2 z?(hmxmddM!TEVMOQD$-(OG1czdDom2A^7oTZmo zE&cjcV}q*lp6LM&M-?y-iJ^7Mi=xm*i~yCS`%g?{|E{jGG#mum)QZ=zB{ZD^*&YYJ zlLZn*_z|8eMZu~rA*Vp^^Mi!v&idQ|Ic6!~HI}ixxH3aHV2ay+LH$a^b?2yChDFBR zYnt`o`aGx{yqyt}^NHz_{F1~wWz075{yy$V#LdThr9@{^Y}q?&UEN(W&}ltufl%nw zp@c@kH_LpafZi1*O5=~49#`+mMF2-;e^C=UFHg93UTwPAk+tAXVATsAi&Gdw01{@Z!fHDa`E-J2G&W z>>76QRw2#Y!oUz|mPpG`yR8|H%slcLzmnu$98oyg`&5^4sVL#}X@BBjo8{lNF@+aT zs#R4{8A;~iTJ%FP)?s86aAC4@$(6y5a_+tH_9{+Xk)T{&%hKa}xcgKoUn6qWe^ukm z$1=BLOsG>WaDC2Rk~1oyRJpsG5rcD=U3(0Rn^uScoCGVU*xTX;1J$M(jzSueH%r%k zH8waDqo&E6IA;6D-3sC-YXPILX`K&Q!?gc{Ih+-Kcm6`vgDmEggcR)*ma&{9v=QGu zxcryCHAJv3#)JR}%28NQuzi2E9CgmHHu{O&Pxb|A^AFfnz|YcL&G;`=>A&L{9WW`7 zXBa}PLi%Scalk9(U-L0DfiLix#5AuCl8r*hK$Wi%Ps%P#AhB@c4$J;4*;+6g?#+*!fL3lF&P((o^)G9E?vK8%t`i5~TfLxYyICb3^e*;@ znKwQbmGa8<9>l*X+5UmCv~^)OGmOdWzjF_D=Ts>dNW-m{4kLN~i30fnZ&x}?X<&E; zrNpj=kSDkPH<2~BZ!e7#UWpwpyf{|3W&j0p%_Rz2II%CcSJmxFp1+$2S>(Ak9A3y- zbkD_c#QZ_n`RhN^%tizPbhOinGUaV98svqUpY>7IKVI%`Y?y_Z+_Bu*G`A=;yh^n= zs4FZlm$j^BovSoaZs^U)d7Qg0%(46J{%F^5U+Quvmn#E*{4EXhVfOwQ*KY%NI=u^5 zg$%w__75ie!3q`_P^vIeN*_83+ABYJyvukcA|hfI@6`o1H{A+wqtJ?UUXwc zr@mE~F4Id)OCu?cZ(T3dG0J-0u2L~ECX_Ye|z!07x_yKW(`sv zw;W^2Edm=GbzGfLZlbZ|QeC58`Sve@q^YWjlHQeKTr5(&kkSo3>-1NO6H2D9?+FO> zR6~0{oUm9u$4fj}xbJ4CoA6V4DIn1LDED2hT|fe4Kc6VR)n4wq@dtuz04G}&`FxS$U};2KPIAvN9Fi>s(CAu)EYil1r( zY69Ej=-Ra}$-K~n&zd5NDss)`U|o4{LKYLxT%(-qc*b_MIA{jNM6I)pjkBmpeZDgY zvdEWv_ifTMN*6=XJd*=7W5x%}QR*f?pRQHvy}BNTDJh?lqh527bRHKjHk5^{7hc2d zM@_FHxE4&=rVhab1a4Spgoe&&^@nsDsSbJ5%2#@p3zZ(7N7h%xB{}j|m#A=OaqoC7 zvDf8?NK~|Ws8m)739+A6cu@RAaDOTmJseqjU2Fp}v9~ddf?;_S1Yk~ymN&VrJMwq) zC-JvjoSZMhtXvG;a-^2k``8CR)^xIYiYoDHARe8X)VgWU)uR85iHUK^l*0>v>A@EPii@2QIkCCIcJn=&hxb?8^WPu zH}eg7RSi%VHEjf>y}9p42`m-6LdMn8LrXYt68%iaMJa&SwC zNGTV_=nMkbKAyV zI|cD3>JVmD?i5ci@--2B2H^`^U1bjOOezLVAb>V3USO)7O=0JF98-+F1E3YL(u1cT zX0m>2-_zK=EYmBIMQwzaE`IIZt({ZMF{De?_F*z<1UysAY-8t;O%-0j1C!o&bY;2& zI66xCPY-N+wshDOd5&g90{@=+g-6eIyN?BEoUo->BWz^UPpr4M{E} z!wicE<g&mXxB~^T8#}|qXl~8$$C4j zjV^z#h_lQc)O7q(WR@b!WlkPh@6*~CQd=wM5Yu73cP{9%ycR)Bk)PLR24Lg?&+*!l zC}X1w409Vgk|=S6AKlObDBkFX+>QAE-i0}h@y%96NEqR^FsO7*HCF~$K0ko7qX5&C z>bBOE3aeoO(iC768>fa=I)+!A^L5Tfyl3HV8|kG>>LI$(Eu&>2E!&fzfPg@_0i^(m z)flA5)c)mtqk`FN3aa|oEqZqq9nGP*ko8a(H095Nx4mLQ&hJjW*`!P-DjP_uH_oAt zN&vu{K=$w!@k0`)i_^`UmVwGU?jJh!d{3FMr|)${$({k4GwMq86YSjF5|3Wz{@5{JC?8hzvGu1*HeK9VkMeh z84LFJlS?534}lp!9(e!wCs+sG^)(q0!7?hbzZ;Su5HAs#ei%NJE^Ki9#}{P&s`Ryx;F|o4%84#xohJ)}@%sQIM8rROZACk}+4VBh=$wSK$yFIWp4F&< z9RyOZYxX3^HV|EyQvd-VXFUr@eRe;z9s()Mn|ATiI)WDA17Y5F2g*rQxuSE+`UJkg z82C@9@H}nDc3Dpz=r0WO{JVQ=b%2*XvTM-y+Ih3x5jy-)5^13IT{z=kG<0HJfXz0M zDgT8c%uz!G=w}eFIF|jwZ(l&fMnT91sTgp^lqW5E%o9D$p)TImZcf6D9&0`_{Gt&V z{b5&F*g9U_D^@U=akQ;p1hlw)V~>kHI&g7xNSU25%oX?tJs8bUac|#0%61+R9f9IE zvv^->gj~_81Gq{-vv=3~Ss+FLxzVPpS6Y2T|r4`X~m z0FZ(aR)N><_nryZpZ2>+2R%stRU26Yd{OSVQvk(sz|45GQ!tmaYDi>eEPH|bZMJlX zg`P_Ae(NDUc#Y`W+U{JbBO9*9Kj6fIoe-omUkdI618^$CWp~ut9MG#gGy~l5)$-%R zWBH_E+C4lRTW!dt$@s@kg5Z`Ff*c=|8&* z3Gnqc3m7_{JSEqhqdgR1_J5$I^{nU6Oo&tc>|El{MGe3%DwqklZu*D$Wk~*QBJ_o^ z)oUW8T5a!JB|g=)E2@1XSp)zC%Ph8%)AZVV<3{(u4aMr><>NB^nhE^FWu1oQ8J=;J zQQOU?mWaq#Cr*FB*j`;vPPh-+0HXkxP-`Fa{>;EwFEHCfk_UaMZxb4@!vaD{x zii-N`^5FK-?{^pV;^GkYNDJV^JFzZp=A+PWyYkbK4u|&16?Cn-3ewThrL!V!ufgEr z>e#CFiKXxN0Oa_)xW~Jm1Fu~%?rirgFJ>s>;b&iLI07Tz zlbgV0tvTzDD-C_qhBhw`#U>;3vn|0zPdw9!o1MH zLCYvd*Y*8})JZ2&=SgRy3wekSiAREeS)_KRf^Flw-rL~d3hI~-!EfKZiOw_sT3+*FBVtV>HgFa9-|0OqN|gkK@6`6tMMf6_*N|>`=cXw6oLYZK*TECYoGz zV;L&z?gt5heX!0w`WXi&A{5W}jHVS`;<4`Gg18s=srukkSw9&#as{;~O~R=jJREmF z?zHuV*IT@R?^Ft)Xh1mOp#Jh2guDK^(UsBuU7W4@;B1nTYvZl{^1)nbL0AG!c+aJe zmju4{s%QZ$#vdrK6f{!ozDtiI6Fhf{&@8%oOG76E%M)PdgN0xbD$0h0BtCI*aaB(1 z8mR|aLzmAIh6aCX2XqYB7puHt1*Y(cyRi zibE1<8l}YiS*clPbD3^a%A^{m z_K(;DpB=hEUFKvd`Dj&v zMZ{$BfLFbl6(UeVDkOSbW*9A+5qs=V*egOtdOtlZLu%L6e(TV6V41$IvgITI5gGN< z8$tQB9;H02L>IVGN6?fE#;FpKn8?7h^cXW`wyS>6J+ z9bns+!3Q^=D%x%^>Ba{r=l|Cj9*yB5Y4W7C$3d+>`AM3M-)cnz_eDO1e&uWk zxyYJjW0sz64N<@&hsjo52xFBP%zf&HWh~qpsuzusiM83+EV?&;T08_mh|dFwv))%> zoLtY21{qjAUm5c(JF)vW}is*712#F~kq=>qu>G>Je^+=0LhhN*FR} zfk5frDUse1mErtl%o3HyOvKWv?tCh@t@tlfP6yVlvX|1+`)h6@?~e7WszV0_H6r_z zccoQ&@qE=b$NaU^C=rYaEY2(|Sqf3A76R zM(3NeQp9)whCvit)t7nq&6B$D>wQQ@0~5pkDZFaD(nfeQw{&WQ^B}Hf)wR@%!<1Km z#?!N?K?i{==Xg%7DOWfMrS4hD4hJc}Um|Ml0UIG+v{>E2KA5jm5$t0nCBE9dLvUsm z(eD3f;)R%5!$EOSZFEHK@T)#whIXmjx%1V%8LiXE>{DMa@@a;VE4FCr`Wxfxqti3^|pwdZy}Vj5x-=Kin}<^ z?i`QUTQQGI!G4U0o2@kwv!Px3*CJ2x=l9T#Cw=!kGzBvi*i~!Gj&?Btfgtd>t5H#H ztDF&~Iu>)DvKQyz+WrmnfuBW-ozlXW`#inQY( z5Xej6%|b_lRtk7^uYgDMLK~{zElu5-IAO1Mw4|{B)T07oiRnOj{dSvF{ zn_mpq-12Rh#WBX9h+j!WIS0rkRw*}GV^rI52GgVm9U~agvN9gXi`sEft5knVrPCtC1G227n_is^@U()B;DWIWLcA6jpR& zR4vL=1v4HGvT4F3d5vf(=j;N$lB{Yubb?a4@wfs*u$q#2<|y5Josy5Lgr~tjo-WIl zBIb|b7Alv#*3(iSH<=!GTvvwR1sr!n%@z(-llR*IMVSFwl9_?^@wqV!DeRuuOOh*L zy{a2cu~v^qir^K0Uju-SFxW&nd8!TC0~`s%hV{5rz|xE3fUEXvsm`iaNcyhuQ|Xy9 zZ)kZuAH!&jfO#3M_LbSfAA>HTq;OfrX@(7V!0HX%RpMrFBZk z7eCKV$`5h0qz!P_8K_h`JDYf^GzWKj8kj)CFH+h+0uoW}{pqVot$27}OJkBl z>nu-mW8wG53WPt{ouJ0#molZj`@LyvbP-2piv81NOwAZ6?9k@CzO!d}Q$##5-c7m~ z;}2<}2uSztNf-nkr!)}(s`-3W6@9R0GpT?q3d=${*{sg zU2S%|d2;Pr_stsM*1UI1(j`vH5|2B5N#diF#lXaHEM-vhl7uEb%p?hnS^>!TcnV7e zRgC~JaffjYE%+Y>ORoJj;8BYg1^iv?@#=g^4XlmR)Jl!mG@jJlz){U+9B7ETa_?!X zF33rS!oaWn*`T%3H7$y{{FCK^y;d#~5QM^YBi9`L&dSKh;IfoYFy@9s+mMWliiBW_ z-Fuf4AUf84HvJ zd(`nQJzNJ)@nJHQkKxXN0M0Zl33+gnD`c_*9;H5?umk6Hr?@IJK1t9{Z{!6suI0w5 zkaKXy0^jGQhYLXGn76etez#))wFqml{cuuVWPrCC*R-CmtVA>R44n-K#CrCdK5>(2 z%q$c&#Ql}*$wu>|sG#63xcQ#t`_DRn)aVmygp9NhPnID9D|f=%(LM|;&LHaFLWqt# z#{VxRCiA)$%Wb{XgylczuqRhD7faFVwmc(3u)LRU6hOFP?TlV!ao1H;GN2Ua-Ek5yiJvG&Vji zsrls_z=MP_14LWGtV61N?iA5&emf~6&|Ogh#udR0>d49UC39HBJz$qaj5={p3 z09aJj7fS5fwy41Y9#qb1*3c%my_nco$=Yi7G@iZx#N=6iF#yA?0sI`mXWC4a0)-tE zsOXrOKy2#rL5I{W+a{nB#~7lZtgNi4m^M)M(X!imFN{FVn;)$cm_`St(7)ItjPlu7 zN1>yqq_nyz3?E|4&IdDL&sJOo&(^>wx0KeOuy8}x#16lk!WKE~h3)PWxDUT`{{y!+ zV|X$C5Kw0SZ6{eiA7HSQekp*}BIPaVIHxP?c*`~rH1!Imle;i_fpI<{1N81IU>xK> z<21zocXmUK57l~^I*Vfh3RwLwLHcvN;$C%FGmala&;dZN=ATL!;j+I7^53j>$eVgJ zxHYxYo9r>5DG^4KArB56A6E`+hMhAcFb?h(eELh_5(A0YaHirw$3*R;%Sn^lytd|8 zY*I|-n9k1560M51N$3gIA;mu7`oFgXt?0aU+Dknojsnv2WQoYg3>%%z zB_t$rkvK64Q|0S7ZZf^_f54OC$tC_mpJ%%em`b$oqdmD#97cflt!*G{``})knahcI z9Iv>y-x??@4>MJ?#6)A$dtb4aBr5AG!vyh9naI9c=+7qK+e>^SpRBh1RfTp#B(-I+^6s}ggBWq}7mwBUg)ea8zRND(!W{I$^ike>lv&fw|m z11;5l=tO&VWJopQoz|SkjZlJ^sLwpoSMW*aegeR-fR_CN@ZN=qfyFp{*uonn0{bGW zhPX?R+t38mBXw*qq0r$w+H9SCc-yvFz58 z8YOnShNOD2>Nl_p5TE&nvde zNgM6QW;qZj%HGvqGEdJ(=F`D6-OSUI)>a`;cg{^(umYp+xNpu8&db*Bo27NVWgkhs zJDVpCzPKX_#tCC#FPX9%6BbB-)MU_|;vdl<2>FIafj)x;0u6YpjchEo9X3Cav3GS} zK5n7&>N_nn-y``pt%9Hu|4-uC0ymFc!hvnDDK&%ki8WLcvMhh0km z{R20Z14FJrSC`Y_jCKFq%U%N9yQjrEKrZrgM7DtVvdx7wifm!q({QZYdMtXB4)CVE zrVasT=Z9J5@|!Kc@RMX4TqYNIz{>JX0EA>Aw=l_tdlNizfDQ&$UYbhAF=suy;CHcxUXd0tUS3{C zwFWXVGGb!AMrT^=5)o5jo4RR~NNcK+j{sI@{JDxZ%PGNJdrNeR4p~N#rx+Fi=w%i3 z!{~n{7!npAsmK%WE1mk)ybMv={3kw9EBzc0T$+7DS#mS{%Xw!-(w2M_uox@0)P>6j zas`r0gAnwAt?mKL_UrT2h41(ABc~BQm-$$|8&B&mtANxVWPA&^iO_Ns#PID|puj>z z(6pJiGL-*eHE^`|-TiYvn)aRKp`P)@KoV0G>w4be zA|PO-ubf7=P@2R}fK0sf5(FoTgv8n?H3yC7n=ag*-H7_1|$5*NEw~lM{wOM-XcMqs@~nxLX61`_UAs1Wyk_=4 zhkpM2+21cOCuc%nG3TOfm)bL2X#M{4M|?d)DZ%u%a-}hp9BKesu(PH*^5SsI8Pd*q z%OOZLrWYg)bpd|YHTv{_orXGRDBK^`n51<&FgJpaTCdbecU~~k`oVEg- zxfh}WO@cP(l}FD`q(k|ghZSqRNucK($JEw~y% zUFP5LCFO^VjGb({Xce#_O?}>p-5mqDWSL$`+n%4gI-T@QO-{_Cu+DN)k3IJE@yqm^dj8y=uLQqle%%)=Z zaxi;yn0BcKcNwr-anbQof%vw{R0>Fsb9Q!~QB4FK=OT_-e0PAqhC6|K^g`!ACJsn2 z1o2+zw_nDlrE%%(J+8^irpgXF{)}0SNJD;1Aj^bL?w~)#Eh@(jw%I=dm}*TW2USMsZQ)Hk84z;@9l*wCJO96 ziUdmFiNa8#a^RueG3Dm0?JIoHlJO9&jYcy$AX@~45MsH}LS^?hI^j!FGHr8m+#TC= z#XZef&eIPFysM7q7|-$S7m{M)XkxQ;0b1!b&FW(}+`zzR(j&l?XO9I+#`+^BvL<{$ z2JD!uI;U@R{k(pJVGs|(GEtawPx|_p0t5LFRs)83?{=_9&Z5aw8-OtBhjHXNz=y!$ z5sa~Z_$lOm_-vURI*yEqmj8w!q-Kf>Q!UzNTzfdGi9 zS8H3*;#{F-Y?CS$QRtuZtd5su&q{(Q=O{S}hNDb--ckbmmHK59FN?zEbE?SvibZ+r z(+^vjz%KsD1>lKpU1zr9ZX1_y1Ek9dma!t+0v4ug>rITw#X& z46Hf^`qfRp^Co-PJjvrqS^caow(JOl*(`+BzMTSTIM%Kn3{+hq=I>!CIBvo|h=>s1 z#B#&d%%r4zbx}Gm5ceQ^ceVeQzNVX7zy}bC{IhH9veRO6Qy{|9k4#nFy<;xunhq{U zF|?0RM4Li1ZH#y&v#Fx|()!br(%`qy!A=oQM5b97!fRa|XJ|YnrB+%ul)p1~AS~iicbzRCd`5?D7oIHTE(o-k!Rg#8S6#Tb<>D;W_3$r3+~)n0))0**b>h+Fs$ z*AN=@>t6A!4tL4n)0>scH*yKDI-(RWxGwcbnRQgg(aDfUETG&HNd=4%jR|s##!6$1wjmYBapH!7*Uj2XrO~DHoDxh?F zCFnZ~a?9&j*7~kKrWdChpq`+vgOwoe#M{uW1J?#J6~%_M;a}r}-IZS}P-XuqJ`2Tsrg8!n9ry4l0J2`B zdW!5H8J`%$!w7UcJXN5$YX{0`0Ax-Xc&RzJ_#73jOC{z%e^4v-A7Ar6JmA`xRt7Cm zUh65}hd}P{%Boi%pSRpxlAQW|qFruEEV$MjG8Pcgp0~v6nhQygWJ>gB$=W zs#jn+SN4)7#Gq#Mw*MVA_N)>YH^#uklOfkuD_Gj(J~ow&H*T`rCdSV&3rO=;FpLO4 zn|vW%4b-zcp}U`xXCk4^f%>h?)v0Tqsn-sX{<+gQdDOdqW^~WVT|I z(gthOhu6-Ce`e88t0jDO8O*c@0!{dqAMs+VYF?b+wpFAQR(r01fCQN+8>3XOi}|wl zx$FF%`GaO}pwx=NFA)!(T5Chti1)%{7;SztEGW1M6^@yYGuif{SVPQsHhXk5=;O!l zNSN}@&ZnoRQ$Y4Lz{BJ<{soAss4(t=$1cPhc#i!FL9 zi`_ul8E!A`HXc7vW9rmKy^wY!x%@v9#s<~mZQ|Q{4O$CAA=NcKlKltd{x^4}q;ZEO zX+&WLwxV7sh3CIidU!MiYK5+_R28HBcpf{77s2=Q>BSy|CH+6{ps$AWTIS>)?HLc0076UC zQzxM{f4X03Tbx$D#>!_t~pa3#im{L`2=+E?*lLP7Gffmh**uHsODkRudWYi*=pOkDSbd|ME z*0xDXE*nsv7C5wF8@4%`6zV3w%#OWox<7CSfo{WSz0t$nEVG z$?rdsxX;tn3H=}rXsj_t?zRsJ36YYLl06#s`K9^}C>+c>gPOg=z&!CzYrP>1jsh$Z z?^X1g(=oKxzSX?_OpDB)?;n=e=3z90re1AAL;teCx3CZ5i*tLcQICJ`LOM6RlqdgQfb#x z-v4;A&Gn~ZuhQ;u$fS2PCqA1G`O=efH-rx%ZqB!n>1d*Tm}$u8{C~>cn#nJ1;itO# z`WXMcMig)>o%2t~Cpl|$T9)P-Ngp-n>!&@pH9-lZ7KMP9sJCZjKeQ7P%0EyF4)u7t ztb42v>_2&J(zAYoO{bcZpHEFqtq@Y*{)vm&5`%7#iN44Wk#(00fX<)If~x;45yxXj zE;(+V{EoKX#J_^N6>UsRhy4Dw25wxYBgds)NgyS4)UU02ako7@)S|0O(fpQ1n5i7N zf&W`Eo%+1P)gQf@xwA{ZtyXP|Hs4&#_lkXlenLhkQ_l>~$z&-vRnI|@tv1i~x3w4n zD2@Dccrty#-?t_lb`I(s%owi$sIXr<2=6zxr zmtHu+uRnqb*7qBr`-XF)CF*u0%AnZ9T(g0OZ)(d2ge!bQhDq$8*nhNjq`I@~8onRP zIDz#2uH-c;DihD<&)A>g4ApFTqp>`j?L;>UCL}dxyL?G+{Mpk4oBckq zx>CF_VO<@2ZGX6Zoz0JHGn~^+E10h~C%D0nm49h2Y4ZmDQ`Nrk)32W+mX1<%Cr`T< zV`>)fzE~Tj9Gdd}sJhg&ER|ELIUCb#(d&p$XIqrym(=KW-YnWum3FV5isxF=9|YMwT%&^~*|ynl4k(T)dWg zMUM!;*FaWJ^cti|Wv|=by{3~<{-CM&LGz=gQer}amae9Hb2GEAoUXh12ls7F`IN!- zf8VO;eKN&KIOZLKGfu z6*TqmN<&^kQ&+JuL4pR|(XN-6=T#4yXc-H9OWu*eXa|dxTYTp(2Lkrrf*U1b=X~9k zyMIt0zMaD(7o&|M3qPG6`2O=rcE{qC^{z@5!{Pp%r~|aCUPMUfk$G_UdQqgacB$Cy z+;(H`Z^s=Rco){E^h~Izho&A#%tBEws2{2~`@d-?N3-Bib*U%zmhy;)2UB(BkDiq* zp1-#R?Ik+MoliJBwisLFgt(j6wReLWhTo#@Mv*@1>uIpd+(TW_(v*i1<rNE^mZ=MBN?bTUKh-9X)1RfIZ)rMw+HMG>vIBq`^?2Y z?g5S$-SY2_hT6xw?j@l{PtT2JV-=>Rn=aS>LS4;@nKmS44wuuuxEW-l_EY`gbh^3P zRsYGA28Z>&fZQv80hhh|%i}RD3SO5zyk$KUxX-3$!*NN1?*X|3*ZKwP2c746#G$;8 z=iI=c!|6%bB!fd>QNHu$=y1wVp5(7Zx8KFuz36|=P#<0dpqu*dfpb@z4gImBLwa`5 zcSiB&Gr0JFD#oADGvP9k44wgM|Ien%EDBPNgfQGFV~_u~!J@;<`b)flZoc?md?%)d}4;;8MGpf8iFV}-{>*;R^kn9otM;P2e zwJZfAC%~Lvg+Qhb=C5PQ749C|GBXw5#%|*?@Wsrv+q>9*=qj(v6-xw{QEUSHd9d*d z@Qj~x^ED)H+M1fW-rhgM|HnIsS0PrOX7&Sl;l)whLQIlHX=KMU7x_UhQInRQ|R#B@-21# z_j(WE?B20mTP*DR6bb=NPP#@b-7Y-Cfu;G(D6zx=Mxih}yby|7FZZU#1{DRWBDDrT}wAt5$&(C5ZPBSZG7y#+f5HjcB6;Vh+X z$*;O%ZlsdFPi?T%RBi^~_)jz)85@An34H?_XkmDXz%I{HM*_J6x|B+!FjfI#z-GD# zHaJ_>m6g@id&HUrn|)gi-h8~u7s6g_H22!CZf_SRQ!SNjiyd^RzKjlXq{Wr&Lf+R6 zv2;Whe{-EPKCxWxK1Y5Z9_d1s)qEvB$S_E3^T7_UQ{KXy#ckFgt>8NLUC>Kcsi(vF zcuh;DHaKL|;b>jY!2vq!J*^n_MUAW~l4e)Be!~Zy)W>rvv%fL{Z}5r*u}pYB9Z0jW zD?3?gKxR+2N|P^I2G^IBFRE9OyvpJbCZ}|8(Hk2zDEUgVIhZ&^rt;fgZ)1tE-%EC5p zQPOM1mrDeD4b3bvtk3W}g$<(lj?ZO8X@o7|96xR!$D-q^SNiZga5+SyTgNU=rPohqVZqaFUz^OT8< z%+ZmYiAke^qd?@NcZ`IfSQi!H_05<7_nK~XBhTP#sZe#|dQCD{4LPjOE zpl-zuO#Bq9^w<>qT%U|21>%Yn@{y8Sg2vOtx2^OR51Xa^>>B>?9RBVqkoqsL^2NSe z2CNFFx+tkJf79YnS6A*bxAeImPD;lxf*F;58Ig_=S%oJX)ZAB!MeFRM$pza-t=XlX zE&AaFLt!>Wsg7&-K9W&X1T}S(>v9yzVW~XajMnz`1Fb;Y-EcQQ-%?mWLrT)@xjVVl zBl$aw$%2%BTJrzLi1bZR8dq1b}-d5~bnsia6V1y}4>JXDSBy;oN zs`c67>KP`^{VtHQ2@4su8h-9Z5VxP+-pKKCYWz7nPf|KEee-9k%TMp+KG-~jkqqzs z_;fD($EcoI?ox?&)lnN}N<@+1Vh7Q3{S<4+@gc>xNI#ZG)-}6q7%)1mq0>+rFwsll zP3}bAcjz-n;E8Fj(`j{i1^4-S%#5AVa;kaoG%z~4cyY1b&u>32j*!cSo{4F=zdx)R zk}YeH&$cg#Ufrk>f*+DLv_<}NiisvVH=h#9K$ZW4@_gw+yv;b$#E%+d-`w{Z3-1aE zoGf@%Hnp z921}9Q?{Y4N{Ej2-Ikp3nE8ZwJ!jgl4PiD>{oA}nI$h}y+KZr$`8B;3opN`&ZZWlX z8DJ)^scp}vUW}xh(5Mu9d7Y_PVaJ~kQ)q_iki4&Q#A#S)x5v3efv{Ko>xB*1sx)Fz zy&D$RGJI;g?ZjtknVnfOz1sS=uBUL5y98pQHwOkt*I#8A*hgwy(X{}ali z(#*}p9u!@iaRrbXs`(L_8BZcDYhBQxFrV7GdEKL{Ydjn7RFCOUb7z$QMd*iOgF zi|6>gTaEbJBefXQ1c#Ci*PtC6J7*ywJ~^g5|F0n>VmYFg$%#DIurD2nH#>+yz)?A* zNsp;|6X-u6u_qrFS0f_q>M~85NnW@7xI1K*_!;|%#@2<0jb#aoYg+z>Gai$WzQV<@m^V}<+NFTr=!g_p;eG#sjtl`NUQsu5&i zbwTVR!{FG+3e-7Kszrmt!^3Cv@pQV}>lIr(xAUX6=ThUT2Onsl3^$P`zI-(-?aFcX6dEbM>+d0``B>iLN zyk+jlm5Q-^BNz7+K3Nz0A*f3P8uYC|xBCF2uP18s%(|MXY|`z4sID1{-N8`!hQtfF z&zmaA#wIlQ#QR~aXz!4CQE{dFraM_Uc}W^i2i;!(tkN8u<VCHI)*n;( zNnR-}68snZB3-^u6jSZdC)TRvY;oX%kxZjAPd5^Rq0Y@ z-M8>tFGxB4312VRNw{ybgAf*v`>b7h2AO;tZ;6>WzX8t3;Epn zdmG38N~~#|x`qf$aA`Y}rYjFK@=78(7(xwaJ!jCN9&7auOxHN0I*dN4NgK?1JeHF_ zW4G@5UhK9iop2-xQb6#p?O$6-+w#tV)cAhAv-h{@N9q< zFMC3vmEsLq+d;~?1qyv415-Wb5#%AB?wJdg$`$83Kg|2Jfa^$owN z4mx_;?L@BUP7NQ|J~i2iF0`2Fs;XN?^wzhkC}wL6GYE{=4^q0YmjtEh{J!K4NgzQ=KR6IrSn#a(^!b#R zbdZ~WKAKLGoQ-+hC4sxM+Zt*{H^k`}+)mPdJ7;0!p zDa>5ubaZVMv8RwgPF_*xZpz6{rzCQ6JB&;hGU>*>=U(nBoPmY+{Q1I}WvSoku&5%H z9h~7su>SeLEZfEmUZ4bSaGBk|$4rA>%n&;_nvY%hI~|}bT<^U3fIrevdK=tR?Z|2v|Il{maP|%92M8f#`)9NqtO$2A+x0NrZD%gS-#_o( zv{8-ma3Pv(G?uxRa5FfVmUivjV4^|ric&{?prE+a{e1bya5n;}Xw+IlY^ksNse$e@ z)d1K~{QK4!5v8MMMQ%=p)0%0f>W9%-O;6Z9WlBw)m!+ls!fq!MArj0^Mxh9Lbzufl z!ffQnFX!H69zED~?8(r_T-sUa^8!^**u}SEAS3u^G6&!Vv|}Mv!Wq7&9K!Z~zx>STAE$-Jp$(~@3&-}?OYe2+td)pT ztmd-sBkbx7>CSaeD4A7RuzJ7=f>Xq%#`_1pot=d^H9Z;0qAsMjce|kA9WygaW*VAo zz|*#O!2uf$kmz8u&5}z3EurlKMdBDPHjh&6MHvBI7*rEO#~7GP|67_8YR~Vya^0!i zv>SvlOtK9v_pRyQ=XR*S4d#XVB;O|@D^*v2y3!RwFS;Aj3gcxiCc)Rxu1ut44t`rM z-T9zLQhF0tAOAJ$;p#YJv^37h=Y&^51ra5b&ip+Mt?|#7=WWdr((s{@5g`f+M7$0r zc}4k%MReG7v0sRzYwZ)hg%*-F_39aqQ5M+U=RGNt-fnJy_0*pa|? zB0hvB5$ZHMeOfIMm~e2oZ#r>Zqx`0+@?e*0e2{)$x$GP1nVLdX@2uy|&-Y|mH>=%as&&(KTpowg{flD`@DW!+MAvyf_V0DjMFc0@ z|4rYT=WD66%eNXHMjOW*NwR^?fX2QQJfIHJA zDO%-t7~(IgWBRy!CqkCRm*C?V7%VF!d(EI^BfCiMU_kFK@H1;dK-LyEzf7&qj*OJg zJkKKNOoPq(Q*0Rz+8H(egOA1Q>#I}7i>>4Y#J0L!&2$!te$>;UZCSEkyYk#5WpI;D zDQ;m;^X&FKP)qPBbKJ=Kk#~>KwCQ1^?#gJc)EexrQdj4=O{!U1DD7-@({{|TsR=Xg zh6=(+9RRS(B3VB#$slQ&B<3$0Lf~N&7IynkqjcChqmSlNkbkM9P}i4ud0wO@v5X$NjgqR&7H2i`!xYv zU#8>hn!XEQBP#k+e7-(26`DQQ&AwdY3nG(gjW^MvM2}|VV|l~CBDL!3W!0(cttbCAFYEMp4<`lO64N`qs#j$XPnQPU^bu8IFvAUSotZjTk`p>%; z^igJ0!qWPC)2{zM49t*ZnJK!XBP;ye=JovdfF7N)E8q3NqqO{d?V6Aphw~1qe#h6e z%GITNyhC5QXG+A$$K;5s!cH<2c7BTA46A*b#Ms_Kl(sT8b%~qFT-~q3< zwUDd(es;`bd(2zr$akTt=v_bT&Yh$Ys-ZEOU45lL-yUdc7Yj|UKCxh`_CItv^gKJw zs}wM;XWE;?B5glS-&5MB$UwmAQ4a z4X{rp-Z^NUDIq)JCH(6gC}|V6XmK=T9S^{k5u&;F&=^R9p6a<$o@qJ7M)fSRK8FTQ z3!j*bzL9x{rko_BUoKZIy`d90V$5M zwHmt}$E>t4CD#w6wPA?LVZPL}>zsv^J(cYGwNLbk+w!7%~Tu3_M(+`Flf3S;s?&r9dp!;D-XQ(`pYgUdL5s=zUs|C`|&>f?d-pV z#n{V8+a%?VfMkULWXf=Ch6(%C+8=5mHI22vd(d6pFL*{2BE1fS11=p{LHE}|^??o! zp@l`%?8*F158@w2TBJs^jRET95-!K7AfZO#Lh0=6W+f-SPB~+R#U~+Zl90jDb;npi z62Gbg?#%UCcKEeU^H5Tjyg~k$NhQzf>@+|zyBaz3G0HI(R2>k@<1{yVK>wzGYf7+d zOFu5EJwALwskME3FhHih#*0;f^?iJpv3Pr*LE`0b-uCz~c2B2v=>4#HtM=%18OC&= z+ww4x(XyqW_B7jSI7$`}8SfS{7o1_iZ^W=rT#m;SLet>^^$0vlFdaP ztfV!1Y)0D4`<&Z^yd)dx4>g;n2*849YLRDF!H*hmW{JPx7y3djLY{FE?sE~;x+R&n z2`Wm4$4zT(1p0;;zn73u5|9zBaj#qpS+FPAE)tQFsu4)pAe+|CP0+=Cl!@3gxGSW- zuC9;L31^S`sco>ZZ%~LF>;i%Cs|qA|_)YP@NSF`$0l+AOO}94E2rGojLx7!&PgswxwFGg~X#Drrp?PQ0-|`$p`)+XAbh7AuQgc2j z>j`KGW4}C~t5_=-Qd}l;Hjmyn0N zPya%&%SW@R){QMXl7#(9yTAAIwTVe6@8j2OWa{L9%o&_O?___A@#WV}F$aC9qLTp7 zcE&4gR?ZpOG;dLUDIMZ9UTkESw3TZ?|9rUzHpS?AUjCYR7qap(sTZ~<``mJ=Y!^e5 z!lKdoxDyvCX=zy&FTP9t#MBR^IJStgXtZyvKk`k7ik_{+*U$<&hc@5#{7XL|_>#r9p_l!U?4H@pp3ShTU^K~PKmuyWw-^xd#qqi-mu56oGtmg6bK-AU+ zV9f8?dSol)zK)pDPz_y{901_>uW_SFjRx1mI z&Jw2t`~`YzyxuY0^IoCU?wudCTCl<>b77!7z~IYOBkjaW%*@QGS5mC<)axweqx0)d z%eRuJx7km>G`{U8Kz60^W2uz!!IQZcWMlf7x1m4qp5idEimSKu(>Y+k`fd+fGPX5Z z*&Oz!S!Vskh=vP{(f2hwDVYsSH2Ge@(W%=VWvcd@2TzYXx&0oQYSQ~S+0tpRz1A3W zCh}XViVt@=K~yE6XsdsVgQ7N|aya)+#VR(xC=vTU#>C}%j#Mv##^sF;rDm7hEj!ib^LvYnDoD>lej%Uxb zXz94DrWJK{(-RUB#=HlM=R?PGCsCmsj$&9r(7E*hkU<40Z%0ydg+{reX3om(p?OKK@Z1!<_cn7sCksU&d*9V);?qsXxdY75|*jTwT zRtzl%-&Ul=1jodG1@@+*iXM=baK+lt34S%*G-4FAAZTxkPlLg!D!7m8HcLNmwku6g z<`jBLCb!|shdUjZFn&kq9nVw$2~lj9GLdHK)76pAKFm>3@fhg)*T z_KSZk)Y)ef?I;PL1+TR@@j%8lobf`!zl0TgM6UAo;#eD4RgB1Lj2WU5`{eR%IAfbZ>j3)5$)zxqEx(cVqV@G3TXBl1`pdq0V`1*wPQ@44P+*xiA3c#@z%?#Ag-68P$GIBhm0&HrsQJ^dkX&L8v=N>6fKH96>W^Txb*fF7-{mA#~S!Z z1)6_*z10XO0KaJ^0q#f zE+#{8_MMNh6SLt8or>$VcaFVwZB;@31{Zh1A|a#%;+2{6fCxy%acj&W{E*-*NC+v@ zv1Vhvs}Vi9vQSu-nj%+(?0bjm?KlMOLXCWGoXeMps*vqBOx=0amM!@sM#dhDaAp6n zzSkRqmSG-bGf2ovQ#f4Elof~CQ9Y7+r1J^sJ^cu^l_M0Vq;WT#qNc3qORxGnf}Zs( zSKpXb&)(gw?JPS|L+4U!;yV>0N<84+8qD3Ldp6qj8IL$#@R-D7?Wcw`q6qC33ywW| z#3H#SwjWzQW@_(5a6FM-DUt;-^l5Rn&Rf4HAG#xn$%XyGMNv^D*aYAcg}T^@y3tcO zp2W|rTOTmbbeg7?2-MiniE&(Yb|5pn7+Of;O@5(J`WLtRxAz0-9gNkm>~_YUS*pIv zHPg|MUleZk>o7>3TzgT8L<@uPc5K-MaNPnoV#$uTPu>pMr@0*4 zZ<_3ggG~vztB?rGjjN=>crH(j3Nw5Qx7?$NEM1!P4|dn7Lo;)2jaXRbU6qqmM8%#> z(`7&0#x7$10Bm$KRSYKvp1pb2luNUk+Ls>3{ekU5kH?qf{x8{BttCzQ8|uD4?>_^f zPS`I<(d^w*xtd61xn0T2wOwC)e0;>9j&htV?@1K5m^q9DvxzKeXX@FwwL-*=G?kZd z8&BLDfC``X(D;6OZqV2=)X@<Ja66MFahJNriQNf#zLItORU52_(4&Qc+3 zS7=IzV@$=T+|I5fZt5g!P9CjSq{QpwYV~x3XHR57Y6D30?)KX`m5F+{%ubW@E0ag% z&+a{aqwrNBj~4g&BI_H2yktmhNCE4QCYj9e_%Niia{IOO64B#C!5n01F+M~?L{m9= zo{U)VGw584TmNMr%nvp#zCi&f7l(ko>vWmDMQHhzsBPtsz9>31ISk5)qDXr3Siok- z_+f)*i3nOf`J?aXH0i>owzQVo9_l&|H#Vls<%m#NCG3Bm>Od`8e2g;Vd%b4VR_VHG zct|9bO(gA|8(S&G5^_b+hIq*t6cxlwm==gkX}q_BM@al~@!Ev{m4W6Dll|o4+bHU1 z?`wRl7w_9b3gE`numRu}E_=np&cn*=#pV3j?GG=JkVOZ034-yl=WyzbRhBifOTIjO zmzs7~S4GRXUCv$e^YeAWnC0GK(Mtf!-Ai^?7m-08)Lln_i|=y?amjrC;`820ry+>1 zMA@kG72q}eKj~ullYiFG$}^0LqK^2fqm zu2&Zh-9o+tQ10bL9QuOY#NQO*^58XDmglCg{lDjhqjkrvGf^%oqkrj%IBuo;S6!2W)38Qwgo6d;ViZyQK4mbUdN4~CVxWng`TFF^NDgtrGN!H+;ypy+u z$4-AQsm=EZTx{&z0VO8rOD$C0NgIlhq3S_i+8vc=Mxzxya~uLk3d`M(cmxmKt@jX2 zg%>LqlE4wlizCQU0;;l@G=pm~L&06*jOnw!`_`3WZnaVk;;Ak>}oJsfE9kcQ%W zn_-~86oQa|{T2vO0m|0kso?5L^8FBoKddSgSPe_$$B~PQ=3zF0CXNceWrqxwhufG4 zA;CLQq=ye?YQ|3gg0%lKJ^s_ z)TW26c>WS{um~QO(Y<6zK{or?4_@Xs2+dmFZ=KDoYLO+(HTVY~Xx~6FIzmxyhcYuV zqWX2?SGra`ogYWBz(Cq*>a1JxL88=rOcPXtGLFG&=S!29AVLo?m-BXacTb+j0^NPpcIMV6M^d!1hrKX<27mrFB`89@1em7r_R0|1PE_Z#-8p<0kax(hDc5)P7WqqipTWI*VUIO1I5;>oBo8gyH3#ui z+s=V@Y8#xsE-NX_djaVC8tMPY8PK~oa9XP|<&%L4uIDW$`caEOCrd@6DInN`@#cWi zMK6(w^y1ZrRm-`;?4Z62qG)nGt`b0K0M+PB|J1t_s%AiHT|za*CsUOi;z_ zlo(W+cUuoc0!0RZbczkokGpl*PaF>5DY3Bhzj-$?`C_Ha934&{{?`w80cIZFHWd@& z^_-W^#~d#lTtY=D&WEchUczRw^hUN0uw#DZ2w2G*>1Vx^%y}^~`U5pBLAbN`jBGQF zBY_TxD9+D-(#nBu5C19L=QxJ{;UJKnceK5h3wn!(q=3)?ph7$YzgNhEIQv;J9>F#3 z{)a`}SQB3ev^gENc9Q0v!L_nx(zywI zyT4ow2nr1gbKdUXARyLF8T)BJza05fS^CB!pT=Ge9;giB^}FDhQwB^6BtWR~Tq270 z@qvrIk#tbq_jqLlfJ?c%6?F_zByt)|ui)aN^1#59ANpt(JLZ;{zrGfGNx*TNeIs!r8^OL{CmT z=kskS?N}Gu=qeFftX=@SgXceqW7Iq;*<~8-vnm8g(-yPkgO&jDp5Usn>82w#F&Vh* zc`sUg!e={J1W-F8RhJoG-3AkWIyySB?aZtC*~p(`q9N;rQj%JwywFh&IQozQiH3hD znc+T;iX{^eL=Kg!u0GWgH?)Q;ONIB()Mt*(MrE;1>JNELnNyc>6W_=(^{Nt zmr95oc<;OmkQImC%fGjup)1AgUdM^&7jp&iaBS+IO?LPx9FE+ED=UVyKETKZl$l=v z7yU672mFhR$J$t5k59mfFJ&6ggQ)3he$=gxhrwPG+^YM($;oD+mp|Ww74i5wKexqk zo69t~=d8o~RC-1b0T7TLUdSU8kVlmn=Bw=x5eY`|LYA%_p5}&(jq0TGzr;nFr^Jll z_4ak8farNQB*u<%o?C}c=`sxYgtG@m@<}3o8`Sy_eUP3-UhIUatemk_e{N*(biET$ z8>}`O#rrV~a)>BH3nAX4aHqe19r@(t!@*U0vU4Ao3g`u{jfMl5pQWo^)@P8#K$M+D zkRu`UKX^Q$cgt$ecI8A1_pjOdhPdEhz{%X3soezV!1(k&x*XVI(Brqe$kw6J)Om2b zpfm2-J>glnR8UqL!Zq(zxqm1(W>>PA)U)1Qs61iN8+?kG=Dgy;H!j{ z0ZQ*Sd|UKzkr)OsGdKeeoFfk{0JMLag^0m?gxbMeQ_H!?#241Fkj19cJ|)u3e);Qc z;$jDYyXtveuTO=eUfq|fsl*lQ6iryL2^0*(fCy*ex3Qx%9oZ}o=3qGkOh-*0W|m+x zxa()T@$qTLEDdkCc)^kcdp_2wc-ur??NIU>=+V1Thl~NoO85W8^dV@6^K%OgT>Dza zTzbiGid?;a6-Am_S6rmmP*q7Cq&tOFbw{Nh2x7P*JMjL1Hl^9C_9ldRrsN^F?t$K@ zr3+BDScr1trw)de$MU5|&f!ufMtQ;`*oltE@Yb-6L8}ZjY%sfFO2atq5daUfiS>0P z83wIJ&Na$zsST6)$bfN&jVba&|)~CiX}r z6%`mL?AV)D`}Qx=yQW-5dml7D@t%{ga|j(sQxfRnAm?Rwy&6@HR2g2e0J@!`8M0$2 zA2Y9_7tv&(k4}PbxF~kb2-k^ z4BJYNVE$BymG0y?zQ#x6KgbVS_t5nj~kvhLFMWNlHZi(&r7DvmtBx zYNs@QXr!t`1xG;dRx~d0Gb~NMvY%9A9caqXV&=DLg+tQhwJp`v5*raW`Iow zCa=AMjQylB;KN?mPl&c~uVizFPXw?W7uSiXcMNrB@W`0?5yy*lSm`y61r+GF^^@w{ zj@4my0ItlS@&8{8Dls;4!tvrn{bd8?3j7!NaZ&BRzHi&@nO zBoMUE&IZsYcVr3&Ut)zoG|Pr-5;O#J{w)Mzu*_JQ%0fr*qi}t2Z8t-?oxXgm0Hl1XFFV_H zI7=IO<)GpxWDFxEhh~xMKY@Hf-J+ioNT}i9a)8>NZA=;N^EhaF1lT9r)4Mu~1tNk% ze7tET4d|ziKv4SD*vJo!SgUd6;C-ICKxf~3U53ITUBSRwMUfWUp%@KeL;E9NMoTHU z{>VO!-M>#c3$01h1QFeG3W0`S(X|B+QPon5x5YiVg~YpbfpCnR*+ zr_O&aebba)iGe=T7*3sKQaM3kT3}ml4^mi@6gl0wPOh#Y9!)D%NP1>2zd=UZPs*j4v(8Ms`NH_(XH#u;>gDi`{HU=wo@hq0gL{mX-#AV4^ysQ%+&4C17%iEAYe&MUyWZ%|2ZpsoasFNM-9I?{aW1 zV2oq$xWEz{jF3&+r1OAx9_zuPP)k_^I!Qx=?Xw&@iD0nQWt5)31k-ODR;>WGR$+4( z5ObH6l?BT-6{j3SaOI(1R72?>Ygsr(hLU>t3`e~_Q*v^!jND$EVk)G6?O2u_hKIv> z@}Js=vO2fSv_b8&51m_yo?4$NnRx^kefJ-qH{bLR3TcxN5d9M%jED+=>s9W^%DFu$ zN-{Wo4VX?CPG2mUKCnEjhq7i=Tb9Ht}kENbPMZq}SM zqfm7$|973s4} z1$ln_R?syI)C&GRFNOMLKU6U>b{<_wM%rq_&h0`#chtuxOhEIhrjUl5?O!1MZD{!J z_C&a0$(SmIYjoJ^qPpOji8z8`ILk&g@CT+=HgEVotH1%leel??&!e_7Z!h6RyuH2e zWjeuS&^Lpd`0h78LnTtA&L>RVs@eZnhDE=YZvxIoWoKhkt?Jp5)m!b3E^%RzsF~mI zIB=7jM;-4^a*vPg0haie{i>@&C@|Yp5>h9BsXa2JvF9RV#Sv$wpzTUY8df|&cHY5T zZz8iDb0x?iA_H=vt{nzAQJiUM;Q9ad1ptrD(ETGO|3vvAOO3Sy8Jd*-(&$$jpX6g)N-LI-hCxzyR1kio7Ze7PQ*t&DyTeAAPjqqNdIKT}b z)Sd8-foTv(8uWrRfJERQK_7NbPTqnM)QHH)hzRs(ZKpO_PNuLQ4H)~{gohc<#PQwT z83qG~tbB9xppTc;+8$O&@K5=CC=@`Zkl}UHaCcPICf-m==u0{+>h(DFm|HuEN5WVk5MjaTQzm=;-i7)k1aBRjlPvl7$_^v2T6%fiK@eZF*V+n-A ztrcf|t~HUkSl72V{!z_{XlUW#k=Ilr9UOrtw$`I&O1>Hw>gQA^L+jCIHa2S^R|Nid zlW*$=hUB9q_nc-mpEoO<^f2^H8*faKe@ z<{Mt?PJaK{^Wb2r?(WBv&J5v~2TMd=AMewCSjtSAS8F;y1GJ!)fM^Xl=ce3Z%X8A2 z^(}tE&S$Mpv0Fa2Kxr>r6mJGD^;x&e=r7?rIDK@Am&cLMQ;LEQbPu5dIjIevO`8|r z>Q5JT1!{v(s-h4H-`Up(Lxc-1vmbz+mJM_VmOZjL|6>myq6Lm);T)A>`q#WePsuMm`|W z0)?>V;QROQZ|Uh}XFB&zI9(I>R_;#qU;=x~{Ap2nEr`FF?ry2oB2+I5R}&?*VT^Nl z`$;illHOc(4<$2(q)mU;RH|gP0EOmGJ7eBF+80f{G6NtHXCDKP@_CUv?BP+eM5)=` zqA2_EE(W7>=USE^yo$!hoUp}4@unEGz`4-@pWd~v?Wga$h7@wPoQ=wiD5@PG2M($@ zU3x^#LoH5aI-yLB^cit)#;f^3x4XmImiv9`3@=t5D23%imHS-Cn7o{VH_vqkD&e`9 zm>7-kmw2%JUX;e9xwuT<0Yf>A8zEj%<_|z)xe7sUFtMF-pMpsKr)HNt5=4Huh?Zi|+UG3!h1_tWF zgDgQ#VIeI+tYCwHXlz4`5iz=obxCPyLW1M^de2N-At(9Ly`xWpp-|tQ? zP6+jhnd*yW?xD3X?`R4#R^B_tm|8{$7nX;n0uh0KE56Pp;d!nG;Lz`X+0+hnWnH|x zlU_Xf9T-!+gMp`~y$#hZb16FZ3K)(COf9%QB$UdYiYcD zH_l_EW+pOcYZ4pVL>4l5!v9mDmA>@^0tr4#ok%^oL9#-4@|j1n1=(K5hVg@uoT8D4 z(NF(j$(cU&YN#O7G6nrhnR*CIXtutMjg5v;x$cd5doJ^uhUr3V?isH-HYHGEj@XB zSL1Q6r!7+JS)zQuu{H9(!1haNTrIO;q8D>gZN!qc!jz}YtsptDO^!`5-yaUncdK~f zPaY1O>Gw1RPfkx;PSXw>Px|N_A7by$oZw3pQ10*DGHbX?)$?U;*|~TdIfs7o^jdLJ zr-l|AU#PqJdfp9pGjJA}mb9?|-?^#UK1vU#F3w7{uX%@o2YfRSQY>>v&8*wnraq>w z6zK$~oszzJI`RfV4;`}~Do_IM#Pk2S+n1>hlO%vZRF7zyAL?kXT;(ahN$mX68Xk$m&$ z0x>1CV&Ubz8|6EzmquZKi+XIMhQ|Xm|1`vh#dE_-VEy&sfJckXM@G~|5R4>5It@aK zbaLM2MjNO}-esQ6y;ns3Q(z6gtxsd@W1WEVCuxT54X3{x-#J^7AAo@e7gqYeI#F1_ z$dCZ4@XKV`*@^zQC^mgDRCf*@?x+|Q4ef8%2Y!PY6J%O&8?<;PQAm1-_Or4I&sF&u zkmDn7*aZF*LVuosH6D3A)ENf2x`1`MSO1sk^eMYOAFZ4R7U&Q|zC`-r$+7mmXZhMy$n075U zDFFQGVsGB{!tDW8iq5Ro_WQ<`w!Pi9Hc zY^GoG3RykFHKPkEDu3upH&}h^T{ue+i{aQut%|xt?n8ZD3bY=L`Ir+bRyOxCGyg=& zFx;o#-@uOX^71eR6t?zv-BgyhBX2O#v1?r9_^usaP3awKT$%kZ%;m`lj+Z{PcIEb1 zEwmkoz=?%DvgRh|;}UsTc<72tBBTW0_^0IVDqQ|-hM8Brfw`1$J;0@T^pW=pY#3A0QYitc6qYAzxM zHuMcT)xk6_KN)ESR@Jy^B+gV7te&$xfQP`Cmd}x6O5YoW{m4_2@2;<>y#CQ?Q)`#H zez=E7S1#W@=|UME!*0eK7!Rt3Bd8gT(iz79VxjJSurPNz$n^{xdqJ#IL`;J>EwKMA zTwen@V8)4=`;PkxOc1e|*0+DvfLvB}>z6_ow@Vw>=bfFJKUB@%098vt08e;%LUp-F z<)832>fx-AAOcqHOsTe(W40+PpPMj)y_+Ryb4sPF6Y5Dl3zI&mz{;)HR-5Nlcs!;p zj>K&x&0jScoT;BM_n~L|yYHv!XfviLg5?KI^f{r(L9C2k{?*FW)*aQ=)kVco-@3Im zJ+1!f(;IXqSgmbrcf1*OC_i-)`2q$dH3!T8ROyb8i^lw)$MV54iZtUWGC0Npc7XlVmo%E){~L?347cyvOl04$(uez~ zd9CE!O7{hK79V}YOUVciNUv%brGC4Ukrfnm7+RWBuXD^;jiU?Tqw;_fqldDFa-DBN ze79tz(Ui5F3^Csx4F1Y6*I&-DuAer7`*K0G!Ay&&yf)??)7C#5SC-%fe!8WZo6erHmeNZ~q(G9FAQf0hMM9mz(|wrCbJCOfTaw2n zAP4lIWGj{^<0DKTtk3@Wkg>)BWH})q3&^hVp}{aoc25RpLFA4$^re*LTervb!ZhPQ zPZhxM_HM7mX8b!ah%xahDTNSRRrYVzT>$b#^QP6{bU}1%^7wDaD`S8Tk0dInlD2kA zf_?1kUunfSYr^(Z`Xpm?HG;I%yGNTP64SlMxEzVo`N;BV)&GmJw+^eSYx_l)D1xFO zAt5Co-5_1k-AI>oBi$h_Dcv9q(%m5lxJc;+>F!*MI)mrg@7~|{UDrP6%zq46bB#IX zi2E1!JvJ^-A--qetQr_tT=AsmZQQm;k$@*cP3oJO(|mXK)!t;O_{y7ZlB;o7VuR)+l-JGPOn>bwK z+0OcgFuYRPk+V)?bnk>!)S!=Uor@Y+q@v)CacNps42^KNtZscL7lti%;8ZxZY!;)W zym!5Jwy`Nh%W`!6moiQ$N$M-NXCp(5?>cz^r(b+CV@A*}o7|Ha)Y z-MA@aU$1yW0=147Px++hR|z%Q*&|z#+}U|MMg6g27i;(ukJtJKNJ4h_m&SZ*8`_&V z_KVB#(CS3K4J5}~To2k6H=8JOeiV#@Tj+4f$F)J3lw>~ttOP>vs;1MZ6Iy>Uwl%vMSq~t zRw_yyqVuB+BYfH>GPw~YZnm#n3bi5YN5nNF{!Iw18RL};fO5MthO?X z(IjQ#lKHBA{=q@(Qd8?@MUQ$u0xWQbnJ-orLv372ndYWcKr-%_7IZJgsSP4c-ZjF& zH6EXs+Ps>V2yCFoEmMa$*Vhr!7)S1^*@`rvE8{S!f0o?h2cY$&at3X%}q?sOUt=V1bv`7uvgfBpGg%91j;83n)`JV3b@sDhE1E1Qf^5%*B-Yn!^G zij|Wy3H+%%YEj$0E8TwH%ICGtSmsmtqoJXpqy!|R+vcO;w){DW=WGpBLTVvxKb&qE zz|EBYu>D(Oy&x?*BtW?g70`?^GgcIj(T^XjexnYm)q^IgE@6Cx_^E@cn42=^d+U}G zi~>o}4P#z(;$11DQ;H4jzxb(8iwGmS5GH`N!uT(I)mq5`ZIA!1DzwXR`F1~I2j99< zgRiZ|#}6XS(8YttxX_e02#pp7gnZ7(`|a~p4UKye$>@DtkvIiWA(;{a67o6;hJa`j zBqVYj(x$&Ob&dYjVfLCIPSnqTpbY57bZ#9rOHfNNcWt2guIFYgn*o+QY*@d-?0plM z1bwz@TQP-Ttwu@AOubfPV_Wa)aA4!Xr#$?)o+5hYs0}%J71yoK> z3PxyI;}coDQe3gI**t`Uz{2dU=GdiAZ>#DZlaW4M#H-EKIw3qlAI#2ZIDo$(1D(QM zly#r^;!<&{7GL2Oz1`5S>ax)Lv(j)gqdsLdTk*dMTz;^YJ z+ntxCbSnS}2MmV&R%rKVz zNo;DjSJ5WTKIoCCkgV;S*;7>hD zOVznQU=O+GlqS+6{#w3}>O+U^A^@lK0Kq{_yV$S9TttXElha~xeDgoU9Krm3N=&Wg z(uP~tZwXaf+l7vfi@v@He2$@pO;U0I;YJFQw&Xl_z`i(C*L4hRrJw1r!(w_dW?PM_ z8pvT&+EM49jX0s!lGk0|(j3+B6kjvNmLDE*xNPl{qEDP`sNVo17KRdvNOicVayZ!k znlG*gJoi2C!a=Cdl{H~;dU_fb8fx$0uz9mh+O+1^|Hq{vTppqi>-$_|NjWSZ9(mXN zPBx%Rb}X_YiF@lEiBA%jv34@jK`x|d~3Uj;eNC!0h5!YM^O3@Qe#F7H;38c zUXkjVA5{JI7}b{1Rp(tlqHY@K2TAlo04u>fest{Sqa5lL-61~-sR$WI$x%J{chnV3 zSWMyI_+)M_jcz+nPKpWZRLXAxti<(6&>>X#1jC507qDzQ5={^A==c{>vjLt}Y^JHb zV`z1lkt0*NAYS4aDAi%^-522l?;(#%j6&YmWwFENDDtL#*k=3OE4B*UbKWimFG?}M z44~p65{_Eb$L0^b!MI9Te)bX|z3pEr|9JM73+aOh-tb&41;^!JqAvWht?fRuwHeK3 zwdM55y`?YXcU`Ka@l;XC7grrDGL)6%Gs({g=LWt-IM5S(XOExHwK<4N6&O7lI;N?W zK`fk;>{(k=s_z&tv?y-i5i79Sw6LsaS7xon>FA6=dZ}3x|GPd`B6*q!FaM7bl~xtC z7S@u8-#gznfhK&jmS`+djJL4cI7O!BOqeHW) zqTx3j%R=;{YS7n-)1v&al}i@I)7XFxiV>)>%AuFeV%;s14<036^$V4D2q#d zR-02GvL7j5NzESTP^rwkEJU@eU8}ya^G;wh7x#J42iXb&2S+C-r&_IIzE|plt;CU$%7kYs>Nd_JOg&^;E=*b#}_07r{?P=d%A2gzudL4pvEe3mWm}Z zPlG=dd=~6q$CWBfj>g1cx$nHt6tt`{T}(#O?2OfMoIm5bI1%f)(3raO}$-={wjF zT&{%qBeB@{mo`hPEKfc z$-)~5#6l*X74M@($1Yk*3QewIoMZ?URDsGSi&AC{lTmeel4{0s`W2N!XlQyoYOTSE zIJ9jd7#UJQLPqwuacYOY*{)wsQhR|g69M9!H*U1jr{tk#ioek0ZEVmq+x11Zx}xG} zi03doGLrv#uNnwz#TTI5^xsG0A~j)Wj^X>9v2^aCD8uE|PXTU>tmoMf1|9qe(wtb^ zT3k(k?=01pkR%gtrK%ChHB_14*_CIglWv{cGg#wQU#6Fw#7$p^n<+VOon)jGRPcy{Cp1Q2a6fPW7L-ZMwW6H@X==Z_> z_L7|J{btXpRB4FwtLich=`G$5%q~tq+dl7UuJk$W>{#tu6=+#o(>GQm@;eOJ57g32sYIj;*TfKcgK?%-F$YrDV(hX!Ko^I=i|yzd>6Q? zU}j9)Juox~3k&6{9uJM@k+fj3Gp^F_{}oS*Im_SGA7cW(C*3wHAZvWI}PoY`UcnGhP>IFf5@+Cp@+{?P`ts%Z#St2Ynb*M{A(+B?pUbR z$hOf)7c8%;8LSNG>z!(7A5I*)ZI%YCF1fYIb+zlK`L**4b<#WX4M_mMHQx1U}E8arW7} zUBD+~&E+ZeO07ehxaXkWXaxHl&D2;ArT#xl=b3cXG_jM;2P+h3TEN78VC9B$qYn;x zWw$|mQ)&mfaL}@>ltl0D^qRYUUP^*$)fMYlqRFn;``Hl`*?ErKse>DJ19?jMd3ms+ zA{flgD|O9vOJ5H z{z!G4J&Rh5{igPsvoL&)4Q1+8oR<)*g8HR9fpJ7Uaj~aNttj73*6kTGtZkP}S@?#h z+cr$hJzFRq>w11r1kF0TzMSW4hlf4<;~7f%lbEak<<`e)u`~!jr5=tti(_M9Vq#%Z za8AsoA_nvT>u}3)`MuLf*(R=5TB?U~0#3CCX;XE@5!zHa<3ihQ?nFvC#@lXx8?`8A zhIifmSdKf@tr)BJNDj(>wi82K1@+&diIcUp`6(zVqKSyC?XG_fnIVY7WyGlmJGOf& zQ6dj%6rQ^QdvDVnLtOK>1a0Ya)JM*FDTQ;j2joopkHILG31Cn0riXD+b{}CHqDj2# zoUwurB-_419h7QwMWFR^QLE~PF~fD`?@xb`*%U=oJto|D zC*3htzYii_!OjjHpu=4LBDwJ=-$bJlQkKK0AGK{+m)VsaiMI(R%eF;mzfby1vQ~MW z_YOa_i6P+lJD$b-__#`KFa)y8h8=}=pXw7Um#2F*62;wqP7gm7;5b;Yt@NyIy&bHq z{GY+gYHyTf;T^l|{s`-~8I`K)Ucl|UfoAs}{cI`SAjdh9o!Wz=9g zJ#8p>FUt2O>ix~Q0_8#wqUu4tq_@_A?+U%=hp#ZM+7OaGi$uoz+-48oRZdd(JD30= z9v-K|2L6r~q>vhxhH{%+&Ai$9*^($%R}@_&YGH<0ibhKP#9>FaG{Ng9*e3U~$Gd`B zu%u`ZVnyxf58adzvB*jOkX(2WGLsL)u5AW|NVHq3c81$iYOE?hNl$ae8!wXt zgEj-19DUdCP2vzuCb1`7*YXJ6T5|l^a-$K5PP#)^w2cp~WGR$)vxFDewX8gEM(5{8 z*Vbmbg5@)K-Ojf9=3+nm#|to$pHES$h~yxi-Br~wokT#gqg?MQDv5j~QbiT{tgayw z;SvA07vy_Y+{b;*iwZGVXfb3xAyOuq%&Gn@cGMlGC!gQ1IO|Z2ZTy59v`>u`Fl89n zmFevXYPe6Q|44&2w==18iy%SjdNE8_}EIzV)^W>wokU5LU;+;045Iwz? zA{O}uQyqh1zBnJ_yA70$Q$auYi&9covS|P3^aq4r4>7hQ!sDrJ<10^ZCsXbT?vl&)^t2DEyjZ?ECfP3#IB+f_-;=O~HH6&}@^B zYrnfjLR7JS;c4sXitxu)9ueV7zE-$aRUJJ~?zV_Ru#omLu_I3}yP$e&OGk9St=4ve zc6+NMaP^ZG=))mP?+B@NAlt5%C zC#xGNj05LgZYGW^>F;Pi<$vYix=$7UtXVleM+dFpNf4a4&4|i`c024N7Q+|Cs*XUq z3lFlLddY2{fuQuwq4jpH@iyru8oVe$!G>b0>2-`JIPp&_PVlB59^Pvh9sT&rMB9++ zcJ!5QX2KO8#imd6(WBB`pwQa*HhxO983|H9cwZ5QOX*w$y0&l;QNe#aEi5@XnZwA< zz?fQm^13ZvRNl^bvFb%&1N(b?b?F~RrPV78 zAI=A;XKuHXA3C=GEYG#Rq zGXtMH;|3L7bRvbT?fAL8_INV=^#{-bFEMa?5E-v@iOr*N`M8x^-aUku8lIS$1D zo7V4A@6@=(0DNcN>$z`4)6px9=8A}x#&HZCpZ0$Au20gucoUfzoU^v`X<#EHP9(y9 z`1ks<*{?xvse6f8*2hB)fA=l;HVjoyT(f1O@6TKTnn8bqhJE{dAIhGO1E#GVTWRCi}J`jpY1?1}WJeuW*S& zxX$o~A#6LbUZWHpX|#1=X{UXTC>&`SK{T_$;dO;9Aa{>mI~X z+RYbwd>MkVMK#8G?fx@Xi}kj84i44b27+v8zB=FgoSHKX_Xg1fJe3og@hn-A?YD7< z2?TU2o;*eLZ-f&uaJ>zfzi7bvOHFikP96TPvJmm1WN^r9f+Ybu6e}5?jB#S*$TlYQ-E*$sAmcC0N|bT#=7j5>r!S303=?TD z3)KXn@#}A5$s!j&3!2Wd!XZKz-;}v4r2}_#AZ)aW4#&Hx9P;VB!1)qIz@-F#+k`+7 zV8~K1HF(k;r(0F52DToop4`s*@y*pV?Qiq^ncVeZI6^kf-VHn=xfGhNXF2m(YqQ;M zr%uhk3E{NCmwH?Vp&2UZn|t2)JEB5^QuTF<%UfHwQT#mm{q_^(Ur;8Dl}72qfFV;G z{wK>K%GkdN>1h)!opD38CMX>Dnc%Wv?zUmBRkOS7=g;#rn_Xs-aJuKd^eXGLXYPp| zRJuog+BUY@J9*k4iV6eiY+NN|wodH=y%ND(Ty|xfH;zT|)4}?>)@cZq*)x8Lv*}eO z-zlkLku_$+t&*7Md>fNPqpNy^GU;XsyNV}sIb{(H!^q8}zkbclSmm1;B<_Gn(zf+{ z6BE@1!{-s;tbNZewO|g_ivQcL z_S=2D@QBw|#T}mys;mRmo)4?teel&h{yJw3n``G0TD`o;)MVHA!ADS-0!Eeban8(m zXTcI&wYC=lk=xya$K7KhX=+a3?wID|&LjQ$ANDnt3)1>nbgm>vCB5sBs4qo5y}ne@ zyAzoxc$N=uJ2nYJv-K0(RK=2yaZ@XaaLz9`d-CH~`^uw#zkJ#6Cu>U=VCX$WM$v_! zOq_7-;n3gZ(G!TW{#3oLcV2wsG1M*!u97xG5DkuZixrhuEDW2X3>pF3%q|M1;x;xZ zJy}(c+Q@>8lan%~oHq9#D~rN%)>LPh=<$ske1ik&Yjz`jdHWsri0Jt_>+lPV!S%%h zgXEH`mY9rGsP~Da3-^NN{xYN_EX6@F5OZ_t^+orqFuzudo4F1XJBxBXivV;a64fc9#KU4jPKAHt34;W5^UzB;)z264rDvWf`(tA6U8`; z8B4jWsBQ3_;yf+ZWIEU*yC=cyHMr2jz|+)%^44Z-oQ* ztSZr^tG21cTuilxt8dR}_1u<&1w6H*a9(_#_sxE#NJ`*s`B|aC z{Wa8pNBUstukLrMzQO*)IYw{}uG1kd0l~YQ-Njbjwx(G^mG~*6ftfaPCV=@~A4>{UXq9Hthlx484aWE7RZXdN5JSiJ)p;`qV82DNO0s8B}>XcT8F>TyEt= z*J=SwxyL+wznuw|k2rqD_M6yDN3=MNv!~ykKNC#db)rlVAwsNTcT8Dq>e+U-66hi; zSEu@@3NM-m#Sh*%~_cQ<jAp!kMteW*6i zYHRqtm0VCtfoWcEvqQiUDKT_>=EXfv4dEsOF_tZ%~J2eM79rwR2EHmR%y0Tmturmq{3Xp2r$D zMAL8Hbhg~-)5a7HUum=me^d7-20E%8Y%2k7#$rF#jQr2dD3a)zHMC``ioFq9 zH^o87c{4o|vw`dc-nq(ICz=l@3#Wug(llao*UG5U%Ellor93+udx}iH1sW2B2>Xup zX(3fA)TpW^W(YKOJ^svIOhZ#KAz@6~+}NC}xuq&iQ_6JIQmu;dVz=FOJ<9vcW-7|Z z)BLPfI!EBnd${?qdyYEe<`XxfB%j5;q2hx)qFFyX&KLP-lkN2rt6NIgU;aIx{FLydm$kwRS6LHT->IH=KtkWMmPUbSXvnPZSDOWcsP zq`*<_k$0pfpmd?*B=15}Ezh_%< zr$Z-AvHFa@uExCOK_+xqwLj^_k!r`D?&O<6ivUWcwj-$)@LK|GdbQ9aC*5%nx&Y9 zu7*_VCCjwm9CZO-fG1DaUQs8tMqqh3X7K}0ckA7iTjFgS;3pTkdK2TG^l7ZVExlc( z+-=7B?3}B`;GA&}Qu|_r!8df2HaVV-o}nNyF+oYXKdfl{WOVf8WOT*A!p)evHAWXo zm5elO^v?YtHBn3tOn}zIEqw2bOva^2z0FDm&u)5phOM0~Bs_?RmC1SW_Gc`MLww3Oqn`}Jip0I|bd zMZZ1+kur#%MV}qPNg8E+F6+J8^tE56z7(f^cT|j;iX-%ulR*GdTo`XQb(@!`H{ZaV zDP>$eV-bb;Ay&?GbXz8eOWAfPMK<}Y&pw@6*;aLww%;k=N~e`NmfRQsJ6oR{YIMck zWz4gmqVyE!0rhWHYZJixFBiCD8EN)``RKOEinO`z$3D3xvXUp?mZWAzrP`Fm- z>stIy871DW(`^CFE8kg)f0@6=rPpvCQN_6S>$&+TjMlM=zgV3+9=B1e&dQGJlXB6Y zH+@!dn|~w=pmtmcmlzc&<4n%?XVlH14Gcz50-dm0d1h~ZZ*R2uu!_fpptKZ5^9X#0 z^LdHe#5hskbZhiHg&w242*|t)r;9o~M+_E8UR$Or^~mH|K1#ppvh`^XHoI!Sxo(Gr zZ&kPN4d#9L5r5czGf__DRw&;ROmM%V79{|?1|dg>SPA1MslZDbmxb`nSn3mp2TuF= zny)8;JoP!vHawzLLDE881FoMYNW)+FuC}YerFO(R35^!0yYlo#iswwH*gh z(XS!7oag6U?2RtIglLr*)7uvsbb6IDkwXLXO?HOBYQ27Y$wNUoOay9BUmg1+q47(| z|3k;t1k>YpqL755O7A{*MrY0%UVgob&-1#2Na5CON}J}q`0H0-b1R?Oe+gFOo*w?W zJ~lnIXG!bT-0UjqxmJrJl4bsD9CrlYZU{CnKOshFp2Nmh?mgCXIDEXWaoW>8Hy5Dy zcXRS(Z64Pg_czeyd(Yk5OIw}xyJLZNfwqPUmE|okAdSvEmPTkDZvPgXrMG(zUK616 z9Y+xRXq4BS_n~=9=>Wtdf5$|e*Eh9Kqa3{ZyZ`j1`J#U$?osQZ{6OE=F~Xw+bZVd?CWe%XcP00~ zb>FSb-QTPgkB*~44|9{aw?kFSB}aeGqq~Jmpg13o|C}!lZYI^eeynHCd+}%Wx*A-OhMXj(8M18=H9qcM?zb@Y$er zc)tkXegtCs2f0HeLXpf3)uX~%wmeigWhmG)83&rH1EsbvYH!Di#X zy^$BooYECgE8~OgF#!ouWPE{7;jAg9VE%AB*#Fm#FSWlZmIKq%_Qvz5p2CE!|nJwfyoNudcz1f8P#` zF(7Eqc}SXHFRxJtfa449#@VXjX`Yn1a2oY<#}zcHs>Y@`Cfzczu!Lbwa(tq zo|mU6UucNtcUS3ebUhpKOGA0kr+_A;{fm&Mfwk;W)t23ZRHF~1wnRYV+rBlIiENlb zWcz?kax0F^rTWap`o+?&Lp71u`?{h91OO_SQU`-eCvmuW#!UrA<%7>{9%JQZ<25&5RSx94K5)SWICYfVes{;rOByv>m5Y_w+ibWM#ZOGGG^=fA9WOI0k@Yl}Y9BrTEvMes3nUAsj=?NVD@oMAk^na7k}iMZD6QP#&I zdE-6Z=j%kBaWg8|m~c<`xtNCdNVH#`f`F*L9l255c{-ED-)+FhP_LS&Tgrd9HXi1= zJ)tqzJ(E+G%e~w5m*LBK19+)o`QMsq+mKsge0K!DE-e>7XtI}tIlw^Sy zcuk*BURU4F#eNY)m+5gf(*O0>1IxTH+jN0}+ii~eN%Spr*iH_FELkUZwI8srbIObc zJ`rOe66u)&D+W;3(l^VrjEsyb_AE)?;NntQw~Gx0lC=B%R` z%YT6oO9Wv!Yoxob>)29Bh9W`HY1Jb9!3a@pjt|a3uix#=SJ?x5M0t+FgiQk$_a#fkuH^1Xlb8 zwcOTqdP^;CJ8RG?X?<;E(S5M~*wm*Ii2MrpEVGd|8!FqD^rs8Mxwe%jZtW}8w-;`E z7C$xhWVY#jcD_&gGv*(O{JMmv$pJB9))#0IM74%`GU)88nd~cruZPI>=)~m8h53k& zzo@5GUt3=hD&Ws<2$WpB0#*pEWcNBWrIk9@x{r-e@M;yRoAkVDXN4h|=V+oM zxPN}Wl(c@Fqz=`PIF*fpD{^MD-4rIa5slZP)t0hr-c9nUz$2PFT&ihB3hT}W3$dSX z-lz-aq=1v9;WP{v3TA*H+FAz!0@(JPNmQ%GoD!uIkRa2D7NoPHwb79P6<6GbyM>W+ z0izn*%SsIJ#$JL`-nY7Tz*&!z9e^wHyg{apc(EGZoc(u@U?gNrpXB1`9+lLpIF zJl;P1oDHcmCf&xU;-;z{m=_4aue_#Tx^1t%yfZY}5GeCJNesI@G2Yj1KoYr)`h( zgSZ*0wZ)w-1#V$`dsaWs%A9`H0SIG9&|CC!!o?f<*;U5&Tku1MEtsqqn%ck@5rKb+ zgA+acsDcM%peX1rd^x2(jg8aTIEbRBXIxCNqob#%4*f(e&;K2GiYzE)kST>hv~T}% z;o#RdlCJc@!C~v2OLh1zR(Wg;jP+TvSvRARSf8@{ zZ?}Js1+1O|LBEgn@E#=p<47oup0X0l6KfQ%(qn@oOJUfsMjbd7gX!l%8$vHH)bgvN z#DDwU)zzYKS6A3SzVd5OkTi5{A>v8P+0s+|a%oTK8*_3W!Gn;=qRL9~ zIERRv7;gzhG+2Gr7WJ&w8J=_3zKz3SGf<%P zyYb<{aoNV%7N(~?;b+;JB?w8#DTqaSUhPS zSPf8sF1l4|*{%T$2wd4+gpbJofg71)`}tcHZ;WDAp4IdCJa^-i;@7jWrItKXlK2CU zz7ZXR0MEu&7oq$-`r)sHuVKT*l@;QzJRz^w`pk zsvvG#+4b_>#n`obZN!QI;caMC*&(K+z{XnNkC=}>G($_KA%Ss_kANZQ9B9d5=u59yc>PWI4Z)29*lP)x1@2C-jNvbufRc$Tbc(;G*jNx9AJmK-jI-aG)T8+O+ z>pi^0&1YG!D}3!$ORHkjqg-}aOMAlt%xs9XHv`|ma-~OyBfa`~oz$U>Uri+r1d_^n znO&|-jZc1lWS%FFqMR=yY8B@HK50(P=>kxZXE~$NG!iDl><8{7l9rxJxL*=61g*#> zb=c+Z1{Q|HXmcu=#hxzUbGI{Lfo4F+DWyf15EK+th1tyR_sk1bF1*~76c_RV?_Wm_ z9d`d=I=7Q(0%Jr(t64Q+rRJbX^`sDpq8e?<#-y=_9s9bA3|*%*%)UMfi}QNm8; z?H00b&=Gk&nMH9qP)j~1#bi1>^>Tj`0EG8NiM!wPB!NX3Ra@HyC~%lP5*`}W{4b=q zq|8%kwEJFAm__G<;sGP0!^~a@^sF&k#<&`|UpKBVO*bDdG$P)HzAON!<9ydP)3V<^ z8Mg+86O=cM>Exu(5>(G~j|tM5jQjI2t9#PITqw0;WR)mmSsYGhzy-w1i}vLAu=*2vKQ z*9g9D@#RM-5V6Y{r^JyQD0_@avEBzo%pCwjVr@;0)xBiaQ(0Nrj~>XDg>(03ed&#& z2O?fxhU*GA)m*>v6A^eBqbMg~5d$b$B+ZHQ61=d6|9AniWC`dYd*~L0#ZUvc{MOct zEw>&6XzqLdAsoaOc0>@sZ5&#?bjgOL1o!j$-lUB!6}MrvVo725RL+y!Ug#_oBfoRs)8s84pjZj~qtH%u zs*d#pa?x_2rdN9L>c^gWv)6?`T2HKGw@s!}T;t5l`sJdb%K@icy5^~3J-1$wf8(}b z6?=`OLQqHCCrvDLbjjoITJ4iXw$!+5e(>eput%?X-AOgHm;NUG5l`cLBNb#W6XpES zZ8?lGznbAKmI-LKNMBQ9J7UXon+Or-J3s0O(r&ZsnxFnZ!8*>)?ox~~-=+}ubu0RFZm!7F z>lcAW6Ys)C*HC_>k$oEAVtQv&9y8YAt_{C!#zJcn#yRt_rU+0=l_T%=Z(IB@Gl1AO zCH~beIaG-}=@kQA5>>bVj_%~DeerGFOm3uI{0bSQ!aF2>&vD`L;|U_6`2A}2HiK%y z^yEgT)gC}tfYQ<~GIAMw4~ToUSblF-HHcKZc=9QJESb%uq6tzpmjqf_Y2@MgYq6!Z z(Ui0B`-0=ZkI&u6rZ$dBEX%$Z% zozG&T;^_D!y<*o+c>Y}e3O6A#9&{svG`n3elx)KQ5rV18*_H`+?B9!tHkgK5?vWsu) z*z!|Qbo;MW#4pAb*AD;=7N#P~Hr=g^usw$(>^jCSkvj*Kx_4dLlnNsl|H}F*2Li5))`zCa! zOHlatjKRWPl3!VQ94$`7_4#iH1tk)I2;&an^h1NK)cs*Ibm$8j>Q}+LQ;9Z9-lG=u zsSZEgwJn}Vhf$(OXLtf2D;3^v5gDM2Ch&Tpd?(PL78xfxVNBmpbi#y8m#5dx_)r67 z-8SWv%_`6J&mebbzW%mdrS>hR8?WMa0oY_adXfe=REy8advptnJ<4*(aCTNW& z@az4u+-&fkS=Oy(R4R{nT|6G^-B{y6EpXi!qG_{OB;Uy1R_h_nGeJxW0(PUj=OsGv z4(CV7ujGO-;HMOn=g$niVLwE=$4D-Ra)ZQc~Het!NQ{)HbylE{zZtvnvE@heu14`Tee-12zf_KIhgGRp5Se z^ddLObNxmdS6s0B4Z#!1+zF6Z1!~Vev5UXs4@#+pKvIp3^dXpMA-}EIiR(1=w)SKS z#sG&D5fK3c3D-sDc(ZIOx5R)HrSW|Ir%w)VHbL33d;M{v#YY%_*mdDFIcBF+vY*EK z91h1uM8u0#s`+pD%0DMp?s$ZR8xi2fL%KDRM3G8cLVm|-oEt#_xIAPX6>L{s*x|K@};xxIW^e~FXs z)#o>{zaZ>TWCU`a`QLx_Yl9VN2TV>uDp*QtDu^Kz3oQ*FR7?$Pj0x1<0F|Xnjt!ST7Z5mY-e8~;D;S{i zP5dNsdL2CX9>zk{Scx-!paf)X@i-JEa?nC^N!(ea^}ttd`xf3I&SfmAE)z*fN&PE3MeB+fZ|B`5LFG zAcGP0b#`|09Ja7>bHn$lhlzNcOJ=)(JGu73YV@A%47Orv-WX^u*%041|mCdL1LqV8Tj`#on$dllSG?me?voGye(ZofCJ& zo2As}nz`prYzx*bzd}`@Ch_Y@s|1!%4sGtqi5W4Ad6_wvhenyN{LdSGWZZ}4@Cv`-x5La7U% zf+!DC5jLS;Bh5yxCoQ8n3%+-nd3Wte?XF^p3crl;gCl(0ED1R6W4)HAYk$S>j!(=? z&dAlz&T86!V)WWbdT86ORc2!XcNtRWj~gzR%DH;m_B;5lbMx)qOf@!&lFB2R%+k-xdPXe1_kp5j*vxWzx0a|9vAzNYB9{>QLxp}5h-t!L3q zP|Mswbj#g63!2$ysgIHYjQi)Rxc$*ivD%dTzr63L|KHyCo&V;2_xNw#_kV8bYpr_Q zr~|VVN=llN(O{q6#OOBh!amF5h+!)mgvYE>OOYF<%e7A z_rCeL$4g48DUr9>>~=~f>PDHImXg6ByRGgIKXY^FQRi5kSI_K|6<#Af?)oEIq98WNH3i zWW>KJmHGAKsH%LV_BHp)4hnhD=V;Ih-yK095aHty0M6rw{7a_=OS1|V_K`oIsgqlp zzxb*}Pps;pVUP6Pf1tX8Da6f!+GhIG=ymlRvrb5_WT=-KWCA$H5^03N4Dr zG`zBpWz47gB$&EH4r?Sy7-(n22G(LlgcdsYw0{J@q%KPiT~wn=fgPzI$~AtLfmPfA z{Nj$dQ^>x2yLY3bj5hO0@_FAJ9ziDj)SvA+{%`qMG`0w8bN{^&c4!Pc4MuadrqPob zTm_rWg(s(^{Pv$QZm`YX4k%!e<4OI>V}X&t(U7S#J~yA50&KW;s<@ts6SI}~?R#L; z19$O|M&P2P2wd>hOpD}EvF!OtjD?4WLYX;ll@ax;C#>(O3-a^p?sFk%Yn25$GmS8`L>5-|UK}EyP9qv(vPjo`bUm3OtZh=#lk*>H!OUC$Ch0%WRc2<| z6sfZx00B!Hjl4NA8--q)LIu6#=2VojQDY&8jDG`Qd5Xif>{Tm$|1dAy449!!svBqh ze}G(uX_QQ^av`v;YMN?+0o+=)(7^0)^!@z5VCVC>C8C=n;X7$PZr7u?=;nz@$moD> zf5I&irE{Q+zzdx%MkUQ|0HE^gKZfy!C47?5&w?l2s103pEjs*_@K(ZBuBH(eJwYFDTA=R@-x)0Erj3w9l!FSs9 zR>9}Kg06xk=UXqPjhcv$lyL)}w>T(g5x4ZHNY6k62 z_E>wPh^NZky63Z!Xm`$}(XQv9mv7tKTuI)KGxCqaAo@r^(DY_w{#2>%eK=l3TjgnP zwI`aoA2OlI{Fi+5pr6=EPjp9na-Od-3k~#gYh1ft;tgEZbJ@DZu9-0(d9_CoD^l{r zVMzb3pZPx4|HV>r&)IXsCC#wTB|Hmy5rNC2r5Uixby4@-t{XF?rn4pUtHl*rIeU9A zdfwmd-GHmbeUlMPr|0Cazd*A&Rf}@op3_Ku09=5g5(19UNQgIi>2! zpO;!xgjF(&8x?vsSjt3lx_4Pd+OYjY$n>9&{G9)4=N8d>4Z*KlNDil^-G&dWuxDaf zDE!AdPQ#Kc6HH{zb-FT@IOKWk;v{=Xe7#cSFr2~dw6ism1MvB4)SXuh0T@G0xqn@l zTtw2z=s*xHbUCo`T^k|iT^U(y`ZKRceWofC9>_G`xPn@2_lcFqHGk~3Th9d>hxF=d zrnTu1faGCo4unAF5=m{U!Lf1BD_Egw;ICz@R4x0Cd2*oWe8S(&Ijdgqx#= zt4{f46GAlpU%YHv!38oE)^$9yY#gx*nHe)1u|h9r+gVsW%AIp`M2x^u5v9Sz_r$vV zN3|Kf86G4LFs5vU8B7%d-D}N9jHP(Jc0(cz!2nKPeP9vMZFc_|hE0$w_b~)(5=Kg@ zi`@7Oa`6o$tR&&%XFg!->{#bbNdFXBYOBd$Uoc9X#-c?(Ih>xaC<_P!UYq1AS zc{6Y;i_~EhwmkmWA6m)xXUe9vNL5d(XKsEkcje+U`*_u5ASm_Od zKC;C@GOyXc!bo)$Y39|kE6B(maQZpG>0X-g|H0|WJnPyDC1#qIk?yI3c8JEd0I5#( zKY;XSF6-IqhW5D?y&)HW^(WS?iBEu$t3{~Pb z8UZOA0iOpFdE~q%SqSKdDybYI4B3&2rkLC~H5nAvD=MqJ;>p5@O#e)&T{vex^J)v> zs2|OubEnZkgnjsl_SB8@%}D=WTB(woJqEtR3cq>7iW^oYjkCfLLFjNiZHj{Z@zZG) z(5+GhT8A=9{kKsvQnJIlUrG)Cb$@$z=8Xma;7h0lhzDdgvT<+#VsgU7={1$+OIH*k zghw4j7X*f34i2_`CkE`&A}-k2cgyheyt(?!8qF!-TYrm(S?u`Ba;&rl8Aq|37n%N~ z#>A=OCc^m+RtHvl4e^oO5^a4MMt7w+-DnS9ef4V~=X?jr)BkGBC{9kpPL6T;j!dZu zo>|?=+wmuw`qgf~E)Q^KmU~`RKT(2@mLG>E2xYUszLJ8Ghy`)Yiu8mvWO=l!Tv175^QBEzUzmNx z87Fw{QC8EDL}2&-u=dtrS#58(Fb1L^-Hmj2r@#Y9mvnc7bcdqS-K}(Yx6&=$pmZZ0 z65o7q@ALk?>wC|8&L7{}US94e)>_Y8Yt1?CF~)u0O&&OaNIQy(=R^ac2;MM!`F3GB z&NcHeW4obO6z-=FTp!(1@T=GriTn(*V}bq$Vxh_aws3c)VBMCtQYO? z+l7a%R1;IECH?(poE{-JUJ30#LakGWJU9W zUTTN7YR72%&ByWY=C&>UC48|j5dc#-*Dp;tC_8!<14!_rX-Zq29*4rDN%y9h~EwTiS)1z;UGa~Z> zbP500T!>tRFh)n-b~oe3T_~u+7^5p(jf?3DQikjQ@~4(vpOtveu^!ayBJ3Bv zF+J#*dA1S?USZBCsU*(lG%7)Gxn=dIvu99>29`16u3*R}kk&L8P|QOWnHsK9M8fxLo5 zai(Plw3b#+n3?CDQZ9`Tp3X-uk?>W6v^6D(`^O}=FxD7()K>C^jUHz^T_Kxw2JB5U z^1jz`&^iXI5mtROPo6Ba`-wn;AeSX|&tQMi5|O-}|5;S8<1gax?+^MMaaaaBFvcJ)taJC<4D^$n|VzGUT%3@#`qz zh4aH#U?(4a7n`OB)YO{%3*{(RiB4}$e0f<}74Wp0y{@Ph7oT|EP{Fr{GqbXSKML1) zUo;~f4Nmp9G0CB6n&l|aS_th2AI+yZ?Ya3Wl^3_RcDuuZAlxak89XOpmSLa@p?;md zh`PqbTL!`MyIL5Srs?M(lUzSR1mw)e${l|1gpzVFGYu$ov)kg&;EDvE!uT<~H=jPI zNnZLC^iY7XJnPkiqFG>R#d;vSbIQo^9r{j$S4lEhTNbBA|ymf|HK zICEqOw*060Q4ng9uD#v^CL*M6irW&fn&=3G2EO^5Pieq2Jwqr(8=Ofly0(vPLdu}O z9!OJ|*fG->i-COYCD^eY=(SV9q6ZR)Cx`+*w6@+9Gw!DbXMV0CABCn+gABxd7=WWF zK6g&ay#!|mwsH!T{W(f-V;0>g?~e*s{Lc#GLkKMdWg12w^MU_i_bJE^(;K_kdG#v# zM$<@MSU;a+K?P&a;l+m#sVC~-XN30}S!M+?#iyur!Kum$#sWId?n@o>LJr~VZdPZ# z3k?p2{AUxZGYJ(NW z$i*gwAc0z7PahBl@<>~~>ZL>YF)^-b2l6&KY5O7twSfh$Dtu)@l7TUI8a|6fL!c}e zd5b5yK}G_c*-Q!w9S}L^J_6nW_kRmtp{~tu{%~}}R99!g8Z65m!!b;LIT-8smcL3t zeiv4t!!sJ}1BW8aDu-{hrj9>6Hs1p9fW=VdNfwLXdS$rd#c_*4IH-dYLgvjDHxKea zz?fKp${&qjn=6?l>eXfcmoIN0_Jf`aWz2SzXn?NqAPb+C5U@D zH*O@4eioJl2J$9q$@`IOV1$@Tf)q2cKLPL`bgs5FKC1&U5dAxgLt$5&+p9HBna1dw zbg8bD95-fSTehczfq{X@XCL~nB$N|YonxG!VYj;2>Oj>#eRbcPzr0;I^eriN(L8rqr|ZHdXDiftEU7jzd_`d>!i_7n zrP7!>q4rg(777rlFa9OJ(ZfL9JE|f9tbB_F55r859M$4>bi)~H zdWeJb^Vu_$uu>ZTvUs|x6 z6k(vghlS-+8=W2)VA2!tCF0UdIfQ0>9R(~JJ|W=p!^Ps8CA#5qyIbi3J6tK5IxijO zY;?Zu@2tL~H2b&o3%=HW)_$3jvso_LRin%egG(SP$iSUCmcKuh2dUO}j&|~?+(&@D z*DS%Tk^+=bY3t2#?MuYMpX)_Mi^7vOn+h;41XZ)mcFV1n5t-MQujz+p1*%*95`ZX= zq3q(4|FD*vm(yHn8jg)EP0n_QYfw?;>qHpl92?MD{o$F)6z?boy1^boPbo#Ic3$al z?XXMZ zqjKsQ9BjA-Ormife?RKiuT(%oYH3OTCO##-K@4KkgD`Dh4Xu0Qv^&L+34RluqUFXC zh9Ux=Do%`~EM+Mu5F?vDcl_;8yriUrspS-HLT98COA;Q<>A-(wJ>rd)w61po2>N5y|Bsn zWg^K2*!kf)1zDfMHVz_152sOsa>hLQ44>mZs@>gPP?~Ax(LY6Xprbzx5)SuYwTHiN zd;l~sFrJDRMfqiqVVclE?l}v9R#1K&Z2TDi1r=fRrAg*g2+7F&Cy5?N?RHV&VsJv1 z;5!c=27i@%{(EuCvBUITh+y`V)MHTfIYOkRgHpIgQu${mX3SY%@j^!|l8cqu&$ye= z#`xVkDPsi$vMCux9*;}R| zg{Gd*ER%#d>)?ZiJ?NYzUroM6MsJ$gtL!;h}4NI_tISg90seB2$vM?}f zIqIQID3nh{ElRl_%j>*nMqRzqK78!(47l@Nu6!*$zP^ToP>8SQ(5ZFv97xbNd3=R! z9xRcQRtv1EqDMu=-Z|o%2ky)@Cnfot8n?)hli5%>FNPh_02&hKl%T*5j9P(KeLiLS zWj)(Y9v=R-Rd~rthN{BYM)o!Rqs5F7RXV|D&Kfa}%^w8e+&iMvyg0M)R#@j-bl|*F z-6;$7VXiDD3soAH9uHCwWIlrFjSGlYA70LYRMR2TM=Z86k<7)lDFi$x@jp>3U0|fA zFDdhV;}l^YYY=GSn>C(xwGsllfH-4qR=RrCUrIwD!U?PzExHD_&extI{n1~E+Nvgt`Lj8jTEZr#(PrW~i!$)vZo;i-sF+^F z1|a*l5SbMS=^=C&H!I*+xZNI?8k8~y2})#o+U-I0%+XX0h%AD+-eExki?P6!c3 zU`)f(bABDz@7b?7UB(Uj&csQ~z;oCOi6#=ux)8IEHHSoti`iRS%iM2``Zu|Ps)=hf zsfT|4%?6Uu-AUBv5S0^rF^VRK zP3@N!PWbfr*jlMnElDfQVK2B|0oi>&NM8+MfHU#N!amzgCKTc9vc%fxvyIjSxAsbY zCcz%7GMSYuvTIkC`ofRb$H6{8Jg`i7F|V(*^!Eu@?od

G)A7G3|s_=@U<%)>)QZ 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�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⩔y$CEoDzH}Kf(IMQ|4%Pdizt4$Y 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 assistanceService.save(assistance)); + } + + @Test + void save_InvalidSession_ShouldThrow() { + assistance.setTrainingSession(null); + assertThrows(InvalidDataException.class, () -> assistanceService.save(assistance)); + } + + @Test + void findById_ShouldReturnAssistance() throws Exception { + when(assistanceRepository.existsById(100)).thenReturn(true); + when(assistanceRepository.findById(100)).thenReturn(Optional.of(assistance)); + + Assistance found = assistanceService.findById(100); + assertEquals(assistance.getId(), found.getId()); + } + + @Test + void findById_NullId_ShouldThrow() { + assertThrows(InvalidDataException.class, () -> assistanceService.findById(null)); + } + + @Test + void findById_NotFound_ShouldThrow() { + when(assistanceRepository.existsById(999)).thenReturn(false); + assertThrows(EntityNotFoundException.class, () -> assistanceService.findById(999)); + } + + @Test + void deleteById_ShouldCallRepository() throws Exception { + when(assistanceRepository.existsById(100)).thenReturn(true); + when(assistanceRepository.findById(100)).thenReturn(Optional.of(assistance)); + + doNothing().when(assistanceRepository).deleteById(100); + assistanceService.deleteById(100); + + verify(assistanceRepository).deleteById(100); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/MembershipServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/MembershipServiceTest.java new file mode 100644 index 0000000..e3eb867 --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/MembershipServiceTest.java @@ -0,0 +1,107 @@ +package com.denniseckerskorn.services.class_managment_services; + +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.enums.MembershipTypeValues; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.class_managment_repositories.MembershipRepository; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.lang.reflect.Field; +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class MembershipServiceTest { + + @Mock + private MembershipRepository membershipRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private MembershipService membershipService; + + private Membership membership; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + membership = new Membership(); + membership.setId(1); + membership.setType(MembershipTypeValues.BASIC); + membership.setStartDate(LocalDate.now()); + membership.setEndDate(LocalDate.now().plusMonths(1)); + membership.setStatus(StatusValues.ACTIVE); + + // Inject mock EntityManager using reflection + Field emField = MembershipService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(membershipService, entityManager); + } + + @Test + void save_ValidMembership_ReturnsSavedMembership() { + when(membershipRepository.findByType(MembershipTypeValues.BASIC)).thenReturn(null); + when(membershipRepository.save(membership)).thenReturn(membership); + + Membership saved = membershipService.save(membership); + assertEquals(MembershipTypeValues.BASIC, saved.getType()); + } + + @Test + void save_InvalidMembership_ThrowsException() { + membership.setType(null); + assertThrows(InvalidDataException.class, () -> membershipService.save(membership)); + } + + @Test + void update_ValidMembership_ReturnsUpdatedMembership() { + when(membershipRepository.existsById(1)).thenReturn(true); + when(entityManager.merge(membership)).thenReturn(membership); + + Membership updated = membershipService.update(membership); + assertEquals(MembershipTypeValues.BASIC, updated.getType()); + } + + @Test + void findById_ValidId_ReturnsMembership() { + when(membershipRepository.existsById(1)).thenReturn(true); + when(membershipRepository.findById(1)).thenReturn(Optional.of(membership)); + + Membership found = membershipService.findById(1); + assertEquals(MembershipTypeValues.BASIC, found.getType()); + } + + @Test + void deleteById_NotAssignedToStudent_Successful() { + when(membershipRepository.existsById(1)).thenReturn(true); + when(membershipRepository.findById(1)).thenReturn(Optional.of(membership)); + doNothing().when(membershipRepository).deleteById(1); + + assertDoesNotThrow(() -> membershipService.deleteById(1)); + } + + @Test + void exists_ReturnsTrueIfFound() { + when(membershipRepository.findByType(MembershipTypeValues.BASIC)).thenReturn(membership); + assertTrue(membershipService.exists(membership)); + } + + @Test + void findAll_ReturnsMembershipList() { + when(membershipRepository.findAll()).thenReturn(List.of(membership)); + List list = membershipService.findAll(); + assertEquals(1, list.size()); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupServiceTest.java new file mode 100644 index 0000000..21210fb --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupServiceTest.java @@ -0,0 +1,137 @@ +package com.denniseckerskorn.services.class_managment_services; + +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.Teacher; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.class_managment_repositories.TrainingGroupRepository; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.time.LocalDateTime; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class TrainingGroupServiceTest { + + @Mock + private TrainingGroupRepository trainingGroupRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private TrainingGroupService trainingGroupService; + + private TrainingGroup group; + private Student student; + private TrainingSession session; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + Teacher teacher = new Teacher(); + teacher.setId(1); + + group = new TrainingGroup(); + group.setId(1); + group.setName("Evening Group"); + group.setTeacher(teacher); + group.setSchedule(LocalDateTime.now().plusDays(1)); + group.setStudents(new HashSet<>()); + group.setTrainingSessions(new HashSet<>()); + + student = new Student(); + student.setId(2); + student.setTrainingGroups(new HashSet<>()); + + session = new TrainingSession(); + session.setId(10); + + // Inyección del EntityManager en AbstractService + Field emField = TrainingGroupService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(trainingGroupService, entityManager); + } + + @Test + void save_ShouldReturnSavedGroup() { + when(trainingGroupRepository.save(group)).thenReturn(group); + TrainingGroup saved = trainingGroupService.save(group); + assertEquals("Evening Group", saved.getName()); + } + + @Test + void findById_ShouldReturnGroup() throws Exception { + when(trainingGroupRepository.existsById(1)).thenReturn(true); + when(trainingGroupRepository.findById(1)).thenReturn(Optional.of(group)); + TrainingGroup found = trainingGroupService.findById(1); + assertEquals(1, found.getId()); + } + + @Test + void deleteById_ShouldCallRepository() throws Exception { + when(trainingGroupRepository.existsById(1)).thenReturn(true); + when(trainingGroupRepository.findById(1)).thenReturn(Optional.of(group)); + doNothing().when(trainingGroupRepository).deleteById(1); + trainingGroupService.deleteById(1); + verify(trainingGroupRepository).deleteById(1); + } + + @Test + void addStudentToGroup_ShouldAddBidirectional() throws Exception { + when(trainingGroupRepository.existsById(1)).thenReturn(true); + when(trainingGroupRepository.findById(1)).thenReturn(Optional.of(group)); + trainingGroupService.addStudentToGroup(group, student); + assertTrue(group.getStudents().contains(student)); + assertTrue(student.getTrainingGroups().contains(group)); + } + + @Test + void removeStudentFromGroup_ShouldRemoveBidirectional() throws Exception { + group.getStudents().add(student); + student.getTrainingGroups().add(group); + when(trainingGroupRepository.existsById(1)).thenReturn(true); + when(trainingGroupRepository.findById(1)).thenReturn(Optional.of(group)); + trainingGroupService.removeStudentFromGroup(group, student); + assertFalse(group.getStudents().contains(student)); + assertFalse(student.getTrainingGroups().contains(group)); + } + + @Test + void addTrainingSessionToGroup_ShouldAddSession() throws Exception { + when(trainingGroupRepository.existsById(1)).thenReturn(true); + when(trainingGroupRepository.findById(1)).thenReturn(Optional.of(group)); + trainingGroupService.addTrainingSessionToGroup(group, session); + assertTrue(group.getTrainingSessions().contains(session)); + assertEquals(group, session.getTrainingGroup()); + } + + @Test + void removeTrainingSessionFromGroup_ShouldRemoveSession() throws Exception { + group.getTrainingSessions().add(session); + session.setTrainingGroup(group); + when(trainingGroupRepository.existsById(1)).thenReturn(true); + when(trainingGroupRepository.findById(1)).thenReturn(Optional.of(group)); + trainingGroupService.removeTrainingSessionFromGroup(group, session); + assertFalse(group.getTrainingSessions().contains(session)); + assertNull(session.getTrainingGroup()); + } + + /* + @Test + void save_InvalidSchedule_ShouldThrow() { + group.setSchedule(LocalDateTime.now().minusDays(1)); + assertThrows(InvalidDataException.class, () -> trainingGroupService.save(group)); + } + + */ +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/TrainingSessionServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/TrainingSessionServiceTest.java new file mode 100644 index 0000000..44be8ed --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/class_managment_services/TrainingSessionServiceTest.java @@ -0,0 +1,109 @@ +package com.denniseckerskorn.services.class_managment_services; + +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.class_managment.TrainingSession; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.class_managment_repositories.TrainingSessionRepository; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.time.LocalDateTime; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class TrainingSessionServiceTest { + + @Mock + private TrainingSessionRepository trainingSessionRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private TrainingSessionService trainingSessionService; + + private TrainingSession session; + private TrainingGroup group; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + group = new TrainingGroup(); + group.setId(1); + group.setStudents(new HashSet<>()); + + session = new TrainingSession(); + session.setId(1); + session.setDate(LocalDateTime.now().plusDays(1)); + session.setStatus(StatusValues.ACTIVE); + session.setTrainingGroup(group); + + // Inyección del EntityManager en AbstractService + Field emField = TrainingSessionService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(trainingSessionService, entityManager); + } + + @Test + void save_ShouldReturnSavedSession() { + when(trainingSessionRepository.save(session)).thenReturn(session); + TrainingSession saved = trainingSessionService.save(session); + assertEquals(1, saved.getId()); + } + + @Test + void findById_ShouldReturnSession() throws Exception { + when(trainingSessionRepository.existsById(1)).thenReturn(true); + when(trainingSessionRepository.findById(1)).thenReturn(Optional.of(session)); + TrainingSession found = trainingSessionService.findById(1); + assertEquals(1, found.getId()); + } + + @Test + void deleteById_ShouldCallRepository() throws Exception { + when(trainingSessionRepository.existsById(1)).thenReturn(true); + when(trainingSessionRepository.findById(1)).thenReturn(Optional.of(session)); + doNothing().when(trainingSessionRepository).deleteById(1); + trainingSessionService.deleteById(1); + verify(trainingSessionRepository).deleteById(1); + } + + @Test + void getStudentsFromSession_ShouldReturnStudentSet() throws Exception { + Student student1 = new Student(); + student1.setId(10); + group.getStudents().add(student1); + + when(trainingSessionRepository.existsById(1)).thenReturn(true); + when(trainingSessionRepository.findById(1)).thenReturn(Optional.of(session)); + + Set students = trainingSessionService.getStudentsFromSession(session); + assertEquals(1, students.size()); + assertTrue(students.contains(student1)); + } +/* + @Test + void save_InvalidSession_ShouldThrow() { + session.setDate(LocalDateTime.now().minusDays(1)); // fecha pasada + assertThrows(InvalidDataException.class, () -> trainingSessionService.save(session)); + + session.setDate(LocalDateTime.now().plusDays(1)); + session.setTrainingGroup(null); // sin grupo + assertThrows(InvalidDataException.class, () -> trainingSessionService.save(session)); + + session.setTrainingGroup(group); + session.setStatus(null); // sin status + assertThrows(InvalidDataException.class, () -> trainingSessionService.save(session)); + } + + */ +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/IVATypeServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/IVATypeServiceTest.java new file mode 100644 index 0000000..8cd33b3 --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/IVATypeServiceTest.java @@ -0,0 +1,78 @@ +package com.denniseckerskorn.services.finance_management_services; + +import com.denniseckerskorn.entities.finance.IVAType; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.IVATypeRepository; +import com.denniseckerskorn.services.finance_services.IVATypeService; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class IVATypeServiceTest { + + @Mock + private IVATypeRepository ivaTypeRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private IVATypeService ivaTypeService; + + private IVAType ivaType; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + ivaType = new IVAType(); + ivaType.setId(1); + ivaType.setPercentage(new BigDecimal("21.00")); + ivaType.setDescription("IVA General"); + + Field emField = IVATypeService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(ivaTypeService, entityManager); + } + + @Test + void save_ValidIVAType_ShouldReturnSaved() { + when(ivaTypeRepository.existsByPercentage(ivaType.getPercentage())).thenReturn(false); + when(ivaTypeRepository.save(any())).thenReturn(ivaType); + + IVAType saved = ivaTypeService.save(ivaType); + assertEquals(new BigDecimal("21.00"), saved.getPercentage()); + } + + @Test + void save_DuplicatePercentage_ShouldThrow() { + when(ivaTypeRepository.existsByPercentage(ivaType.getPercentage())).thenReturn(true); + assertThrows(DuplicateEntityException.class, () -> ivaTypeService.save(ivaType)); + } + + @Test + void save_NegativePercentage_ShouldThrow() { + ivaType.setPercentage(new BigDecimal("-5.00")); + assertThrows(InvalidDataException.class, () -> ivaTypeService.save(ivaType)); + } + + @Test + void save_TooLongDescription_ShouldThrow() { + ivaType.setDescription("A".repeat(60)); // Más de 50 caracteres + assertThrows(InvalidDataException.class, () -> ivaTypeService.save(ivaType)); + } + + @Test + void save_NullPercentage_ShouldThrow() { + ivaType.setPercentage(null); + assertThrows(InvalidDataException.class, () -> ivaTypeService.save(ivaType)); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/InvoiceLineServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/InvoiceLineServiceTest.java new file mode 100644 index 0000000..d48ed72 --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/InvoiceLineServiceTest.java @@ -0,0 +1,93 @@ +package com.denniseckerskorn.services.finance_management_services; + +import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.finance.InvoiceLine; +import com.denniseckerskorn.entities.finance.ProductService; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.InvoiceLineRepository; +import com.denniseckerskorn.services.finance_services.InvoiceLineService; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class InvoiceLineServiceTest { + + @Mock + private InvoiceLineRepository invoiceLineRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private InvoiceLineService invoiceLineService; + + private InvoiceLine line; + private Invoice invoice; + private ProductService product; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + invoice = new Invoice(); + invoice.setId(1); + invoice.setTotal(BigDecimal.ZERO); + invoice.setStatus(StatusValues.NOT_PAID); + + product = new ProductService(); + product.setId(1); + product.setName("Clases JiuJitsu"); + product.setPrice(new BigDecimal("50.00")); + + line = new InvoiceLine(); + line.setId(100); + line.setInvoice(invoice); + line.setProductService(product); + line.setQuantity(2); + line.setUnitPrice(new BigDecimal("50.00")); + + Field emField = InvoiceLineService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(invoiceLineService, entityManager); + } + + @Test + void save_ValidInvoiceLine_ShouldCalculateSubtotal() { + when(invoiceLineRepository.save(any())).thenReturn(line); + InvoiceLine saved = invoiceLineService.save(line); + assertNotNull(saved); + assertEquals(new BigDecimal("100.00"), saved.getSubtotal()); + } + + @Test + void save_InvalidQuantity_ShouldThrow() { + line.setQuantity(0); + assertThrows(InvalidDataException.class, () -> invoiceLineService.save(line)); + } + + @Test + void save_InvalidProduct_ShouldThrow() { + line.setProductService(null); + assertThrows(InvalidDataException.class, () -> invoiceLineService.save(line)); + } + + @Test + void save_InvalidInvoice_ShouldThrow() { + line.setInvoice(null); + assertThrows(InvalidDataException.class, () -> invoiceLineService.save(line)); + } + + @Test + void save_InvalidPrice_ShouldThrow() { + line.setUnitPrice(BigDecimal.ZERO); + assertThrows(InvalidDataException.class, () -> invoiceLineService.save(line)); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/InvoiceServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/InvoiceServiceTest.java new file mode 100644 index 0000000..a91cdad --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/InvoiceServiceTest.java @@ -0,0 +1,97 @@ +package com.denniseckerskorn.services.finance_management_services; + +import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.InvoiceRepository; +import com.denniseckerskorn.services.finance_services.InvoiceService; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class InvoiceServiceTest { + + @Mock + private InvoiceRepository invoiceRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private InvoiceService invoiceService; + + private Invoice invoice; + private User user; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + user = new User(); + user.setId(1); + + invoice = new Invoice(); + invoice.setId(10); + invoice.setUser(user); + invoice.setDate(LocalDateTime.now().minusDays(1)); + invoice.setTotal(new BigDecimal("200.00")); + invoice.setStatus(StatusValues.NOT_PAID); + + Field emField = InvoiceService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(invoiceService, entityManager); + } + + @Test + void save_ValidInvoice_ShouldReturnInvoice() { + when(invoiceRepository.save(invoice)).thenReturn(invoice); + Invoice saved = invoiceService.save(invoice); + assertEquals(10, saved.getId()); + } + + @Test + void save_InvalidTotal_ShouldThrow() { + invoice.setTotal(BigDecimal.ZERO); + assertThrows(InvalidDataException.class, () -> invoiceService.save(invoice)); + } + + @Test + void save_InvalidUser_ShouldThrow() { + invoice.setUser(null); + assertThrows(InvalidDataException.class, () -> invoiceService.save(invoice)); + } + + @Test + void save_InvalidStatus_ShouldThrow() { + invoice.setStatus(null); + assertThrows(InvalidDataException.class, () -> invoiceService.save(invoice)); + } + + @Test + void findById_ValidId_ShouldReturnInvoice() { + when(invoiceRepository.existsById(10)).thenReturn(true); + when(invoiceRepository.findById(10)).thenReturn(Optional.of(invoice)); + Invoice found = invoiceService.findById(10); + assertEquals(10, found.getId()); + } + + @Test + void deleteById_ValidId_ShouldCallRepository() { + when(invoiceRepository.existsById(10)).thenReturn(true); + when(invoiceRepository.findById(10)).thenReturn(Optional.of(invoice)); + doNothing().when(invoiceRepository).deleteById(10); + + assertDoesNotThrow(() -> invoiceService.deleteById(10)); + verify(invoiceRepository).deleteById(10); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/PaymentServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/PaymentServiceTest.java new file mode 100644 index 0000000..e286e3f --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/PaymentServiceTest.java @@ -0,0 +1,102 @@ +package com.denniseckerskorn.services.finance_management_services; + +import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.finance.Payment; +import com.denniseckerskorn.enums.PaymentMethodValues; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.PaymentRepository; +import com.denniseckerskorn.services.finance_services.InvoiceService; +import com.denniseckerskorn.services.finance_services.PaymentService; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class PaymentServiceTest { + + @Mock + private PaymentRepository paymentRepository; + + @Mock + private InvoiceService invoiceService; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private PaymentService paymentService; + + private Invoice invoice; + private Payment payment; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + invoice = new Invoice(); + invoice.setId(1); + invoice.setTotal(new BigDecimal("59.99")); + invoice.setStatus(StatusValues.NOT_PAID); + + payment = new Payment(); + payment.setId(101); + payment.setInvoice(invoice); + payment.setAmount(new BigDecimal("59.99")); + payment.setPaymentDate(LocalDateTime.now().minusDays(1)); + payment.setPaymentMethod(PaymentMethodValues.CREDIT_CARD); + payment.setStatus(StatusValues.PAID); + + Field emField = PaymentService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(paymentService, entityManager); + } + + @Test + void save_ShouldUpdateInvoiceStatusAndSavePayment() { + when(paymentRepository.existsByInvoiceId(1)).thenReturn(false); + when(paymentRepository.save(any())).thenReturn(payment); + + Payment saved = paymentService.save(payment); + assertEquals(StatusValues.PAID, payment.getInvoice().getStatus()); + verify(invoiceService).update(invoice); + } + + @Test + void save_DuplicatePayment_ShouldThrow() { + when(paymentRepository.existsByInvoiceId(1)).thenReturn(true); + assertThrows(DuplicateEntityException.class, () -> paymentService.save(payment)); + } + + @Test + void save_InvalidAmount_ShouldThrow() { + payment.setAmount(BigDecimal.ZERO); + assertThrows(InvalidDataException.class, () -> paymentService.save(payment)); + } + + @Test + void save_InvalidPaymentDate_ShouldThrow() { + payment.setPaymentDate(LocalDateTime.now().plusDays(1)); + assertThrows(InvalidDataException.class, () -> paymentService.save(payment)); + } + + @Test + void save_InvalidMethod_ShouldThrow() { + payment.setPaymentMethod(null); + assertThrows(InvalidDataException.class, () -> paymentService.save(payment)); + } + + @Test + void save_InvoiceNull_ShouldThrow() { + payment.setInvoice(null); + assertThrows(InvalidDataException.class, () -> paymentService.save(payment)); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/ProductServiceServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/ProductServiceServiceTest.java new file mode 100644 index 0000000..8e51e70 --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/finance_management_services/ProductServiceServiceTest.java @@ -0,0 +1,95 @@ +package com.denniseckerskorn.services.finance_management_services; + +import com.denniseckerskorn.entities.finance.IVAType; +import com.denniseckerskorn.entities.finance.ProductService; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.finance_repositories.ProductServiceRepository; +import com.denniseckerskorn.services.finance_services.ProductServiceService; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class ProductServiceServiceTest { + + @Mock + private ProductServiceRepository productServiceRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private ProductServiceService productServiceService; + + private ProductService product; + private IVAType ivaType; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + ivaType = new IVAType(); + ivaType.setId(1); + ivaType.setPercentage(new BigDecimal("21.00")); + ivaType.setDescription("IVA General"); + + product = new ProductService(); + product.setId(10); + product.setName("Clase Avanzada"); + product.setType("Servicio"); + product.setPrice(new BigDecimal("30.00")); + product.setIvaType(ivaType); + product.setStatus(StatusValues.ACTIVE); + + Field emField = ProductServiceService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(productServiceService, entityManager); + } + + @Test + void save_ValidProduct_ShouldReturnSaved() { + when(productServiceRepository.existsByName(product.getName())).thenReturn(false); + when(productServiceRepository.save(any())).thenReturn(product); + + ProductService saved = productServiceService.save(product); + assertEquals("Clase Avanzada", saved.getName()); + } + + @Test + void save_DuplicateName_ShouldThrow() { + when(productServiceRepository.existsByName(product.getName())).thenReturn(true); + assertThrows(DuplicateEntityException.class, () -> productServiceService.save(product)); + } + + @Test + void save_NullName_ShouldThrow() { + product.setName(null); + assertThrows(InvalidDataException.class, () -> productServiceService.save(product)); + } + + @Test + void save_InvalidPrice_ShouldThrow() { + product.setPrice(BigDecimal.ZERO); + assertThrows(InvalidDataException.class, () -> productServiceService.save(product)); + } + + @Test + void save_NoIVAType_ShouldThrow() { + product.setIvaType(null); + assertThrows(InvalidDataException.class, () -> productServiceService.save(product)); + } + + @Test + void save_NullStatus_ShouldThrow() { + product.setStatus(null); + assertThrows(InvalidDataException.class, () -> productServiceService.save(product)); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/AdminServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/AdminServiceTest.java new file mode 100644 index 0000000..766fa2b --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/AdminServiceTest.java @@ -0,0 +1,123 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.users.Admin; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.AdminRepository; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.time.LocalDateTime; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class AdminServiceTest { + + @Mock + private AdminRepository adminRepository; + + @Mock + private UserRepository userRepository; + + @InjectMocks + private AdminService adminService; + + + private Admin admin; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + + User user = new User(); + user.setId(1); + user.setName("Dennis"); + user.setSurname("Tester"); + user.setEmail("test@example.com"); + user.setPhoneNumber("600000000"); + user.setPassword("12345678"); + user.setStatus(StatusValues.ACTIVE); + user.setRegisterDate(LocalDateTime.now()); + user.setAddress("Calle Test"); + + admin = new Admin(); + admin.setId(1); + admin.setUser(user); + } + + @Test + void givenValidAdmin_whenSave_thenReturnsSavedAdmin() { + when(adminRepository.existsById(admin.getId())).thenReturn(false); + when(userRepository.save(admin.getUser())).thenReturn(admin.getUser()); // <-- AÑADIDO + when(adminRepository.save(admin)).thenReturn(admin); + + Admin savedAdmin = adminService.save(admin); + + assertNotNull(savedAdmin); + assertEquals(admin.getId(), savedAdmin.getId()); + verify(userRepository, times(1)).save(admin.getUser()); // <-- AÑADIDO + verify(adminRepository, times(1)).save(admin); + } + + + @Test + void givenNullAdmin_whenSave_thenThrowsInvalidDataException() { + InvalidDataException exception = assertThrows(InvalidDataException.class, () -> adminService.save(null)); + assertEquals("Admin cannot be null.", exception.getMessage()); + } + + @Test + void givenAdminAlreadyExists_whenSave_thenThrowsDuplicateEntityException() { + when(adminRepository.existsById(admin.getId())).thenReturn(true); + assertThrows(DuplicateEntityException.class, () -> adminService.save(admin)); + } + + @Test + void givenValidId_whenFindById_thenReturnsAdmin() { + when(adminRepository.existsById(admin.getId())).thenReturn(true); + when(adminRepository.findById(admin.getId())).thenReturn(Optional.of(admin)); + + Admin found = adminService.findById(admin.getId()); + assertEquals(admin.getId(), found.getId()); + } + + @Test + void givenNullId_whenFindById_thenThrowsInvalidDataException() { + assertThrows(InvalidDataException.class, () -> adminService.findById(null)); + } + + @Test + void givenNonExistingId_whenFindById_thenThrowsEntityNotFoundException() { + when(adminRepository.existsById(99)).thenReturn(false); + assertThrows(EntityNotFoundException.class, () -> adminService.findById(99)); + } + + @Test + void givenValidId_whenDeleteById_thenDeletesAdmin() { + when(adminRepository.existsById(admin.getId())).thenReturn(true); + doNothing().when(adminRepository).deleteById(admin.getId()); + + adminService.deleteById(admin.getId()); + verify(adminRepository, times(1)).deleteById(admin.getId()); + } + + @Test + void givenNullId_whenDeleteById_thenThrowsInvalidDataException() { + assertThrows(InvalidDataException.class, () -> adminService.deleteById(null)); + } + + @Test + void givenNonExistingId_whenDeleteById_thenThrowsEntityNotFoundException() { + when(adminRepository.existsById(99)).thenReturn(false); + assertThrows(EntityNotFoundException.class, () -> adminService.deleteById(99)); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/NotificationServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/NotificationServiceTest.java new file mode 100644 index 0000000..8d63821 --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/NotificationServiceTest.java @@ -0,0 +1,105 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.Notification; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.NotificationRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.time.LocalDateTime; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class NotificationServiceTest { + + @Mock + private NotificationRepository notificationRepository; + + @InjectMocks + private NotificationService notificationService; + + private Notification notification; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + notification = new Notification(); + notification.setId(1); + notification.setTitle("Test"); + notification.setShippingDate(LocalDateTime.now()); + } + + @Test + void save_ValidNotification_ReturnsSavedNotification() { + when(notificationRepository.save(notification)).thenReturn(notification); + Notification saved = notificationService.save(notification); + assertNotNull(saved); + assertEquals("Test", saved.getTitle()); + } + + @Test + void save_NullNotification_ThrowsInvalidDataException() { + InvalidDataException exception = assertThrows(InvalidDataException.class, () -> notificationService.save(null)); + assertEquals("Notification cannot be null", exception.getMessage()); + } + + + @Test + void findById_ValidId_ReturnsNotification() { + when(notificationRepository.existsById(1)).thenReturn(true); + when(notificationRepository.findById(1)).thenReturn(Optional.of(notification)); + Notification found = notificationService.findById(1); + assertEquals("Test", found.getTitle()); + } + + @Test + void findById_NullId_ThrowsInvalidDataException() { + assertThrows(InvalidDataException.class, () -> notificationService.findById(null)); + } + + @Test + void deleteNotificationById_ValidId_DeletesNotification() { + when(notificationRepository.existsById(1)).thenReturn(true); + doNothing().when(notificationRepository).deleteById(1); + assertDoesNotThrow(() -> notificationService.deleteById(1)); + } + + @Test + void findAll_ReturnsList() { + when(notificationRepository.findAll()).thenReturn(Collections.singletonList(notification)); + List list = notificationService.findAll(); + assertEquals(1, list.size()); + } + + @Test + void addNotificationToUser_AddsUserSuccessfully() { + User user = new User(); + user.setId(1); + when(notificationRepository.findById(1)).thenReturn(Optional.of(notification)); + when(notificationRepository.existsById(1)).thenReturn(true); + when(notificationRepository.save(notification)).thenReturn(notification); + notification.setUsers(new HashSet<>()); + notificationService.addNotificationToUser(notification, user); + verify(notificationRepository, times(1)).save(any()); + } + + @Test + void removeNotificationFromUser_RemovesUserSuccessfully() { + User user = new User(); + user.setId(1); + notification.addUser(user); + when(notificationRepository.findById(1)).thenReturn(Optional.of(notification)); + when(notificationRepository.existsById(1)).thenReturn(true); + when(notificationRepository.save(notification)).thenReturn(notification); + notificationService.removeNotificationFromUser(notification, user); + verify(notificationRepository, times(1)).save(notification); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/PermissionServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/PermissionServiceTest.java new file mode 100644 index 0000000..c6ff735 --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/PermissionServiceTest.java @@ -0,0 +1,92 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.Permission; +import com.denniseckerskorn.enums.PermissionValues; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.PermissionRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.Optional; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class PermissionServiceTest { + + @Mock + private PermissionRepository permissionRepository; + + @InjectMocks + private PermissionService permissionService; + + private Permission permission; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + permission = new Permission(); + permission.setId(1); + permission.setPermissionName(PermissionValues.FULL_ACCESS); + } + + @Test + void save_ValidPermission_ReturnsSavedPermission() { + when(permissionRepository.save(permission)).thenReturn(permission); + Permission saved = permissionService.save(permission); + assertNotNull(saved); + assertEquals(PermissionValues.FULL_ACCESS, saved.getPermissionName()); + } + + @Test + void save_NullPermission_ThrowsInvalidDataException() { + assertThrows(InvalidDataException.class, () -> permissionService.save(null)); + } + + @Test + void findById_ValidId_ReturnsPermission() { + when(permissionRepository.existsById(1)).thenReturn(true); + when(permissionRepository.findById(1)).thenReturn(Optional.of(permission)); + Permission found = permissionService.findById(1); + assertEquals(permission.getPermissionName(), found.getPermissionName()); + } + + @Test + void findById_NotFound_ThrowsEntityNotFoundException() { + when(permissionRepository.existsById(99)).thenReturn(false); + assertThrows(EntityNotFoundException.class, () -> permissionService.findById(99)); + } + + @Test + void deleteById_ValidId_DeletesPermission() { + when(permissionRepository.existsById(1)).thenReturn(true); + doNothing().when(permissionRepository).deleteById(1); + assertDoesNotThrow(() -> permissionService.deleteById(1)); + } + + @Test + void findPermissionByName_Valid_ReturnsPermission() { + when(permissionRepository.findByPermissionName(PermissionValues.FULL_ACCESS)).thenReturn(permission); + Permission found = permissionService.findPermissionByName(PermissionValues.FULL_ACCESS); + assertEquals(permission.getPermissionName(), found.getPermissionName()); + } + + @Test + void findPermissionByName_NotFound_ThrowsEntityNotFoundException() { + when(permissionRepository.findByPermissionName(PermissionValues.VIEW_OWN_DATA)).thenReturn(null); + assertThrows(EntityNotFoundException.class, + () -> permissionService.findPermissionByName(PermissionValues.VIEW_OWN_DATA)); + } + + @Test + void findAll_ReturnsList() { + when(permissionRepository.findAll()).thenReturn(List.of(permission)); + List result = permissionService.findAll(); + assertEquals(1, result.size()); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/RoleServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/RoleServiceTest.java new file mode 100644 index 0000000..0885f0f --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/RoleServiceTest.java @@ -0,0 +1,120 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.Permission; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.RoleRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class RoleServiceTest { + + @Mock + private RoleRepository roleRepository; + + @InjectMocks + private RoleService roleService; + + private Role role; + private Permission permission; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + role = new Role(); + role.setId(1); + role.setName("Admin"); + role.setPermissions(new HashSet<>()); + + permission = new Permission(); + permission.setId(1); + } + + @Test + void save_ValidRole_ReturnsSavedRole() { + when(roleRepository.save(role)).thenReturn(role); + Role saved = roleService.save(role); + assertNotNull(saved); + assertEquals("Admin", saved.getName()); + } + + @Test + void save_NullRoleName_ThrowsInvalidDataException() { + role.setName(null); + assertThrows(InvalidDataException.class, () -> roleService.save(role)); + } + + @Test + void findById_ValidId_ReturnsRole() { + when(roleRepository.existsById(1)).thenReturn(true); + when(roleRepository.findById(1)).thenReturn(Optional.of(role)); + Role found = roleService.findById(1); + assertEquals("Admin", found.getName()); + } + + @Test + void findById_InvalidId_ThrowsEntityNotFoundException() { + when(roleRepository.existsById(99)).thenReturn(false); + assertThrows(EntityNotFoundException.class, () -> roleService.findById(99)); + } + + @Test + void deleteById_ValidId_DeletesRole() { + when(roleRepository.existsById(1)).thenReturn(true); + doNothing().when(roleRepository).deleteById(1); + assertDoesNotThrow(() -> roleService.deleteById(1)); + } + + @Test + void findAll_ReturnsListOfRoles() { + when(roleRepository.findAll()).thenReturn(List.of(role)); + List roles = roleService.findAll(); + assertEquals(1, roles.size()); + } + + @Test + void addPermissionToRole_AddsSuccessfully() { + when(roleRepository.findById(1)).thenReturn(Optional.of(role)); + when(roleRepository.existsById(1)).thenReturn(true); + when(roleRepository.save(any())).thenReturn(role); + roleService.addPermissionToRole(role, permission); + verify(roleRepository).save(any()); + } + + @Test + void addPermissionToRole_NullInputs_ThrowsInvalidDataException() { + assertThrows(InvalidDataException.class, () -> roleService.addPermissionToRole(null, permission)); + assertThrows(InvalidDataException.class, () -> roleService.addPermissionToRole(role, null)); + } + + @Test + void removePermissionFromRole_RemovesSuccessfully() { + Set mutablePermissions = new HashSet<>(); + mutablePermissions.add(permission); + role.setPermissions(mutablePermissions); + + when(roleRepository.findById(1)).thenReturn(Optional.of(role)); + when(roleRepository.existsById(1)).thenReturn(true); + when(roleRepository.save(any())).thenReturn(role); + + roleService.removePermissionFromRole(role, permission); + + verify(roleRepository).save(any()); + } + + + @Test + void removePermissionFromRole_NullInputs_ThrowsInvalidDataException() { + assertThrows(InvalidDataException.class, () -> roleService.removePermissionFromRole(null, permission)); + assertThrows(InvalidDataException.class, () -> roleService.removePermissionFromRole(role, null)); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/StudentHistoryServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/StudentHistoryServiceTest.java new file mode 100644 index 0000000..cbe8c50 --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/StudentHistoryServiceTest.java @@ -0,0 +1,105 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.repositories.user_managment_repositories.StudentHistoryRepository; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class StudentHistoryServiceTest { + + @Mock + private StudentHistoryRepository studentHistoryRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private StudentHistoryService studentHistoryService; + + private StudentHistory history; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + // Inyectar entityManager manualmente en AbstractService + Field entityManagerField = studentHistoryService.getClass().getSuperclass().getDeclaredField("entityManager"); + entityManagerField.setAccessible(true); + entityManagerField.set(studentHistoryService, entityManager); + + history = new StudentHistory(); + history.setId(1); + history.setEventType("REGISTERED"); + } + + @Test + void save_ValidHistory_ReturnsSavedEntity() { + when(studentHistoryRepository.save(history)).thenReturn(history); + StudentHistory saved = studentHistoryService.save(history); + assertNotNull(saved); + assertEquals("REGISTERED", saved.getEventType()); + } + + @Test + void findById_ValidId_ReturnsEntity() { + when(studentHistoryRepository.existsById(1)).thenReturn(true); + when(studentHistoryRepository.findById(1)).thenReturn(Optional.of(history)); + StudentHistory found = studentHistoryService.findById(1); + assertEquals(history.getEventType(), found.getEventType()); + } + + @Test + void findById_NotFound_ThrowsException() { + when(studentHistoryRepository.existsById(99)).thenReturn(false); + assertThrows(EntityNotFoundException.class, () -> studentHistoryService.findById(99)); + } + + @Test + void deleteById_ValidId_DeletesSuccessfully() { + when(studentHistoryRepository.existsById(1)).thenReturn(true); + doNothing().when(studentHistoryRepository).deleteById(1); + studentHistoryService.deleteById(1); + verify(studentHistoryRepository).deleteById(1); + } + + @Test + void findAll_ReturnsList() { + when(studentHistoryRepository.findAll()).thenReturn(List.of(history)); + List list = studentHistoryService.findAll(); + assertEquals(1, list.size()); + assertEquals("REGISTERED", list.get(0).getEventType()); + } + + @Test + void exists_WithMatchingEventType_ReturnsTrue() { + when(studentHistoryRepository.existsByEventType("REGISTERED")).thenReturn(true); + assertTrue(studentHistoryService.exists(history)); + } + + @Test + void update_ValidHistory_ReturnsUpdatedEntity() { + when(studentHistoryRepository.existsById(1)).thenReturn(true); + when(entityManager.merge(history)).thenReturn(history); + StudentHistory updated = studentHistoryService.update(history); + assertEquals("REGISTERED", updated.getEventType()); + } + + @Test + void update_NonExistent_ThrowsException() { + history.setId(99); + when(studentHistoryRepository.existsById(99)).thenReturn(false); + assertThrows(EntityNotFoundException.class, () -> studentHistoryService.update(history)); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/StudentServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/StudentServiceTest.java new file mode 100644 index 0000000..c96976f --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/StudentServiceTest.java @@ -0,0 +1,181 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.class_managment.Assistance; +import com.denniseckerskorn.entities.class_managment.Membership; +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.user_managment.StudentHistory; +import com.denniseckerskorn.entities.user_managment.users.Student; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.StudentRepository; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import com.denniseckerskorn.repositories.class_managment_repositories.AssistanceRepository; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.time.LocalDate; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class StudentServiceTest { + + @Mock private StudentRepository studentRepository; + @Mock private UserRepository userRepository; + @Mock private AssistanceRepository assistanceRepository; + @Mock private EntityManager entityManager; + + @InjectMocks + private StudentService studentService; + + private Student student; + private Membership membership; + private StudentHistory history; + private Assistance assistance; + private TrainingGroup group; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + student = new Student(); + student.setId(1); + student.setDni("12345678A"); + student.setBirthdate(LocalDate.of(2000, 1, 1)); + student.setUser(new User()); + student.setHistories(new HashSet<>()); + student.setAssistances(new HashSet<>()); + student.setTrainingGroups(new HashSet<>()); + + membership = new Membership(); membership.setId(1); + history = new StudentHistory(); history.setId(1); + assistance = new Assistance(); assistance.setId(10); + group = new TrainingGroup(); group.setId(99); group.setStudents(new HashSet<>()); + + // Inyectar entityManager usando reflexión + Field emField = StudentService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(studentService, entityManager); + } + + @Test + void save_ValidStudent_ShouldSucceed() { + when(userRepository.save(any())).thenReturn(student.getUser()); + when(studentRepository.save(any())).thenReturn(student); + + Student saved = studentService.save(student); + assertEquals("12345678A", saved.getDni()); + } + + @Test + void update_ValidStudent_ShouldSucceed() { + when(studentRepository.existsById(1)).thenReturn(true); + when(entityManager.merge(any())).thenReturn(student); + Student updated = studentService.update(student); + assertEquals("12345678A", updated.getDni()); + } + + @Test + void addStudentHistoryToStudent_ShouldAddSuccessfully() { + when(studentRepository.existsById(1)).thenReturn(true); + when(studentRepository.findById(1)).thenReturn(Optional.of(student)); + studentService.addStudentHistoryToStudent(student, history); + assertTrue(student.getHistories().contains(history)); + } + + @Test + void addStudentToMembership_ShouldLinkMembership() { + when(studentRepository.existsById(1)).thenReturn(true); + when(studentRepository.findById(1)).thenReturn(Optional.of(student)); + studentService.addStudentToMembership(student, membership); + assertEquals(membership, student.getMembership()); + } + + @Test + void addAssistanceToStudent_ShouldLinkAssistance() { + when(studentRepository.existsById(1)).thenReturn(true); + when(studentRepository.findById(1)).thenReturn(Optional.of(student)); + studentService.addAssistanceToStudent(student, assistance); + assertTrue(student.getAssistances().contains(assistance)); + assertEquals(student, assistance.getStudent()); + } + + @Test + void addGroupToStudent_ShouldLinkBothSides() { + when(studentRepository.existsById(1)).thenReturn(true); + when(studentRepository.findById(1)).thenReturn(Optional.of(student)); + studentService.addGroupToStudent(1, group); + assertTrue(student.getTrainingGroups().contains(group)); + assertTrue(group.getStudents().contains(student)); + } + + @Test + void removeGroupFromStudent_ShouldUnlinkBothSides() { + student.getTrainingGroups().add(group); + group.getStudents().add(student); + + when(studentRepository.existsById(1)).thenReturn(true); + when(studentRepository.findById(1)).thenReturn(Optional.of(student)); + studentService.removeGroupFromStudent(1, group); + assertFalse(student.getTrainingGroups().contains(group)); + assertFalse(group.getStudents().contains(student)); + } + + @Test + void deleteSingleAssistanceFromStudent_ShouldRemoveCorrectly() { + assistance.setStudent(student); + student.getAssistances().add(assistance); + + when(studentRepository.existsById(1)).thenReturn(true); + when(studentRepository.findById(1)).thenReturn(Optional.of(student)); + doNothing().when(assistanceRepository).delete(any()); + + studentService.deleteSingleAssistanceFromStudent(1, 10); + assertFalse(student.getAssistances().contains(assistance)); + } + + @Test + void deleteStudentHistory_ShouldClearHistories() { + history.setStudent(student); + student.getHistories().add(history); + + when(studentRepository.existsById(1)).thenReturn(true); + when(studentRepository.findById(1)).thenReturn(Optional.of(student)); + studentService.deleteStudentHistory(1); + assertTrue(student.getHistories().isEmpty()); + } + + @Test + void deleteStudentMembership_ShouldUnlink() { + student.setMembership(membership); + when(studentRepository.existsById(1)).thenReturn(true); + when(studentRepository.findById(1)).thenReturn(Optional.of(student)); + studentService.deleteStudentMembership(1); + assertNull(student.getMembership()); + } + + @Test + void findByDni_ValidDni_ShouldReturnStudent() { + when(studentRepository.findByDni("12345678A")).thenReturn(student); + Student result = studentService.findByDni("12345678A"); + assertEquals("12345678A", result.getDni()); + } + + @Test + void existsByDni_ShouldReturnTrue() { + when(studentRepository.existsByDni("12345678A")).thenReturn(true); + assertTrue(studentService.existsByDni("12345678A")); + } + + @Test + void findAll_ShouldReturnList() { + when(studentRepository.findAll()).thenReturn(List.of(student)); + List list = studentService.findAll(); + assertEquals(1, list.size()); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/TeacherServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/TeacherServiceTest.java new file mode 100644 index 0000000..ec53e5a --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/TeacherServiceTest.java @@ -0,0 +1,141 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.class_managment.TrainingGroup; +import com.denniseckerskorn.entities.user_managment.users.Teacher; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.TeacherRepository; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.lang.reflect.Field; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class TeacherServiceTest { + + @Mock + private TeacherRepository teacherRepository; + + @Mock + private EntityManager entityManager; + + @Mock + private UserRepository userRepository; + + @InjectMocks + private TeacherService teacherService; + + private Teacher teacher; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + User user = new User(); + user.setEmail("test@example.com"); + teacher = new Teacher(); + teacher.setId(1); + teacher.setUser(user); + teacher.setTrainingGroups(new HashSet<>()); + + // Inject mock EntityManager into AbstractService using reflection + Field emField = TeacherService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(teacherService, entityManager); + } + + @Test + void save_ValidTeacher_ReturnsSavedTeacher() { + when(userRepository.save(teacher.getUser())).thenReturn(teacher.getUser()); // <-- Añadido + when(teacherRepository.save(teacher)).thenReturn(teacher); + + Teacher saved = teacherService.save(teacher); + assertNotNull(saved); + assertEquals("test@example.com", saved.getUser().getEmail()); + + verify(userRepository).save(teacher.getUser()); // <-- Validación opcional + } + + + @Test + void save_NullTeacher_ThrowsInvalidDataException() { + InvalidDataException exception = assertThrows(InvalidDataException.class, () -> teacherService.save(null)); + assertEquals("Teacher or user email cannot be null.", exception.getMessage()); + } + + @Test + void update_ValidTeacher_ReturnsUpdatedTeacher() { + when(teacherRepository.existsById(teacher.getId())).thenReturn(true); + when(entityManager.merge(teacher)).thenReturn(teacher); + Teacher updated = teacherService.update(teacher); + assertNotNull(updated); + assertEquals("test@example.com", updated.getUser().getEmail()); + } + + @Test + void update_NullTeacher_ThrowsInvalidDataException() { + InvalidDataException exception = assertThrows(InvalidDataException.class, () -> teacherService.update(null)); + assertEquals("Teacher or user email cannot be null.", exception.getMessage()); + } + + @Test + void deleteById_WithTrainingGroups_ThrowsInvalidDataException() { + teacher.setTrainingGroups(Set.of(new TrainingGroup())); + when(teacherRepository.findById(1)).thenReturn(Optional.of(teacher)); + when(teacherRepository.existsById(1)).thenReturn(true); + + InvalidDataException exception = assertThrows(InvalidDataException.class, () -> teacherService.deleteById(1)); + assertTrue(exception.getMessage().contains("Cannot delete teacher with ID")); + } + + @Test + void deleteById_ValidId_DeletesSuccessfully() { + when(teacherRepository.findById(1)).thenReturn(Optional.of(teacher)); + when(teacherRepository.existsById(1)).thenReturn(true); + doNothing().when(teacherRepository).deleteById(1); + assertDoesNotThrow(() -> teacherService.deleteById(1)); + verify(teacherRepository).deleteById(1); + } + + @Test + void findAll_ReturnsListOfTeachers() { + when(teacherRepository.findAll()).thenReturn(List.of(teacher)); + List list = teacherService.findAll(); + assertEquals(1, list.size()); + } + + @Test + void exists_ReturnsTrueIfEmailExists() { + when(teacherRepository.existsByUserEmail("test@example.com")).thenReturn(true); + assertTrue(teacherService.exists(teacher)); + } + + @Test + void findById_NullId_ThrowsInvalidDataException() { + assertThrows(InvalidDataException.class, () -> teacherService.findById(null)); + } + + @Test + void findById_NotFound_ThrowsEntityNotFoundException() { + when(teacherRepository.existsById(99)).thenReturn(false); + assertThrows(EntityNotFoundException.class, () -> teacherService.findById(99)); + } + + @Test + void findById_ValidId_ReturnsTeacher() { + when(teacherRepository.existsById(1)).thenReturn(true); + when(teacherRepository.findById(1)).thenReturn(Optional.of(teacher)); + Teacher found = teacherService.findById(1); + assertEquals("test@example.com", found.getUser().getEmail()); + } +} diff --git a/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/UserServiceTest.java b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/UserServiceTest.java new file mode 100644 index 0000000..7bea7bf --- /dev/null +++ b/memberflow-data/src/test/java/com/denniseckerskorn/services/user_managment_services/UserServiceTest.java @@ -0,0 +1,147 @@ +package com.denniseckerskorn.services.user_managment_services; + +import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.user_managment.Role; +import com.denniseckerskorn.entities.user_managment.users.User; +import com.denniseckerskorn.enums.StatusValues; +import com.denniseckerskorn.exceptions.DuplicateEntityException; +import com.denniseckerskorn.exceptions.EntityNotFoundException; +import com.denniseckerskorn.exceptions.InvalidDataException; +import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository; +import jakarta.persistence.EntityManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.*; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class UserServiceTest { + + @Mock + private UserRepository userRepository; + + @Mock + private EntityManager entityManager; + + @InjectMocks + private UserService userService; + + private User user; + private Role role; + + @BeforeEach + void setUp() throws Exception { + MockitoAnnotations.openMocks(this); + + role = new Role(); + role.setId(1); + role.setName("Admin"); + + user = new User(); + user.setId(1); + user.setName("John"); + user.setSurname("Doe"); + user.setEmail("john@example.com"); + user.setPhoneNumber("123456789"); + user.setPassword("password123"); + user.setStatus(StatusValues.ACTIVE); + user.setRegisterDate(LocalDateTime.now()); + user.setRole(role); + + // Inyectar el EntityManager en AbstractService + Field emField = UserService.class.getSuperclass().getDeclaredField("entityManager"); + emField.setAccessible(true); + emField.set(userService, entityManager); + } + + @Test + void save_ValidUser_ReturnsSavedUser() { + when(userRepository.save(user)).thenReturn(user); + User saved = userService.save(user); + assertNotNull(saved); + assertEquals("john@example.com", saved.getEmail()); + } + + @Test + void save_InvalidUser_ThrowsException() { + user.setEmail("invalid"); + assertThrows(InvalidDataException.class, () -> userService.save(user)); + } + + @Test + void update_ValidUser_ReturnsUpdatedUser() { + when(userRepository.existsById(1)).thenReturn(true); + when(entityManager.merge(user)).thenReturn(user); + User updated = userService.update(user); + assertNotNull(updated); + } + + @Test + void deleteById_ValidId_DeletesUser() { + when(userRepository.findById(1)).thenReturn(Optional.of(user)); + when(userRepository.existsById(1)).thenReturn(true); + doNothing().when(userRepository).deleteById(1); + + assertDoesNotThrow(() -> userService.deleteById(1)); + verify(userRepository).deleteById(1); + } + + + @Test + void findAllUserByRoleName_ReturnsList() { + when(userRepository.findAllByRoleName("Admin")).thenReturn(List.of(user)); + List users = userService.findAllUserByRoleName("Admin"); + assertEquals(1, users.size()); + } + + @Test + void findByEmail_ValidEmail_ReturnsUser() { + when(userRepository.findByEmail("john@example.com")).thenReturn(user); + User found = userService.findByEmail("john@example.com"); + assertEquals("John", found.getName()); + } + + @Test + void findByEmail_NotFound_ThrowsException() { + when(userRepository.findByEmail("notfound@example.com")).thenReturn(null); + assertThrows(EntityNotFoundException.class, () -> userService.findByEmail("notfound@example.com")); + } + + @Test + void assignRoleToUser_AssignsSuccessfully() { + when(userRepository.existsById(1)).thenReturn(true); + when(userRepository.findById(1)).thenReturn(Optional.of(user)); + when(userRepository.save(user)).thenReturn(user); + assertDoesNotThrow(() -> userService.assignRoleToUser(1, role)); + assertEquals("Admin", user.getRole().getName()); + } + + @Test + void existsByEmail_ReturnsTrue() { + when(userRepository.existsByEmail("john@example.com")).thenReturn(true); + assertTrue(userService.existsByEmail("john@example.com")); + } + + @Test + void addInvoiceToUser_ShouldLinkInvoiceCorrectly() { + Invoice invoice = new Invoice(); + invoice.setId(1); + invoice.setDate(LocalDateTime.now().minusDays(1)); + invoice.setTotal(new BigDecimal("100.00")); + invoice.setStatus(StatusValues.NOT_PAID); + + assertDoesNotThrow(() -> userService.addInvoiceToUser(user, invoice)); + + assertTrue(user.getInvoices().contains(invoice)); + assertEquals(user, invoice.getUser()); + } + + +} diff --git a/memberflow-frontend/.gitignore b/memberflow-frontend/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/memberflow-frontend/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/memberflow-frontend/estructura-frontend.txt b/memberflow-frontend/estructura-frontend.txt new file mode 100644 index 0000000..635d694 --- /dev/null +++ b/memberflow-frontend/estructura-frontend.txt @@ -0,0 +1,90 @@ +Listado de rutas de carpetas +El nmero de serie del volumen es 2891-90D5 +C:. +| .gitignore +| estructura-frontend.txt +| package-lock.json +| package.json +| ++---public +| favicon.ico +| index.html +| logo192.png +| logo512.png +| manifest.json +| robots.txt +| +\---src + | App.css + | App.js + | App.test.js + | index.css + | index.js + | logo.svg + | reportWebVitals.js + | service-worker.js + | serviceWorkerRegistration.js + | setupTests.js + | + +---api + | axiosConfig.js + | + +---components + | +---common + | | ErrorMessage.jsx + | | + | +---forms + | | AssitanceForm.jsx + | | LoginForm.jsx + | | MembershipCreateForm.jsx + | | NotificationCreateForm.jsx + | | StudentForm.jsx + | | StudentHistoryCreateForm.jsx + | | TeacherForm.jsx + | | TrainingGroupFrom.jsx + | | TrainingGroupsStudentManager.jsx + | | UserCreateForm.jsx + | | UserForm.jsx + | | ViewTimetable.jsx + | | + | +---layout + | | ContentArea.jsx + | | MainLayout.jsx + | | Sidebar.jsx + | | Topbar.jsx + | | + | +---lists + | | AssistanceList.jsx + | | MembershipList.jsx + | | NotificationList.jsx + | | StudentHistoryList.jsx + | | TrainingGroupList.jsx + | | TrainingSessionList.jsx + | | UserList.jsx + | | + | \---styles + | ContentArea.css + | DashboardCards.css + | FormStyles.css + | Login.css + | MainLayout.css + | Sidebar.css + | Topbar.css + | + +---pages + | | LoginPage.jsx + | | ProfilePage.jsx + | | RedirectByRole.jsx + | | + | +---admin + | | AdminDashboard.jsx + | | + | +---student + | | StudentDashboard.jsx + | | + | \---teacher + | TeacherDashboard.jsx + | + \---utils + jwtHelper.js + diff --git a/memberflow-frontend/package-lock.json b/memberflow-frontend/package-lock.json new file mode 100644 index 0000000..fed0b9f --- /dev/null +++ b/memberflow-frontend/package-lock.json @@ -0,0 +1,17490 @@ +{ + "name": "memberflow-front", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "memberflow-front", + "version": "0.1.0", + "dependencies": { + "axios": "^1.8.4", + "cra-template-pwa": "2.0.0", + "jwt-decode": "^4.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-hot-toast": "^2.5.2", + "react-router-dom": "^7.5.1", + "react-scripts": "^5.0.1", + "web-vitals": "^4.2.4" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.0.tgz", + "integrity": "sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", + "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.27.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", + "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", + "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-decorators": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", + "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz", + "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/plugin-syntax-flow": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", + "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", + "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", + "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz", + "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.27.0", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", + "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-typescript": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "license": "MIT" + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", + "license": "CC0-1.0" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.16.tgz", + "integrity": "sha512-kLQc9xz6QIqd2oIYyXRUiAp79kGpFBm3fEM9ahfG1HI0WI5gdZ2OVHWdmZYnwODt7ISck+QuQ6sBPrtvUBML7Q==", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "license": "MIT", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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==", + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause" + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001715", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", + "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "license": "MIT", + "engines": { + "node": ">=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==", + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "license": "MIT" + }, + "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==", + "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==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cra-template-pwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cra-template-pwa/-/cra-template-pwa-2.0.0.tgz", + "integrity": "sha512-sSxPH6qzIUvPQ6I0dllqO58a9BHHc1TvC0A6jhZlfARgdruDGTmPWup7EvgFl2lHwhkQWTBanx3D7iUOEsyUjg==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "license": "MIT", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "license": "MIT" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "license": "BSD-2-Clause" + }, + "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==", + "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/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.139", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.139.tgz", + "integrity": "sha512-GGnRYOTdN5LYpwbIr0rwP/ZHOQSvAF6TG0LSzp28uCBb9JiXHJGmaaKw29qjNJc5bGnnp6kXJqRnGMQoELwi5w==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "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==", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "license": "MIT" + }, + "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==", + "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==", + "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/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "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==", + "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-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/goober": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", + "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", + "license": "MIT", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "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==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=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==", + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "license": "MIT", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", + "license": "MIT" + }, + "node_modules/react-hot-toast": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.2.tgz", + "integrity": "sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw==", + "license": "MIT", + "dependencies": { + "csstype": "^3.1.3", + "goober": "^2.1.16" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.1.tgz", + "integrity": "sha512-/jjU3fcYNd2bwz9Q0xt5TwyiyoO8XjSEFXJY4O/lMAlkGTHWuHRAbR9Etik+lSDqMC7A7mz3UlXzgYT6Vl58sA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.1.tgz", + "integrity": "sha512-5DPSPc7ENrt2tlKPq0FtpG80ZbqA9aIKEyqX6hSNJDlol/tr6iqCK4crqdsusmOSSotq6zDsn0y3urX9TuTNmA==", + "license": "MIT", + "dependencies": { + "react-router": "7.5.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + "license": "CC0-1.0" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "license": "MIT" + }, + "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==", + "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/string-width-cjs": { + "name": "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==", + "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/string-width-cjs/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==", + "license": "MIT" + }, + "node_modules/string-width/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==", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.99.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.6.tgz", + "integrity": "sha512-TJOLrJ6oeccsGWPl7ujCYuc0pIq2cNsuD6GZDma8i5o5Npvcco/z+NKvZSFsP0/x6SShVb0+X2JK/JHUjKY9dQ==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "license": "MIT", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "license": "MIT" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "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==", + "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/wrap-ansi-cjs": { + "name": "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==", + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/memberflow-frontend/package.json b/memberflow-frontend/package.json new file mode 100644 index 0000000..b9bc01c --- /dev/null +++ b/memberflow-frontend/package.json @@ -0,0 +1,40 @@ +{ + "name": "memberflow-front", + "version": "0.1.0", + "private": true, + "dependencies": { + "axios": "^1.8.4", + "cra-template-pwa": "2.0.0", + "jwt-decode": "^4.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-hot-toast": "^2.5.2", + "react-router-dom": "^7.5.1", + "react-scripts": "^5.0.1", + "web-vitals": "^4.2.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/memberflow-frontend/public/favicon.ico b/memberflow-frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 zcma);c{J4h9>;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b; zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB3vGa^W|sj)80f#V0@M_CAZTIO(t--xg= z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS` z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4 z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4 z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$ zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$ zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+ zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5& z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3 zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@ zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7 zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@ zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN z1ZY^;10j4M4#HYXP zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9} z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5 z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al zV63XN@)j$FN#cCD;ek1R#l zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0 zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w= zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0 zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@ z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/memberflow-frontend/public/index.html b/memberflow-frontend/public/index.html new file mode 100644 index 0000000..6a9f8c2 --- /dev/null +++ b/memberflow-frontend/public/index.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + React App + + + +

+ + + diff --git a/memberflow-frontend/public/logo192.png b/memberflow-frontend/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/memberflow-frontend/public/manifest.json b/memberflow-frontend/public/manifest.json new file mode 100644 index 0000000..080d6c7 --- /dev/null +++ b/memberflow-frontend/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/memberflow-frontend/public/robots.txt b/memberflow-frontend/public/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/memberflow-frontend/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/memberflow-frontend/src/App.css b/memberflow-frontend/src/App.css new file mode 100644 index 0000000..74b5e05 --- /dev/null +++ b/memberflow-frontend/src/App.css @@ -0,0 +1,38 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/memberflow-frontend/src/App.js b/memberflow-frontend/src/App.js new file mode 100644 index 0000000..1267185 --- /dev/null +++ b/memberflow-frontend/src/App.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import LoginPage from './pages/LoginPage'; +import RedirectByRole from './pages/RedirectByRole'; +import MainLayout from './components/layout/MainLayout'; + +function App() { + return ( + + + } /> + } /> + } /> + + + ); +} + +export default App; diff --git a/memberflow-frontend/src/App.test.js b/memberflow-frontend/src/App.test.js new file mode 100644 index 0000000..2a68616 --- /dev/null +++ b/memberflow-frontend/src/App.test.js @@ -0,0 +1,9 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/memberflow-frontend/src/api/axiosConfig.js b/memberflow-frontend/src/api/axiosConfig.js new file mode 100644 index 0000000..2d4bdcc --- /dev/null +++ b/memberflow-frontend/src/api/axiosConfig.js @@ -0,0 +1,21 @@ +import axios from 'axios' + +const api = axios.create({ + baseURL: 'http://localhost:8080/api/v1', + headers: { + 'Content-Type': 'application/json', + }, +}); + +api.interceptors.request.use( + (config) => { + const token = localStorage.getItem('token'); + if (token) { + config.headers['Authorization'] = `Bearer ${token}`; + } + return config; + }, + (error) => Promise.reject(error) +); + +export default api; \ No newline at end of file diff --git a/memberflow-frontend/src/components/common/ErrorMessage.jsx b/memberflow-frontend/src/components/common/ErrorMessage.jsx new file mode 100644 index 0000000..9ecb258 --- /dev/null +++ b/memberflow-frontend/src/components/common/ErrorMessage.jsx @@ -0,0 +1,18 @@ +import React from "react"; + +const ErrorMessage = ({ message, type = "error" }) => { + if (!message) return null; + + const styles = { + padding: "10px", + marginTop: "10px", + borderRadius: "5px", + color: type === "error" ? "#a94442" : "#155724", + backgroundColor: type === "error" ? "#f8d7da" : "#d4edda", + border: type === "error" ? "1px solid #f5c6cb" : "1px solid #c3e6cb", + }; + + return
{message}
; +}; + +export default ErrorMessage; diff --git a/memberflow-frontend/src/components/forms/AssitanceForm.jsx b/memberflow-frontend/src/components/forms/AssitanceForm.jsx new file mode 100644 index 0000000..d3e699d --- /dev/null +++ b/memberflow-frontend/src/components/forms/AssitanceForm.jsx @@ -0,0 +1,88 @@ +import React, { useEffect, useState } from "react"; +import api from "../../api/axiosConfig"; +import ErrorMessage from "../common/ErrorMessage"; +import "../styles/ContentArea.css"; + +const AssistanceForm = () => { + const [students, setStudents] = useState([]); + const [sessions, setSessions] = useState([]); + const [formData, setFormData] = useState({ + studentId: "", + sessionId: "" + }); + const [errorMsg, setErrorMsg] = useState(""); + const [successMsg, setSuccessMsg] = useState(""); + + useEffect(() => { + api.get("/students/getAll").then((res) => setStudents(res.data)); + api.get("/training-sessions/getAll").then((res) => setSessions(res.data)); + }, []); + + const handleChange = (e) => { + setFormData({ ...formData, [e.target.name]: e.target.value }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + setErrorMsg(""); + setSuccessMsg(""); + + const payload = { + studentId: formData.studentId, + sessionId: formData.sessionId, + date: new Date(new Date().setHours(new Date().getHours() + 2)).toISOString() +}; + + + try { + await api.post("/assistances/create", payload); + setSuccessMsg("✅ Asistencia registrada correctamente."); + setFormData({ studentId: "", sessionId: "" }); + } catch (err) { + console.error(err); + const msg = err.response?.data?.message || "❌ Error al registrar asistencia."; + setErrorMsg(msg); + } + }; + + return ( +
+

Registrar Asistencia

+
+ + + + + + + + +
+ ); +}; + +export default AssistanceForm; diff --git a/memberflow-frontend/src/components/forms/LoginForm.jsx b/memberflow-frontend/src/components/forms/LoginForm.jsx new file mode 100644 index 0000000..6d8b277 --- /dev/null +++ b/memberflow-frontend/src/components/forms/LoginForm.jsx @@ -0,0 +1,51 @@ +import React, { useState } from "react"; +import api from "../../api/axiosConfig"; +import "../styles/Login.css" + +const LoginForm = ({ onLoginSuccess }) => { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(''); + + const handleLogin = async (e) => { + e.preventDefault(); + setError(''); + try { + const res = await api.post('/auth/login', { email, password }); + localStorage.setItem('token', res.data.token); + console.log("Token guardado:", res.data.token); + onLoginSuccess(); + } catch (err) { + console.error("Error al iniciar sesión:", err); + setError('Email o contraseña incorrectos'); + } + }; + + return ( +
+
+

MemberFlow

+
+ setEmail(e.target.value)} + required + /> + setPassword(e.target.value)} + required + /> + + {error &&

{error}

} +
+
+
+ ); +}; + +export default LoginForm; \ No newline at end of file diff --git a/memberflow-frontend/src/components/forms/MembershipCreateForm.jsx b/memberflow-frontend/src/components/forms/MembershipCreateForm.jsx new file mode 100644 index 0000000..ff6876c --- /dev/null +++ b/memberflow-frontend/src/components/forms/MembershipCreateForm.jsx @@ -0,0 +1,101 @@ +import React, { use, useState } from "react"; +import api from "../../api/axiosConfig"; +import ErrorMessage from "../common/ErrorMessage"; +import "../styles/ContentArea.css"; + + +const MembershipForm = () => { + const [formData, setFormData] = useState({ + startDate: "", + endDate: "", + type: "BASIC", + status: "ACTIVE", + }); + + const [successMsg, setSuccessMsg] = useState(""); + const [errorMsg, setErrorMsg] = useState(""); + + const handleChange = (e) => { + setFormData({ ...formData, [e.target.name]: e.target.value }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + setSuccessMsg(""); + setErrorMsg(""); + + try { + console.log("Payload:", formData); + + await api.post("/memberships/create", formData); + setSuccessMsg("✅ Membresía creada correctamente"); + setFormData({ + startDate: "", + endDate: "", + type: "BASIC", + status: "ACTIVE", + }); + } catch (err) { + console.error(err); + const msg = + err.response?.data?.message || "❌ Error al crear la membresía"; + setErrorMsg(msg); + } + }; + + return ( +
+

Crear Membresía nueva

+
+ + + + + + + + + + + + +
+ + +
+ ); +}; + +export default MembershipForm; diff --git a/memberflow-frontend/src/components/forms/NotificationCreateForm.jsx b/memberflow-frontend/src/components/forms/NotificationCreateForm.jsx new file mode 100644 index 0000000..c893642 --- /dev/null +++ b/memberflow-frontend/src/components/forms/NotificationCreateForm.jsx @@ -0,0 +1,122 @@ +import React, { useState, useEffect } from 'react'; +import api from '../../api/axiosConfig'; +import '../styles/FormStyles.css'; + +const NotificationCreateForm = () => { + const today = new Date().toISOString().split('T')[0]; + + const [notificationData, setNotificationData] = useState({ + title: '', + message: '', + shippingDate: today, + type: '', + status: 'ACTIVE', + userIds: [], + }); + + const [users, setUsers] = useState([]); + const [successMsg, setSuccessMsg] = useState(''); + const [error, setError] = useState(''); + + useEffect(() => { + fetchUsers(); + }, []); + + const fetchUsers = async () => { + try { + const res = await api.get('/users/getAll'); + setUsers(res.data); + } catch (err) { + console.error('Error al cargar usuarios', err); + } + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setNotificationData({ ...notificationData, [name]: value }); + }; + + const handleCheckboxChange = (e, userId) => { + const selectedUserIds = [...notificationData.userIds]; + if (e.target.checked) { + selectedUserIds.push(userId); + } else { + const index = selectedUserIds.indexOf(userId); + if (index !== -1) { + selectedUserIds.splice(index, 1); + } + } + setNotificationData({ ...notificationData, userIds: selectedUserIds }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + setError(''); + setSuccessMsg(''); + + try { + await api.post('/notifications/create', { + ...notificationData, + shippingDate: new Date(notificationData.shippingDate).toISOString(), + }); + setSuccessMsg('✅ Notificación creada correctamente'); + resetForm(); + } catch (err) { + console.error(err); + setError('❌ Error al crear la notificación'); + } + }; + + const resetForm = () => { + setNotificationData({ + title: '', + message: '', + shippingDate: today, + type: '', + status: 'ACTIVE', + userIds: [], + }); + }; + + return ( +
+

Crear nueva notificación

+ +
+ +