From b6f2213ccf7c9a3b3345e58de6ca815dc7c8cb4b Mon Sep 17 00:00:00 2001 From: Sayan Kolay Date: Mon, 31 Aug 2026 16:18:47 +0530 Subject: [PATCH] feat: Add newProjectConfigureHttpApiModule for API configuration and localization feat: Implement SampleAppServiceTests for application service testing feat: Create newProjectConfigureApplicationTests project for application layer tests feat: Establish newProjectConfigureDomainTests project for domain layer tests feat: Introduce Entity Framework Core tests for the newProjectConfigure application feat: Develop console test application for HTTP API client demonstration feat: Implement FakeCurrentPrincipalAccessor for testing purposes chore: Set up test base classes and data seed contributors for consistent testing environment --- angular/.editorconfig | 16 + angular/.eslintrc.json | 50 + angular/.gitignore | 46 + angular/.postcssrc.json | 1 + angular/.prettierrc | 5 + angular/README.md | 27 + angular/angular.json | 183 + angular/package-lock.json | 13472 ++++++++++++++++ angular/package.json | 65 + .../projects/theme-basic10_1_0/.eslintrc.json | 33 + angular/projects/theme-basic10_1_0/README.md | 130 + .../projects/theme-basic10_1_0/jest.config.ts | 27 + .../theme-basic10_1_0/ng-package.json | 8 + .../projects/theme-basic10_1_0/package.json | 31 + .../projects/theme-basic10_1_0/project.json | 38 + .../account-layout.component.html | 63 + .../account-layout.component.ts | 40 + .../auth-wrapper/auth-wrapper.component.html | 24 + .../auth-wrapper/auth-wrapper.component.ts | 15 + .../tenant-box/tenant-box.component.html | 65 + .../tenant-box/tenant-box.component.ts | 23 + .../application-layout.component.html | 693 + .../application-layout.component.scss | 1195 ++ .../application-layout.component.ts | 639 + .../create-overlay.component.html | 235 + .../create-overlay.component.ts | 341 + .../create-overlay.service.ts | 62 + .../user-menu.component.html | 85 + .../application-layout/user-menu.component.ts | 115 + .../empty-layout/empty-layout.component.ts | 12 + .../src/lib/components/index.ts | 12 + .../src/lib/components/logo/logo.component.ts | 148 + .../nav-items/current-user.component.html | 62 + .../nav-items/current-user.component.ts | 53 + .../nav-items/languages.component.ts | 79 + .../nav-items/nav-items.component.html | 18 + .../nav-items/nav-items.component.ts | 17 + .../page-alert-container.component.html | 26 + .../page-alert-container.component.ts | 14 + .../components/routes/routes.component.html | 109 + .../lib/components/routes/routes.component.ts | 61 + .../validation-error.component.ts | 38 + .../src/lib/constants/styles.ts | 182 + .../src/lib/enums/components.ts | 10 + .../theme-basic10_1_0/src/lib/enums/index.ts | 2 + .../src/lib/enums/user-menu-items.ts | 4 + .../src/lib/handlers/index.ts | 1 + .../src/lib/handlers/lazy-style.handler.ts | 104 + .../theme-basic10_1_0/src/lib/models/index.ts | 1 + .../src/lib/models/layout.ts | 13 + .../src/lib/providers/index.ts | 4 + .../src/lib/providers/nav-item.provider.ts | 27 + .../src/lib/providers/styles.provider.ts | 43 + .../providers/theme-basic-config.provider.ts | 36 + .../src/lib/providers/user-menu.provider.ts | 42 + .../src/lib/services/index.ts | 2 + .../src/lib/services/layout.service.ts | 54 + .../src/lib/services/theme.service.ts | 91 + .../src/lib/tests/lazy-style.handler.spec.ts | 90 + .../src/lib/tests/utils/index.ts | 1 + .../tests/utils/setup-component-resources.ts | 54 + .../src/lib/theme-basic.module.ts | 54 + .../theme-basic10_1_0/src/lib/tokens/index.ts | 1 + .../src/lib/tokens/lazy-styles.token.ts | 3 + .../theme-basic10_1_0/src/public-api.ts | 12 + .../theme-basic10_1_0/src/test-setup.ts | 20 + .../theme-basic10_1_0/testing/ng-package.json | 6 + .../src/lib/theme-basic-testing.module.ts | 40 + .../testing/src/public-api.ts | 1 + .../projects/theme-basic10_1_0/tsconfig.json | 17 + .../theme-basic10_1_0/tsconfig.lib.json | 32 + .../theme-basic10_1_0/tsconfig.lib.prod.json | 11 + .../theme-basic10_1_0/tsconfig.spec.json | 23 + .../theme-basic10_1_0/vitest.config.mts | 22 + angular/src/app/app.component.ts | 14 + angular/src/app/app.config.ts | 85 + angular/src/app/app.routes.ts | 47 + .../dropdown-component.component.html | 104 + .../dropdown-component.component.scss | 370 + .../dropdown-component.component.spec.ts | 23 + .../dropdown-component.component.ts | 262 + .../dynamic-form/dynamic-form.component.html | 23 + .../dynamic-form/dynamic-form.component.scss | 0 .../dynamic-form.component.spec.ts | 23 + .../dynamic-form/dynamic-form.component.ts | 43 + .../app/components/modal/modal.component.html | 82 + .../app/components/modal/modal.component.scss | 204 + .../components/modal/modal.component.spec.ts | 23 + .../app/components/modal/modal.component.ts | 128 + .../dropdownmanual.component.html | 259 + .../dropdownmanual.component.scss | 0 .../dropdownmanual.component.spec.ts | 23 + .../dropdownmanual.component.ts | 277 + .../app/dummypage/dummypage.component.html | 2 + .../app/dummypage/dummypage.component.scss | 0 .../app/dummypage/dummypage.component.spec.ts | 23 + .../src/app/dummypage/dummypage.component.ts | 11 + .../form-management.component.html | 214 + .../form-management.component.scss | 6 + .../form-management.component.ts | 317 + .../formly-field-dropdown.component.html | 32 + .../formly-field-dropdown.component.scss | 0 .../formly-field-dropdown.component.spec.ts | 23 + .../formly-field-dropdown.component.ts | 68 + angular/src/app/home/home.component.html | 281 + angular/src/app/home/home.component.scss | 25 + angular/src/app/home/home.component.spec.ts | 88 + angular/src/app/home/home.component.ts | 92 + angular/src/app/home/home.routes.ts | 9 + .../modal-manual/modal-manual.component.html | 211 + .../modal-manual/modal-manual.component.scss | 0 .../modal-manual.component.spec.ts | 23 + .../modal-manual/modal-manual.component.ts | 158 + .../erm-global-search-contract/dto/index.ts | 1 + .../erm-global-search-contract/dto/models.ts | 15 + .../proxy/erm-global-search-contract/index.ts | 1 + .../global-search.service.ts | 28 + .../src/app/proxy/erm-global-search/index.ts | 1 + angular/src/app/proxy/index.ts | 3 + .../src/app/proxy/notifications/dto/index.ts | 1 + .../src/app/proxy/notifications/dto/models.ts | 7 + angular/src/app/proxy/notifications/index.ts | 2 + .../notifications/notification.service.ts | 42 + angular/src/app/route.provider.ts | 59 + angular/src/app/shared/shared.module.ts | 23 + angular/src/assets/.gitkeep | 0 .../images/getting-started/abp-blog.svg | 11 + .../images/getting-started/abp-community.svg | 11 + .../images/getting-started/abp-support.svg | 11 + .../assets/images/getting-started/bg-01.png | Bin 0 -> 22111 bytes .../assets/images/getting-started/book.png | Bin 0 -> 294908 bytes .../assets/images/getting-started/discord.svg | 7 + .../images/getting-started/img-blog.png | Bin 0 -> 30220 bytes .../images/getting-started/img-community.png | Bin 0 -> 42859 bytes .../images/getting-started/img-support.png | Bin 0 -> 23461 bytes .../images/getting-started/instagram.svg | 23 + .../images/getting-started/stack-overflow.svg | 4 + .../src/assets/images/getting-started/x.svg | 3 + .../assets/images/getting-started/youtube.svg | 11 + .../images/logo/logo-light-thumbnail.png | Bin 0 -> 9230 bytes angular/src/assets/images/logo/logo-light.png | Bin 0 -> 33228 bytes angular/src/environments/environment.prod.ts | 26 + angular/src/environments/environment.ts | 26 + angular/src/favicon.ico | Bin 0 -> 1406 bytes angular/src/index.html | 16 + angular/src/main.ts | 11 + angular/src/polyfills.ts | 54 + angular/src/styles.scss | 470 + angular/start.ps1 | 2 + angular/tsconfig.app.json | 25 + angular/tsconfig.json | 30 + angular/tsconfig.spec.json | 15 + angular/yarn.lock | 6153 +++++++ aspnet-core/.gitattributes | 1 + aspnet-core/.gitignore | 265 + aspnet-core/.prettierrc | 5 + aspnet-core/NuGet.Config | 5 + aspnet-core/README.md | 70 + aspnet-core/common.props | 19 + .../newProjectConfigure.sln.DotSettings | 23 + aspnet-core/newProjectConfigure.slnx | 35 + ...ctConfigurePermissionDefinitionProvider.cs | 20 + .../newProjectConfigurePermissions.cs | 9 + ...jectConfigure.Application.Contracts.csproj | 25 + ...jectConfigureApplicationContractsModule.cs | 28 + .../newProjectConfigureDtoExtensions.cs | 28 + .../Properties/AssemblyInfo.cs | 2 + .../newProjectConfigure.Application.csproj | 25 + .../newProjectConfigureAppService.cs | 17 + .../newProjectConfigureApplicationMappers.cs | 12 + .../newProjectConfigureApplicationModule.cs | 29 + .../DbMigratorHostedService.cs | 51 + .../newProjectConfigure.DbMigrator/Program.cs | 41 + .../appsettings.json | 17 + .../appsettings.secrets.json | 2 + .../newProjectConfigure.DbMigrator.csproj | 45 + .../newProjectConfigureDbMigratorModule.cs | 14 + .../Localization/newProjectConfigure/ar.json | 9 + .../Localization/newProjectConfigure/cs.json | 9 + .../Localization/newProjectConfigure/de.json | 9 + .../newProjectConfigure/en-GB.json | 9 + .../Localization/newProjectConfigure/en.json | 9 + .../Localization/newProjectConfigure/es.json | 9 + .../Localization/newProjectConfigure/fi.json | 9 + .../Localization/newProjectConfigure/fr.json | 9 + .../Localization/newProjectConfigure/hi.json | 9 + .../Localization/newProjectConfigure/hr.json | 9 + .../Localization/newProjectConfigure/hu.json | 9 + .../Localization/newProjectConfigure/is.json | 9 + .../Localization/newProjectConfigure/it.json | 9 + .../Localization/newProjectConfigure/nl.json | 9 + .../newProjectConfigure/pl-PL.json | 9 + .../newProjectConfigure/pt-BR.json | 9 + .../newProjectConfigure/ro-RO.json | 9 + .../Localization/newProjectConfigure/ru.json | 9 + .../Localization/newProjectConfigure/sk.json | 9 + .../Localization/newProjectConfigure/sl.json | 9 + .../Localization/newProjectConfigure/sv.json | 9 + .../Localization/newProjectConfigure/tr.json | 9 + .../Localization/newProjectConfigure/vi.json | 9 + .../newProjectConfigure/zh-Hans.json | 9 + .../newProjectConfigure/zh-Hant.json | 9 + .../newProjectConfigureResource.cs | 9 + .../MultiTenancy/MultiTenancyConsts.cs | 10 + .../newProjectConfigure.Domain.Shared.csproj | 32 + .../newProjectConfigureDomainErrorCodes.cs | 6 + .../newProjectConfigureDomainSharedModule.cs | 58 + ...ojectConfigureGlobalFeatureConfigurator.cs | 22 + ...ectConfigureModuleExtensionConfigurator.cs | 73 + .../InewProjectConfigureDbSchemaMigrator.cs | 8 + ...NullnewProjectConfigureDbSchemaMigrator.cs | 15 + .../newProjectConfigureDbMigrationService.cs | 218 + .../OpenIddictDataSeedContributor.cs | 350 + .../Properties/AssemblyInfo.cs | 3 + ...ojectConfigureSettingDefinitionProvider.cs | 12 + .../Settings/newProjectConfigureSettings.cs | 9 + .../newProjectConfigure.Domain.csproj | 28 + .../newProjectConfigureConsts.cs | 8 + .../newProjectConfigureDomainModule.cs | 68 + ...CorenewProjectConfigureDbSchemaMigrator.cs | 34 + .../newProjectConfigureDbContext.cs | 86 + .../newProjectConfigureDbContextFactory.cs | 33 + ...tConfigureEfCoreEntityExtensionMappings.cs | 44 + ...ojectConfigureEntityFrameworkCoreModule.cs | 54 + .../20260828095937_Initial.Designer.cs | 2162 +++ .../Migrations/20260828095937_Initial.cs | 1253 ++ ...wProjectConfigureDbContextModelSnapshot.cs | 2159 +++ .../Properties/AssemblyInfo.cs | 2 + ...rojectConfigure.EntityFrameworkCore.csproj | 31 + .../newProjectConfigure.HttpApi.Client.csproj | 29 + .../newProjectConfigureHttpApiClientModule.cs | 38 + .../Controllers/HomeController.cs | 12 + .../Program.cs | 56 + .../Properties/launchSettings.json | 27 + .../abp.resourcemapping.js | 11 + .../appsettings.Development.json | 2 + .../appsettings.json | 19 + .../appsettings.secrets.json | 2 + .../newProjectConfigure.HttpApi.Host.csproj | 41 + .../newProjectConfigureBrandingProvider.cs | 19 + .../newProjectConfigureHttpApiHostModule.cs | 226 + .../package.json | 8 + .../web.config | 18 + .../wwwroot/global-styles.css | 6 + .../yarn.lock | 310 + .../newProjectConfigureController.cs | 14 + .../Models/Test/TestModel.cs | 10 + .../newProjectConfigure.HttpApi.csproj | 24 + .../newProjectConfigureHttpApiModule.cs | 41 + .../Samples/SampleAppServiceTests.cs | 34 + ...wProjectConfigure.Application.Tests.csproj | 20 + .../newProjectConfigureApplicationTestBase.cs | 9 + ...ewProjectConfigureApplicationTestModule.cs | 12 + .../Samples/SampleDomainTests.cs | 46 + .../newProjectConfigure.Domain.Tests.csproj | 20 + .../newProjectConfigureDomainTestBase.cs | 10 + .../newProjectConfigureDomainTestModule.cs | 12 + .../EfCoreSampleAppServiceTests.cs | 10 + .../Domains/EfCoreSampleDomainTests.cs | 10 + .../Samples/SampleRepositoryTests.cs | 44 + ...tConfigureEntityFrameworkCoreCollection.cs | 9 + ...ntityFrameworkCoreCollectionFixtureBase.cs | 9 + ...jectConfigureEntityFrameworkCoreFixture.cs | 11 + ...ectConfigureEntityFrameworkCoreTestBase.cs | 8 + ...tConfigureEntityFrameworkCoreTestModule.cs | 71 + ...Configure.EntityFrameworkCore.Tests.csproj | 21 + .../ClientDemoService.cs | 25 + .../ConsoleTestAppHostedService.cs | 40 + .../Program.cs | 22 + .../appsettings.json | 17 + .../appsettings.secrets.json | 2 + ...igure.HttpApi.Client.ConsoleTestApp.csproj | 33 + ...wProjectConfigureConsoleApiClientModule.cs | 30 + .../Security/FakeCurrentPrincipalAccessor.cs | 25 + .../newProjectConfigure.TestBase.csproj | 31 + .../newProjectConfigureTestBase.cs | 60 + .../newProjectConfigureTestBaseModule.cs | 47 + .../newProjectConfigureTestConsts.cs | 6 + ...ProjectConfigureTestDataSeedContributor.cs | 15 + 279 files changed, 39466 insertions(+) create mode 100644 angular/.editorconfig create mode 100644 angular/.eslintrc.json create mode 100644 angular/.gitignore create mode 100644 angular/.postcssrc.json create mode 100644 angular/.prettierrc create mode 100644 angular/README.md create mode 100644 angular/angular.json create mode 100644 angular/package-lock.json create mode 100644 angular/package.json create mode 100644 angular/projects/theme-basic10_1_0/.eslintrc.json create mode 100644 angular/projects/theme-basic10_1_0/README.md create mode 100644 angular/projects/theme-basic10_1_0/jest.config.ts create mode 100644 angular/projects/theme-basic10_1_0/ng-package.json create mode 100644 angular/projects/theme-basic10_1_0/package.json create mode 100644 angular/projects/theme-basic10_1_0/project.json create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/account-layout/account-layout.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/account-layout/account-layout.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/account-layout/tenant-box/tenant-box.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/account-layout/tenant-box/tenant-box.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.scss create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.service.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/application-layout/user-menu.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/application-layout/user-menu.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/empty-layout/empty-layout.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/index.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/logo/logo.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/nav-items/current-user.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/nav-items/current-user.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/nav-items/languages.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/nav-items/nav-items.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/nav-items/nav-items.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/page-alert-container/page-alert-container.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/page-alert-container/page-alert-container.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/routes/routes.component.html create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/routes/routes.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/components/validation-error/validation-error.component.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/constants/styles.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/enums/components.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/enums/index.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/enums/user-menu-items.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/handlers/index.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/handlers/lazy-style.handler.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/models/index.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/models/layout.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/providers/index.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/providers/nav-item.provider.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/providers/styles.provider.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/providers/theme-basic-config.provider.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/providers/user-menu.provider.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/services/index.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/services/layout.service.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/services/theme.service.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/tests/lazy-style.handler.spec.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/tests/utils/index.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/tests/utils/setup-component-resources.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/theme-basic.module.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/tokens/index.ts create mode 100644 angular/projects/theme-basic10_1_0/src/lib/tokens/lazy-styles.token.ts create mode 100644 angular/projects/theme-basic10_1_0/src/public-api.ts create mode 100644 angular/projects/theme-basic10_1_0/src/test-setup.ts create mode 100644 angular/projects/theme-basic10_1_0/testing/ng-package.json create mode 100644 angular/projects/theme-basic10_1_0/testing/src/lib/theme-basic-testing.module.ts create mode 100644 angular/projects/theme-basic10_1_0/testing/src/public-api.ts create mode 100644 angular/projects/theme-basic10_1_0/tsconfig.json create mode 100644 angular/projects/theme-basic10_1_0/tsconfig.lib.json create mode 100644 angular/projects/theme-basic10_1_0/tsconfig.lib.prod.json create mode 100644 angular/projects/theme-basic10_1_0/tsconfig.spec.json create mode 100644 angular/projects/theme-basic10_1_0/vitest.config.mts create mode 100644 angular/src/app/app.component.ts create mode 100644 angular/src/app/app.config.ts create mode 100644 angular/src/app/app.routes.ts create mode 100644 angular/src/app/components/dropdown-component/dropdown-component.component.html create mode 100644 angular/src/app/components/dropdown-component/dropdown-component.component.scss create mode 100644 angular/src/app/components/dropdown-component/dropdown-component.component.spec.ts create mode 100644 angular/src/app/components/dropdown-component/dropdown-component.component.ts create mode 100644 angular/src/app/components/dynamic-form/dynamic-form.component.html create mode 100644 angular/src/app/components/dynamic-form/dynamic-form.component.scss create mode 100644 angular/src/app/components/dynamic-form/dynamic-form.component.spec.ts create mode 100644 angular/src/app/components/dynamic-form/dynamic-form.component.ts create mode 100644 angular/src/app/components/modal/modal.component.html create mode 100644 angular/src/app/components/modal/modal.component.scss create mode 100644 angular/src/app/components/modal/modal.component.spec.ts create mode 100644 angular/src/app/components/modal/modal.component.ts create mode 100644 angular/src/app/dropdownmanual/dropdownmanual.component.html create mode 100644 angular/src/app/dropdownmanual/dropdownmanual.component.scss create mode 100644 angular/src/app/dropdownmanual/dropdownmanual.component.spec.ts create mode 100644 angular/src/app/dropdownmanual/dropdownmanual.component.ts create mode 100644 angular/src/app/dummypage/dummypage.component.html create mode 100644 angular/src/app/dummypage/dummypage.component.scss create mode 100644 angular/src/app/dummypage/dummypage.component.spec.ts create mode 100644 angular/src/app/dummypage/dummypage.component.ts create mode 100644 angular/src/app/form-management/form-management.component.html create mode 100644 angular/src/app/form-management/form-management.component.scss create mode 100644 angular/src/app/form-management/form-management.component.ts create mode 100644 angular/src/app/formly-field-dropdown/formly-field-dropdown.component.html create mode 100644 angular/src/app/formly-field-dropdown/formly-field-dropdown.component.scss create mode 100644 angular/src/app/formly-field-dropdown/formly-field-dropdown.component.spec.ts create mode 100644 angular/src/app/formly-field-dropdown/formly-field-dropdown.component.ts create mode 100644 angular/src/app/home/home.component.html create mode 100644 angular/src/app/home/home.component.scss create mode 100644 angular/src/app/home/home.component.spec.ts create mode 100644 angular/src/app/home/home.component.ts create mode 100644 angular/src/app/home/home.routes.ts create mode 100644 angular/src/app/modal-manual/modal-manual.component.html create mode 100644 angular/src/app/modal-manual/modal-manual.component.scss create mode 100644 angular/src/app/modal-manual/modal-manual.component.spec.ts create mode 100644 angular/src/app/modal-manual/modal-manual.component.ts create mode 100644 angular/src/app/proxy/erm-global-search-contract/dto/index.ts create mode 100644 angular/src/app/proxy/erm-global-search-contract/dto/models.ts create mode 100644 angular/src/app/proxy/erm-global-search-contract/index.ts create mode 100644 angular/src/app/proxy/erm-global-search/global-search.service.ts create mode 100644 angular/src/app/proxy/erm-global-search/index.ts create mode 100644 angular/src/app/proxy/index.ts create mode 100644 angular/src/app/proxy/notifications/dto/index.ts create mode 100644 angular/src/app/proxy/notifications/dto/models.ts create mode 100644 angular/src/app/proxy/notifications/index.ts create mode 100644 angular/src/app/proxy/notifications/notification.service.ts create mode 100644 angular/src/app/route.provider.ts create mode 100644 angular/src/app/shared/shared.module.ts create mode 100644 angular/src/assets/.gitkeep create mode 100644 angular/src/assets/images/getting-started/abp-blog.svg create mode 100644 angular/src/assets/images/getting-started/abp-community.svg create mode 100644 angular/src/assets/images/getting-started/abp-support.svg create mode 100644 angular/src/assets/images/getting-started/bg-01.png create mode 100644 angular/src/assets/images/getting-started/book.png create mode 100644 angular/src/assets/images/getting-started/discord.svg create mode 100644 angular/src/assets/images/getting-started/img-blog.png create mode 100644 angular/src/assets/images/getting-started/img-community.png create mode 100644 angular/src/assets/images/getting-started/img-support.png create mode 100644 angular/src/assets/images/getting-started/instagram.svg create mode 100644 angular/src/assets/images/getting-started/stack-overflow.svg create mode 100644 angular/src/assets/images/getting-started/x.svg create mode 100644 angular/src/assets/images/getting-started/youtube.svg create mode 100644 angular/src/assets/images/logo/logo-light-thumbnail.png create mode 100644 angular/src/assets/images/logo/logo-light.png create mode 100644 angular/src/environments/environment.prod.ts create mode 100644 angular/src/environments/environment.ts create mode 100644 angular/src/favicon.ico create mode 100644 angular/src/index.html create mode 100644 angular/src/main.ts create mode 100644 angular/src/polyfills.ts create mode 100644 angular/src/styles.scss create mode 100644 angular/start.ps1 create mode 100644 angular/tsconfig.app.json create mode 100644 angular/tsconfig.json create mode 100644 angular/tsconfig.spec.json create mode 100644 angular/yarn.lock create mode 100644 aspnet-core/.gitattributes create mode 100644 aspnet-core/.gitignore create mode 100644 aspnet-core/.prettierrc create mode 100644 aspnet-core/NuGet.Config create mode 100644 aspnet-core/README.md create mode 100644 aspnet-core/common.props create mode 100644 aspnet-core/newProjectConfigure.sln.DotSettings create mode 100644 aspnet-core/newProjectConfigure.slnx create mode 100644 aspnet-core/src/newProjectConfigure.Application.Contracts/Permissions/newProjectConfigurePermissionDefinitionProvider.cs create mode 100644 aspnet-core/src/newProjectConfigure.Application.Contracts/Permissions/newProjectConfigurePermissions.cs create mode 100644 aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigure.Application.Contracts.csproj create mode 100644 aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigureApplicationContractsModule.cs create mode 100644 aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigureDtoExtensions.cs create mode 100644 aspnet-core/src/newProjectConfigure.Application/Properties/AssemblyInfo.cs create mode 100644 aspnet-core/src/newProjectConfigure.Application/newProjectConfigure.Application.csproj create mode 100644 aspnet-core/src/newProjectConfigure.Application/newProjectConfigureAppService.cs create mode 100644 aspnet-core/src/newProjectConfigure.Application/newProjectConfigureApplicationMappers.cs create mode 100644 aspnet-core/src/newProjectConfigure.Application/newProjectConfigureApplicationModule.cs create mode 100644 aspnet-core/src/newProjectConfigure.DbMigrator/DbMigratorHostedService.cs create mode 100644 aspnet-core/src/newProjectConfigure.DbMigrator/Program.cs create mode 100644 aspnet-core/src/newProjectConfigure.DbMigrator/appsettings.json create mode 100644 aspnet-core/src/newProjectConfigure.DbMigrator/appsettings.secrets.json create mode 100644 aspnet-core/src/newProjectConfigure.DbMigrator/newProjectConfigure.DbMigrator.csproj create mode 100644 aspnet-core/src/newProjectConfigure.DbMigrator/newProjectConfigureDbMigratorModule.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ar.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/cs.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/de.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/en-GB.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/en.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/es.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/fi.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/fr.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hi.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hr.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hu.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/is.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/it.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/nl.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/pl-PL.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/pt-BR.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ro-RO.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ru.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sk.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sl.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sv.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/tr.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/vi.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/zh-Hans.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/zh-Hant.json create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigureResource.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigure.Domain.Shared.csproj create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureDomainErrorCodes.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureDomainSharedModule.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureGlobalFeatureConfigurator.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureModuleExtensionConfigurator.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/Data/InewProjectConfigureDbSchemaMigrator.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/Data/NullnewProjectConfigureDbSchemaMigrator.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/Data/newProjectConfigureDbMigrationService.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/OpenIddict/OpenIddictDataSeedContributor.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/Properties/AssemblyInfo.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/Settings/newProjectConfigureSettingDefinitionProvider.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/Settings/newProjectConfigureSettings.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/newProjectConfigure.Domain.csproj create mode 100644 aspnet-core/src/newProjectConfigure.Domain/newProjectConfigureConsts.cs create mode 100644 aspnet-core/src/newProjectConfigure.Domain/newProjectConfigureDomainModule.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCorenewProjectConfigureDbSchemaMigrator.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureDbContext.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureDbContextFactory.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureEfCoreEntityExtensionMappings.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreModule.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/20260828095937_Initial.Designer.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/20260828095937_Initial.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/newProjectConfigureDbContextModelSnapshot.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Properties/AssemblyInfo.cs create mode 100644 aspnet-core/src/newProjectConfigure.EntityFrameworkCore/newProjectConfigure.EntityFrameworkCore.csproj create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Client/newProjectConfigure.HttpApi.Client.csproj create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Client/newProjectConfigureHttpApiClientModule.cs create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/Controllers/HomeController.cs create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/Program.cs create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/Properties/launchSettings.json create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/abp.resourcemapping.js create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.Development.json create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.json create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.secrets.json create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigure.HttpApi.Host.csproj create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigureBrandingProvider.cs create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigureHttpApiHostModule.cs create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/package.json create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/web.config create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/wwwroot/global-styles.css create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi.Host/yarn.lock create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi/Controllers/newProjectConfigureController.cs create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi/Models/Test/TestModel.cs create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi/newProjectConfigure.HttpApi.csproj create mode 100644 aspnet-core/src/newProjectConfigure.HttpApi/newProjectConfigureHttpApiModule.cs create mode 100644 aspnet-core/test/newProjectConfigure.Application.Tests/Samples/SampleAppServiceTests.cs create mode 100644 aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigure.Application.Tests.csproj create mode 100644 aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigureApplicationTestBase.cs create mode 100644 aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigureApplicationTestModule.cs create mode 100644 aspnet-core/test/newProjectConfigure.Domain.Tests/Samples/SampleDomainTests.cs create mode 100644 aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigure.Domain.Tests.csproj create mode 100644 aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigureDomainTestBase.cs create mode 100644 aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigureDomainTestModule.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreCollection.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreCollectionFixtureBase.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreFixture.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreTestBase.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreTestModule.cs create mode 100644 aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/newProjectConfigure.EntityFrameworkCore.Tests.csproj create mode 100644 aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs create mode 100644 aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs create mode 100644 aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/Program.cs create mode 100644 aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/appsettings.json create mode 100644 aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json create mode 100644 aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/newProjectConfigure.HttpApi.Client.ConsoleTestApp.csproj create mode 100644 aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/newProjectConfigureConsoleApiClientModule.cs create mode 100644 aspnet-core/test/newProjectConfigure.TestBase/Security/FakeCurrentPrincipalAccessor.cs create mode 100644 aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigure.TestBase.csproj create mode 100644 aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestBase.cs create mode 100644 aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestBaseModule.cs create mode 100644 aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestConsts.cs create mode 100644 aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestDataSeedContributor.cs diff --git a/angular/.editorconfig b/angular/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/angular/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/angular/.eslintrc.json b/angular/.eslintrc.json new file mode 100644 index 0000000..47c17dd --- /dev/null +++ b/angular/.eslintrc.json @@ -0,0 +1,50 @@ +{ + "root": true, + "ignorePatterns": [ + "projects/**/*" + ], + "overrides": [ + { + "files": [ + "*.ts" + ], + "parserOptions": { + "project": [ + "tsconfig.json" + ], + "createDefaultProgram": true + }, + "extends": [ + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "app", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ] + } + }, + { + "files": [ + "*.html" + ], + "extends": [ + "plugin:@angular-eslint/template/recommended" + ], + "rules": {} + } + ] +} diff --git a/angular/.gitignore b/angular/.gitignore new file mode 100644 index 0000000..df2a9f5 --- /dev/null +++ b/angular/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.angular/cache +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/angular/.postcssrc.json b/angular/.postcssrc.json new file mode 100644 index 0000000..f29f52c --- /dev/null +++ b/angular/.postcssrc.json @@ -0,0 +1 @@ + { "plugins": { "@tailwindcss/postcss": {} } } \ No newline at end of file diff --git a/angular/.prettierrc b/angular/.prettierrc new file mode 100644 index 0000000..d029317 --- /dev/null +++ b/angular/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "printWidth": 100, + "arrowParens": "avoid" +} diff --git a/angular/README.md b/angular/README.md new file mode 100644 index 0000000..aa37217 --- /dev/null +++ b/angular/README.md @@ -0,0 +1,27 @@ +# newProjectConfigure + +This is a startup project based on the ABP framework. For more information, visit abp.io + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Vitest](https://vitest.dev). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/angular/angular.json b/angular/angular.json new file mode 100644 index 0000000..a72e827 --- /dev/null +++ b/angular/angular.json @@ -0,0 +1,183 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "cli": { + "analytics": false, + "schematicCollections": ["@angular-eslint/schematics"] + }, + "version": 1, + "newProjectRoot": "projects", + "projects": { + "newProjectConfigure": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "outputPath": "dist/newProjectConfigure", + "index": "src/index.html", + "browser": "src/main.ts", + "polyfills": ["src/polyfills.ts"], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "allowedCommonJsDependencies": ["chart.js", "js-sha256"], + "assets": ["src/favicon.ico", "src/assets"], + "styles": [ + { + "input": "node_modules/bootstrap/dist/css/bootstrap.rtl.min.css", + "inject": false, + "bundleName": "bootstrap-rtl.min" + }, + { + "input": "node_modules/bootstrap/dist/css/bootstrap.min.css", + "inject": true, + "bundleName": "bootstrap-ltr.min" + }, + { + "input": "node_modules/@fortawesome/fontawesome-free/css/all.min.css", + "inject": true, + "bundleName": "fontawesome-all.min" + }, + { + "input": "node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css", + "inject": true, + "bundleName": "fontawesome-v4-shims.min" + }, + { + "input": "node_modules/@swimlane/ngx-datatable/index.css", + "inject": true, + "bundleName": "ngx-datatable-index" + }, + { + "input": "node_modules/@swimlane/ngx-datatable/assets/icons.css", + "inject": true, + "bundleName": "ngx-datatable-icons" + }, + { + "input": "node_modules/@swimlane/ngx-datatable/themes/material.css", + "inject": true, + "bundleName": "ngx-datatable-material" + }, + { + "input": "node_modules/@ng-select/ng-select/themes/default.theme.css", + "inject": true, + "bundleName": "ng-select-default" + }, + "src/styles.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "2.5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "25kb", + "maximumError": "35kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "newProjectConfigure:build:production" + }, + "development": { + "buildTarget": "newProjectConfigure:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular/build:extract-i18n", + "options": { + "buildTarget": "newProjectConfigure:build" + } + }, + "test": { + "builder": "@angular/build:unit-test" + }, + "lint": { + "builder": "@angular-eslint/builder:lint", + "options": { + "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] + } + } + } + }, + "theme-basic": { + "projectType": "library", + "root": "projects/theme-basic10_1_0", + "sourceRoot": "projects/theme-basic10_1_0/src", + "prefix": "abp", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "tsConfig": "projects/theme-basic10_1_0/tsconfig.lib.json", + "project": "projects/theme-basic10_1_0/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/theme-basic10_1_0/tsconfig.lib.prod.json" + } + } + } + } + } + }, + "schematics": { + "@schematics/angular:component": { + "type": "component" + }, + "@schematics/angular:directive": { + "type": "directive" + }, + "@schematics/angular:service": { + "type": "service" + }, + "@schematics/angular:guard": { + "typeSeparator": "." + }, + "@schematics/angular:interceptor": { + "typeSeparator": "." + }, + "@schematics/angular:module": { + "typeSeparator": "." + }, + "@schematics/angular:pipe": { + "typeSeparator": "." + }, + "@schematics/angular:resolver": { + "typeSeparator": "." + } + } +} diff --git a/angular/package-lock.json b/angular/package-lock.json new file mode 100644 index 0000000..45eec03 --- /dev/null +++ b/angular/package-lock.json @@ -0,0 +1,13472 @@ +{ + "name": "newProjectConfigure", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "newProjectConfigure", + "version": "0.0.0", + "dependencies": { + "@abp/ng.account": "~10.6.0", + "@abp/ng.components": "~10.6.0", + "@abp/ng.core": "~10.6.0", + "@abp/ng.identity": "~10.6.0-rc.3", + "@abp/ng.oauth": "~10.6.0", + "@abp/ng.setting-management": "~10.6.0", + "@abp/ng.tenant-management": "~10.6.0", + "@abp/ng.theme.basic": "~10.6.0", + "@abp/ng.theme.shared": "~10.6.0", + "@angular/animations": "~22.0.1", + "@angular/aria": "~22.0.0", + "@angular/cdk": "~22.0.0", + "@angular/common": "~22.0.1", + "@angular/compiler": "~22.0.1", + "@angular/core": "~22.0.1", + "@angular/forms": "~22.0.1", + "@angular/localize": "~22.0.1", + "@angular/platform-browser": "~22.0.1", + "@angular/platform-browser-dynamic": "~22.0.1", + "@angular/router": "~22.0.1", + "@microsoft/signalr": "^10.0.11", + "rxjs": "~7.8.0", + "tslib": "^2.0.0", + "zone.js": "~0.15.0" + }, + "devDependencies": { + "@abp/ng.schematics": "~10.6.0", + "@angular-eslint/builder": "~21.2.0", + "@angular-eslint/eslint-plugin": "~21.2.0", + "@angular-eslint/eslint-plugin-template": "~21.2.0", + "@angular-eslint/schematics": "~21.2.0", + "@angular-eslint/template-parser": "~21.2.0", + "@angular/build": "~22.0.1", + "@angular/cli": "~22.0.1", + "@angular/compiler-cli": "~22.0.1", + "@angular/language-service": "~22.0.1", + "@tailwindcss/postcss": "^4.3.3", + "@types/node": "~20.11.0", + "@typescript-eslint/eslint-plugin": "7.16.0", + "@typescript-eslint/parser": "7.16.0", + "eslint": "^8.0.0", + "jsdom": "^27.1.0", + "postcss": "^8.5.26", + "tailwindcss": "^4.3.3", + "typescript": "~6.0.3", + "vitest": "^4.0.0" + } + }, + "node_modules/@abp/ng.account": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.account/-/ng.account-10.6.0.tgz", + "integrity": "sha512-GOkFrKPyE4dNpJxg8RxjPzbIbXsK4GfciqDRZpW0ooJAwd3IPkiU+GMkcdm/s4FYTifP1I/ok2btgUBqsDhxPg==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/ng.account.core": "~10.6.0", + "@abp/ng.theme.shared": "~10.6.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@abp/ng.account.core": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.account.core/-/ng.account.core-10.6.0.tgz", + "integrity": "sha512-y5i+VHltaW088qgXI0ma2y7KT5aAmM+XguGISTVGQFxhE/m1ZslybJ8+RcvTHsCxcezUV2SC79LNtR458XUWdg==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/ng.core": "~10.6.0", + "@abp/ng.theme.shared": "~10.6.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@abp/ng.components": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.components/-/ng.components-10.6.0.tgz", + "integrity": "sha512-C78653VVTsuP1zNCxy3fm67FYEqpW/4h/MfCqfjch3I64+XIuWUk3AKgSu3tBBWaZXWwHJqdh9qOAwB17PZEew==", + "license": "LGPL-3.0", + "dependencies": { + "@ctrl/tinycolor": "^4.0.0", + "chart.js": "^3.5.1", + "ng-zorro-antd": "~21.3.1", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@abp/ng.core": ">=10.6.0", + "@abp/ng.theme.shared": ">=10.6.0" + } + }, + "node_modules/@abp/ng.core": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.core/-/ng.core-10.6.0.tgz", + "integrity": "sha512-BMtjbwzptbSGKqBV7kGcYZ+6Rq7/Yfs87AenaDtqe4jn1XT/uH/pmbHsIhGL436HIzZUbfW5znJbGqnZ31WA4w==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/utils": "~10.6.0", + "just-clone": "^6.0.0", + "just-compare": "^2.0.0", + "luxon": "^3.0.0", + "ts-toolbelt": "^9.0.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@abp/ng.feature-management": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.feature-management/-/ng.feature-management-10.6.0.tgz", + "integrity": "sha512-gXUaXf7DbNCC7z8VSrX4VE2x7hc8vdzLR5UId8wTinRhMXD0y8OIbfLkrSfab67D51p2Ty8mNCMQyirOQYr5YQ==", + "dependencies": { + "@abp/ng.theme.shared": "~10.6.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/aria": "~21.2.0" + } + }, + "node_modules/@abp/ng.identity": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.identity/-/ng.identity-10.6.0.tgz", + "integrity": "sha512-nXK97bgo7/WEA5bY2B911R1ickMDJuRuZj4DGea2HaSJbu+5FKpP4tqYSZP7+Ny8U5OSnR8IYa5+ePhbGmhXEQ==", + "dependencies": { + "@abp/ng.components": "~10.6.0", + "@abp/ng.permission-management": "~10.6.0", + "@abp/ng.theme.shared": "~10.6.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@abp/ng.oauth": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.oauth/-/ng.oauth-10.6.0.tgz", + "integrity": "sha512-Pwf9el0OHrnL4xXLdvThJCkxcgaluQaDpqskvXEaTwi7NAPeECXASuFCL2tbTW345+ztkxV4gUTKCnhtq3n3MQ==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/ng.core": "~10.6.0", + "@abp/utils": "~10.6.0", + "angular-oauth2-oidc": "^20.0.0", + "just-clone": "^6.0.0", + "just-compare": "^2.0.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@abp/ng.permission-management": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.permission-management/-/ng.permission-management-10.6.0.tgz", + "integrity": "sha512-Z31aqzCrslxUxmvEWnls26DrkcUZLfdE/uR2kQNzLGHig6AD8gfShrqURwZt5Yx17f5JtaYwANZuH3psS1MWpQ==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/ng.theme.shared": "~10.6.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/aria": "~21.2.0" + } + }, + "node_modules/@abp/ng.schematics": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.schematics/-/ng.schematics-10.6.0.tgz", + "integrity": "sha512-hZB/tik5JpKUsNH8zBBNiZZFSfbtnO5jFdGEqhS0URZqNL3PMWeTH5X9e4oYJ4QJkG2vbhRCXdyPd443W8KJzg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@angular-devkit/core": "~22.0.0", + "@angular-devkit/schematics": "~22.0.0", + "@angular/cli": "~22.0.0", + "got": "^11.5.2", + "jsonc-parser": "^2.3.0", + "should-quote": "^1.0.0", + "typescript": "~6.0.3" + } + }, + "node_modules/@abp/ng.schematics/node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@abp/ng.setting-management": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.setting-management/-/ng.setting-management-10.6.0.tgz", + "integrity": "sha512-ZPgdWZ3WXS4tXXD7JdH97EJ+RVAO/gYSmB21Y2gY7AjcIdH2jstqGHg8DmRi3FBJwWibO8TFK2CEQF8hErhiZw==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/ng.components": "~10.6.0", + "@abp/ng.theme.shared": "~10.6.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/aria": "~21.2.0" + } + }, + "node_modules/@abp/ng.tenant-management": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.tenant-management/-/ng.tenant-management-10.6.0.tgz", + "integrity": "sha512-QqLuzjqBxwrGbVYg1UuqmX6xvOK9Om/8/tHn2sLsqam4rEoFfcwYqX6eSQ8N62c0g4m2MPoLX3hlxcIrliJwxw==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/ng.feature-management": "~10.6.0", + "@abp/ng.theme.shared": "~10.6.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@abp/ng.theme.basic": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.theme.basic/-/ng.theme.basic-10.6.0.tgz", + "integrity": "sha512-9avt1xqRHZQ4LtySz18cEAp3g/FcKZ5dVH4Rx5ywPmfvyxGYEoLuuh1WvuvhnO9MCUtp19O/i2ff+jSkfwvvVQ==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/ng.account.core": "~10.6.0", + "@abp/ng.theme.shared": "~10.6.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@abp/ng.theme.shared": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/ng.theme.shared/-/ng.theme.shared-10.6.0.tgz", + "integrity": "sha512-TYrAR04rOduqIRTVBd8DcTO95p6V2KtiIuXfN5r6lJFNJHx1yiB7R9hQ1IFL5ThxNflisMd8vMvV2klvyeZvjw==", + "license": "LGPL-3.0", + "dependencies": { + "@abp/ng.core": "~10.6.0", + "@fortawesome/fontawesome-free": "^6.0.0", + "@ng-bootstrap/ng-bootstrap": "~20.0.0", + "@ngx-validate/core": "^0.2.0", + "@popperjs/core": "~2.11.0", + "@swimlane/ngx-datatable": "~22.0.0", + "bootstrap": "^5.0.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@abp/utils": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/@abp/utils/-/utils-10.6.0.tgz", + "integrity": "sha512-dQaHPKNKcsyeyCot28UOwOhU5ykS6tqVVNXqRvQrrQIvqj5tOAGtWMeXRP1eP47JRCmF4kOgOSZcMvVnuoUrUQ==", + "license": "LGPL-3.0", + "dependencies": { + "just-compare": "^2.3.0" + } + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/abtesting": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.18.0.tgz", + "integrity": "sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.52.0.tgz", + "integrity": "sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.52.0.tgz", + "integrity": "sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.52.0.tgz", + "integrity": "sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.52.0.tgz", + "integrity": "sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.52.0.tgz", + "integrity": "sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.0.tgz", + "integrity": "sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.0.tgz", + "integrity": "sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.0.tgz", + "integrity": "sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.52.0.tgz", + "integrity": "sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.52.0.tgz", + "integrity": "sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.0.tgz", + "integrity": "sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.52.0.tgz", + "integrity": "sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.52.0.tgz", + "integrity": "sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.2200.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2200.9.tgz", + "integrity": "sha512-kwiyEFfJsnJ4o7ondW8KswwJbp+qri5yWLS0wMMG+uBwOolZfrQReorqsQNCALhwmojhDNZc0wEWXEHEhKnotw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "22.0.9", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "22.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-22.0.9.tgz", + "integrity": "sha512-u53kltrh1ZKHSqGfEDbPW2RzSC1WBPpan3LN61TuzjAkiHqqaQXrN6EmUvYkX3CIT5PKhO6RPRsptMH9y7hs0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.20.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "22.0.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-22.0.9.tgz", + "integrity": "sha512-r7tPuiXI7pnwcaLQY4hQLOM9R5rkKRc1mKhQQb074Shh8XzTcTaw2ktDXLeiJm/SUUWQPhaxClnjjO3qU8AJRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "22.0.9", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.4.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-21.2.0.tgz", + "integrity": "sha512-wcp3J9cbrDwSeI/o1D/DSvMQa8zpKjc5WhRGTx33omhWijCfiVNEAiBLWiEx5Sb/dWcoX8yFNWY5jSgFVy9Sjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": ">= 0.2100.0 < 0.2200.0", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0" + }, + "peerDependencies": { + "@angular/cli": ">= 21.0.0 < 22.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/architect": { + "version": "0.2102.22", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.22.tgz", + "integrity": "sha512-7+jlbVdPk1TKqbp8xmsMnRsXsnOilD9NH4OGKu2YtNL9mg0y8aB5ziBqvm7IpeHysyi9ae8XTabajq99ItM9gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.22", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/core": { + "version": "21.2.22", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.22.tgz", + "integrity": "sha512-sJoZr7cGfw3imZaE7caQGUB3XiAMGLtpzEmyTe6LnuixVJbJYZBjlYk9AFoW8RJT5hJN8hIe1MLQdAl23kMlLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/builder/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "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/@angular-eslint/builder/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.2.0.tgz", + "integrity": "sha512-J0DWL+j6t9ItFIyIADvzHGqwDA1qfVJ9bx+oTmJ/Hlo7cUpIRoXpcTXpug0CEEABFH0RfDu6PDG2b0FoZ1+7bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-21.2.0.tgz", + "integrity": "sha512-X2Qn2viDsjm91CEMxNrxDH3qkKpp6un0C1F1BW2p/m9J4AUVfOcXwWz9UpHFSHTRQ+YlTJbiH1ZwwAPeKhFaxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.2.0", + "@angular-eslint/utils": "21.2.0", + "ts-api-utils": "^2.1.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-21.2.0.tgz", + "integrity": "sha512-lJ13Dj0DjR6YiceQR0sRbyWzSzOQ6uZPwK9CJUF3wuZjYAUvL1D61zaU9QrVLtf89NVOxv+dYZHDdu3IDeIqbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.2.0", + "@angular-eslint/utils": "21.2.0", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" + }, + "peerDependencies": { + "@angular-eslint/template-parser": "21.2.0", + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-21.2.0.tgz", + "integrity": "sha512-WtT4fPKIUQ/hswy+l2GF/rKOdD+42L3fUzzcwRzNutQbe2tU9SimoSOAsay/ylWEuhIOQTs7ysPB8fUgFQoLpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/eslint-plugin": "21.2.0", + "@angular-eslint/eslint-plugin-template": "21.2.0", + "ignore": "7.0.5", + "semver": "7.7.3", + "strip-json-comments": "3.1.1" + }, + "peerDependencies": { + "@angular/cli": ">= 21.0.0 < 22.0.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/core": { + "version": "21.2.22", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.22.tgz", + "integrity": "sha512-sJoZr7cGfw3imZaE7caQGUB3XiAMGLtpzEmyTe6LnuixVJbJYZBjlYk9AFoW8RJT5hJN8hIe1MLQdAl23kMlLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/schematics": { + "version": "21.2.22", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.22.tgz", + "integrity": "sha512-qhpaXOV4R4Db35bIcgCrJoBMdgTIqipsvG55BVEYtNbVjFxmMWam1nh/OIDTNR54fmpB9/y1LBK1Hm4gVEnAAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.22", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.3.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "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/@angular-eslint/schematics/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/ora": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", + "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.3.1", + "string-width": "^8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-21.2.0.tgz", + "integrity": "sha512-TCb3qYOC/uXKZCo56cJ6N9sHeWdFhyVqrbbYfFjTi09081T6jllgHDZL5Ms7gOMNY8KywWGGbhxwvzeA0RwTgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.2.0", + "eslint-scope": "^9.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-21.2.0.tgz", + "integrity": "sha512-E19/hkuvHoNFvctBkmEiGWpy2bbC6cgbr3GNVrn2nGtbI4jnwnDFCGHv50I4LBfvj0PA9E6TWe73ejJ5qoMJWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.2.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/animations": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-22.0.8.tgz", + "integrity": "sha512-hdBlckl5mARzuc5gt2siydIAxeJbBiRneg8V0kazEDH6xNkNp/1siro68ZaHgTY5dCUEOec/eC4zbhB8AlSLhQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/core": "22.0.8" + } + }, + "node_modules/@angular/aria": { + "version": "22.0.7", + "resolved": "https://registry.npmjs.org/@angular/aria/-/aria-22.0.7.tgz", + "integrity": "sha512-elinnulWH/AgRajJ6tLEFP9nuYlX/6Q/vbm5STmyBzjdaRA7G+/XZ8m2aBlFkt1Da8jIJbgqqfXYKTI8FLtRTQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/cdk": "22.0.7", + "@angular/core": "^22.0.0 || ^23.0.0" + } + }, + "node_modules/@angular/build": { + "version": "22.0.9", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-22.0.9.tgz", + "integrity": "sha512-j5eYaMTGFXdPVSX0xtWRRWHE2Ezz2CFiBPsAKrWHitvzccv95nURQYk5jbB+FHCYuN60zJNoTZMIlT7rXYAvag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2200.9", + "@babel/core": "7.29.7", + "@babel/helper-annotate-as-pure": "7.29.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "6.0.12", + "@vitejs/plugin-basic-ssl": "2.3.0", + "beasties": "0.4.2", + "browserslist": "^4.26.0", + "esbuild": "0.28.1", + "https-proxy-agent": "9.0.0", + "jsonc-parser": "3.3.1", + "listr2": "10.2.1", + "magic-string": "0.30.21", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "8.0.1", + "picomatch": "4.0.4", + "piscina": "5.2.0", + "rollup": "4.60.2", + "sass": "1.99.0", + "semver": "7.7.4", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.16", + "vite": "7.3.6", + "watchpack": "2.5.1" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.5.4" + }, + "peerDependencies": { + "@angular/compiler": "^22.0.0", + "@angular/compiler-cli": "^22.0.0", + "@angular/core": "^22.0.0", + "@angular/localize": "^22.0.0", + "@angular/platform-browser": "^22.0.0", + "@angular/platform-server": "^22.0.0", + "@angular/service-worker": "^22.0.0", + "@angular/ssr": "^22.0.9", + "istanbul-lib-instrument": "^6.0.0", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^22.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=6.0 <6.1", + "vitest": "^4.0.8" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "istanbul-lib-instrument": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/agent-base": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", + "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@angular/build/node_modules/https-proxy-agent": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.0.0.tgz", + "integrity": "sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@angular/build/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular/build/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/build/node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/@angular/build/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular/cdk": { + "version": "22.0.7", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-22.0.7.tgz", + "integrity": "sha512-Omh8YkevuG7psuOw8KvPbPINxwqC0iqfosC6monTakb4xX6qP2wprF71PLIFiXSP2rl+OxHLRcf3nPchsPCE5Q==", + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^22.0.0 || ^23.0.0", + "@angular/core": "^22.0.0 || ^23.0.0", + "@angular/platform-browser": "^22.0.0 || ^23.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cli": { + "version": "22.0.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-22.0.9.tgz", + "integrity": "sha512-nkdz9sc9OjTLBG2QwPH8HuFc4fOl489AzrKInM2y+Q0u1+/HFt9QpSeupPnDJeOYGImDIP0B2VJJ3teDRM1DGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2200.9", + "@angular-devkit/core": "22.0.9", + "@angular-devkit/schematics": "22.0.9", + "@inquirer/prompts": "8.4.2", + "@listr2/prompt-adapter-inquirer": "4.2.3", + "@modelcontextprotocol/sdk": "1.29.0", + "@schematics/angular": "22.0.9", + "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.52.0", + "ini": "6.0.0", + "jsonc-parser": "3.3.1", + "listr2": "10.2.1", + "npm-package-arg": "13.0.2", + "pacote": "21.5.1", + "parse5-html-rewriting-stream": "8.0.1", + "semver": "7.7.4", + "yargs": "18.0.0", + "zod": "4.4.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@angular/cli/node_modules/@modelcontextprotocol/sdk/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@angular/cli/node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "node_modules/@angular/cli/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/cli/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/@angular/cli/node_modules/zod": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.2.tgz", + "integrity": "sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@angular/common": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-22.0.8.tgz", + "integrity": "sha512-FnwkXndUgAyWk1/p5flMfocIUtuuneJ01mxC1FxRc5/bdWTyNVeQDsM9Lw4PEAPc0AHu//EnblegRq8o6LGdUQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/core": "22.0.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-22.0.8.tgz", + "integrity": "sha512-ot7rvntfkZsPHmp8yl6PWUj/yG4e50X0+YeR7QYy/rEYKBiIg91w8GwjxSzaF4g5+bzJGDv7l/XnachKm0IySg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-22.0.8.tgz", + "integrity": "sha512-shBqaUxMtqriv4UG2MHmYT8GSvDizI40mUFkOfeQ1yRJ2C9dk0TnWKPwjSO7o6bs6UiU6V8Y3uSWdmfCGVVZAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.29.7", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^5.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^18.0.0" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/compiler": "22.0.8", + "typescript": ">=6.0 <6.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular/core": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-22.0.8.tgz", + "integrity": "sha512-HagZZVzbtXd+ZhMb++k/HOtr/UTiBROHHH7xutgYgnSnPRXX0kCca5EQ02OZ/OCWfsMP5liSJDfwiePFULKA6Q==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/compiler": "22.0.8", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0 || ~0.16.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } + } + }, + "node_modules/@angular/forms": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-22.0.8.tgz", + "integrity": "sha512-KlLJE8rgziSBqCQy+cqCHPEQPGjJEY53i1vZbpnBoLXhnwswLJ3O0c76RHNpIrlrvr9v4p3b2/LxSE8wQmdStg==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "tslib": "^2.3.0", + "zod": "^4.0.10" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/common": "22.0.8", + "@angular/core": "22.0.8", + "@angular/platform-browser": "22.0.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-22.0.8.tgz", + "integrity": "sha512-mPSWGX1t09Bf0c+JXtq0xUNbyGAPCnWJndbn+VPA5fmnNDbVZiINuDn8MhXnYZAqK1GCvl/MTtg2TKFUWHnU0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/@angular/localize": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-22.0.8.tgz", + "integrity": "sha512-jKP+bwzjB9i6GgPlrGDzzXPpre8+/ERR9luvQsLxEKX+hWTNYM/HaDIyzWiouVqzsH+dYP8nJLqdrJm2FxYzyQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "7.29.7", + "@types/babel__core": "7.20.5", + "tinyglobby": "^0.2.12", + "yargs": "^18.0.0" + }, + "bin": { + "localize-extract": "tools/bundles/src/extract/cli.js", + "localize-migrate": "tools/bundles/src/migrate/cli.js", + "localize-translate": "tools/bundles/src/translate/cli.js" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/compiler": "22.0.8", + "@angular/compiler-cli": "22.0.8" + } + }, + "node_modules/@angular/platform-browser": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-22.0.8.tgz", + "integrity": "sha512-FllGHCayu5Dv82HAA9ORL04Xf+In9JGMbQ1Vn4QnhrAVxBz182vm+ZwszLzRDSAwmfeIjZDeK49tKAcqHR9XNg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/animations": "22.0.8", + "@angular/common": "22.0.8", + "@angular/core": "22.0.8" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-22.0.8.tgz", + "integrity": "sha512-HQ5GeMoKqd2eMy9hHga1F0yumhrt4gVlhoP8YfmQnZWluVagdyinUpGdd3dNiuYjLcbHB+KXdW9c6LnqEmU+dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/common": "22.0.8", + "@angular/compiler": "22.0.8", + "@angular/core": "22.0.8", + "@angular/platform-browser": "22.0.8" + } + }, + "node_modules/@angular/router": { + "version": "22.0.8", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-22.0.8.tgz", + "integrity": "sha512-9NO5K03QqfWMWWZ+Uu4WqBSLw/YAot918cBUFdgl6mTUOfoHi/xWO5pAt0SEpbXMHmWafJBdb99GRlAGybGSTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "@angular/common": "22.0.8", + "@angular/core": "22.0.8", + "@angular/platform-browser": "22.0.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons-angular": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons-angular/-/icons-angular-21.0.0.tgz", + "integrity": "sha512-Io1DSg0JyzsxQtF2T9LfQSZL22d7zSYyNz0RiUCOhtMoDnnGis1oU6mPs5JzZTRtVdgpuLUhS6GVTlT+dmP1nA==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/platform-browser": "^21.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", + "integrity": "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.0.0", + "@csstools/css-color-parser": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.5" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "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/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "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/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/@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-compilation-targets/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/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", + "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.1.tgz", + "integrity": "sha512-YpAJZhaHplYQkG8ib+/Fx5Y0eF2lVWi3tIvMJA6i39TLyUNp2439cifzW8VMjhlqrBjHzK5hVGugRRm2zTKI/A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.1.1", + "@csstools/css-calc": "^3.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.9.tgz", + "integrity": "sha512-iGGw4OsAYsS6pD29MdJ2bX/nJx65a04ZZiw6x+VwWlP2DdXf6f++Zmuv/OzALpdyfVhjbduIIF2cXM7HWBIe9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "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==", + "dev": true, + "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/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "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/@eslint/eslintrc/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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", + "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@gar/promise-retry": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", + "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@harperfast/extended-iterable": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz", + "integrity": "sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/@hono/node-server": { + "version": "1.19.17", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.17.tgz", + "integrity": "sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@inquirer/ansi": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.3.tgz", + "integrity": "sha512-XEYX2WA8SBkLPczL6/yXPHLPCvDoptmh9v56Cy05BSV1Smk1vWy19bTC4qJBuIffw7+6l4CcaYYzGqG60RfW1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^12.0.1", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.12.tgz", + "integrity": "sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.9", + "@inquirer/type": "^4.0.5" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm/node_modules/@inquirer/core": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz", + "integrity": "sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.1.0", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.3.1.tgz", + "integrity": "sha512-y43COoyVUjPWIobn2Qep/uI1drPS78aaZZZ9kVi94Tyu/GuW2N8d8Q4rifJXGAXCEAXCPTTMjD8gC1HyvM5ukA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.1", + "@inquirer/external-editor": "^3.0.4", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.3.tgz", + "integrity": "sha512-3NQJiXNJ/aj9wiAsr7pECdp5Qe9J0X9YUJCKsaFXS+ddOxfL6J4AIl3w3T4Gq3kK0WsQY5GMoDokK5X94m6lHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.1", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.4.tgz", + "integrity": "sha512-tZbbaK2ovq6vlrRBNQvjrypmrED/p5x2ncIHQ79cD55tei3dD96v5glMMA+6tiq7K104i/25DVYKWVPJuV6ptA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.2" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.8.tgz", + "integrity": "sha512-tApbon79GM9ry56ja/Ud3SY2CL4TQsao9fIwDQbgTeNY55025GdMzQ2+UdegV/lx51VNGUB59M0v0nMpybYY4Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/input": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.4.tgz", + "integrity": "sha512-3xQkQrOvgOzpSN2ciTVdRDlg1FWMCA8l+0KfB6SNlILoTCGzJTzO/gc0Rwjcb3usuGyKdaGtI6OiyMdeMeLWkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.1", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.2.1.tgz", + "integrity": "sha512-5KaqwZNLRpUuWcoCrYghPP9TMaXL5v2Sk4xqePM7RCVegcJStoXdWibio60YIC1bec+z1fCyb67N6XPJIkZtGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.1", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.2.0.tgz", + "integrity": "sha512-CvVcW09emkBESEOW+4R8CjLNkP3fB3XrjeL8CDvfpjgrJN+V9oerXmJAXXM3l+4xqYPD5Yaujzy/Ph0PLOdDuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^12.0.1", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.4.2.tgz", + "integrity": "sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^5.1.4", + "@inquirer/confirm": "^6.0.12", + "@inquirer/editor": "^5.1.1", + "@inquirer/expand": "^5.0.13", + "@inquirer/input": "^5.0.12", + "@inquirer/number": "^4.0.12", + "@inquirer/password": "^5.0.12", + "@inquirer/rawlist": "^5.2.8", + "@inquirer/search": "^4.1.8", + "@inquirer/select": "^5.1.4" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts/node_modules/@inquirer/confirm": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.3.0.tgz", + "integrity": "sha512-pZHXJImFtERmSNMBHcjwuz8Ck5vEFEYNUZnwbb8aJpjHv/TwGuFErNxF2Hp8+V+pNJs2EYPMlyWscvFEqO9jOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.1", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.3.tgz", + "integrity": "sha512-Mu7WrtmDLaXBDEyrRLS70SZgX9ZSm4Up1w0ZxiH8C1OOp9oaVCn2k8q3QGgmlnhsKYUhuaU3zFWhAP6wxkVIMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.1", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.3.1.tgz", + "integrity": "sha512-0VWOvsHWI0rPj6CG70MoP4oXNCB6adcyN8bVFZXnh11eLDdPIK2f2XCmva78acPPDfJisfab7qNakwBh7hdBXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^12.0.1", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.3.tgz", + "integrity": "sha512-KuRTodDa6xBXX2noIpjuitpX/QT7Sfav7dIZ/OfUY54Hxg95nrGoshSzxx6Ey7qqLbImKdiGkSDt7KjPXjQgmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^12.0.1", + "@inquirer/figures": "^2.0.8", + "@inquirer/type": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.1.0.tgz", + "integrity": "sha512-FMiJpuHUG3Dk0ex+UIXkre7i+i4OcwHWk9YdcVtZHFwb/r2rnrU2ipTCNAB7A+QOP0ryzIcqOfy76fRyyvOEAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-4.2.3.tgz", + "integrity": "sha512-Co9U3AJ3LW0J8XBHjVoNKA79dMAyFt8EZH3OaKTMcDTj8r+6kG3vSUPq/eGLHT7P0iK3uLaFfhdFYd3033P24g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^4.0.5" + }, + "engines": { + "node": ">=22.13.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 9", + "listr2": "10.2.1" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.5.4.tgz", + "integrity": "sha512-Kk4Kz3iyu1QiLsLZBS9Af1eSKUC8VR2T+/jyE2iAyuGw2VwK08pp5iTbZnXn6sWu0LogO/RFktMxOjiDA2sS3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.5.4.tgz", + "integrity": "sha512-BEe5Rp3trn26oxoXOVL5HVDoiYmjUDwr8NRPkBOdUdCSBEorKI+7JrZLRKAdxO+G6cGQLgseXk0gR7qIQa7aGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.5.4.tgz", + "integrity": "sha512-SGbFR7816uBcTHc2ZY4S6WyOkl9bICnzqTQd2Mv4V/j24cfds88xx2nC6cm/y8zGQL7Ds31YF/5NGxjgcdM5Hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.5.4.tgz", + "integrity": "sha512-cUXEengO8o60v1SWerJTH4/RH4U3+9jC0/4njp2Z9NdmvaGzhKsbRM2wpXuRYrN8tytsoJCg0SvWEWwHAwLbCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.5.4.tgz", + "integrity": "sha512-Gxq8jpgOWXwd0PUR+c9R2Ik1/uBnGd5GMIIzRRDqABCkvmjtC3KWcyhesV9jSPCz759isl0NlbsstZ2oyvk8lA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.5.4.tgz", + "integrity": "sha512-pKv1DJ1bPZAaHkdFsSz5IDfUG8x9vntgquXF9/Dm2xuupcIe/EkLzylpoBxppFVK5vzbV561Dq26jNY2fIMA7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.5.4.tgz", + "integrity": "sha512-JF1BmLCm9kGEVZgYmJq43zeQVdHVgAJnTi/NURWEsy6L1ZrrlSmdltS+D17QN4LODwf+1LMXAA9auIZVXtWwzw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@microsoft/signalr": { + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-10.0.11.tgz", + "integrity": "sha512-FulOJ2EEtKvLQcswe/U7v8pzyXyk7Jua5xgWJPPwyQU/2Z9ORvKcVjyO75VvLsem+CJ1ORRexJ+7Bz1FCei2aw==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "eventsource": "^2.0.2", + "fetch-cookie": "^2.0.3", + "node-fetch": "^2.6.7", + "ws": "^7.5.10" + } + }, + "node_modules/@microsoft/signalr/node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@microsoft/signalr/node_modules/ws": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", + "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", + "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/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", + "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", + "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", + "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", + "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", + "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", + "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ng-bootstrap/ng-bootstrap": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-20.0.0.tgz", + "integrity": "sha512-Jt+GUQ0PdM8VsOUUVr7vTQXhwcGwe2DCe1mmfS21vz9pLSOtGRz41ohZKc1egUevj5Rxm2sHVq5Sve68/nTMfA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/forms": "^21.0.0", + "@angular/localize": "^21.0.0", + "@popperjs/core": "^2.11.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@ngx-validate/core": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@ngx-validate/core/-/core-0.2.0.tgz", + "integrity": "sha512-04iGHPCXyFCykAyCGehxetziOt69Lhk/6yWifhC/vc8PZJ0S8m3hIn6tI63pEdVoV95+Hc1GQ1K/wMRtRD0uLQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=5.0.0", + "@angular/core": ">=5.0.0", + "@angular/forms": ">=5.0.0", + "rxjs": ">=6.0.0 || ^5.6.0-forward-compat.4" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz", + "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", + "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", + "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", + "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", + "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", + "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.147.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", + "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", + "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", + "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", + "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", + "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", + "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", + "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", + "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", + "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", + "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", + "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", + "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", + "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", + "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", + "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", + "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "22.0.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-22.0.9.tgz", + "integrity": "sha512-moQI3UnqUt6GZ81ykxJRUbf+IpM6SDFRyMMj6A2VNSiUGVpSAETNFIuTk/6YDzNG8yhMN9zOICeBwvvPH0ylbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "22.0.9", + "@angular-devkit/schematics": "22.0.9", + "jsonc-parser": "3.3.1", + "typescript": "6.0.3" + }, + "engines": { + "node": "^22.22.3 || ^24.15.0 || >=26.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/core": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz", + "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.2.tgz", + "integrity": "sha512-SQqvFMt4V78fdjcDdYX6HbiVSOR4QK3ZgwCa2KOsopAgPIHy1rU5UDUmzLl02r5oyyaYcYHR1hpwDRk/yUe+Mw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.1.tgz", + "integrity": "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@gar/promise-retry": "^1.0.2", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz", + "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz", + "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@swimlane/ngx-datatable": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-22.0.0.tgz", + "integrity": "sha512-NteAxuMHNnXMeRun0qGZNz5ocoRmoypmhJtfvQRpO6umZPDVlf0+GzlEsTSOfqJNrKiYjtaMJ8EP+1lRYxrigw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "18.x || 19.x || 20.x", + "@angular/core": "18.x || 19.x || 20.x", + "@angular/platform-browser": "18.x || 19.x || 20.x", + "rxjs": "7.x" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz", + "integrity": "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "postcss": "^8.5.16", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", + "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@tufjs/models/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/cacheable-request/node_modules/@types/node": { + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", + "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/cacheable-request/node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/keyv/node_modules/@types/node": { + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", + "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/keyv/node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/responselike/node_modules/@types/node": { + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", + "integrity": "sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/responselike/node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz", + "integrity": "sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/type-utils": "7.16.0", + "@typescript-eslint/utils": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz", + "integrity": "sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/typescript-estree": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz", + "integrity": "sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz", + "integrity": "sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.16.0", + "@typescript-eslint/utils": "7.16.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz", + "integrity": "sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz", + "integrity": "sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/visitor-keys": "7.16.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz", + "integrity": "sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.16.0", + "@typescript-eslint/types": "7.16.0", + "@typescript-eslint/typescript-estree": "7.16.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz", + "integrity": "sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.16.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.3.0.tgz", + "integrity": "sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", + "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", + "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.11", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", + "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", + "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.11", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", + "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.11", + "@vitest/utils": "4.1.11", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", + "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", + "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.11", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "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": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.0.tgz", + "integrity": "sha512-0ZzY9mjqV7gop/AH8pIBiAS8giXP7WcSiUfoFYIzYAK9QC5c37E4SIVtJVBMwlURc0/uNt2o4RcNRvdHa4CJ5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.18.0", + "@algolia/client-abtesting": "5.52.0", + "@algolia/client-analytics": "5.52.0", + "@algolia/client-common": "5.52.0", + "@algolia/client-insights": "5.52.0", + "@algolia/client-personalization": "5.52.0", + "@algolia/client-query-suggestions": "5.52.0", + "@algolia/client-search": "5.52.0", + "@algolia/ingestion": "1.52.0", + "@algolia/monitoring": "1.52.0", + "@algolia/recommend": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/angular-oauth2-oidc": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/angular-oauth2-oidc/-/angular-oauth2-oidc-20.0.3.tgz", + "integrity": "sha512-SL0iV/WlrX35J4CXvc7VdoNhlol+YIo8c0i1NrfAQ70++dxLZjg/li6vNx7lu2sC3GElZLzmlbBZOvlvLB2Q5w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.5.2" + }, + "peerDependencies": { + "@angular/common": ">=20.0.0", + "@angular/core": ">=20.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/beasties": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.4.2.tgz", + "integrity": "sha512-NvcGjG/7AVUAfRbvrJmHunDQS9uHnE6Q/7AkaPr8oKE8HjOlpjRG5075z/th2Tmlezk3VlaaS8+X9I1RwHJMQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^6.0.0", + "css-what": "^7.0.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3", + "postcss-safe-parser": "^7.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "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": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", + "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "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/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chart.js": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz", + "integrity": "sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^15.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.416", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz", + "integrity": "sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "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/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "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/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz", + "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-uri": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz", + "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fastq": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.2.tgz", + "integrity": "sha512-UpGiiODyCGprM8EPP6JodP6jC9Rws6TCuiDOD+nn0CJhR8guI3g/ozo4ugL0vJ+Yz1UtJuuRPqvQuybVOF1VQA==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-cookie": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz", + "integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==", + "license": "Unlicense", + "dependencies": { + "set-cookie-parser": "^2.4.8", + "tough-cookie": "^4.0.0" + } + }, + "node_modules/fetch-cookie/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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "dev": true, + "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/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "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.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.13.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.5.tgz", + "integrity": "sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ignore-walk/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/ip-address": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.5.0.tgz", + "integrity": "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jose": { + "version": "6.2.10", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz", + "integrity": "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "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": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz", + "integrity": "sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.28", + "@asamuzakjp/dom-selector": "^6.7.6", + "@exodus/bytes": "^1.6.0", + "cssstyle": "^5.3.4", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "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==", + "dev": true, + "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/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/just-clone": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz", + "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==", + "license": "MIT" + }, + "node_modules/just-compare": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/just-compare/-/just-compare-2.3.0.tgz", + "integrity": "sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/listr2": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.1.tgz", + "integrity": "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.2.0", + "eventemitter3": "^5.0.4", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^10.0.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.1.tgz", + "integrity": "sha512-M0N4xzyzosiIok3svYlEo1sdLZts/8FPgYH/GPC3wvlmPoRvnoManGMrE54waYj3tISA8w6lsdesfVv67qSr8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.5.4.tgz", + "integrity": "sha512-9FKQA6G1MMtqNxfxvSBNXD/axeG2QRjYbNh0/ykRL5xYcRbCm2vXq7B9bhc7nSuKdHzr8/BHIwfPuYYH1UsXXw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@harperfast/extended-iterable": "^1.0.3", + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.5.4", + "@lmdb/lmdb-darwin-x64": "3.5.4", + "@lmdb/lmdb-linux-arm": "3.5.4", + "@lmdb/lmdb-linux-arm64": "3.5.4", + "@lmdb/lmdb-linux-x64": "3.5.4", + "@lmdb/lmdb-win32-arm64": "3.5.4", + "@lmdb/lmdb-win32-x64": "3.5.4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-fetch-happen": { + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz", + "integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", + "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", + "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/msgpackr": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", + "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", + "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" + } + }, + "node_modules/mute-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ng-zorro-antd": { + "version": "21.3.3", + "resolved": "https://registry.npmjs.org/ng-zorro-antd/-/ng-zorro-antd-21.3.3.tgz", + "integrity": "sha512-70zzTqc2MQI9W+uX+OGdXfT1azbum3X/cdJ1orxLY0grz+deKtH2zVW7bQytHiCWdRe9pP4KtdE5xLY6eYKssw==", + "license": "MIT", + "dependencies": { + "@angular/cdk": "^21.0.0", + "@ant-design/icons-angular": "^21.0.0", + "@ctrl/tinycolor": "^3.6.0", + "date-fns": "^2.16.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^21.0.0", + "@angular/core": "^21.0.0", + "@angular/forms": "^21.0.0", + "@angular/platform-browser": "^21.0.0", + "@angular/router": "^21.0.0" + } + }, + "node_modules/ng-zorro-antd/node_modules/@angular/cdk": { + "version": "21.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.14.tgz", + "integrity": "sha512-806REq/CLf37nEhmmd8Q+ILN8z/RVG2vk2n8YZ/4TdHpcBCi5ux4AxLbpMmduLwGPOzPagJ6ggRzE5fnX0rmcQ==", + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^21.0.0 || ^22.0.0", + "@angular/core": "^21.0.0 || ^22.0.0", + "@angular/platform-browser": "^21.0.0 || ^22.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/ng-zorro-antd/node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-bundled": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", + "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-install-checks": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", + "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", + "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", + "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", + "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", + "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "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==", + "dev": true, + "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/ora": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.0.tgz", + "integrity": "sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.3.2", + "string-width": "^8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ordered-binary": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", + "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.7.tgz", + "integrity": "sha512-VaWRu2i4FJNRtiRWCuuQRgfQ1B7a6+gMSrO+3j0EQi/k0ULfS9kosRxGoiqwzIjZTDI02tGfk5mXXltLg6QtfQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pacote": { + "version": "21.5.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz", + "integrity": "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.1.tgz", + "integrity": "sha512-NaRku2aMpUN1Sh1Gyk1KWUh2A7EJx2c6qYzvwsPtqhoHoaURshdrceYK3LunVCm3WHhm6FS7Vcczbvdh3/UIVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "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": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/piscina": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.2.0.tgz", + "integrity": "sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.4" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "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==", + "dev": true, + "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/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.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==", + "dev": true, + "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-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/rolldown": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", + "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.147.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.6", + "@rolldown/binding-android-arm64": "1.2.6", + "@rolldown/binding-darwin-arm64": "1.2.6", + "@rolldown/binding-darwin-x64": "1.2.6", + "@rolldown/binding-freebsd-x64": "1.2.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", + "@rolldown/binding-linux-arm64-gnu": "1.2.6", + "@rolldown/binding-linux-arm64-musl": "1.2.6", + "@rolldown/binding-linux-ppc64-gnu": "1.2.6", + "@rolldown/binding-linux-s390x-gnu": "1.2.6", + "@rolldown/binding-linux-x64-gnu": "1.2.6", + "@rolldown/binding-linux-x64-musl": "1.2.6", + "@rolldown/binding-openharmony-arm64": "1.2.6", + "@rolldown/binding-win32-arm64-msvc": "1.2.6", + "@rolldown/binding-win32-x64-msvc": "1.2.6" + } + }, + "node_modules/rollup": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.2", + "@rollup/rollup-android-arm64": "4.60.2", + "@rollup/rollup-darwin-arm64": "4.60.2", + "@rollup/rollup-darwin-x64": "4.60.2", + "@rollup/rollup-freebsd-arm64": "4.60.2", + "@rollup/rollup-freebsd-x64": "4.60.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", + "@rollup/rollup-linux-arm64-gnu": "4.60.2", + "@rollup/rollup-linux-arm64-musl": "4.60.2", + "@rollup/rollup-linux-loong64-gnu": "4.60.2", + "@rollup/rollup-linux-loong64-musl": "4.60.2", + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", + "@rollup/rollup-linux-ppc64-musl": "4.60.2", + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", + "@rollup/rollup-linux-riscv64-musl": "4.60.2", + "@rollup/rollup-linux-s390x-gnu": "4.60.2", + "@rollup/rollup-linux-x64-gnu": "4.60.2", + "@rollup/rollup-linux-x64-musl": "4.60.2", + "@rollup/rollup-openbsd-x64": "4.60.2", + "@rollup/rollup-openharmony-arm64": "4.60.2", + "@rollup/rollup-win32-arm64-msvc": "4.60.2", + "@rollup/rollup-win32-ia32-msvc": "4.60.2", + "@rollup/rollup-win32-x64-gnu": "4.60.2", + "@rollup/rollup-win32-x64-msvc": "4.60.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "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==", + "dev": true, + "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/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.99.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", + "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/should-quote": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/should-quote/-/should-quote-1.0.0.tgz", + "integrity": "sha512-mQN5Meec3CTPmykzwXfDGWDpi75HUD8NT21wRWaJ7oqxpFIhXq80Hiy4ziccUNOwzhWeFkT9/kNSZbaugL9jsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.5", + "npm": ">=6.0", + "yarn": "^1.0" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "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.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.1.tgz", + "integrity": "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stdin-discarder": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", + "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", + "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.11" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", + "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", + "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", + "license": "Apache-2.0" + }, + "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/tuf-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "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/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "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==", + "dev": true, + "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/validate-npm-package-name": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/vitest": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", + "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-istanbul": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "@vitest/ui": "4.1.11", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/vite": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "dev": true, + "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/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yargs": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zone.js": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", + "license": "MIT" + } + } +} diff --git a/angular/package.json b/angular/package.json new file mode 100644 index 0000000..95c2608 --- /dev/null +++ b/angular/package.json @@ -0,0 +1,65 @@ +{ + "name": "newProjectConfigure", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve --open", + "build": "ng build", + "build:prod": "ng build --configuration production", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "lint": "ng lint" + }, + "private": true, + "dependencies": { + "@abp/ng.account": "~10.6.0", + "@abp/ng.components": "~10.6.0", + "@abp/ng.core": "~10.6.0", + "@abp/ng.identity": "~10.6.0-rc.3", + "@abp/ng.oauth": "~10.6.0", + "@abp/ng.setting-management": "~10.6.0", + "@abp/ng.tenant-management": "~10.6.0", + "@abp/ng.theme.basic": "~10.6.0", + "@abp/ng.theme.shared": "~10.6.0", + "@angular/animations": "~22.0.1", + "@angular/aria": "~22.0.0", + "@angular/cdk": "~22.0.0", + "@angular/common": "~22.0.1", + "@angular/compiler": "~22.0.1", + "@angular/core": "~22.0.1", + "@angular/forms": "~22.0.1", + "@angular/localize": "~22.0.1", + "@angular/platform-browser": "~22.0.1", + "@angular/platform-browser-dynamic": "~22.0.1", + "@angular/router": "~22.0.1", + "@microsoft/signalr": "^10.0.11", + "@ng-select/ng-select": "^24.0.2", + "@ngx-formly/bootstrap": "^7.1.0", + "@ngx-formly/core": "^7.1.0", + "rxjs": "~7.8.0", + "tslib": "^2.0.0", + "zone.js": "~0.15.0" + }, + "devDependencies": { + "@abp/ng.schematics": "~10.6.0", + "@angular-eslint/builder": "~21.2.0", + "@angular-eslint/eslint-plugin": "~21.2.0", + "@angular-eslint/eslint-plugin-template": "~21.2.0", + "@angular-eslint/schematics": "~21.2.0", + "@angular-eslint/template-parser": "~21.2.0", + "@angular/build": "~22.0.1", + "@angular/cli": "~22.0.1", + "@angular/compiler-cli": "~22.0.1", + "@angular/language-service": "~22.0.1", + "@tailwindcss/postcss": "^4.3.3", + "@types/node": "~20.11.0", + "@typescript-eslint/eslint-plugin": "7.16.0", + "@typescript-eslint/parser": "7.16.0", + "eslint": "^8.0.0", + "jsdom": "^27.1.0", + "postcss": "^8.5.26", + "tailwindcss": "^4.3.3", + "typescript": "~6.0.3", + "vitest": "^4.0.0" + } +} diff --git a/angular/projects/theme-basic10_1_0/.eslintrc.json b/angular/projects/theme-basic10_1_0/.eslintrc.json new file mode 100644 index 0000000..afa6cfe --- /dev/null +++ b/angular/projects/theme-basic10_1_0/.eslintrc.json @@ -0,0 +1,33 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*", "**/vitest.config.*.timestamp*"], + "overrides": [ + { + "files": ["*.ts"], + "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"], + "rules": { + "@angular-eslint/directive-selector": [ + "error", + { + "type": "attribute", + "prefix": "abp", + "style": "camelCase" + } + ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "abp", + "style": "kebab-case" + } + ] + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@nx/angular-template"], + "rules": {} + } + ] +} diff --git a/angular/projects/theme-basic10_1_0/README.md b/angular/projects/theme-basic10_1_0/README.md new file mode 100644 index 0000000..c214a71 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/README.md @@ -0,0 +1,130 @@ +## ℹ️ Description + +ABP Framework is a complete open-source infrastructure to create modern web applications by following the best practices and conventions of software development. This package is a part of the [ABP Framework](https://abp.io) and contains client-side files. +For more information, check out the below links: + +🔗Official Website: https://abp.io + +🔗Commercial Website: https://commercial.abp.io + +🔗Commercial Demo: https://commercial.abp.io/demo + +🔗GitHub Repository: https://github.com/abpframework/abp + +🔗Official Theme: https://www.LeptonTheme.com + +🔗Documentation: https://docs.abp.io + +🔗Community: https://community.abp.io + +🔗Blog: https://blog.abp.io + +🔗Books: https://abp.io/books + +🔗Twitter: https://twitter.com/abpframework + +🔗Discord: https://community.abp.io/discord + +🔗Stackoverflow: https://stackoverflow.com/questions/tagged/abp + +🔗YouTube: https://www.youtube.com/@Volosoft + + +## 🤔 Why ABP Platform? + +Why should you use the ABP.IO Platform instead of creating a new solution from scratch? + +You can find the answer here 👉🏻 [Why ABP Platform?](https://docs.abp.io/en/commercial/latest/why-abp-io-platform) + + +## 🚀 Key Features of the ABP Framework + +🟡 Modularity + +🟡 Multi-Tenancy + +🟡 Bootstrap Tag Helpers + +🟡 Dynamic Forms + +🟡 Authentication + +🟡 Authorization + +🟡 Distributed Event Bus + +🟡 BLOB Storing + +🟡 Text Templating + +🟡 Tooling: ABP CLI + +🟡 Cross-Cutting Concerns + +🟡 Bundling & Minification + +🟡 Virtual File System + +🟡 Theming + +🟡 Background Jobs + +🟡 DDD Infrastructure + +🟡 Auto REST APIs + +🟡 Dynamic Client Proxies + +🟡 Multiple Database Providers + +🟡 Data filtering + +🟡 Test Infrastructure + +🟡 Audit Logging + +🟡 Object to Object Mapping + +🟡 Email & SMS Abstractions + +🟡 Localization + +🟡 Setting Management + +🟡 Extension Methods + +🟡 Aspect Oriented Programming + +🟡 Dependency Injection + + +## 🧐 How It Works? + +The following page explains how you use the ABP.IO Platform as a .NET developer 👉 [How it works?](https://commercial.abp.io/how-it-works) + + +### 📘 Supported Database Providers + +🔵 Entity Framework Core + +🔵 MongoDB + +🔵 Dapper + + +### 🎴 Supported UI Frameworks + +🔵 Angular + +🔵 Razor Pages + +🔵 Blazor Web Assembly + +🔵 Blazor Server + +🔵 MAUI with Blazor Hybrid + + +## 📫 Bug & Support + +Support for open-source ABP Framework client-side packages is available at [GitHub Issues](https://github.com/abpframework/abp/issues), and the commercial support is available at [support.abp.io](https://support.abp.io). diff --git a/angular/projects/theme-basic10_1_0/jest.config.ts b/angular/projects/theme-basic10_1_0/jest.config.ts new file mode 100644 index 0000000..2c6efb6 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/jest.config.ts @@ -0,0 +1,27 @@ +/* eslint-disable */ +/** + * @deprecated use vitest instead of jest + * @see https://vitest.dev/guide/migration.html#jest + */ +export default { + displayName: 'theme-basic', + preset: '../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + globals: {}, + coverageDirectory: '../../coverage/packages/theme-basic', + transform: { + '^.+.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/angular/projects/theme-basic10_1_0/ng-package.json b/angular/projects/theme-basic10_1_0/ng-package.json new file mode 100644 index 0000000..a5d3991 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/ng-package.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/packages/theme-basic", + "lib": { + "entryFile": "src/public-api.ts" + }, + "allowedNonPeerDependencies": ["@abp/ng.theme.shared", "@abp/ng.account.core"] +} diff --git a/angular/projects/theme-basic10_1_0/package.json b/angular/projects/theme-basic10_1_0/package.json new file mode 100644 index 0000000..766690a --- /dev/null +++ b/angular/projects/theme-basic10_1_0/package.json @@ -0,0 +1,31 @@ +{ + "name": "@abp/ng.theme.basic", + "version": "10.1.0", + "homepage": "https://abp.io", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git" + }, + "dependencies": { + "@abp/ng.account.core": "~10.1.0", + "@abp/ng.theme.shared": "~10.1.0", + "tslib": "^2.0.0" + }, + "publishConfig": { + "access": "public" + }, + "license": "LGPL-3.0", + "keywords": [ + "aspnetcore", + "boilerplate", + "framework", + "web", + "best-practices", + "angular", + "maui", + "blazor", + "mvc", + "csharp", + "webapp" + ] +} diff --git a/angular/projects/theme-basic10_1_0/project.json b/angular/projects/theme-basic10_1_0/project.json new file mode 100644 index 0000000..ac155e0 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/project.json @@ -0,0 +1,38 @@ +{ + "name": "theme-basic", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "sourceRoot": "packages/theme-basic/src", + "prefix": "abp", + "tags": [], + "implicitDependencies": ["core", "theme-shared", "account-core"], + "targets": { + "build": { + "executor": "@nx/angular:package", + "outputs": ["{workspaceRoot}/dist/packages/theme-basic"], + "options": { + "project": "packages/theme-basic/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "packages/theme-basic/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "packages/theme-basic/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"] + }, + "test": { + "executor": "@nx/vitest:test", + "outputs": ["{options.reportsDirectory}"], + "options": { + "reportsDirectory": "../../coverage/packages/theme-basic" + } + } + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/account-layout.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/account-layout.component.html new file mode 100644 index 0000000..a27790c --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/account-layout.component.html @@ -0,0 +1,63 @@ + + + +
+ + + + +
diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/account-layout.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/account-layout.component.ts new file mode 100644 index 0000000..3600c61 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/account-layout.component.ts @@ -0,0 +1,40 @@ +import { AfterViewInit, Component, inject } from '@angular/core'; +import { eLayoutType, ReplaceableTemplateDirective, SubscriptionService } from '@abp/ng.core'; +import { LayoutService } from '../../services/layout.service'; +import { NgTemplateOutlet } from '@angular/common'; +import { LogoComponent } from '../logo/logo.component'; +import { RoutesComponent } from '../routes/routes.component'; +import { NavItemsComponent } from '../nav-items/nav-items.component'; +import { AuthWrapperComponent } from './auth-wrapper/auth-wrapper.component'; +import { PageAlertContainerComponent } from '../page-alert-container/page-alert-container.component'; +import { RouterOutlet } from '@angular/router'; +import { collapseWithMargin } from '@abp/ng.theme.shared'; + +@Component({ + selector: 'abp-layout-account', + templateUrl: './account-layout.component.html', + animations: [collapseWithMargin], + providers: [LayoutService, SubscriptionService], + imports: [ + NgTemplateOutlet, + LogoComponent, + RoutesComponent, + NavItemsComponent, + AuthWrapperComponent, + PageAlertContainerComponent, + ReplaceableTemplateDirective, + RouterOutlet, + ], +}) +export class AccountLayoutComponent implements AfterViewInit { + service = inject(LayoutService); + + // required for dynamic component + static type = eLayoutType.account; + + authWrapperKey = 'Account.AuthWrapperComponent'; + + ngAfterViewInit() { + this.service.subscribeWindowSize(); + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.html new file mode 100644 index 0000000..b32078a --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.html @@ -0,0 +1,24 @@ +
+
+ @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) { + + } + + +
+
diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.ts new file mode 100644 index 0000000..e87c55d --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/auth-wrapper/auth-wrapper.component.ts @@ -0,0 +1,15 @@ +import { AuthWrapperService } from '@abp/ng.account.core'; +import { Component, inject } from '@angular/core'; +import { AsyncPipe } from '@angular/common'; +import { LocalizationPipe, ReplaceableTemplateDirective } from '@abp/ng.core'; +import { TenantBoxComponent } from '../tenant-box/tenant-box.component'; + +@Component({ + selector: 'abp-auth-wrapper', + templateUrl: './auth-wrapper.component.html', + providers: [AuthWrapperService], + imports: [AsyncPipe, TenantBoxComponent, ReplaceableTemplateDirective, LocalizationPipe], +}) +export class AuthWrapperComponent { + service = inject(AuthWrapperService); +} \ No newline at end of file diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/tenant-box/tenant-box.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/tenant-box/tenant-box.component.html new file mode 100644 index 0000000..309f4fe --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/tenant-box/tenant-box.component.html @@ -0,0 +1,65 @@ +@if ((service.currentTenant$ | async) || { name: '' }; as currentTenant) { +
+
+
+
+ {{ + 'AbpUiMultiTenancy::Tenant' | abpLocalization + }}
+
+ {{ currentTenant.name || ('AbpUiMultiTenancy::NotSelected' | abpLocalization) }} +
+
+ +
+
+
+ + + +
Switch Tenant
+
+ +
+
+
+ + +
+

{{ 'AbpUiMultiTenancy::SwitchTenantHint' | abpLocalization }}

+
+
+
+ + + + {{ 'AbpTenantManagement::Save' | abpLocalization }} + + +
+} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/tenant-box/tenant-box.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/tenant-box/tenant-box.component.ts new file mode 100644 index 0000000..c9897fe --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/account-layout/tenant-box/tenant-box.component.ts @@ -0,0 +1,23 @@ +import { TenantBoxService } from '@abp/ng.account.core'; +import { Component, inject } from '@angular/core'; +import { AsyncPipe } from '@angular/common'; +import { LocalizationPipe } from '@abp/ng.core'; +import { ButtonComponent, ModalCloseDirective, ModalComponent } from '@abp/ng.theme.shared'; +import { FormsModule } from '@angular/forms'; + +@Component({ + selector: 'abp-tenant-box', + templateUrl: './tenant-box.component.html', + providers: [TenantBoxService], + imports: [ + AsyncPipe, + FormsModule, + ModalComponent, + LocalizationPipe, + ButtonComponent, + ModalCloseDirective, + ], +}) +export class TenantBoxComponent { + service = inject(TenantBoxService); +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.html new file mode 100644 index 0000000..758b4f6 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.html @@ -0,0 +1,693 @@ +
+ +
+ + + + + + + +
+ +
+ + + + + + + +
+ + + + + + + + + + + +
+ + + +
+
+
+ Notifications + {{ unreadCount }} new +
+ +
+
+ +
+ + + +
+ + +
+
+ + + +
+ All caught up! + You have no new notifications. +
+ + + +
+
+
+ + + + + + + + + + + + +
+
+
+
{{ n.title }}
+
{{ n.message }}
+
+ + + + + {{ n.timestamp }} + +
+
+
+ +
+
+
+ + +
+ + + +
+
+
+
+ + + +
+
+ + + + + +
+ +
+
+
+ + + +
+
+
+

Search

+

Search across risks, incidents, and tasks

+
+
+ + + + + +
+
+ +
+ + +
+
+
+
{{ item.title }}
+
+ {{ group.groupKey }} + ID: {{ item.id }} +
+
+ {{ group.groupKey }} +
+
+
+ + +
+ + + +

No results for "{{ searchQuery }}"

+
+
+ +
+ + + +

Start typing to search

+
+
+
+
+
+ + + diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.scss b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.scss new file mode 100644 index 0000000..cb77a46 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.scss @@ -0,0 +1,1195 @@ +// ─── Design tokens (references to global :root vars) ────────────────────────── +// All hardcoded colors replaced with CSS custom properties. +// The only SCSS variables here are structural (dimensions, transitions). + +$sidebar-expanded: 260px; +$sidebar-collapsed: 64px; +$topnav-height: 56px; +$radius-nav: 10px; +$tx: 150ms ease; + +// ─── Shell ──────────────────────────────────────────────────────────────────── +.app-shell { + display: flex; + height: 100vh; + overflow: hidden; + background: var(--clr-bg); + font-family: var(--font-base); + -webkit-font-smoothing: antialiased; +} + +// ─── Mobile overlay ─────────────────────────────────────────────────────────── +.mobile-overlay { + position: fixed; + inset: 0; + z-index: 30; + background: rgba(0, 0, 0, 0.4); + @media (min-width: 1024px) { display: none; } +} + +// ─── Sidebar ────────────────────────────────────────────────────────────────── +.sidebar { + display: flex; + flex-direction: column; + flex-shrink: 0; + height: 100vh; + width: $sidebar-expanded; + min-width: $sidebar-expanded; + background: var(--clr-bg-card); + border-right: 1px solid var(--clr-border); + position: sticky; + top: 0; + z-index: 40; + transition: width 220ms cubic-bezier(0.4, 0, 0.2, 1), min-width 220ms cubic-bezier(0.4, 0, 0.2, 1); + overflow: hidden; + box-shadow: 1px 0 3px 0 rgba(0, 0, 0, 0.02); + + &.collapsed { + width: $sidebar-collapsed; + min-width: $sidebar-collapsed; + } + + @media (max-width: 1023px) { + position: fixed; + inset-y: 0; + left: 0; + transform: translateX(-100%); + transition: transform 220ms cubic-bezier(0.4, 0, 0.2, 1), width $tx; + box-shadow: var(--shadow-xl); + + .app-shell.mobile-open & { transform: translateX(0); } + } + + // ── Head ── + &__head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 0 16px; + height: 60px; + flex-shrink: 0; + border-bottom: 1px solid var(--clr-border); + background: var(--clr-bg-card); + + &--collapsed { + justify-content: center; + padding: 0; + } + } + + &__logo { + cursor: pointer; + flex: 1; + min-width: 0; + overflow: hidden; + display: flex; + align-items: center; + abp-logo, a { display: block; } + img { max-height: 32px; width: auto; object-fit: contain; } + } + + // ── Collapse / Expand toggle ── + &__toggle { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + width: 32px; + height: 32px; + border-radius: 8px; + border: 1px solid var(--clr-border); + background: var(--clr-bg); + color: var(--clr-text-muted); + cursor: pointer; + transition: all 180ms cubic-bezier(0.4, 0, 0.2, 1); + + svg { display: block; flex-shrink: 0; transition: transform 180ms ease; } + + &:hover { + background: var(--clr-primary-lt); + border-color: var(--clr-border-focus); + color: var(--clr-primary); + transform: scale(1.04); + } + + &:active { + transform: scale(0.96); + } + } + + // ── Nav scroll area ── + &__nav { + flex: 1; + overflow-y: auto; + overflow-x: hidden; + padding: 12px 10px; + display: flex; + flex-direction: column; + gap: 3px; + + &::-webkit-scrollbar { width: 4px; } + &::-webkit-scrollbar-thumb { + background: var(--clr-border-strong); + border-radius: 4px; + } + scrollbar-width: thin; + scrollbar-color: var(--clr-border-strong) transparent; + } + + // ── Footer ── + &__footer { + flex-shrink: 0; + padding: 10px 14px; + border-top: 1px solid var(--clr-border); + background: var(--clr-bg-card); + } +} + +// ─── Shared icon-btn ───────────────────────────────────────────────────────── +.icon-btn { + display: flex; + align-items: center; + justify-content: center; + width: 34px; + height: 34px; + border: none; + background: transparent; + border-radius: 8px; + cursor: pointer; + color: var(--clr-text-muted); + flex-shrink: 0; + transition: all 180ms ease; + + &:hover { + background: var(--clr-bg-hover); + color: var(--clr-text); + } + + svg { display: block; flex-shrink: 0; } +} + +// ─── Expanded nav item ──────────────────────────────────────────────────────── +.nav-item { + position: relative; + display: flex; + align-items: center; + gap: 12px; + padding: 9px 12px; + border-radius: 8px; + font-size: 14px; + font-weight: 500; + font-family: var(--font-base); + color: var(--clr-text-muted); + text-decoration: none; + cursor: pointer; + border: none; + background: transparent; + width: 100%; + text-align: left; + transition: all 160ms cubic-bezier(0.4, 0, 0.2, 1); + white-space: nowrap; + overflow: hidden; + flex-shrink: 0; + + &:hover { + background: var(--clr-bg-hover); + color: var(--clr-text); + + .nav-item__icon { + color: var(--clr-text); + } + } + + // ── Active state ── + &--active, + &.nav-item--active { + background: var(--clr-primary-lt); + color: var(--clr-primary); + font-weight: 600; + + .nav-item__indicator { + opacity: 1; + transform: translateY(-50%) scaleY(1); + } + + .nav-item__icon { + color: var(--clr-primary); + + svg { + stroke: var(--clr-primary); + color: var(--clr-primary); + } + i { color: var(--clr-primary); } + } + } + + &--help { color: var(--clr-text-muted); } + + &--group { + font-weight: 500; + justify-content: flex-start; + } + + // ── Left indicator bar ── + &__indicator { + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%) scaleY(0.5); + width: 3.5px; + height: 20px; + background: var(--clr-primary); + border-radius: 0 4px 4px 0; + opacity: 0; + transition: all 180ms cubic-bezier(0.4, 0, 0.2, 1); + flex-shrink: 0; + } + + // ── Icon slot ── + &__icon { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + width: 20px; + height: 20px; + color: var(--clr-text-subtle); + transition: color 160ms ease; + + svg, i { + display: block; + width: 18px; + height: 18px; + flex-shrink: 0; + } + } + + &__label { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + font-size: 14px; + letter-spacing: -0.01em; + } + + &__chevron { + flex-shrink: 0; + color: var(--clr-text-subtle); + transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1); + display: block; + } + + &--expanded .nav-item__chevron { + transform: rotate(180deg); + } +} + +// ─── Nav group ──────────────────────────────────────────────────────────────── +.nav-group { + display: flex; + flex-direction: column; + gap: 2px; + flex-shrink: 0; + + &__children { + display: flex; + flex-direction: column; + gap: 2px; + margin-left: 20px; + padding-left: 12px; + border-left: 1.5px solid var(--clr-border); + margin-top: 2px; + margin-bottom: 4px; + } +} + +// ─── Nav child ──────────────────────────────────────────────────────────────── +.nav-child { + display: flex; + align-items: center; + padding: 7px 10px; + border-radius: 6px; + font-size: 13px; + font-weight: 500; + color: var(--clr-text-muted); + text-decoration: none; + transition: all 160ms ease; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + + &:hover { + background: var(--clr-bg-hover); + color: var(--clr-text); + } + + &--active, + &.nav-child--active { + color: var(--clr-primary); + font-weight: 600; + background: var(--clr-primary-lt); + } +} + +// ─── Platform nav section ───────────────────────────────────────────────────── +.nav-section { + margin-top: 16px; + padding-top: 12px; + border-top: 1px solid var(--clr-border); + flex-shrink: 0; + + &__toggle { + display: flex; + align-items: center; + gap: 8px; + width: 100%; + padding: 6px 10px; + border: none; + background: transparent; + cursor: pointer; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--clr-text-subtle); + font-family: var(--font-base); + transition: color $tx; + + &:hover { color: var(--clr-text-muted); } + span { flex: 1; text-align: left; } + } + + &__chevron { + transition: transform $tx; + &.rotated { transform: rotate(180deg); } + } + + &__items { + display: flex; + flex-direction: column; + gap: 2px; + margin-top: 4px; + margin-left: 16px; + padding-left: 10px; + border-left: 1.5px solid var(--clr-border); + } +} + +// ─── COLLAPSED — Icon-only nav items ───────────────────────────────────────── +.nav-icon-item { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 42px; + height: 42px; + border-radius: 10px; + color: var(--clr-text-muted); + text-decoration: none; + margin: 2px auto; + transition: all 180ms cubic-bezier(0.4, 0, 0.2, 1); + cursor: pointer; + flex-shrink: 0; + + svg, i { + display: block; + width: 20px; + height: 20px; + flex-shrink: 0; + pointer-events: none; + stroke: currentColor; + transition: transform 160ms ease; + } + + &:hover { + background: var(--clr-bg-hover); + color: var(--clr-text); + transform: scale(1.05); + } + + // ── Active ── + &--active { + background: var(--clr-primary-lt); + color: var(--clr-primary); + + svg { + stroke: var(--clr-primary); + color: var(--clr-primary); + } + i { color: var(--clr-primary); } + + .nav-icon-item__indicator { + opacity: 1; + } + } + + &__indicator { + position: absolute; + left: -2px; + top: 50%; + transform: translateY(-50%); + width: 3.5px; + height: 22px; + background: var(--clr-primary); + border-radius: 0 4px 4px 0; + opacity: 0; + transition: opacity $tx; + } +} + +// ─── Main area ──────────────────────────────────────────────────────────────── +.main-area { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + overflow: hidden; +} + +// ─── Top nav ────────────────────────────────────────────────────────────────── +.topnav { + height: $topnav-height; + background: var(--clr-bg-card); + border-bottom: 1px solid var(--clr-border); + box-shadow: var(--shadow-sm); + display: flex; + align-items: center; + gap: 12px; + padding: 0 20px; + flex-shrink: 0; + + &__hamburger { + display: none; + margin-right: 4px; + @media (max-width: 1023px) { display: flex; } + } + + &__search { + display: flex; + align-items: center; + gap: 8px; + height: 36px; + padding: 0 12px; + border-radius: 10px; + border: 1px solid var(--clr-border); + background: var(--clr-bg); + color: var(--clr-text-subtle); + font-size: var(--text-base); + font-family: var(--font-base); + min-width: 220px; + cursor: pointer; + transition: background $tx, border-color $tx, color $tx; + + span { flex: 1; } + + kbd { + font-size: 10px; + padding: 2px 6px; + border-radius: 4px; + border: 1px solid var(--clr-border-strong); + background: var(--clr-bg-card); + color: var(--clr-text-subtle); + font-family: var(--font-mono); + } + + &:hover { + background: var(--clr-bg-hover); + border-color: var(--clr-border-strong); + color: var(--clr-text-muted); + } + } + + &__right { + display: flex; + align-items: center; + gap: 6px; + margin-left: auto; + + abp-nav-items { + display: flex; + align-items: center; + + ::ng-deep .navbar-nav { + flex-direction: row; + gap: 2px; + margin: 0 !important; + + .nav-item { display: flex; align-items: center; } + + .nav-link { + padding: 6px 8px; + font-size: var(--text-base); + color: var(--clr-text-muted); + border-radius: 8px; + + &:hover { + background: var(--clr-bg-hover); + color: var(--clr-text); + } + } + } + } + } + + &__icon-btn { + width: 36px; + height: 36px; + position: relative; + } +} + +// ─── Theme Toggle Button ────────────────────────────────────────────────────── +.theme-toggle-btn { + width: 36px; + height: 36px; + border-radius: 8px; + color: var(--clr-text-muted); + transition: all 180ms cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + align-items: center; + justify-content: center; + + &:hover { + background: var(--clr-bg-hover); + color: var(--clr-text); + transform: scale(1.05); + } + + &:active { + transform: scale(0.95); + } + + .theme-icon { + display: block; + transition: transform 260ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms ease; + + &--sun { + color: #f59e0b; + animation: sun-pop 260ms cubic-bezier(0.34, 1.56, 0.64, 1); + } + + &--moon { + color: #6366f1; + animation: moon-pop 260ms cubic-bezier(0.34, 1.56, 0.64, 1); + } + } +} + +@keyframes sun-pop { + 0% { transform: rotate(-90deg) scale(0.6); opacity: 0; } + 100% { transform: rotate(0deg) scale(1); opacity: 1; } +} + +@keyframes moon-pop { + 0% { transform: rotate(90deg) scale(0.6); opacity: 0; } + 100% { transform: rotate(0deg) scale(1); opacity: 1; } +} + +// ─── Notification dot & Icon Spinner ───────────────────────────────────────── +.notif-dot { + position: absolute; + top: 3px; + right: 3px; + width: 9px; + height: 9px; + border-radius: 50%; + background: #f43f5e; + border: 2px solid var(--clr-bg-card); + box-shadow: 0 0 0 2px rgba(244, 63, 94, 0.2); +} + +.notif-icon-spinner { + position: absolute; + top: 3px; + right: 3px; + width: 10px; + height: 10px; + border: 2px solid rgba(59, 130, 246, 0.15); + border-top-color: #3b82f6; + border-radius: 50%; + animation: notif-spin 0.8s linear infinite; +} + +@keyframes notif-spin { + to { transform: rotate(360deg); } +} + +// ─── Premium Notification Dropdown ──────────────────────────────────────────── +.notif-wrap { position: relative; } + +.notif-dropdown { + position: absolute; + right: -10px; + top: calc(100% + 12px); + width: 400px; + background: var(--clr-bg-card); + border: 1px solid rgba(226, 232, 240, 0.8); + border-radius: 16px; + box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05), 0 8px 10px -6px rgba(0, 0, 0, 0.05); + z-index: 100; + overflow: hidden; + animation: notif-slide-down 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards; + + @keyframes notif-slide-down { + from { + opacity: 0; + transform: translateY(-8px) scale(0.98); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } + } + + &__head { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px 14px; + background: #fff; + border-bottom: 1px solid rgba(241, 245, 249, 0.8); + } + + &__title-wrap { + display: flex; + align-items: center; + gap: 8px; + } + + &__title { + font-size: 16px; + font-weight: 700; + color: #1e293b; + letter-spacing: -0.01em; + } + + .notif-count-badge { + padding: 2px 8px; + font-size: 11px; + font-weight: 600; + color: #3b82f6; + background: rgba(59, 130, 246, 0.08); + border-radius: 9999px; + } + + &__list { + max-height: 400px; + overflow-y: auto; + background: #f8fafc; + padding: 8px 10px; + display: flex; + flex-direction: column; + gap: 6px; + + &::-webkit-scrollbar { + width: 6px; + } + &::-webkit-scrollbar-thumb { + background: rgba(203, 213, 225, 0.8); + border-radius: 3px; + } + } +} + +.notif-item { + display: flex; + align-items: flex-start; + gap: 12px; + padding: 14px 16px; + background: #fff; + border-radius: 12px; + border: 1px solid rgba(241, 245, 249, 0.8); + cursor: pointer; + transition: all 0.2s ease-in-out; + position: relative; + + &:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(15, 23, 42, 0.03); + border-color: rgba(203, 213, 225, 0.5); + } + + &--unread { + background: #f0f7ff; + border-color: rgba(59, 130, 246, 0.15); + + &:hover { + background: #e0f0fe; + border-color: rgba(59, 130, 246, 0.25); + } + } + + &__left { + flex-shrink: 0; + } + + &__icon { + width: 36px; + height: 36px; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + + &[data-type="risk"] { + background: rgba(245, 158, 11, 0.1); + svg { color: #d97706; } + } + &[data-type="task"] { + background: rgba(59, 130, 246, 0.1); + svg { color: #2563eb; } + } + &[data-type="incident"] { + background: rgba(239, 68, 68, 0.1); + svg { color: #dc2626; } + } + &[data-type="indicator"] { + background: rgba(139, 92, 246, 0.1); + svg { color: #7c3aed; } + } + } + + &__body { + flex: 1; + min-width: 0; + } + + &__title { + font-size: 14px; + font-weight: 600; + color: #1e293b; + line-height: 1.3; + overflow-wrap: break-word; + word-break: break-word; + } + + &__msg { + font-size: 12px; + color: #64748b; + margin-top: 4px; + line-height: 1.45; + word-break: break-word; + } + + &__meta { + display: flex; + align-items: center; + margin-top: 6px; + } + + &__time { + font-size: 11px; + font-weight: 500; + color: #94a3b8; + display: flex; + align-items: center; + } + + &__right { + display: flex; + align-items: center; + justify-content: center; + align-self: center; + margin-left: 4px; + } + + &__unread-indicator { + width: 6px; + height: 6px; + border-radius: 50%; + background: #3b82f6; + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.25); + } +} + +// ─── Link button ────────────────────────────────────────────────────────────── +.link-btn { + background: transparent; + border: none; + font-size: var(--text-sm); + color: var(--clr-primary); + cursor: pointer; + padding: 2px 6px; + border-radius: var(--radius-sm); + font-family: var(--font-base); + transition: background $tx; + + &:hover { + background: var(--clr-primary-lt); + color: var(--clr-primary-dk); + } +} + +// ─── Create button ──────────────────────────────────────────────────────────── +.btn-create { + display: flex; + align-items: center; + gap: 6px; + height: 34px; + padding: 0 14px; + border-radius: var(--radius-md); + border: none; + background: var(--clr-primary); + color: #fff; + font-size: var(--text-base); + font-weight: 500; + font-family: var(--font-base); + cursor: pointer; + white-space: nowrap; + transition: background $tx; + box-shadow: var(--shadow-sm); + + svg { display: block; flex-shrink: 0; } + &:hover { background: var(--clr-primary-dk); } +} + +// ─── Content area ───────────────────────────────────────────────────────────── +.content { + flex: 1; + overflow-y: auto; + // No padding here — each page component owns its own padding +} + +// ─── ABP page-alert-container ───────────────────────────────────────────────── +abp-page-alert-container { + display: block; + + ::ng-deep .alert { + border-radius: var(--radius-md); + font-size: var(--text-base); + margin: 12px 24px 0; + } +} + +// ─── Search dialog ──────────────────────────────────────────────────────────── +.dialog-overlay { + position: fixed; + inset: 0; + z-index: 100; + background: rgba(0, 0, 0, 0.4); + display: flex; + align-items: flex-start; + justify-content: center; + padding-top: 14vh; +} + +.search-dialog { + width: 100%; + max-width: 640px; + margin: 0 16px; + background: var(--clr-bg-card); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xl); + max-height: 75vh; + display: flex; + flex-direction: column; + overflow: hidden; + + &__head { + padding: 20px 24px 10px; + flex-shrink: 0; + + h3 { font-size: var(--text-lg); font-weight: 600; color: var(--clr-text); margin: 0; } + p { font-size: var(--text-base); color: var(--clr-text-muted); margin: 2px 0 0; } + } + + &__input-wrap { + display: flex; + align-items: center; + gap: 10px; + padding: 4px 16px 14px; + flex-shrink: 0; + + svg { flex-shrink: 0; color: var(--clr-text-subtle); } + + input { + flex: 1; + height: 44px; + border: 1px solid var(--clr-border); + border-radius: var(--radius-md); + background: var(--clr-bg); + padding: 0 12px; + font-size: var(--text-md); + font-family: var(--font-base); + color: var(--clr-text); + outline: none; + transition: border-color $tx, box-shadow $tx; + + &:focus { + border-color: var(--clr-primary); + box-shadow: 0 0 0 3px var(--clr-primary-ring); + } + &::placeholder { color: var(--clr-text-subtle); } + } + + button { + display: flex; + align-items: center; + justify-content: center; + width: 30px; + height: 30px; + border: none; + background: transparent; + border-radius: var(--radius-sm); + cursor: pointer; + color: var(--clr-text-subtle); + &:hover { background: var(--clr-bg-hover); } + } + } + + &__results { + flex: 1; + overflow-y: auto; + padding: 0 16px 20px; + display: flex; + flex-direction: column; + gap: 16px; + } +} + +.search-section { + display: flex; + flex-direction: column; + gap: 6px; + + &__label { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 14px; + border-radius: var(--radius-md); + background: linear-gradient(135deg, var(--clr-bg) 0%, var(--clr-bg-hover) 100%); + border: 1.5px solid var(--clr-border); + border-left: 4px solid var(--clr-primary); + font-size: var(--text-sm); + font-weight: 800; + letter-spacing: 0.04em; + text-transform: uppercase; + color: var(--clr-text); + user-select: none; + transition: background $tx, border-color $tx, box-shadow $tx, transform $tx; + box-shadow: 0 1px 4px rgba(0,0,0,0.06); + + // Per-type accent border colors + &[data-group-key="Risk"] { border-left-color: #f97316; } + &[data-group-key="Incident"] { border-left-color: #ef4444; } + &[data-group-key="Task"] { border-left-color: #3b82f6; } + &[data-group-key="Assignment"] { border-left-color: #8b5cf6; } + + &--clickable { + cursor: pointer; + &:hover { + background: linear-gradient(135deg, var(--clr-bg-hover) 0%, var(--clr-primary-lt) 100%); + border-color: var(--clr-border-focus); + box-shadow: 0 2px 8px rgba(0,0,0,0.1); + transform: translateY(-1px); + } + &:active { + transform: translateY(0); + box-shadow: 0 1px 3px rgba(0,0,0,0.06); + } + } + + .search-section__head-left { + display: flex; + align-items: center; + gap: 10px; + } + + .search-section__title { + font-size: 11px; + font-weight: 800; + letter-spacing: 0.07em; + text-transform: uppercase; + color: var(--clr-text); + } + + .search-section__count { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 20px; + height: 20px; + padding: 0 7px; + border-radius: var(--radius-full); + background: var(--clr-primary); + color: #fff; + font-size: 11px; + font-weight: 700; + letter-spacing: 0; + text-transform: none; + box-shadow: 0 1px 4px rgba(0,0,0,0.15); + } + } + + &__chevron { + color: var(--clr-text-muted); + transition: transform $tx; + flex-shrink: 0; + opacity: 0.7; + + &--collapsed { + transform: rotate(-90deg); + } + } +} + +.search-group-items { + display: flex; + flex-direction: column; + gap: 6px; + padding-left: 10px; + margin-top: 2px; +} + +.search-result { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 10px 14px; + background: var(--clr-bg-card); + border: 1px solid var(--clr-border); + border-left-width: 4px; + border-radius: var(--radius-md); + cursor: pointer; + transition: all $tx; + + &[data-group="Risk"] { + border-left-color: #f97316; + &:hover { background: rgba(249, 115, 22, 0.05); border-color: rgba(249, 115, 22, 0.3); } + } + &[data-group="Incident"] { + border-left-color: #ef4444; + &:hover { background: rgba(239, 68, 68, 0.05); border-color: rgba(239, 68, 68, 0.3); } + } + &[data-group="Task"] { + border-left-color: #3b82f6; + &:hover { background: rgba(59, 130, 246, 0.05); border-color: rgba(59, 130, 246, 0.3); } + } + &[data-group="Assignment"] { + border-left-color: #8b5cf6; + &:hover { background: rgba(139, 92, 246, 0.05); border-color: rgba(139, 92, 246, 0.3); } + } + + &:hover { + box-shadow: var(--shadow-sm); + transform: translateX(3px); + } + + &__info { + display: flex; + flex-direction: column; + gap: 2px; + } + + &__name { font-size: var(--text-base); font-weight: 500; color: var(--clr-text); } + &__sub { + font-size: var(--text-xs); + color: var(--clr-text-subtle); + display: flex; + align-items: center; + gap: 6px; + margin-top: 2px; + } + + &__parent-tag { + font-size: 10px; + font-weight: 600; + padding: 1px 6px; + border-radius: 4px; + background: var(--clr-bg-hover); + color: var(--clr-text-muted); + + &[data-type="Risk"] { background: rgba(249, 115, 22, 0.12); color: #c2410c; } + &[data-type="Incident"] { background: rgba(239, 68, 68, 0.12); color: #b91c1c; } + &[data-type="Task"] { background: rgba(59, 130, 246, 0.12); color: #1d4ed8; } + &[data-type="Assignment"] { background: rgba(139, 92, 246, 0.12); color: #6d28d9; } + } + + &__badge { + font-size: var(--text-xs); + font-weight: 600; + padding: 2px 8px; + border-radius: var(--radius-full); + border: 1px solid var(--clr-border); + background: var(--clr-bg-card); + color: var(--clr-text-muted); + flex-shrink: 0; + margin-left: 8px; + + &[data-type="Risk"] { background: rgba(249, 115, 22, 0.08); color: #f97316; border-color: rgba(249, 115, 22, 0.2); } + &[data-type="Incident"] { background: rgba(239, 68, 68, 0.08); color: #ef4444; border-color: rgba(239, 68, 68, 0.2); } + &[data-type="Task"] { background: rgba(59, 130, 246, 0.08); color: #3b82f6; border-color: rgba(59, 130, 246, 0.2); } + &[data-type="Assignment"] { background: rgba(139, 92, 246, 0.08); color: #8b5cf6; border-color: rgba(139, 92, 246, 0.2); } + } +} + +.search-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 16px; + gap: 8px; + text-align: center; + + svg { color: var(--clr-border-strong); display: block; } + p { font-size: var(--text-base); color: var(--clr-text-muted); margin: 0; } +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +.notif-spinner { + display: flex; + align-items: center; + justify-content: center; + padding: 30px 0; + color: #3b82f6; + + .animate-spin { + animation: notif-spin 0.8s linear infinite; + } +} + +.notif-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 20px; + text-align: center; + background: #fff; + border-radius: 12px; + border: 1px dashed rgba(226, 232, 240, 0.8); + margin: 4px; + + &__icon-wrap { + width: 56px; + height: 56px; + border-radius: 50%; + background: #f1f5f9; + color: #94a3b8; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 12px; + } + + &__title { + font-size: 14px; + font-weight: 600; + color: #334155; + } + + &__subtitle { + font-size: 12px; + color: #64748b; + margin-top: 4px; + } +} + diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.ts new file mode 100644 index 0000000..bb5f51a --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/application-layout.component.ts @@ -0,0 +1,639 @@ +import { ABP, ConfigStateService, eLayoutType, EnvironmentService, LocalizationPipe, PermissionDirective, ReplaceableTemplateDirective, RoutesService, SubscriptionService, TreeNode } from '@abp/ng.core'; +import { collapseWithMargin, slideFromBottom } from '@abp/ng.theme.shared'; +import { AsyncPipe, CommonModule } from '@angular/common'; +import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostListener, inject, NgZone, OnDestroy, OnInit, TrackByFunction, ViewChild } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { Router, RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router'; +import { HubConnection, HubConnectionBuilder } from '@microsoft/signalr'; +import { OAuthService } from 'angular-oauth2-oidc'; +import { Observable, Subject, Subscription } from 'rxjs'; +import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; +import { GlobalSearchService } from '../../../../../../src/app/proxy/erm-global-search/global-search.service'; +import { GlobalSearchResultDto, SearchItemDto } from '../../../../../../src/app/proxy/erm-global-search-contract/dto/models'; +import { environment } from '../../../../../../src/environments/environment'; +import { NotificationDto } from '../../../../../../src/app/proxy/notifications/dto/models'; +import { NotificationService } from '../../../../../../src/app/proxy/notifications/notification.service'; +import { LayoutService } from '../../services/layout.service'; +import { ThemeService } from '../../services/theme.service'; +import { LogoComponent } from '../logo/logo.component'; +import { PageAlertContainerComponent } from '../page-alert-container/page-alert-container.component'; +import { CreateOverlayComponent } from "./create-overlay.component"; +import { CreateOverlayService } from './create-overlay.service'; +import { UserMenuComponent } from "./user-menu.component"; +import { PermissionService } from '@abp/ng.core'; + +/* ── Types (mirrors existing interfaces) ─────────────────────────── */ +export interface AppNotification { + id: string; + type: 'risk' | 'task' | 'incident' | 'indicator' | string; + title: string; + message: string; + timestamp: string; + unread: boolean; + link: string; +} + +export interface SearchResults { + risks: { id: string; name: string; category: string; residualRisk: number }[]; + incidents: { id: string; title: string; priority?: string }[]; + tasks: { id: string; name: string; status: string; dueDate: string }[]; +} + +/* ── Route icon map ──────────────────────────────────────────────── */ +const ROUTE_ICONS: Record = { + // ABP route names → SVG strings (stroke icons, 18×18) + Dashboard: ``, + Incidents: ``, + Risks: ``, + Assessments: ``, + Tasks: ``, + Indicators:``, + Reporting: ``, + Admin: ``, + DEFAULT: ``, +}; +@Component({ + selector: 'abp-layout-application', + templateUrl: './application-layout.component.html', + styleUrl: './application-layout.component.scss', + animations: [slideFromBottom, collapseWithMargin], + providers: [LayoutService, SubscriptionService,PermissionDirective], + imports: [ + CommonModule, + AsyncPipe, + FormsModule, + RouterLink, + RouterLinkActive, + RouterOutlet, + LocalizationPipe, + PermissionDirective, + ReplaceableTemplateDirective, + LogoComponent, + PageAlertContainerComponent, + UserMenuComponent, + CreateOverlayComponent, + ], +}) + +export class ApplicationLayoutComponent implements OnInit, AfterViewInit, OnDestroy { + static type = eLayoutType.application; + readonly service = inject(LayoutService); + readonly themeService = inject(ThemeService); + private readonly router = inject(Router); + private readonly config = inject(ConfigStateService); + private readonly routesService = inject(RoutesService); + private readonly createOverlay = inject(CreateOverlayService); + private readonly environment = inject(EnvironmentService); + private readonly notificationSvc = inject(NotificationService); + private readonly ngZone = inject(NgZone); + private readonly oauthService = inject(OAuthService); + private readonly cdr = inject(ChangeDetectorRef); + private readonly globalSearchService = inject(GlobalSearchService); + private readonly permissionService = inject(PermissionService); + private isDestroyed = false; + + private readonly SIDEBAR_KEY = 'delight_sidebar_collapsed'; + + get isDarkMode(): boolean { + return this.themeService.isDarkMode; + } + + toggleTheme(): void { + this.themeService.toggleTheme(); + } + + /* ── Sidebar ──────────────────────────────────────────────────── */ + private _sidebarCollapsed = false; + isMobile = false; + mobileOpen = false; + platformGroupExpanded = false; + expandedGroups: Record = {}; + + constructor() { + const stored = localStorage.getItem(this.SIDEBAR_KEY); + this.routesService.remove(['AbpUiNavigation::Menu:Administration']); + if (stored !== null) this._sidebarCollapsed = stored === 'true'; + + } + + set sidebarCollapsed(v: boolean) { + this._sidebarCollapsed = v; + localStorage.setItem(this.SIDEBAR_KEY, String(v)); + } + get sidebarCollapsed(): boolean { return this._sidebarCollapsed; } + + /* ── ABP Routes observable ────────────────────────────────────── */ + visibleRoutes$: Observable[]> = this.routesService.visible$; + + trackByFn: TrackByFunction> = (_, item) => item.name; + + getRouteIcon(route: TreeNode): string { + if (route.iconClass) { + return ``; + } + + const routeName = String(route.name ?? ''); + const normalizedName = routeName.startsWith('::Menu:') + ? routeName.replace('::Menu:', '') + : routeName; + + return ROUTE_ICONS[normalizedName] ?? ROUTE_ICONS['DEFAULT']; + } + + toggleGroup(name: string): void { + if (this.expandedGroups[name] === undefined) { + this.expandedGroups[name] = false; + } else { + this.expandedGroups[name] = !this.expandedGroups[name]; + } + } + + isGroupExpanded(route: any): boolean { + if (this.expandedGroups[route.name] !== undefined) { + return this.expandedGroups[route.name]; + } + return this.isGroupRouteActive(route); + } + + /* ── Route helpers ────────────────────────────────────────────── */ + getDashboardRoute(): string { + const user = this.config.getOne('currentUser') as any; + const roles: string[] = user?.roles ?? []; + if (roles.includes('Super Admin')) return '/platform-dashboard'; + if (roles.includes('Tenant Admin')) return '/tenant-dashboard'; + if (roles.includes('Department')) return '/department-dashboard'; + return '/'; + } + + navigateToDashboard(): void { + this.router.navigateByUrl(this.getDashboardRoute()); + } + + get isAdminRoute(): boolean { + const url = this.router.url; + return url.startsWith('/admin') || url.startsWith('/config') || url.startsWith('/configuration'); + } + + isRouteActive(routePath?: string): boolean { + const url = this.router.url; + const cleanUrl = url.split('?')[0].replace(/^\/|\/$/g, ''); + const cleanRoutePath = (routePath || '').replace(/^\/|\/$/g, ''); + + if (cleanUrl === cleanRoutePath) { + return true; + } + + if (cleanRoutePath === 'risk-register') { + return ( + cleanUrl.startsWith('risk-details') || + cleanUrl.startsWith('new-risk-details') + ); + } + + if (cleanRoutePath === 'risk-assessment') { + return ( + cleanUrl === 'risk-assessment' || + cleanUrl.startsWith('risk-assessment/') || + cleanUrl.startsWith('risk-assessment-details') + ); + } + + if (cleanRoutePath === 'incident-management') { + return cleanUrl.startsWith('incident-details'); + } + + if (cleanRoutePath === 'task-management') { + return cleanUrl.startsWith('tasks/'); + } + + if (cleanRoutePath === 'admin') { + return ( + cleanUrl === 'admin' || + cleanUrl.startsWith('admin/') || + cleanUrl.startsWith('user-roles') || + cleanUrl.startsWith('approval-groups') || + cleanUrl.startsWith('user-profile-details') || + cleanUrl.startsWith('departments') || + cleanUrl.startsWith('location') || + cleanUrl.startsWith('email-template') || + cleanUrl.startsWith('assets-types') || + cleanUrl.startsWith('incident-priority') || + cleanUrl.startsWith('config/') || + cleanUrl.startsWith('risk-matrix') || + cleanUrl.startsWith('threshold') + ); + } + + if (cleanRoutePath && cleanUrl.startsWith(cleanRoutePath + '/')) { + return true; + } + + return false; + } + + isGroupRouteActive(route: any): boolean { + if (!route.children) return false; + return route.children.some((child: any) => this.isRouteActive(child.path)); + } + + get showPlatformMenu(): boolean { + const user = this.config.getOne('currentUser') as any; + const roles: string[] = user?.roles ?? []; + return roles.includes('Super Admin'); + } + + /* ── Mobile ───────────────────────────────────────────────────── */ + @HostListener('window:resize') + onResize(): void { this.checkMobile(); } + + private checkMobile(): void { + this.isMobile = window.innerWidth < 1024; + if (!this.isMobile) this.mobileOpen = false; + } + + /* ── Keyboard shortcuts ───────────────────────────────────────── */ + @HostListener('document:keydown', ['$event']) + onKeydown(event: KeyboardEvent): void { + const target = event.target as HTMLElement; + const isInput = ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName); + if (event.key === '/' && !isInput && !this.showSearchDialog) { + if (this.permissionService.getGrantedPolicy('DelightErm.NavbarGroupPermission.Navbar.GlobalSearch')) { + event.preventDefault(); + this.showSearchDialog = true; + } + } + if (event.key === 'Escape') { + this.showSearchDialog = false; + this.showNotifications = false; + } + } + + /* ── Notifications ────────────────────────────────────────────── */ + @ViewChild('notificationRef') notificationRef!: ElementRef; + showNotifications = false; + + private hubConnection!: HubConnection; + notifications: AppNotification[] = []; + isLoading = false; + isLoadingMore = false; + hasMore = true; + + get unreadCount(): number { return this.notifications.filter(n => n.unread).length; } + toggleNotifications(): void { this.showNotifications = !this.showNotifications; } + + loadNotifications(isInitial: boolean = false): void { + if (isInitial) { + this.isLoading = true; + this.notifications = []; + this.hasMore = true; + } else { + if (this.isLoading || this.isLoadingMore || !this.hasMore) return; + this.isLoadingMore = true; + } + + const skipCount = isInitial ? 0 : this.notifications.length; + this.notificationSvc.getList(skipCount, 10).subscribe({ + next: (dtos: NotificationDto[]) => { + const mapped = (dtos || []).map(d => this.mapNotification(d)); + if (isInitial) { + this.notifications = mapped; + this.isLoading = false; + } else { + this.notifications = [...this.notifications, ...mapped]; + this.isLoadingMore = false; + } + if ((dtos || []).length < 10) { + this.hasMore = false; + this.cdr.markForCheck(); + } + }, + error: (err) => { + console.error('Error loading notifications:', err); + this.isLoading = false; + this.isLoadingMore = false; + this.cdr.markForCheck(); + } + }); + } + + private mapNotification(dto: NotificationDto): AppNotification { + const type = this.getNotificationType(dto.actionTitle || dto.action || ''); + return { + id: dto.id || '', + type, + title: dto.actionTitle || 'Notification', + message: dto.action || '', + timestamp: (dto as any).creationTime ? this.formatTimeAgo((dto as any).creationTime) : 'Recent', + unread: !dto.isRead, + link: this.getNotificationLink(type) + }; + } + + private getNotificationType(text: string): string { + const lower = text.toLowerCase(); + if (lower.includes('risk')) return 'risk'; + if (lower.includes('task')) return 'task'; + if (lower.includes('incident')) return 'incident'; + if (lower.includes('indicator') || lower.includes('kri')) return 'indicator'; + return 'task'; // fallback type + } + + private getNotificationLink(type: string): string { + if (type === 'risk') return '/risks'; + if (type === 'task') return '/tasks'; + if (type === 'incident') return '/incidents'; + return '/'; + } + + private formatTimeAgo(dateInput: any): string { + if (!dateInput) return 'Recent'; + try { + const date = new Date(dateInput); + const now = new Date(); + const seconds = Math.floor((now.getTime() - date.getTime()) / 1000); + if (seconds < 60) return 'Just now'; + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes}m ago`; + const hours = Math.floor(minutes / 60); + if (hours < 24) return `${hours}h ago`; + const days = Math.floor(hours / 24); + if (days === 1) return 'Yesterday'; + return `${days} days ago`; + } catch { + return 'Recent'; + } + } + + initSignalR(): void { + const tenantId = (this.config.getOne('currentTenant')?.id || '00000000-0000-0000-0000-000000000000').toLowerCase(); + const rawUrl = environment.apis?.default?.url || ''; + const apiBaseUrl = rawUrl.replace('{0}.', ''); + const hubUrl = `${apiBaseUrl.replace(/\/$/, '')}/erm-notification-hub/${tenantId}`; + + console.log('🚀 initSignalR called'); + console.log('🔑 TenantId:', tenantId); + console.log('🌐 Hub URL:', hubUrl); + console.log('🎫 Token:', this.oauthService.getAccessToken() ? 'Present ✅' : 'Missing ❌'); + + this.hubConnection = new HubConnectionBuilder() + .withUrl(hubUrl, { + accessTokenFactory: () => { + const token = this.oauthService.getAccessToken() || ''; + console.log('🎫 accessTokenFactory called, token length:', token.length); + return token; + } + }) + .withAutomaticReconnect() + .build(); + + console.log('🔧 HubConnection built, registering handlers...'); + + this.hubConnection.on('NotificationEvent', (data: any) => { + console.log('🔔 ===== NotificationEvent FIRED ====='); + console.log('🔔 Raw data:', data); + console.log('🔔 JSON:', JSON.stringify(data, null, 2)); + + if (data) { + console.log('✅ Data exists, entering ngZone.run...'); + this.ngZone.run(() => { + console.log('✅ Inside ngZone.run'); + const mapped = this.mapNotification(data); + console.log('✅ Mapped notification:', mapped); + this.notifications = [mapped, ...this.notifications]; + console.log('✅ notifications length now:', this.notifications.length); + this.cdr.markForCheck(); + console.log('✅ markForCheck called'); + }); + } else { + console.warn('⚠️ data is null or undefined'); + } + }); + + console.log('🔧 NotificationEvent handler registered'); + + this.hubConnection.onreconnecting((error) => { + console.warn('🔄 SignalR reconnecting:', error); + }); + + this.hubConnection.onreconnected((connectionId) => { + console.log('🔄 SignalR reconnected. ID:', connectionId); + }); + + this.hubConnection.onclose((error) => { + console.error('❌ SignalR connection closed:', error); + if (!this.isDestroyed) { + console.log('🔄 Attempting restart...'); + this.startHubConnection(); + } + }); + + console.log('🔧 All handlers registered, starting connection...'); + this.startHubConnection(); + } + + private startHubConnection(): void { + if (this.isDestroyed) return; + + console.log('🚀 startHubConnection called, current state:', this.hubConnection.state); + + this.hubConnection.start() + .then(() => { + console.log('✅ SignalR connected successfully'); + console.log('✅ Connection ID:', this.hubConnection.connectionId); + console.log('✅ Connection state:', this.hubConnection.state); + }) + .catch(err => { + console.error('❌ SignalR connection failed:', err); + console.error('❌ Error details:', JSON.stringify(err)); + if (!this.isDestroyed) { + console.log('🔄 Retrying in 5 seconds...'); + setTimeout(() => this.startHubConnection(), 5000); + } + }); + } + + onDropdownScroll(event: Event): void { + const element = event.target as HTMLElement; + if (element.scrollHeight - element.scrollTop <= element.clientHeight + 15) { + this.loadNotifications(false); + } + } + + markAllAsRead(): void { + this.notificationSvc.markAsReadAllNotifications().subscribe({ + next: () => { + this.notifications = this.notifications.map(n => ({ ...n, unread: false })); + this.cdr.markForCheck(); + }, + error: (err) => { + console.error('Error marking notifications as read:', err); + this.notifications = this.notifications.map(n => ({ ...n, unread: false })); + } + }); + } + + onNotificationClick(n: AppNotification): void { + n.unread = false; + this.showNotifications = false; + } + + @HostListener('document:mousedown', ['$event']) + onDocumentClick(event: MouseEvent): void { + if (this.showNotifications && this.notificationRef?.nativeElement && + !this.notificationRef.nativeElement.contains(event.target as Node)) { + this.showNotifications = false; + } + } + + /* ── Search ───────────────────────────────────────────────────── */ + private _showSearchDialog = false; + get showSearchDialog(): boolean { return this._showSearchDialog; } + set showSearchDialog(val: boolean) { + this._showSearchDialog = val; + if (val) { + setTimeout(() => { + this.searchInputRef?.nativeElement?.focus(); + }); + } + } + searchQuery = ''; + searchResults: GlobalSearchResultDto | null = null; + private readonly searchSubject = new Subject(); + private searchSub?: Subscription; + + @ViewChild('searchInputRef') searchInputRef!: ElementRef; + + onSearchChange(q: string): void { + this.searchSubject.next(q); + } + + onSearchResultClick(item: SearchItemDto): void { + let path = item.routeHint || ''; + if (!path) return; + + if (!path.startsWith('/')) { + path = '/' + path; + } + + if (item.id && !path.includes(item.id)) { + const qIndex = path.indexOf('?'); + if (qIndex !== -1) { + const basePath = path.substring(0, qIndex); + const queryStr = path.substring(qIndex); + const cleanBase = basePath.endsWith('/') ? basePath : basePath + '/'; + path = cleanBase + item.id + queryStr; + } else { + if (!path.endsWith('/')) { + path += '/'; + } + path += item.id; + } + } + + // Split into base route and query parameters + let urlPath = path; + let queryParams: Record = {}; + + const firstQ = path.indexOf('?'); + if (firstQ !== -1) { + urlPath = path.substring(0, firstQ); + const rawQuery = path.substring(firstQ + 1).replace(/\?/g, '&'); + const pairs = rawQuery.split('&'); + pairs.forEach(p => { + const [k, v] = p.split('='); + if (k && k.trim()) { + queryParams[k.trim()] = decodeURIComponent(v || ''); + } + }); + } + + this.ngZone.run(() => { + if (Object.keys(queryParams).length > 0) { + this.router.navigate([urlPath], { + queryParams, + queryParamsHandling: 'merge', + }); + } else { + this.router.navigateByUrl(urlPath); + } + }); + + this.showSearchDialog = false; + this.searchQuery = ''; + this.searchResults = null; + } + + closeSearchOnBackdrop(event: MouseEvent): void { + if ((event.target as HTMLElement) === event.currentTarget) { + this.showSearchDialog = false; + this.searchQuery = ''; + this.searchResults = null; + } + } + + collapsedSearchGroups: Record = {}; + + toggleSearchGroup(groupKey: string): void { + if (!groupKey) return; + this.collapsedSearchGroups[groupKey] = !this.collapsedSearchGroups[groupKey]; + this.cdr.markForCheck(); + } + + isSearchGroupCollapsed(groupKey: string): boolean { + if (!groupKey) return false; + return !!this.collapsedSearchGroups[groupKey]; + } + + hasSearchResults(): boolean { + if (!this.searchResults || !this.searchResults.groups) return false; + return this.searchResults.groups.some(g => g.items && g.items.length > 0); + } + + /* ── Create ───────────────────────────────────────────────────── */ + onCreateClick(): void { this.createOverlay.open(); } + + /* ── Lifecycle ────────────────────────────────────────────────── */ + ngOnInit(): void { + this.checkMobile(); + this.loadNotifications(true); + this.initSignalR(); + + this.searchSub = this.searchSubject + .pipe( + debounceTime(300), + distinctUntilChanged() + ) + .subscribe(q => { + const keyword = (q || '').trim(); + if (!keyword) { + this.searchResults = null; + this.cdr.markForCheck(); + return; + } + + this.globalSearchService.search({ keyword, maxResultsPerGroup: 5 }).subscribe({ + next: (res: GlobalSearchResultDto) => { + this.searchResults = res; + this.cdr.markForCheck(); + }, + error: (err) => { + console.error('Global search error:', err); + this.searchResults = null; + this.cdr.markForCheck(); + } + }); + }); + } + ngAfterViewInit(): void { this.service.subscribeWindowSize(); } + ngOnDestroy(): void { + this.isDestroyed = true; + if (this.searchSub) { + this.searchSub.unsubscribe(); + } + if (this.hubConnection) { + this.hubConnection.stop() + .then(() => console.log('SignalR connection stopped.')) + .catch(err => console.error('Error stopping SignalR connection:', err)); + } + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.component.html new file mode 100644 index 0000000..f1bba3a --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.component.html @@ -0,0 +1,235 @@ + + + + +
+ + +
+ + +
+
+

+ What would you like to create? +

+

+ Select an entity type to get started +

+
+ +
+ + +
+ + +
+ + + + + + + + + + +
+ + +
+ + Assessments are embedded in the risk governance lifecycle. + +
+ +
+ +
+
+
\ No newline at end of file diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.component.ts new file mode 100644 index 0000000..0c3cae5 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.component.ts @@ -0,0 +1,341 @@ +import { + Component, + OnInit, + OnDestroy, + HostListener, + inject, + computed, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { Router } from '@angular/router'; +import { CreateOverlayService, CreateEntityType } from './create-overlay.service'; + +// ── Form interfaces ─────────────────────────────────────────────────────────── + +interface IncidentForm { + title: string; + category: string; + priority: string; + status: string; + dateOccurred: string; + description: string; + impact: string; + urgency: string; + financialLoss: number | null; + affectedSystems: string; + immediateActions: string; +} + +interface TaskForm { + name: string; + linkedEntityType: string; + linkedEntityId: string; + owner: string; + dueDate: string; + priority: string; + description: string; +} + +interface AssessmentForm { + name: string; + type: string; + dueDate: string; + assignedTo: string; + priority: string; + scope: string; +} + +interface RiskForm { + name: string; + category: string; + primaryOwner: string; + description: string; + likelihood: string; + impact: string; +} + +// ── Risk step names (matches React RISK_STEPS array) ───────────────────────── +const RISK_STEPS = [ + 'Risk Identification', + 'Root Cause & Consequence', + 'Inherent Risk Assessment', + 'Risk Analysis & Voting', + 'Control Identification', + 'Residual Risk Calculation', + 'Target Risk Definition', + 'Mitigation Planning', + 'KRI Linking', + 'Reassessment', + 'Monitoring Phase', + 'Risk Closure', +]; + +@Component({ + selector: 'app-create-overlay', + templateUrl: './create-overlay.component.html', + standalone: true, + imports: [CommonModule, FormsModule], +}) +export class CreateOverlayComponent implements OnInit, OnDestroy { + + private readonly overlayService = inject(CreateOverlayService); + private readonly router = inject(Router); + + // ── Expose constants to template ───────────────────────────────── + readonly RISK_STEPS = RISK_STEPS; + readonly RISK_TOTAL_STEPS = RISK_STEPS.length; + + // ── Overlay state (reads from service signals) ──────────────────── + get isOpen(): boolean { return this.overlayService.isOpen(); } + get preselected(): CreateEntityType { return this.overlayService.preselected(); } + + // ── Navigation state ────────────────────────────────────────────── + /** step 1 = type selector, step 2+ = form */ + step = 1; + /** Which entity type is selected */ + selectedType: CreateEntityType = null; + /** Sub-step within multi-step forms (Incident: 1-3, Risk: 1-12) */ + formStep = 1; + /** Submission spinner */ + isSubmitting = false; + + // ── Form models ─────────────────────────────────────────────────── + incidentForm: IncidentForm = this.freshIncident(); + taskForm: TaskForm = this.freshTask(); + assessmentForm: AssessmentForm = this.freshAssessment(); + riskForm: RiskForm = this.freshRisk(); + + // ── Lifecycle ───────────────────────────────────────────────────────────── + ngOnInit(): void { + // When the service opens with a pre-selected type, skip step 1 + // We use a poll/effect pattern since Angular signals don't auto-subscribe + // in class fields — wire this manually if you use signal-based change detection + } + + ngOnDestroy(): void { + // Always restore scroll on destroy to avoid a stuck lock + this.unlockBodyScroll(); + } + + private lockBodyScroll(): void { + // Lock every possible scroll host in this app's layout + document.body.style.overflow = 'hidden'; + document.documentElement.style.overflow = 'hidden'; + const content = document.querySelector('.content'); + const mainArea = document.querySelector('.main-area'); + const appShell = document.querySelector('.app-shell'); + if (content) { content.dataset['prevOverflow'] = content.style.overflow; content.style.overflow = 'hidden'; } + if (mainArea) { mainArea.dataset['prevOverflow'] = mainArea.style.overflow; mainArea.style.overflow = 'hidden'; } + if (appShell) { appShell.dataset['prevOverflow'] = appShell.style.overflow; appShell.style.overflow = 'hidden'; } + } + + private unlockBodyScroll(): void { + document.body.style.overflow = ''; + document.documentElement.style.overflow = ''; + const content = document.querySelector('.content'); + const mainArea = document.querySelector('.main-area'); + const appShell = document.querySelector('.app-shell'); + if (content) content.style.overflow = content.dataset['prevOverflow'] ?? ''; + if (mainArea) mainArea.style.overflow = mainArea.dataset['prevOverflow'] ?? ''; + if (appShell) appShell.style.overflow = appShell.dataset['prevOverflow'] ?? ''; + } + + // ── Watch service state ─────────────────────────────────────────── + /** + * Called by the parent layout whenever the overlay opens. + * The parent template renders and the service + * signals drive isOpen automatically. + * If a preselectedType is set, jump straight to step 2. + */ + private _wasOpen = false; + + ngDoCheck(): void { + const open = this.isOpen; + + // Lock / unlock body scroll whenever open state toggles + if (open && !this._wasOpen) { + this.lockBodyScroll(); + } else if (!open && this._wasOpen) { + this.unlockBodyScroll(); + } + this._wasOpen = open; + + if (open && this.preselected && this.step === 1) { + this.selectedType = this.preselected; + this.step = 2; + this.formStep = 1; + } + } + + // ── Type selection ──────────────────────────────────────────────── + selectType(type: CreateEntityType): void { + this.selectedType = type; + } + + navigateToCreate(type: 'Risk' | 'Incident' | 'Task'): void { + this.close(); + if (type === 'Risk') { + this.router.navigate(['/risk-register'], { queryParams: { create: 'true' } }); + } else if (type === 'Incident') { + this.router.navigate(['/incident-management'], { queryParams: { create: 'true' } }); + } else if (type === 'Task') { + this.router.navigate(['/task-management'], { queryParams: { create: 'true' } }); + } + } + + proceedFromTypeSelection(): void { + if (!this.selectedType) return; + this.step = 2; + this.formStep = 1; + } + + // ── Navigation ──────────────────────────────────────────────────── + goBack(): void { + if (this.formStep > 1) { + this.formStep--; + } else { + // Back to type selector + this.step = 1; + this.selectedType = null; + this.formStep = 1; + } + } + + // Fix: use this.formStep + // private get formStep(): number { return this._formStep; } + // private set formStep(v: number) { this._formStep = v; } + _formStep = 1; + + nextStep(): void { + if (!this.canProceed()) return; + this._formStep++; + } + + prevStep(): void { + if (this._formStep > 1) this._formStep--; + } + + isLastFormStep(): boolean { + if (this.selectedType === 'Risk') return this._formStep === this.RISK_TOTAL_STEPS; + if (this.selectedType === 'Incident') return this._formStep === 3; + // Task and Assessment are single-step + return this.selectedType === 'Task' || this.selectedType === 'Assessment'; + } + + // ── Titles ──────────────────────────────────────────────────────── + getTitle(): string { + if (this.step === 1) return 'What would you like to create?'; + if (this.selectedType === 'Task') return 'Create Task'; + if (this.selectedType === 'Incident') return 'Create Incident'; + if (this.selectedType === 'Assessment') return 'Create Assessment'; + if (this.selectedType === 'Risk') + return `Create Risk — ${RISK_STEPS[this._formStep - 1] || 'Lifecycle'}`; + return ''; + } + + getSubtitle(): string { + if (this.step === 1) return 'Select an entity type to get started'; + if (this.selectedType === 'Task') return 'Create a new task linked to an entity'; + if (this.selectedType === 'Assessment') return 'Run a structured risk or compliance assessment'; + return ''; + } + + getRiskStepName(): string { + return RISK_STEPS[this._formStep - 1] ?? ''; + } + + // ── Validation ──────────────────────────────────────────────────── + canProceed(): boolean { + if (this.selectedType === 'Incident') { + if (this._formStep === 1) return !!this.incidentForm.title && !!this.incidentForm.category && !!this.incidentForm.priority; + if (this._formStep === 2) return !!this.incidentForm.impact; + return true; + } + if (this.selectedType === 'Task') { + return !!this.taskForm.name && !!this.taskForm.owner && !!this.taskForm.dueDate; + } + if (this.selectedType === 'Assessment') { + return !!this.assessmentForm.name && !!this.assessmentForm.type; + } + if (this.selectedType === 'Risk') { + if (this._formStep === 1) return !!this.riskForm.name && !!this.riskForm.category; + return true; // placeholder steps pass through + } + return false; + } + + // ── Submit ──────────────────────────────────────────────────────── + handleSubmit(): void { + if (!this.canProceed() || this.isSubmitting) return; + this.isSubmitting = true; + + // Simulate async save — replace with your real API service call + setTimeout(() => { + this.isSubmitting = false; + console.log('Submitted:', this.selectedType, this.getFormData()); + this.close(); + // Optionally navigate: this.router.navigateByUrl('/risks'); + }, 1200); + } + + private getFormData(): unknown { + switch (this.selectedType) { + case 'Incident': return this.incidentForm; + case 'Task': return this.taskForm; + case 'Assessment': return this.assessmentForm; + case 'Risk': return this.riskForm; + default: return {}; + } + } + + // ── Close / reset ───────────────────────────────────────────────── + close(): void { + this.overlayService.close(); + // Reset after animation frame so closing feels instant + setTimeout(() => { + this.step = 1; + this.selectedType = null; + this._formStep = 1; + this.isSubmitting = false; + this.incidentForm = this.freshIncident(); + this.taskForm = this.freshTask(); + this.assessmentForm = this.freshAssessment(); + this.riskForm = this.freshRisk(); + }, 200); + } + + onBackdropClick(event: MouseEvent): void { + // Only close if the backdrop itself was clicked (not the panel) + if ((event.target as HTMLElement) === event.currentTarget) { + this.close(); + } + } + + /** Escape key closes overlay */ + @HostListener('document:keydown.escape') + onEscape(): void { + if (this.isOpen) this.close(); + } + + // ── Fresh form factories ────────────────────────────────────────── + private freshIncident(): IncidentForm { + return { title:'', category:'', priority:'', status:'Open', dateOccurred:'', + description:'', impact:'', urgency:'', financialLoss:null, + affectedSystems:'', immediateActions:'' }; + } + + private freshTask(): TaskForm { + return { name:'', linkedEntityType:'', linkedEntityId:'', + owner:'', dueDate:'', priority:'', description:'' }; + } + + private freshAssessment(): AssessmentForm { + return { name:'', type:'', dueDate:'', assignedTo:'', priority:'', scope:'' }; + } + + private freshRisk(): RiskForm { + return { name:'', category:'', primaryOwner:'', description:'', + likelihood:'', impact:'' }; + } +} \ No newline at end of file diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.service.ts b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.service.ts new file mode 100644 index 0000000..7c1b79f --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/create-overlay.service.ts @@ -0,0 +1,62 @@ +import { Injectable, signal, computed } from '@angular/core'; + +export type CreateEntityType = 'Risk' | 'Incident' | 'Task' | 'Assessment' | null; + +export interface LinkedEntity { + type: 'Risk' | 'Incident' | 'Task'; + id: string; + name: string; +} + +export interface CreateOverlayState { + isOpen: boolean; + preselectedType: CreateEntityType; + linkedEntity?: LinkedEntity; +} + +/** + * Angular equivalent of React's CreateOverlayContext. + * Inject this wherever you need to open the Create overlay. + * + * Usage: + * constructor(private createOverlay: CreateOverlayService) {} + * this.createOverlay.open({ type: 'Risk' }); + * this.createOverlay.open(); // shows type selector + */ +@Injectable({ providedIn: 'root' }) +export class CreateOverlayService { + + private _state = signal({ + isOpen: false, + preselectedType: null, + }); + + /** Read-only state signal */ + readonly state = this._state.asReadonly(); + + /** Convenience computed signals */ + readonly isOpen = computed(() => this._state().isOpen); + readonly preselected = computed(() => this._state().preselectedType); + readonly linkedEntity = computed(() => this._state().linkedEntity); + + /** + * Open the overlay. Optionally pre-select a type and/or linked entity. + * Matches React: openCreate({ type?, linkedEntity? }) + */ + open(opts?: { type?: CreateEntityType; linkedEntity?: LinkedEntity }): void { + this._state.set({ + isOpen: true, + preselectedType: opts?.type ?? null, + linkedEntity: opts?.linkedEntity, + }); + } + + /** Close and reset — matches React closeCreate() */ + close(): void { + this._state.set({ + isOpen: false, + preselectedType: null, + linkedEntity: undefined, + }); + } +} \ No newline at end of file diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/user-menu.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/user-menu.component.html new file mode 100644 index 0000000..b98b523 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/user-menu.component.html @@ -0,0 +1,85 @@ + +
+ + + + + +
+ + +
+
+
+ {{ initials }} +
+
+
{{ displayName }}
+
{{ displayEmail }}
+
+
+ +
+ {{ displayRole }} +
+
+ + +
+ +
+ + +
+ + + +
+ +
+
diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/user-menu.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/user-menu.component.ts new file mode 100644 index 0000000..98d0f4c --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/application-layout/user-menu.component.ts @@ -0,0 +1,115 @@ +import { + Component, + OnInit, + OnDestroy, + HostListener, + ElementRef, + ViewChild, + inject, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Router } from '@angular/router'; +import { ConfigStateService, AuthService } from '@abp/ng.core'; +import { Subject, takeUntil } from 'rxjs'; + +@Component({ + selector: 'app-user-menu', + templateUrl: './user-menu.component.html', + standalone: true, + imports: [CommonModule], +}) + +export class UserMenuComponent implements OnInit, OnDestroy { + private readonly router = inject(Router); + private readonly config = inject(ConfigStateService); + private readonly auth = inject(AuthService); + private readonly destroy$ = new Subject(); + @ViewChild('menuRef') menuRef!: ElementRef; + + isOpen = false; + + // ── Derived display values ──────────────────────────────────────── + displayName = 'Guest User'; + displayEmail = 'guest@company.com'; + displayRole = 'Department'; + initials = 'GU'; + + ngOnInit(): void { + // this.loadUser(); + this.config.getAll$() + .pipe(takeUntil(this.destroy$)) + .subscribe(() => this.loadUser()); + } + + private loadUser(): void { + const currentUser = this.config.getOne('currentUser') as any; + + // Reset to guest defaults when logged out + if (!currentUser?.isAuthenticated) { + this.displayName = 'Guest User'; + this.displayEmail = ''; + this.displayRole = ''; + this.initials = 'GU'; + return; + } + + const name: string = currentUser.name + || currentUser.userName + || currentUser.email + || 'Guest User'; + + this.displayName = name; + this.displayEmail = currentUser.email ?? ''; + + const roles: string[] = currentUser.roles ?? []; + this.displayRole = roles[0] ?? 'User'; + + this.initials = this.getInitials(name); + } + + private getInitials(name: string): string { + const parts = name.trim().split(/\s+/); + if (parts.length >= 2) { + return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase(); + } + return name.slice(0, 2).toUpperCase(); + } + + // ── Toggle ──────────────────────────────────────────────────────── + toggleMenu(): void { + this.isOpen = !this.isOpen; + } + + // ── Close on outside click — mirrors React useEffect ───────────── + @HostListener('document:mousedown', ['$event']) + onDocumentClick(event: MouseEvent): void { + if ( + this.isOpen && + this.menuRef?.nativeElement && + !this.menuRef.nativeElement.contains(event.target as Node) + ) { + this.isOpen = false; + } + } + + // ── Navigation ──────────────────────────────────────────────────── + navigate(path: string): void { + this.router.navigateByUrl(path); + this.isOpen = false; + } + + // ── Logout — mirrors React handleLogout ────────────────────────── + handleLogout(): void { + this.isOpen = false; + this.auth.logout().subscribe({ + next: () => { /* ABP handles redirect via post_logout_redirect_uri */ }, + error: () => this.router.navigateByUrl('/'), + }); + } + + ngOnDestroy(): void { + // HostListener cleanup is automatic + this.destroy$.next(); + this.destroy$.complete(); + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/empty-layout/empty-layout.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/empty-layout/empty-layout.component.ts new file mode 100644 index 0000000..2153ecf --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/empty-layout/empty-layout.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { eLayoutType } from '@abp/ng.core'; +import { RouterOutlet } from '@angular/router'; + +@Component({ + selector: 'abp-layout-empty', + template: ` `, + imports: [RouterOutlet], +}) +export class EmptyLayoutComponent { + static type = eLayoutType.empty; +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/index.ts b/angular/projects/theme-basic10_1_0/src/lib/components/index.ts new file mode 100644 index 0000000..b5e0d52 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/index.ts @@ -0,0 +1,12 @@ +export * from './account-layout/account-layout.component'; +export * from './account-layout/auth-wrapper/auth-wrapper.component'; +export * from './account-layout/tenant-box/tenant-box.component'; +export * from './application-layout/application-layout.component'; +export * from './empty-layout/empty-layout.component'; +export * from './logo/logo.component'; +export * from './nav-items/current-user.component'; +export * from './nav-items/languages.component'; +export * from './nav-items/nav-items.component'; +export * from './page-alert-container/page-alert-container.component'; +export * from './routes/routes.component'; +export * from './validation-error/validation-error.component'; diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/logo/logo.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/logo/logo.component.ts new file mode 100644 index 0000000..d42021d --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/logo/logo.component.ts @@ -0,0 +1,148 @@ +import { EnvironmentService } from '@abp/ng.core'; +import { RouterLink } from '@angular/router'; +import { Component, inject } from '@angular/core'; +import { LOGO_APP_NAME_TOKEN, LOGO_URL_TOKEN } from '@abp/ng.theme.shared'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'abp-logo', + template: ` + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ + +
+ DelightERM +
+
+
+
+ `, + styles: [ + ` + :host { + display: block; + } + + /* ── Link reset ───────────────────────────────────────── */ + .logo-link { + display: flex; + align-items: center; + text-decoration: none; + outline: none; + user-select: none; + } + + /* ── External image logo ──────────────────────────────── */ + .logo-img { + height: 32px; + width: auto; + display: block; + } + + /* ── Wordmark layout ──────────────────────────────────── */ + .logo-wordmark { + display: flex; + align-items: center; + gap: 9px; + } + + /* ── Icon mark ────────────────────────────────────────── */ + .logo-icon { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + filter: drop-shadow(0 2px 4px rgba(37, 99, 235, 0.25)); + + svg { + display: block; + } + } + + /* ── Text ─────────────────────────────────────────────── */ + .logo-text { + display: flex; + align-items: baseline; + gap: 1px; + line-height: 1; + } + + .logo-text__brand { + font-size: 16px; + font-weight: 700; + letter-spacing: -0.3px; + color: var(--clr-text); + font-family: var(--font-base); + } + + .logo-text__suffix { + font-size: 16px; + font-weight: 700; + letter-spacing: -0.3px; + color: var(--clr-primary); + font-family: var(--font-base); + } + `, + ], + standalone: true, + imports: [RouterLink, CommonModule], +}) +export class LogoComponent { + private readonly environment = inject(EnvironmentService); + private readonly providedLogoUrl = inject(LOGO_URL_TOKEN, { optional: true }); + private readonly providedAppName = inject(LOGO_APP_NAME_TOKEN, { optional: true }); + + get logoUrl(): string { + return this.providedLogoUrl ?? this.environment.getEnvironment().application?.logoUrl ?? ''; + } + + get appName(): string { + return this.providedAppName ?? this.environment.getEnvironment().application?.name ?? 'DelightERM'; + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/current-user.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/current-user.component.html new file mode 100644 index 0000000..75a140e --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/current-user.component.html @@ -0,0 +1,62 @@ +@if ((currentUser$ | async)?.isAuthenticated) { + +} @else { + + {{ 'AbpAccount::Login' | abpLocalization }} + +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/current-user.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/current-user.component.ts new file mode 100644 index 0000000..d151580 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/current-user.component.ts @@ -0,0 +1,53 @@ +import { + AuthService, + ConfigStateService, + CurrentUserDto, + LocalizationPipe, + NAVIGATE_TO_MANAGE_PROFILE, + PermissionDirective, + SessionStateService, + ToInjectorPipe, +} from '@abp/ng.core'; +import { AbpVisibleDirective, UserMenu, UserMenuService } from '@abp/ng.theme.shared'; +import { Component, TrackByFunction, inject } from '@angular/core'; +import { Observable } from 'rxjs'; +import { NgComponentOutlet, AsyncPipe, DOCUMENT } from '@angular/common'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'abp-current-user', + templateUrl: './current-user.component.html', + imports: [ + NgComponentOutlet, + AsyncPipe, + NgbDropdownModule, + AbpVisibleDirective, + PermissionDirective, + ToInjectorPipe, + LocalizationPipe, + ], +}) +export class CurrentUserComponent { + readonly navigateToManageProfile = inject(NAVIGATE_TO_MANAGE_PROFILE); + readonly userMenu = inject(UserMenuService); + private authService = inject(AuthService); + private configState = inject(ConfigStateService); + private sessionState = inject(SessionStateService); + private document = inject(DOCUMENT); + + currentUser$: Observable = this.configState.getOne$('currentUser'); + selectedTenant$ = this.sessionState.getTenant$(); + trackByFn: TrackByFunction = (_, element) => element.id; + + get smallScreen(): boolean { + return (this.document.defaultView?.innerWidth ?? 0) < 992; + } + + navigateToLogin() { + this.authService.navigateToLogin(); + } + + logout() { + this.authService.logout().subscribe(); + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/languages.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/languages.component.ts new file mode 100644 index 0000000..712efc5 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/languages.component.ts @@ -0,0 +1,79 @@ +import { ConfigStateService, LanguageInfo, SessionStateService } from '@abp/ng.core'; +import { Component, inject } from '@angular/core'; +import { DOCUMENT, AsyncPipe } from '@angular/common'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'abp-languages', + template: ` + @if (((dropdownLanguages$ | async)?.length || 0) > 0) { + + } + `, + imports: [AsyncPipe, NgbDropdownModule], +}) +export class LanguagesComponent { + private sessionState = inject(SessionStateService); + private configState = inject(ConfigStateService); + document = inject(DOCUMENT); + + get smallScreen(): boolean { + return (this.document.defaultView?.innerWidth ?? 0) < 992; + } + + languages$: Observable = this.configState.getDeep$('localization.languages'); + + get defaultLanguage$(): Observable { + return this.languages$.pipe( + map( + languages => + languages?.find(lang => lang.cultureName === this.selectedLangCulture)?.displayName || '', + ), + ); + } + + get dropdownLanguages$(): Observable { + return this.languages$.pipe( + map( + languages => languages?.filter(lang => lang.cultureName !== this.selectedLangCulture) || [], + ), + ); + } + + get selectedLangCulture(): string { + return this.sessionState.getLanguage(); + } + + onChangeLang(cultureName: string) { + this.sessionState.setLanguage(cultureName); + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/nav-items.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/nav-items.component.html new file mode 100644 index 0000000..ca47912 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/nav-items.component.html @@ -0,0 +1,18 @@ + diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/nav-items.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/nav-items.component.ts new file mode 100644 index 0000000..82d80bd --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/nav-items/nav-items.component.ts @@ -0,0 +1,17 @@ +import { AbpVisibleDirective, NavItem, NavItemsService } from '@abp/ng.theme.shared'; +import { Component, TrackByFunction, inject, PLATFORM_ID } from '@angular/core'; +import { NgComponentOutlet, AsyncPipe, isPlatformBrowser } from '@angular/common'; +import { PermissionDirective, ToInjectorPipe } from '@abp/ng.core'; + +@Component({ + selector: 'abp-nav-items', + templateUrl: 'nav-items.component.html', + imports: [NgComponentOutlet, AsyncPipe, AbpVisibleDirective, PermissionDirective, ToInjectorPipe], +}) +export class NavItemsComponent { + readonly navItems = inject(NavItemsService); + private platformId = inject(PLATFORM_ID); + readonly isBrowser = isPlatformBrowser(this.platformId); + + trackByFn: TrackByFunction = (_, element) => element.id; +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/page-alert-container/page-alert-container.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/page-alert-container/page-alert-container.component.html new file mode 100644 index 0000000..86e9d40 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/page-alert-container/page-alert-container.component.html @@ -0,0 +1,26 @@ +@for (alert of service.alerts$ | async; track i; let i = $index) { + +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/page-alert-container/page-alert-container.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/page-alert-container/page-alert-container.component.ts new file mode 100644 index 0000000..f40ba2c --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/page-alert-container/page-alert-container.component.ts @@ -0,0 +1,14 @@ +import { Component, ViewEncapsulation, inject } from '@angular/core'; +import { PageAlertService } from '@abp/ng.theme.shared'; +import { NgClass, AsyncPipe } from '@angular/common'; +import { LocalizationPipe, SafeHtmlPipe } from '@abp/ng.core'; + +@Component({ + selector: 'abp-page-alert-container', + templateUrl: './page-alert-container.component.html', + encapsulation: ViewEncapsulation.None, + imports: [NgClass, AsyncPipe, LocalizationPipe, SafeHtmlPipe], +}) +export class PageAlertContainerComponent { + service = inject(PageAlertService); +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/routes/routes.component.html b/angular/projects/theme-basic10_1_0/src/lib/components/routes/routes.component.html new file mode 100644 index 0000000..28e4086 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/routes/routes.component.html @@ -0,0 +1,109 @@ + diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/routes/routes.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/routes/routes.component.ts new file mode 100644 index 0000000..27463ea --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/routes/routes.component.ts @@ -0,0 +1,61 @@ +import { + ABP, + AsyncLocalizationPipe, + LocalizationPipe, + PermissionDirective, + RoutesService, + TreeNode, +} from '@abp/ng.core'; +import { + Component, + ElementRef, + inject, + Input, + QueryList, + Renderer2, + TrackByFunction, + ViewChildren, +} from '@angular/core'; +import { NgTemplateOutlet, NgClass, AsyncPipe } from '@angular/common'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { RouterLink } from '@angular/router'; +import { EllipsisDirective } from '@abp/ng.theme.shared'; + +@Component({ + selector: 'abp-routes', + templateUrl: 'routes.component.html', + imports: [ + NgTemplateOutlet, + NgClass, + AsyncPipe, + RouterLink, + NgbDropdownModule, + AsyncLocalizationPipe, + PermissionDirective, + EllipsisDirective, + LocalizationPipe, + ], +}) +export class RoutesComponent { + public readonly routesService = inject(RoutesService); + protected renderer = inject(Renderer2); + + @Input() smallScreen?: boolean; + + @ViewChildren('childrenContainer') childrenContainers!: QueryList>; + + rootDropdownExpand = {} as { [key: string]: boolean }; + + trackByFn: TrackByFunction> = (_, item) => item.name; + + isDropdown(node: TreeNode) { + return !node?.isLeaf || this.routesService.hasChildren(node.name); + } + + closeDropdown() { + this.childrenContainers.forEach(({ nativeElement }) => { + this.renderer.addClass(nativeElement, 'd-none'); + setTimeout(() => this.renderer.removeClass(nativeElement, 'd-none'), 0); + }); + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/components/validation-error/validation-error.component.ts b/angular/projects/theme-basic10_1_0/src/lib/components/validation-error/validation-error.component.ts new file mode 100644 index 0000000..213ebb6 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/components/validation-error/validation-error.component.ts @@ -0,0 +1,38 @@ +import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; +import { Validation, ValidationErrorComponent as ErrorComponent } from '@ngx-validate/core'; +import { LocalizationPipe } from '@abp/ng.core'; + +@Component({ + selector: 'abp-validation-error', + template: ` + @for (error of abpErrors; track $index) { +
+ {{ error.message | abpLocalization: error.interpoliteParams }} +
+ } + `, + changeDetection: ChangeDetectionStrategy.OnPush, + encapsulation: ViewEncapsulation.None, + imports: [LocalizationPipe], +}) +export class ValidationErrorComponent extends ErrorComponent { + get abpErrors(): (Validation.Error & { interpoliteParams?: string[] })[] { + if (!this.errors || !this.errors.length) return []; + + return this.errors.map(error => { + if (!error.message) return error; + + const index = error.message.indexOf('['); + + if (index > -1) { + return { + ...error, + message: error.message.slice(0, index), + interpoliteParams: error.message.slice(index + 1, error.message.length - 1).split(','), + }; + } + + return error; + }); + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/constants/styles.ts b/angular/projects/theme-basic10_1_0/src/lib/constants/styles.ts new file mode 100644 index 0000000..93ed7d2 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/constants/styles.ts @@ -0,0 +1,182 @@ +export default ` +.content-header-title { + font-size: 24px; +} +.entry-row { + margin-bottom: 15px; +} +#main-navbar-tools a.dropdown-toggle { + text-decoration: none; + color: #fff; +} +.navbar .dropdown-submenu { + position: relative; +} +.navbar .dropdown-menu { + margin: 0; + padding: 0; +} +.navbar .dropdown-menu a { + font-size: .9em; + padding: 10px 15px; + display: block; + min-width: 210px; + text-align: left; + border-radius: 0.25rem; + min-height: 44px; +} +[dir=rtl] .navbar .dropdown-menu a { + text-align: right!important; +} +.navbar .dropdown-submenu a::after { + transform: rotate(-90deg); + position: absolute; + right: 16px; + top: 18px; +} +[dir=rtl] .navbar .dropdown-submenu a::after { + transform: rotate(90deg); + left: 16px; + right: auto; + top: 20px; +} +.navbar .dropdown-submenu .dropdown-menu { + top: 0; + left: 100%; +} +/* work around for rtl. Track https://github.com/ng-bootstrap/ng-bootstrap/issues/4100 issue */ +[dir=rtl] .navbar .dropdown-submenu .dropdown-menu { + top: 0; + right: 100%; +} +.card-header .btn { + padding: 2px 6px; +} +.card-header h5 { + margin: 0; +} +.container > .card { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} +@media screen and (min-width: 992px) { + .navbar .dropdown:hover > .dropdown-menu { + display: block; + } + + .navbar .dropdown-submenu:hover > .dropdown-menu { + display: block; + } +} +.input-validation-error { + border-color: #dc3545; +} +.field-validation-error { + font-size: 0.8em; +} +.ui-table .ui-table-tbody > tr.empty-row > div.empty-row-content { + border: 1px solid #c8c8c8; + } +.abp-loading { + background: rgba(0, 0, 0, 0.05); +} +.modal-backdrop { +background-color: rgba(0, 0, 0, 0.6); +} + +.confirmation .confirmation-backdrop { + background: rgba(0, 0, 0, 0.7) !important; +} + .confirmation .confirmation-dialog { + border: none; + border-radius: 10px; + background-color: #fff; + box-shadow: 0 0 10px -5px rgba(0, 0, 0, 0.5); +} + .confirmation .confirmation-dialog .icon-container .icon { + stroke: #fff; + color: #fff; +} + .confirmation .confirmation-dialog .icon-container.info .icon { + stroke: #2f96b4; + color: #2f96b4; +} + .confirmation .confirmation-dialog .icon-container.success .icon { + stroke: #51a351; + color: #51a351; +} + .confirmation .confirmation-dialog .icon-container.warning .icon { + stroke: #f89406; + color: #f89406; +} + .confirmation .confirmation-dialog .icon-container.error .icon { + stroke: #bd362f; + color: #bd362f; +} + .confirmation .confirmation-dialog .content .title { + color: #222; +} + .confirmation .confirmation-dialog .content .message { + color: #777; +} + .confirmation .confirmation-dialog .footer { + background: transparent; +} + .confirmation .confirmation-dialog .footer .confirmation-button { + background-color: #eee; + color: #777; +} + .confirmation .confirmation-dialog .footer .confirmation-button:hover, .confirmation .confirmation-dialog .footer .confirmation-button:focus, .confirmation .confirmation-dialog .footer .confirmation-button:active { + background-color: #bbb; +} + .confirmation .confirmation-dialog .footer .confirmation-button--confirm { + background-color: #2f96b4; + color: #fff; +} + .confirmation .confirmation-dialog .footer .confirmation-button--confirm:hover { + background-color: #2e819b; +} +.ui-table .pagination-wrapper { + background-color: #f4f4f4; + border: 1px solid #c8c8c8; +} +.bordered .datatable-body-row { + border-top: 1px solid #eee; + margin-top: -1px; +} +.breadcrumb { + background-color: transparent; + padding: 0.27rem; +} + +.abp-md-form { + max-width: 540px; +} + +abp-chat-icon, +abp-back-to-impersonator-nav-item { + margin-inline: 0.4rem; +} + +abp-chat-icon { + .fa-comments:before { + color: var(--bs-navbar-color); + } +} + +abp-back-to-impersonator-nav-item { + .fa-undo { + color: var(--bs-navbar-color); + } +} + +.ngx-datatable.material:has(.datatable-body-row) .datatable-footer { + border-top: none; +} + +.ngx-datatable.material:not(:has(.datatable-body-row)) .datatable-footer { + border-top: 1px solid #dee2e6; +} + +`; + + diff --git a/angular/projects/theme-basic10_1_0/src/lib/enums/components.ts b/angular/projects/theme-basic10_1_0/src/lib/enums/components.ts new file mode 100644 index 0000000..e62f551 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/enums/components.ts @@ -0,0 +1,10 @@ +export const enum eThemeBasicComponents { + ApplicationLayout = 'Theme.ApplicationLayoutComponent', + AccountLayout = 'Theme.AccountLayoutComponent', + EmptyLayout = 'Theme.EmptyLayoutComponent', + Logo = 'Theme.LogoComponent', + Routes = 'Theme.RoutesComponent', + NavItems = 'Theme.NavItemsComponent', + CurrentUser = 'Theme.CurrentUserComponent', + Languages = 'Theme.LanguagesComponent', +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/enums/index.ts b/angular/projects/theme-basic10_1_0/src/lib/enums/index.ts new file mode 100644 index 0000000..3c919aa --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/enums/index.ts @@ -0,0 +1,2 @@ +export * from './components'; +export * from './user-menu-items'; diff --git a/angular/projects/theme-basic10_1_0/src/lib/enums/user-menu-items.ts b/angular/projects/theme-basic10_1_0/src/lib/enums/user-menu-items.ts new file mode 100644 index 0000000..42ab66e --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/enums/user-menu-items.ts @@ -0,0 +1,4 @@ +export const enum eUserMenuItems { + MyAccount = 'UserMenu.MyAccount', + Logout = 'UserMenu.Logout', +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/handlers/index.ts b/angular/projects/theme-basic10_1_0/src/lib/handlers/index.ts new file mode 100644 index 0000000..d671e47 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/handlers/index.ts @@ -0,0 +1 @@ +export * from './lazy-style.handler'; diff --git a/angular/projects/theme-basic10_1_0/src/lib/handlers/lazy-style.handler.ts b/angular/projects/theme-basic10_1_0/src/lib/handlers/lazy-style.handler.ts new file mode 100644 index 0000000..c362e42 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/handlers/lazy-style.handler.ts @@ -0,0 +1,104 @@ +import { LazyLoadService, LOADING_STRATEGY } from '@abp/ng.core'; +import { DocumentDirHandlerService, LocaleDirection } from '@abp/ng.theme.shared'; +import { Injectable, Injector, inject } from '@angular/core'; +import { LAZY_STYLES } from '../tokens/lazy-styles.token'; +import { DOCUMENT } from '@angular/common'; +export const BOOTSTRAP = 'bootstrap-{{dir}}.min.css'; + +@Injectable() +export class LazyStyleHandler { + private document = inject(DOCUMENT); + private lazyLoad!: LazyLoadService; + private styles!: string[]; + private _dir: LocaleDirection = 'ltr'; + + readonly loaded = new Map(); + + set dir(dir: LocaleDirection) { + if (dir === this._dir) return; + + this.switchCSS(dir); + this._dir = dir; + } + + get dir(): LocaleDirection { + return this._dir; + } + + constructor() { + const injector = inject(Injector); + + this.setStyles(injector); + this.setLazyLoad(injector); + this.listenToDirectionChanges(injector); + } + + private getHrefFromLink(link: HTMLLinkElement | null | undefined): string { + if (!link) return ''; + + const a = this.document.createElement('a'); + a.href = link.href; + return a.pathname.replace(/^\//, ''); + } + + private getLoadedBootstrap(): LoadedStyle { + const href = createLazyStyleHref(BOOTSTRAP, this.dir); + const selector = `[href*="${href.replace(/\.css$/, '')}"]`; + const link = this.document.querySelector(selector); + return { href, link }; + } + + private listenToDirectionChanges(injector: Injector) { + const docDirHandler = injector.get(DocumentDirHandlerService); + + // will always listen, no need to unsubscribe + docDirHandler.dir$.subscribe(dir => { + this.dir = dir; + }); + } + + private setLazyLoad(injector: Injector) { + this.lazyLoad = injector.get(LazyLoadService); + const { href, link } = this.getLoadedBootstrap(); + if (link) { + this.lazyLoad.loaded.set(href, link); + } + } + + private setStyles(injector: Injector) { + this.styles = injector.get(LAZY_STYLES, [BOOTSTRAP]); + } + + private switchCSS(dir: LocaleDirection) { + this.styles.forEach(style => { + const oldHref = createLazyStyleHref(style, this.dir); + const newHref = createLazyStyleHref(style, dir); + const link = this.loaded.get(newHref); + const href = this.getHrefFromLink(link) || newHref; + + const strategy = LOADING_STRATEGY.PrependAnonymousStyleToHead(href); + this.lazyLoad.load(strategy).subscribe(() => { + const oldLink = this.lazyLoad.loaded.get(oldHref) as HTMLLinkElement; + this.loaded.delete(newHref); + this.loaded.set(oldHref, oldLink); + const newLink = this.lazyLoad.loaded.get(href) as HTMLLinkElement; + this.lazyLoad.loaded.delete(href); + this.lazyLoad.loaded.set(newHref, newLink); + this.lazyLoad.remove(oldHref); + }); + }); + } +} + +export function createLazyStyleHref(style: string, dir: string): string { + return style.replace(/{{\s*dir\s*}}/g, dir); +} + +export function initLazyStyleHandler() { + return () => new LazyStyleHandler(); +} + +interface LoadedStyle { + href: string; + link: HTMLLinkElement | null; +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/models/index.ts b/angular/projects/theme-basic10_1_0/src/lib/models/index.ts new file mode 100644 index 0000000..5d15fe1 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/models/index.ts @@ -0,0 +1 @@ +export * from './layout'; diff --git a/angular/projects/theme-basic10_1_0/src/lib/models/layout.ts b/angular/projects/theme-basic10_1_0/src/lib/models/layout.ts new file mode 100644 index 0000000..e2636e4 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/models/layout.ts @@ -0,0 +1,13 @@ +import { TemplateRef } from '@angular/core'; + +export namespace Layout { + export interface State { + navigationElements: NavigationElement[]; + } + + export interface NavigationElement { + name: string; + element: TemplateRef; + order?: number; + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/providers/index.ts b/angular/projects/theme-basic10_1_0/src/lib/providers/index.ts new file mode 100644 index 0000000..d1dc780 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/providers/index.ts @@ -0,0 +1,4 @@ +export * from './nav-item.provider'; +export * from './styles.provider'; +export * from './user-menu.provider'; +export * from './theme-basic-config.provider'; diff --git a/angular/projects/theme-basic10_1_0/src/lib/providers/nav-item.provider.ts b/angular/projects/theme-basic10_1_0/src/lib/providers/nav-item.provider.ts new file mode 100644 index 0000000..63230c2 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/providers/nav-item.provider.ts @@ -0,0 +1,27 @@ +import { NavItemsService } from '@abp/ng.theme.shared'; +import { inject, provideAppInitializer } from '@angular/core'; +import { CurrentUserComponent } from '../components/nav-items/current-user.component'; +import { LanguagesComponent } from '../components/nav-items/languages.component'; +import { eThemeBasicComponents } from '../enums/components'; + +export const BASIC_THEME_NAV_ITEM_PROVIDERS = [ + provideAppInitializer(() => { + configureNavItems(); + }), +]; + +export function configureNavItems() { + const navItems = inject(NavItemsService); + navItems.addItems([ + { + id: eThemeBasicComponents.Languages, + order: 100, + component: LanguagesComponent, + }, + { + id: eThemeBasicComponents.CurrentUser, + order: 100, + component: CurrentUserComponent, + }, + ]); +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/providers/styles.provider.ts b/angular/projects/theme-basic10_1_0/src/lib/providers/styles.provider.ts new file mode 100644 index 0000000..0bb2df9 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/providers/styles.provider.ts @@ -0,0 +1,43 @@ +import { CONTENT_STRATEGY, DomInsertionService, ReplaceableComponentsService } from '@abp/ng.core'; +import { inject, provideAppInitializer } from '@angular/core'; +import { AccountLayoutComponent } from '../components/account-layout/account-layout.component'; +import { ApplicationLayoutComponent } from '../components/application-layout/application-layout.component'; +import { EmptyLayoutComponent } from '../components/empty-layout/empty-layout.component'; +import styles from '../constants/styles'; +import { eThemeBasicComponents } from '../enums/components'; + +export const BASIC_THEME_STYLES_PROVIDERS = [ + provideAppInitializer(() => { + const initializerFn = configureStyles( + inject(DomInsertionService), + inject(ReplaceableComponentsService), + ); + return initializerFn(); + }), +]; + +export function configureStyles( + domInsertion: DomInsertionService, + replaceableComponents: ReplaceableComponentsService, +) { + return () => { + domInsertion.insertContent(CONTENT_STRATEGY.AppendStyleToHead(styles)); + + initLayouts(replaceableComponents); + }; +} + +function initLayouts(replaceableComponents: ReplaceableComponentsService) { + replaceableComponents.add({ + key: eThemeBasicComponents.ApplicationLayout, + component: ApplicationLayoutComponent, + }); + replaceableComponents.add({ + key: eThemeBasicComponents.AccountLayout, + component: AccountLayoutComponent, + }); + replaceableComponents.add({ + key: eThemeBasicComponents.EmptyLayout, + component: EmptyLayoutComponent, + }); +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/providers/theme-basic-config.provider.ts b/angular/projects/theme-basic10_1_0/src/lib/providers/theme-basic-config.provider.ts new file mode 100644 index 0000000..012889a --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/providers/theme-basic-config.provider.ts @@ -0,0 +1,36 @@ +import { makeEnvironmentProviders, inject, provideAppInitializer } from '@angular/core'; + +import { + VALIDATION_ERROR_TEMPLATE, + VALIDATION_TARGET_SELECTOR, + VALIDATION_INVALID_CLASSES, +} from '@ngx-validate/core'; +import { LazyStyleHandler } from '../handlers'; +import { BASIC_THEME_NAV_ITEM_PROVIDERS } from './nav-item.provider'; +import { BASIC_THEME_STYLES_PROVIDERS } from './styles.provider'; +import { BASIC_THEME_USER_MENU_PROVIDERS } from './user-menu.provider'; +import { ValidationErrorComponent } from '../components'; + +export function provideThemeBasicConfig() { + return makeEnvironmentProviders([ + BASIC_THEME_NAV_ITEM_PROVIDERS, + BASIC_THEME_USER_MENU_PROVIDERS, + BASIC_THEME_STYLES_PROVIDERS, + { + provide: VALIDATION_ERROR_TEMPLATE, + useValue: ValidationErrorComponent, + }, + { + provide: VALIDATION_TARGET_SELECTOR, + useValue: '.form-group', + }, + { + provide: VALIDATION_INVALID_CLASSES, + useValue: 'is-invalid', + }, + LazyStyleHandler, + provideAppInitializer(() => { + inject(LazyStyleHandler); + }), + ]); +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/providers/user-menu.provider.ts b/angular/projects/theme-basic10_1_0/src/lib/providers/user-menu.provider.ts new file mode 100644 index 0000000..6626b01 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/providers/user-menu.provider.ts @@ -0,0 +1,42 @@ +import { AuthService, NAVIGATE_TO_MANAGE_PROFILE } from '@abp/ng.core'; +import { UserMenuService } from '@abp/ng.theme.shared'; +import { Injector, inject, provideAppInitializer } from '@angular/core'; +import { eUserMenuItems } from '../enums/user-menu-items'; + +export const BASIC_THEME_USER_MENU_PROVIDERS = [ + provideAppInitializer(() => { + const initializerFn = configureUserMenu(inject(Injector)); + return initializerFn(); + }), +]; + +export function configureUserMenu(injector: Injector) { + const userMenu = injector.get(UserMenuService); + const authService = injector.get(AuthService); + const navigateToManageProfile = injector.get(NAVIGATE_TO_MANAGE_PROFILE); + + return () => { + userMenu.addItems([ + { + id: eUserMenuItems.MyAccount, + order: 100, + textTemplate: { + text: 'AbpAccount::MyAccount', + icon: 'fa fa-cog', + }, + action: () => navigateToManageProfile(), + }, + { + id: eUserMenuItems.Logout, + order: 101, + textTemplate: { + text: 'AbpUi::Logout', + icon: 'fa fa-power-off', + }, + action: () => { + authService.logout().subscribe(); + }, + }, + ]); + }; +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/services/index.ts b/angular/projects/theme-basic10_1_0/src/lib/services/index.ts new file mode 100644 index 0000000..1dcf624 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/services/index.ts @@ -0,0 +1,2 @@ +export * from './layout.service'; +export * from './theme.service'; diff --git a/angular/projects/theme-basic10_1_0/src/lib/services/layout.service.ts b/angular/projects/theme-basic10_1_0/src/lib/services/layout.service.ts new file mode 100644 index 0000000..ed2a350 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/services/layout.service.ts @@ -0,0 +1,54 @@ +import {RouterEvents, SubscriptionService} from '@abp/ng.core'; +import { ChangeDetectorRef, Injectable, inject } from '@angular/core'; +import { fromEvent } from 'rxjs'; +import { debounceTime } from 'rxjs/operators'; +import { eThemeBasicComponents } from '../enums'; +import { DOCUMENT } from '@angular/common'; + +@Injectable() +export class LayoutService { + private subscription = inject(SubscriptionService); + private cdRef = inject(ChangeDetectorRef); + + document = inject(DOCUMENT); + isCollapsed = true; + + smallScreen!: boolean; // do not set true or false + + logoComponentKey = eThemeBasicComponents.Logo; + + routesComponentKey = eThemeBasicComponents.Routes; + + navItemsComponentKey = eThemeBasicComponents.NavItems; + + constructor() { + const subscription = this.subscription; + const routerEvents = inject(RouterEvents); + + subscription.addOne(routerEvents.getNavigationEvents("End"),() => { + this.isCollapsed = true; + }) + } + + private checkWindowWidth() { + if (!this.document.defaultView) return; + const isSmallScreen = this.document.defaultView.innerWidth < 992; + if (isSmallScreen && this.smallScreen === false) { + this.isCollapsed = false; + setTimeout(() => { + this.isCollapsed = true; + }, 100); + } + this.smallScreen = isSmallScreen; + this.cdRef.detectChanges(); + } + + subscribeWindowSize() { + this.checkWindowWidth(); + + if (this.document.defaultView) { + const resize$ = fromEvent(this.document.defaultView, 'resize').pipe(debounceTime(150)); + this.subscription.addOne(resize$, () => this.checkWindowWidth()); + } + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/services/theme.service.ts b/angular/projects/theme-basic10_1_0/src/lib/services/theme.service.ts new file mode 100644 index 0000000..035eb47 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/services/theme.service.ts @@ -0,0 +1,91 @@ +import { DOCUMENT } from '@angular/common'; +import { Injectable, inject } from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; + +export type AppTheme = 'light' | 'dark'; + +@Injectable({ + providedIn: 'root', +}) +export class ThemeService { + private readonly document = inject(DOCUMENT); + private readonly STORAGE_KEY = 'delight_theme'; + + private readonly themeSubject = new BehaviorSubject(this.getInitialTheme()); + readonly theme$: Observable = this.themeSubject.asObservable(); + + constructor() { + this.applyTheme(this.currentTheme); + } + + get currentTheme(): AppTheme { + return this.themeSubject.value; + } + + get isDarkMode(): boolean { + return this.currentTheme === 'dark'; + } + + toggleTheme(): void { + const nextTheme: AppTheme = this.isDarkMode ? 'light' : 'dark'; + this.setTheme(nextTheme); + } + + setTheme(theme: AppTheme): void { + this.themeSubject.next(theme); + this.saveTheme(theme); + this.applyTheme(theme); + } + + private getInitialTheme(): AppTheme { + try { + if (typeof window !== 'undefined' && window.localStorage) { + const saved = localStorage.getItem(this.STORAGE_KEY) as AppTheme | null; + if (saved === 'light' || saved === 'dark') { + return saved; + } + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + return 'dark'; + } + } + } catch { + // Fallback in case of restricted environment + } + return 'light'; + } + + private saveTheme(theme: AppTheme): void { + try { + if (typeof window !== 'undefined' && window.localStorage) { + localStorage.setItem(this.STORAGE_KEY, theme); + } + } catch { + // Ignore storage errors + } + } + + private applyTheme(theme: AppTheme): void { + if (!this.document || !this.document.documentElement) { + return; + } + + const root = this.document.documentElement; + const body = this.document.body; + + if (theme === 'dark') { + root.classList.add('dark'); + root.setAttribute('data-theme', 'dark'); + if (body) { + body.classList.add('dark'); + body.setAttribute('data-theme', 'dark'); + } + } else { + root.classList.remove('dark'); + root.setAttribute('data-theme', 'light'); + if (body) { + body.classList.remove('dark'); + body.setAttribute('data-theme', 'light'); + } + } + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/tests/lazy-style.handler.spec.ts b/angular/projects/theme-basic10_1_0/src/lib/tests/lazy-style.handler.spec.ts new file mode 100644 index 0000000..847c341 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/tests/lazy-style.handler.spec.ts @@ -0,0 +1,90 @@ +import { DOCUMENT } from '@angular/common'; +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/vitest'; +import { of, Subject } from 'rxjs'; +import { vi } from 'vitest'; + +import { LazyLoadService, LoadingStrategy, LocalizationService } from '@abp/ng.core'; +import { DocumentDirHandlerService } from '@abp/ng.theme.shared'; +import { BOOTSTRAP, createLazyStyleHref, LazyStyleHandler } from '../handlers'; +import { LAZY_STYLES } from '../tokens/lazy-styles.token'; +import { setupComponentResources } from './utils'; + +describe('LazyStyleHandler', () => { + let spectator: SpectatorService; + let handler: LazyStyleHandler; + let lazyLoad: any; + + beforeAll(async () => { + await setupComponentResources( + '../components/breadcrumb', + import.meta.url + ); + }); + + const dir$ = new Subject<'ltr' | 'rtl'>(); + + const createService = createServiceFactory({ + service: LazyStyleHandler, + providers: [ + { + provide: DOCUMENT, + useValue: document, + }, + { + provide: LAZY_STYLES, + useValue: [BOOTSTRAP], + }, + { + provide: LazyLoadService, + useValue: { + loaded: new Map(), + load: vi.fn(() => of(null)), + remove: vi.fn(), + }, + }, + { + provide: DocumentDirHandlerService, + useValue: { + dir$, + }, + }, + { + provide: LocalizationService, + useValue: { + currentLang: 'en', + currentLang$: of({ payload: 'en' }), + }, + }, + ], + }); + + beforeEach(() => { + spectator = createService(); + handler = spectator.service; + lazyLoad = spectator.inject(LazyLoadService); + }); + + describe('#dir', () => { + it('should initially be "ltr"', () => { + expect(handler.dir).toBe('ltr'); + }); + + it('should set bootstrap to rtl', () => { + const oldHref = createLazyStyleHref(BOOTSTRAP, 'ltr'); + const newHref = createLazyStyleHref(BOOTSTRAP, 'rtl'); + + lazyLoad.loaded.set(newHref, null); + + const loadSpy = vi.spyOn(lazyLoad, 'load'); + const removeSpy = vi.spyOn(lazyLoad, 'remove'); + + handler.dir = 'rtl'; + + expect(loadSpy).toHaveBeenCalledTimes(1); + const [strategy] = loadSpy.mock.calls[0]; + expect((strategy as LoadingStrategy).path).toBe(newHref); + + expect(removeSpy).toHaveBeenCalledWith(oldHref); + }); + }); +}); diff --git a/angular/projects/theme-basic10_1_0/src/lib/tests/utils/index.ts b/angular/projects/theme-basic10_1_0/src/lib/tests/utils/index.ts new file mode 100644 index 0000000..73b1172 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/tests/utils/index.ts @@ -0,0 +1 @@ +export * from './setup-component-resources'; \ No newline at end of file diff --git a/angular/projects/theme-basic10_1_0/src/lib/tests/utils/setup-component-resources.ts b/angular/projects/theme-basic10_1_0/src/lib/tests/utils/setup-component-resources.ts new file mode 100644 index 0000000..0795a5e --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/tests/utils/setup-component-resources.ts @@ -0,0 +1,54 @@ +import { readFileSync } from 'node:fs'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +/** + * Sets up component resource resolution for Angular component tests. + * This is needed when components have external templates or stylesheets. + * + * @param componentDirPath - The path to the component directory relative to the test file. + * For example: '../components/loader-bar' or './components/my-component' + * @param testFileUrl - The import.meta.url from the test file. Defaults to the caller's location. + * + * @example + * ```typescript + * + * import { setupComponentResources } from './utils'; + * + * beforeAll(() => setupComponentResources('../components/loader-bar', import.meta.url)); + * ``` + */ +export async function setupComponentResources( + componentDirPath: string, + testFileUrl: string = import.meta.url, +): Promise { + try { + if (typeof process !== 'undefined' && process.versions?.node) { + const { ɵresolveComponentResources: resolveComponentResources } = await import('@angular/core'); + + // Get the test file directory path + const testFileDir = dirname(fileURLToPath(testFileUrl)); + const componentDir = resolve(testFileDir, componentDirPath); + + await resolveComponentResources((url: string) => { + // For SCSS/SASS files, return empty CSS since jsdom can't parse SCSS + if (url.endsWith('.scss') || url.endsWith('.sass')) { + return Promise.resolve(''); + } + + // For other files (HTML, CSS, etc.), read the actual content + try { + // Resolve relative paths like './component.scss' or 'component.scss' + const normalizedUrl = url.replace(/^\.\//, ''); + const filePath = resolve(componentDir, normalizedUrl); + return Promise.resolve(readFileSync(filePath, 'utf-8')); + } catch (error) { + // If file not found, return empty string + return Promise.resolve(''); + } + }); + } + } catch (error) { + console.warn('Failed to set up component resource resolver:', error); + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/theme-basic.module.ts b/angular/projects/theme-basic10_1_0/src/lib/theme-basic.module.ts new file mode 100644 index 0000000..7177045 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/theme-basic.module.ts @@ -0,0 +1,54 @@ +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { + AccountLayoutComponent, + AuthWrapperComponent, + TenantBoxComponent, + ApplicationLayoutComponent, + EmptyLayoutComponent, + LogoComponent, + CurrentUserComponent, + LanguagesComponent, + NavItemsComponent, + PageAlertContainerComponent, + RoutesComponent, + ValidationErrorComponent, +} from './components'; +import { provideThemeBasicConfig } from './providers'; + +export const LAYOUTS = [ApplicationLayoutComponent, AccountLayoutComponent, EmptyLayoutComponent]; + +export const THEME_BASIC_COMPONENTS = [ + ...LAYOUTS, + ValidationErrorComponent, + LogoComponent, + NavItemsComponent, + RoutesComponent, + CurrentUserComponent, + LanguagesComponent, + PageAlertContainerComponent, + AuthWrapperComponent, + TenantBoxComponent, +]; + +@NgModule({ + declarations: [], + exports: [...THEME_BASIC_COMPONENTS], + imports: [...THEME_BASIC_COMPONENTS], +}) +export class BaseThemeBasicModule {} + +@NgModule({ + exports: [BaseThemeBasicModule], + imports: [BaseThemeBasicModule], +}) +export class ThemeBasicModule { + /** + * @deprecated forRoot method is deprecated, use `provideThemeBasicConfig` *function* for config settings. + */ + static forRoot(): ModuleWithProviders { + return { + ngModule: ThemeBasicModule, + providers: [provideThemeBasicConfig()], + }; + } +} diff --git a/angular/projects/theme-basic10_1_0/src/lib/tokens/index.ts b/angular/projects/theme-basic10_1_0/src/lib/tokens/index.ts new file mode 100644 index 0000000..b817d0d --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/tokens/index.ts @@ -0,0 +1 @@ +export * from './lazy-styles.token'; diff --git a/angular/projects/theme-basic10_1_0/src/lib/tokens/lazy-styles.token.ts b/angular/projects/theme-basic10_1_0/src/lib/tokens/lazy-styles.token.ts new file mode 100644 index 0000000..73ca304 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/lib/tokens/lazy-styles.token.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from '@angular/core'; + +export const LAZY_STYLES = new InjectionToken('LAZY_STYLES'); diff --git a/angular/projects/theme-basic10_1_0/src/public-api.ts b/angular/projects/theme-basic10_1_0/src/public-api.ts new file mode 100644 index 0000000..1c36578 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/public-api.ts @@ -0,0 +1,12 @@ +/* + * Public API Surface of theme-basic + */ + +export * from './lib/components'; +export * from './lib/enums'; +export * from './lib/handlers'; +export * from './lib/models'; +export * from './lib/providers'; +export * from './lib/services'; +export * from './lib/theme-basic.module'; +export * from './lib/tokens'; diff --git a/angular/projects/theme-basic10_1_0/src/test-setup.ts b/angular/projects/theme-basic10_1_0/src/test-setup.ts new file mode 100644 index 0000000..b349bcf --- /dev/null +++ b/angular/projects/theme-basic10_1_0/src/test-setup.ts @@ -0,0 +1,20 @@ +import '@angular/compiler'; +import 'zone.js'; +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { BrowserTestingModule, platformBrowserTesting } from '@angular/platform-browser/testing'; + +// Initialize Angular testing environment +getTestBed().initTestEnvironment(BrowserTestingModule, platformBrowserTesting()); + +// Mock window.location for test environment +Object.defineProperty(window, 'location', { + value: { + href: 'http://localhost:4200', + origin: 'http://localhost:4200', + pathname: '/', + search: '', + hash: '', + }, + writable: true, +}); diff --git a/angular/projects/theme-basic10_1_0/testing/ng-package.json b/angular/projects/theme-basic10_1_0/testing/ng-package.json new file mode 100644 index 0000000..e09fb3f --- /dev/null +++ b/angular/projects/theme-basic10_1_0/testing/ng-package.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-entrypoint.schema.json", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/angular/projects/theme-basic10_1_0/testing/src/lib/theme-basic-testing.module.ts b/angular/projects/theme-basic10_1_0/testing/src/lib/theme-basic-testing.module.ts new file mode 100644 index 0000000..282e5a2 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/testing/src/lib/theme-basic-testing.module.ts @@ -0,0 +1,40 @@ +import { + BaseThemeBasicModule, + BASIC_THEME_NAV_ITEM_PROVIDERS, + BASIC_THEME_STYLES_PROVIDERS, + ValidationErrorComponent, +} from '@abp/ng.theme.basic'; +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { + VALIDATION_ERROR_TEMPLATE, + VALIDATION_INVALID_CLASSES, + VALIDATION_TARGET_SELECTOR, +} from '@ngx-validate/core'; + +@NgModule({ + exports: [BaseThemeBasicModule], + imports: [BaseThemeBasicModule], +}) +export class ThemeBasicTestingModule { + static withConfig(): ModuleWithProviders { + return { + ngModule: ThemeBasicTestingModule, + providers: [ + BASIC_THEME_NAV_ITEM_PROVIDERS, + BASIC_THEME_STYLES_PROVIDERS, + { + provide: VALIDATION_ERROR_TEMPLATE, + useValue: ValidationErrorComponent, + }, + { + provide: VALIDATION_TARGET_SELECTOR, + useValue: '.form-group', + }, + { + provide: VALIDATION_INVALID_CLASSES, + useValue: 'is-invalid', + }, + ], + }; + } +} diff --git a/angular/projects/theme-basic10_1_0/testing/src/public-api.ts b/angular/projects/theme-basic10_1_0/testing/src/public-api.ts new file mode 100644 index 0000000..24a3ac7 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/testing/src/public-api.ts @@ -0,0 +1 @@ +export * from './lib/theme-basic-testing.module'; diff --git a/angular/projects/theme-basic10_1_0/tsconfig.json b/angular/projects/theme-basic10_1_0/tsconfig.json new file mode 100644 index 0000000..89f56f7 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "target": "es2020" + } +} diff --git a/angular/projects/theme-basic10_1_0/tsconfig.lib.json b/angular/projects/theme-basic10_1_0/tsconfig.lib.json new file mode 100644 index 0000000..80ebc37 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/tsconfig.lib.json @@ -0,0 +1,32 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "target": "ES2022", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [], + "lib": ["dom", "es2020"], + "useDefineForClassFields": false + }, + "exclude": [ + "src/test-setup.ts", + "**/*.spec.ts", + "jest.config.ts", + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/test-setup.ts" + ], + "include": ["**/*.ts"] +} diff --git a/angular/projects/theme-basic10_1_0/tsconfig.lib.prod.json b/angular/projects/theme-basic10_1_0/tsconfig.lib.prod.json new file mode 100644 index 0000000..0e06848 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/tsconfig.lib.prod.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false, + "target": "ES2022", + "useDefineForClassFields": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/angular/projects/theme-basic10_1_0/tsconfig.spec.json b/angular/projects/theme-basic10_1_0/tsconfig.spec.json new file mode 100644 index 0000000..fc61345 --- /dev/null +++ b/angular/projects/theme-basic10_1_0/tsconfig.spec.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["vitest/globals", "vitest/importMeta", "vite/client", "node", "vitest"] + }, + "include": [ + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ], + "files": ["src/test-setup.ts"] +} diff --git a/angular/projects/theme-basic10_1_0/vitest.config.mts b/angular/projects/theme-basic10_1_0/vitest.config.mts new file mode 100644 index 0000000..f76013d --- /dev/null +++ b/angular/projects/theme-basic10_1_0/vitest.config.mts @@ -0,0 +1,22 @@ +import { defineConfig } from 'vitest/config'; +import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; +import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin'; + +export default defineConfig(() => ({ + root: __dirname, + cacheDir: '../../node_modules/.vite/packages/theme-basic', + plugins: [nxViteTsPaths(), nxCopyAssetsPlugin(['*.md'])], + test: { + name: 'theme-basic', + watch: false, + globals: true, + environment: 'jsdom', + setupFiles: ['src/test-setup.ts'], + include: ['{src,tests}/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default'], + coverage: { + reportsDirectory: '../../coverage/packages/theme-basic', + provider: 'v8' as const, + }, + }, +})); diff --git a/angular/src/app/app.component.ts b/angular/src/app/app.component.ts new file mode 100644 index 0000000..68cc759 --- /dev/null +++ b/angular/src/app/app.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { InternetConnectionStatusComponent, LoaderBarComponent } from '@abp/ng.theme.shared'; +import { DynamicLayoutComponent } from '@abp/ng.core'; + +@Component({ + selector: 'app-root', + template: ` + + + + `, + imports: [LoaderBarComponent, DynamicLayoutComponent, InternetConnectionStatusComponent], +}) +export class AppComponent {} diff --git a/angular/src/app/app.config.ts b/angular/src/app/app.config.ts new file mode 100644 index 0000000..0a14391 --- /dev/null +++ b/angular/src/app/app.config.ts @@ -0,0 +1,85 @@ +import { + withValidationBluePrint, + provideAbpThemeShared, + provideLogo, + withEnvironmentOptions, +} from '@abp/ng.theme.shared'; +import { provideThemeBasicConfig } from '@abp/ng.theme.basic'; +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; + +import { appRoutes } from './app.routes'; +import { APP_ROUTE_PROVIDER } from './route.provider'; +import { provideAbpCore, withOptions } from '@abp/ng.core'; +import { environment } from '../environments/environment'; +import { registerLocaleForEsBuild } from '@abp/ng.core/locale'; +import { provideAbpOAuth } from '@abp/ng.oauth'; +import { provideSettingManagementConfig } from '@abp/ng.setting-management/config'; +import { provideAccountConfig } from '@abp/ng.account/config'; +import { provideIdentityConfig } from '@abp/ng.identity/config'; +import { provideTenantManagementConfig } from '@abp/ng.tenant-management/config'; +import { provideFeatureManagementConfig } from '@abp/ng.feature-management'; +import { provideFormlyCore } from '@ngx-formly/core'; +import { withFormlyBootstrap } from '@ngx-formly/bootstrap'; +import { FormlyFieldDropdownComponent } from './formly-field-dropdown/formly-field-dropdown.component'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideRouter(appRoutes), + APP_ROUTE_PROVIDER, + provideAbpCore( + withOptions({ + environment, + registerLocaleFn: registerLocaleForEsBuild(), + }), + ), + provideThemeBasicConfig(), + provideAbpOAuth(), + provideSettingManagementConfig(), + provideAccountConfig(), + provideIdentityConfig(), + provideTenantManagementConfig(), + provideFeatureManagementConfig(), + provideLogo(withEnvironmentOptions(environment)), + provideAbpThemeShared( + withValidationBluePrint({ + wrongPassword: 'Please choose 1q2w3E*', + }), + ), + provideFormlyCore([ + ...withFormlyBootstrap(), + { + types: [ + { name: 'dropdown', component: FormlyFieldDropdownComponent }, + { name: 'select', component: FormlyFieldDropdownComponent }, + ], + validationMessages: [ + { + name: 'required', + message: (error: any, field: any) => `${field.props?.label || 'This field'} is required`, + }, + { + name: 'minlength', + message: (error: any, field: any) => `${field.props?.label || 'This field'} must be at least ${field.props?.minLength} characters`, + }, + { + name: 'minLength', + message: (error: any, field: any) => `${field.props?.label || 'This field'} must be at least ${field.props?.minLength} characters`, + }, + { + name: 'maxlength', + message: (error: any, field: any) => `${field.props?.label || 'This field'} cannot exceed ${field.props?.maxLength} characters`, + }, + { + name: 'maxLength', + message: (error: any, field: any) => `${field.props?.label || 'This field'} cannot exceed ${field.props?.maxLength} characters`, + }, + { + name: 'email', + message: 'Please enter a valid email address', + }, + ], + }, + ]), + ], +}; diff --git a/angular/src/app/app.routes.ts b/angular/src/app/app.routes.ts new file mode 100644 index 0000000..6b41e64 --- /dev/null +++ b/angular/src/app/app.routes.ts @@ -0,0 +1,47 @@ +import { Routes } from '@angular/router'; + +export const appRoutes: Routes = [ + { + path: '', + pathMatch: 'full', + loadChildren: () => import('./home/home.routes').then(m => m.homeRoutes), + }, + { + path: 'account', + loadChildren: () => import('@abp/ng.account').then(m => m.createRoutes()), + }, + { + path: 'identity', + loadChildren: () => import('@abp/ng.identity').then(m => m.createRoutes()), + }, + { + path: 'tenant-management', + loadChildren: () => + import('@abp/ng.tenant-management').then(m => m.createRoutes()), + }, + { + path: 'setting-management', + loadChildren: () => + import('@abp/ng.setting-management').then(m => m.createRoutes()), + }, + { + path : 'dummy-page', + loadComponent: () => import('./dummypage/dummypage.component').then(m => m.DummypageComponent), + }, + { + path : 'dropdown-manual', + loadComponent: () => import('./dropdownmanual/dropdownmanual.component').then(m => m.DropdownmanualComponent), + }, + // { + // path : 'dynamic-form-manual', + // loadComponent: () => import('./dynamic-form-manual/dynamic-form-manual.component').then(m => m.DynamicFormManualComponent), + // }, + { + path : 'modal-manual', + loadComponent: () => import('./modal-manual/modal-manual.component').then(m => m.ModalManualComponent), + }, + { + path : 'form-management', + loadComponent: () => import('./form-management/form-management.component').then(m => m.FormManagementComponent), + } +]; diff --git a/angular/src/app/components/dropdown-component/dropdown-component.component.html b/angular/src/app/components/dropdown-component/dropdown-component.component.html new file mode 100644 index 0000000..f7cf15e --- /dev/null +++ b/angular/src/app/components/dropdown-component/dropdown-component.component.html @@ -0,0 +1,104 @@ +
+ + + + + + + + + + + + + + + + {{ item[bindLabel] }} + + + + + + + + + + + + + +

{{ errorMessage }}

+

{{ hint }}

+
+ diff --git a/angular/src/app/components/dropdown-component/dropdown-component.component.scss b/angular/src/app/components/dropdown-component/dropdown-component.component.scss new file mode 100644 index 0000000..64aadae --- /dev/null +++ b/angular/src/app/components/dropdown-component/dropdown-component.component.scss @@ -0,0 +1,370 @@ +@reference "tailwindcss"; + +:host { + display: block; + width: 100%; +} + +::ng-deep { + .app-dropdown.ng-select { + font-family: var(--font-base, inherit); + + .ng-select-container { + min-height: 42px; + border-radius: 0.5rem; + border: 1px solid var(--clr-input-border); + background-color: var(--clr-input-bg); + padding: 0 6px; + box-shadow: var(--shadow-xs); + transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease; + + .ng-value-container { + padding: 4px 4px; + + .ng-placeholder { + color: var(--clr-input-placeholder); + font-size: 14px; + } + + .ng-input > input { + font-family: inherit; + font-size: 14px; + color: var(--clr-input-text); + } + } + } + + &.ng-select-opened.ng-select-bottom > .ng-select-container { + border-bottom-left-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + border-color: var(--clr-input-border-focus); + } + + &.ng-select-focused:not(.ng-select-opened) > .ng-select-container { + border-color: var(--clr-input-border-focus); + box-shadow: 0 0 0 2px var(--clr-primary-lt); + } + + &.ng-select-disabled .ng-select-container { + cursor: not-allowed; + border-color: var(--clr-input-disabled-border); + background-color: var(--clr-input-disabled-bg); + + .ng-value-container .ng-value { + background-color: var(--clr-input-disabled-bg); + color: var(--clr-input-disabled-text); + } + } + + // Single value display + &.ng-select-single .ng-select-container .ng-value-container .ng-value { + font-size: 14px; + color: var(--clr-input-text); + display: flex; + align-items: center; + + .ng-value-label { + color: var(--clr-input-text); + font-weight: 500; + } + } + + // Multiple/Tags value chips + &.ng-select-multiple .ng-select-container .ng-value-container .ng-value { + background-color: var(--clr-chip-bg); + color: var(--clr-chip-text); + border: 1px solid var(--clr-chip-border); + border-radius: 6px; + padding: 2px 8px; + margin: 2px; + display: inline-flex; + align-items: center; + font-size: 13px; + font-weight: 500; + + .ng-value-icon { + color: var(--clr-chip-icon); + cursor: pointer; + padding-right: 4px; + margin-right: 4px; + border-right: 1px solid var(--clr-chip-border); + display: inline-flex; + align-items: center; + + &:hover { + color: var(--clr-primary-hover); + background-color: var(--clr-chip-icon-hover-bg); + } + } + } + + .ng-arrow-wrapper { + width: 24px; + padding-right: 6px; + cursor: pointer; + + .ng-arrow { + border-color: var(--clr-text-muted) transparent transparent; + border-width: 5px 5px 2.5px; + } + } + + &.ng-select-opened .ng-arrow-wrapper .ng-arrow { + border-color: transparent transparent var(--clr-text-muted); + border-width: 0 5px 5px; + } + + .ng-clear-wrapper { + cursor: pointer; + color: var(--clr-text-subtle); + width: 20px; + font-size: 16px; + + &:hover { + color: var(--clr-text); + } + } + } + + // Error state + .app-dropdown--error.ng-select .ng-select-container { + border-color: var(--clr-input-border-error) !important; + + &:focus-within { + box-shadow: 0 0 0 2px var(--clr-danger-lt) !important; + } + } + + // Dropdown options drawer panel + .ng-dropdown-panel { + background-color: var(--clr-dropdown-bg) !important; + border: 1px solid var(--clr-dropdown-border) !important; + border-radius: 0.5rem !important; + box-shadow: var(--shadow-xl) !important; + margin-top: 4px; + margin-bottom: 4px; + z-index: 1050; + overflow: hidden; + + &.ng-select-top { + bottom: calc(100% + 4px); + border-radius: 0.5rem !important; + } + + &.ng-select-bottom { + top: calc(100% + 4px); + border-radius: 0.5rem !important; + } + + .ng-dropdown-panel-items { + background-color: var(--clr-dropdown-bg) !important; + max-height: 240px; + + .ng-optgroup { + padding: 8px 12px 4px; + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.05em; + color: var(--clr-dropdown-optgroup-text); + background-color: var(--clr-dropdown-optgroup-bg); + border-bottom: 1px solid var(--clr-border); + user-select: none; + } + + .ng-option { + background-color: var(--clr-dropdown-bg); + color: var(--clr-text); + padding: 9px 12px; + font-size: 14px; + cursor: pointer; + display: flex; + align-items: center; + transition: background-color 120ms ease, color 120ms ease; + + .dropdown-option-item { + display: flex; + flex-direction: column; + gap: 2px; + width: 100%; + text-align: left; + + &__label { + font-size: 14px; + font-weight: 500; + color: inherit; + line-height: 1.35; + } + + &__desc { + font-size: 12px; + color: var(--clr-text-subtle); + line-height: 1.35; + transition: color 120ms ease; + } + } + + &.ng-option-marked { + background-color: var(--clr-dropdown-hover-bg) !important; + color: var(--clr-dropdown-hover-text) !important; + + .dropdown-option-item__desc { + color: var(--clr-dropdown-hover-text) !important; + opacity: 0.85; + } + } + + &.ng-option-selected { + background-color: var(--clr-dropdown-selected-bg) !important; + color: var(--clr-dropdown-selected-text) !important; + font-weight: 600; + + .dropdown-option-item__desc { + color: var(--clr-dropdown-selected-text) !important; + opacity: 0.85; + } + } + + &.ng-option-disabled { + background-color: var(--clr-bg-subtle) !important; + color: var(--clr-text-subtle) !important; + cursor: not-allowed; + } + } + } + + // Pinned drawer search header + .ng-dropdown-header { + padding: 8px !important; + border-bottom: 1px solid var(--clr-border) !important; + background-color: var(--clr-dropdown-bg) !important; + + .dropdown-drawer-search { + position: relative; + display: flex; + align-items: center; + width: 100%; + + &__icon { + position: absolute; + left: 10px; + width: 15px; + height: 15px; + color: var(--clr-text-subtle); + pointer-events: none; + } + + &__input { + width: 100%; + height: 36px; + padding: 0 32px 0 32px; + border-radius: 6px; + border: 1px solid var(--clr-input-border); + background-color: var(--clr-bg-subtle); + color: var(--clr-input-text); + font-family: inherit; + font-size: 13.5px; + outline: none; + transition: border-color 150ms ease, box-shadow 150ms ease, background-color 150ms ease; + + &::placeholder { + color: var(--clr-input-placeholder); + font-size: 13px; + } + + &:focus { + border-color: var(--clr-primary); + background-color: var(--clr-dropdown-bg); + box-shadow: 0 0 0 2px var(--clr-primary-lt); + } + } + + &__clear { + position: absolute; + right: 6px; + display: flex; + align-items: center; + justify-content: center; + width: 22px; + height: 22px; + border: none; + background: transparent; + color: var(--clr-text-subtle); + border-radius: 4px; + cursor: pointer; + padding: 0; + + svg { + width: 16px; + height: 16px; + } + + &:hover { + color: var(--clr-text); + background-color: var(--clr-bg-hover); + } + } + } + } + + // Infinite scroll / pagination footer + .ng-dropdown-footer { + padding: 8px 12px !important; + border-top: 1px solid var(--clr-border) !important; + background-color: var(--clr-dropdown-bg) !important; + + .dropdown-drawer-footer { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + font-size: 12.5px; + color: var(--clr-text-muted); + font-weight: 500; + padding: 4px 0; + + .dropdown-spinner { + width: 14px; + height: 14px; + border: 2px solid var(--clr-border-strong); + border-top-color: var(--clr-primary); + border-radius: 50%; + animation: dropdown-spin 0.6s linear infinite; + } + } + } + + // Empty state + .dropdown-empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 6px; + padding: 24px 16px; + color: var(--clr-text-subtle); + text-align: center; + + &__icon { + width: 28px; + height: 28px; + opacity: 0.6; + } + + &__text { + font-size: 13px; + } + } + } +} + +@keyframes dropdown-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + + diff --git a/angular/src/app/components/dropdown-component/dropdown-component.component.spec.ts b/angular/src/app/components/dropdown-component/dropdown-component.component.spec.ts new file mode 100644 index 0000000..bc957d5 --- /dev/null +++ b/angular/src/app/components/dropdown-component/dropdown-component.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DropdownComponentComponent } from './dropdown-component.component'; + +describe('DropdownComponentComponent', () => { + let component: DropdownComponentComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DropdownComponentComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DropdownComponentComponent); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular/src/app/components/dropdown-component/dropdown-component.component.ts b/angular/src/app/components/dropdown-component/dropdown-component.component.ts new file mode 100644 index 0000000..f6f61ba --- /dev/null +++ b/angular/src/app/components/dropdown-component/dropdown-component.component.ts @@ -0,0 +1,262 @@ +import { CommonModule } from '@angular/common'; +import { + ChangeDetectorRef, + Component, + ElementRef, + EventEmitter, + forwardRef, + inject, + Input, + OnDestroy, + OnInit, + Output, + ViewChild, +} from '@angular/core'; +import { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { NgSelectModule } from '@ng-select/ng-select'; +import { debounceTime, distinctUntilChanged, Subject, Subscription } from 'rxjs'; + +export interface DropdownOption { + label: string; + value: any; + description?: string; + disabled?: boolean; + group?: string; +} + +export type DropdownType = 'single' | 'multiple' | 'tags' | 'grouped'; + +/** + * Reusable dropdown component. + * + * Wraps @ng-select/ng-select and supports: + * - "single" → normal single-choice dropdown + * - "multiple" → multi-select with chips + * - "tags" → multi-select with free-text typing + * - "grouped" → optgroup section headers + * - Option subtitles → dual-line label + short description + * - Drawer search → search box pinned inside the option panel + * - Server search → debounced API querying with remote pagination & infinite scroll + * + * Implements ControlValueAccessor, working interchangeably with + * [(ngModel)] and [formControl] / formControlName. + */ + +@Component({ + selector: 'app-dropdown-component', + imports: [CommonModule, FormsModule, NgSelectModule], + templateUrl: './dropdown-component.component.html', + styleUrl: './dropdown-component.component.scss', + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => DropdownComponentComponent), + multi: true, + }, + ], +}) +export class DropdownComponentComponent implements OnInit, OnDestroy, ControlValueAccessor { + private readonly cdr = inject(ChangeDetectorRef); + + @ViewChild('drawerSearchInput') drawerSearchInputElement?: ElementRef; + + /** Options to render. Default shape is { label, value, description?, group? } — override bindLabel/bindValue/bindDescription for custom shapes. */ + @Input() items: DropdownOption[] | any[] = []; + + /** Controls select behavior: 'single' | 'multiple' | 'tags' | 'grouped'. Defaults to 'single'. */ + @Input() type: DropdownType = 'single'; + + @Input() bindLabel = 'label'; + @Input() bindValue = 'value'; + @Input() bindDescription = 'description'; + /** Field name holding the group label. Only used when type="grouped". */ + @Input() groupBy = 'group'; + + @Input() label = ''; + @Input() placeholder = 'Select an option'; + @Input() hint = ''; + @Input() errorMessage = ''; + + @Input() required = false; + @Input() disabled = false; + @Input() clearable = true; + @Input() loading = false; + @Input() searchable = true; + @Input() clearSearchOnAdd = true; + @Input() hideSelected = false; + @Input() closeOnSelect?: boolean; + @Input() appendTo?: string; + @Input() dropdownPosition: 'bottom' | 'top' | 'auto' = 'auto'; + @Input() virtualScroll = false; + + /** Pins a search input box inside the top header of the dropdown option drawer. */ + @Input() showDrawerSearch = false; + @Input() drawerSearchPlaceholder = 'Type to search...'; + + /** Server-side search mode: disables local array filtering so the dropdown reflects API results directly. */ + @Input() serverSearch = false; + + /** Displays a loading spinner at the bottom of the drawer when fetching the next page. */ + @Input() loadingMore = false; + + /** Whether additional pages exist on the server for infinite scrolling. */ + @Input() hasMore = true; + + /** Debounce time in milliseconds for search input emissions. */ + @Input() searchDebounce = 300; + + /** Emits the new value on every change, in addition to normal ngModel/formControl binding. */ + @Output() selectionChange = new EventEmitter(); + @Output() open = new EventEmitter(); + @Output() close = new EventEmitter(); + @Output() clear = new EventEmitter(); + + /** Emits raw search term when typed in either standard search or drawer search box. */ + @Output() search = new EventEmitter<{ term: string; items: any[] }>(); + + /** Emits debounced search string specifically designed for triggering API search calls. */ + @Output() searchChange = new EventEmitter(); + + /** Emits when user scrolls to the bottom of the option list (for pagination / loading next page). */ + @Output() scrollToEnd = new EventEmitter(); + + value: any = null; + isDisabledByForm = false; + drawerSearchTerm = ''; + + private readonly searchSubject = new Subject(); + private searchSubscription?: Subscription; + + private onChange: (value: any) => void = () => {}; + private onTouched: () => void = () => {}; + + ngOnInit(): void { + this.searchSubscription = this.searchSubject + .pipe(debounceTime(this.searchDebounce), distinctUntilChanged()) + .subscribe((term) => { + this.searchChange.emit(term); + this.search.emit({ term, items: this.items }); + }); + } + + ngOnDestroy(): void { + this.searchSubscription?.unsubscribe(); + } + + get isMultiple(): boolean { + return this.type === 'multiple' || this.type === 'tags'; + } + + get allowAddTag(): boolean { + return this.type === 'tags'; + } + + get computedCloseOnSelect(): boolean { + if (this.closeOnSelect !== undefined) { + return this.closeOnSelect; + } + // Single & Grouped should close upon selection; Multiple & Tags stay open + return !this.isMultiple; + } + + get groupByField(): string | undefined { + return this.type === 'grouped' ? this.groupBy : undefined; + } + + /** Custom search function to bypass internal client filtering when serverSearch is true. */ + customSearchFn = (term: string, item: any): boolean => { + if (this.serverSearch || this.showDrawerSearch) { + return true; // Bypass local filtering, display items provided by parent / API + } + const label = item[this.bindLabel] ? String(item[this.bindLabel]).toLowerCase() : ''; + const desc = item[this.bindDescription] ? String(item[this.bindDescription]).toLowerCase() : ''; + const search = (term || '').toLowerCase(); + return label.includes(search) || desc.includes(search); + }; + + handleModelChange(val: any): void { + this.value = val; + this.onChange(val); + this.selectionChange.emit(val); + this.cdr.markForCheck(); + } + + handleItemChange(item: any): void { + // ng-select (change) event with raw selected item(s) + } + + handleBlur(): void { + this.onTouched(); + this.cdr.markForCheck(); + } + + handleOpen(): void { + this.open.emit(); + if (this.showDrawerSearch) { + setTimeout(() => { + this.drawerSearchInputElement?.nativeElement?.focus(); + }, 60); + } + } + + handleClose(): void { + this.close.emit(); + this.onTouched(); + this.cdr.markForCheck(); + } + + handleClear(): void { + this.clear.emit(); + if (this.showDrawerSearch && this.drawerSearchTerm) { + this.clearDrawerSearch(); + } + } + + handleNativeSearch(event: { term: string; items: any[] }): void { + if (!this.showDrawerSearch) { + this.searchSubject.next(event.term); + } + } + + onDrawerSearchInput(term: string): void { + this.drawerSearchTerm = term; + this.searchSubject.next(term); + } + + clearDrawerSearch(event?: Event): void { + if (event) { + event.stopPropagation(); + } + this.drawerSearchTerm = ''; + this.searchSubject.next(''); + this.drawerSearchInputElement?.nativeElement?.focus(); + } + + handleScrollToEnd(): void { + if (!this.loading && !this.loadingMore && this.hasMore) { + this.scrollToEnd.emit(); + } + } + + // --- ControlValueAccessor --- + + writeValue(value: any): void { + this.value = value; + this.cdr.markForCheck(); + } + + registerOnChange(fn: (value: any) => void): void { + this.onChange = fn; + } + + registerOnTouched(fn: () => void): void { + this.onTouched = fn; + } + + setDisabledState(isDisabled: boolean): void { + this.isDisabledByForm = isDisabled; + this.cdr.markForCheck(); + } +} + + diff --git a/angular/src/app/components/dynamic-form/dynamic-form.component.html b/angular/src/app/components/dynamic-form/dynamic-form.component.html new file mode 100644 index 0000000..98db774 --- /dev/null +++ b/angular/src/app/components/dynamic-form/dynamic-form.component.html @@ -0,0 +1,23 @@ +
+ + + +
+ + +
+
diff --git a/angular/src/app/components/dynamic-form/dynamic-form.component.scss b/angular/src/app/components/dynamic-form/dynamic-form.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular/src/app/components/dynamic-form/dynamic-form.component.spec.ts b/angular/src/app/components/dynamic-form/dynamic-form.component.spec.ts new file mode 100644 index 0000000..7540ca2 --- /dev/null +++ b/angular/src/app/components/dynamic-form/dynamic-form.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DynamicFormComponent } from './dynamic-form.component'; + +describe('DynamicFormComponent', () => { + let component: DynamicFormComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DynamicFormComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DynamicFormComponent); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular/src/app/components/dynamic-form/dynamic-form.component.ts b/angular/src/app/components/dynamic-form/dynamic-form.component.ts new file mode 100644 index 0000000..eff99ec --- /dev/null +++ b/angular/src/app/components/dynamic-form/dynamic-form.component.ts @@ -0,0 +1,43 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core'; + +/** + * Generic form host. Give it a FormGroup, a model, and a list of + * FormlyFieldConfig entries — it renders every field via its registered + * Formly type (e.g. 'dropdown' -> FormlyFieldDropdownComponent, 'input', + * 'radio', etc.) and emits the model on submit. + * + * This component doesn't know or care what field types are inside it — + * add new reusable components (input, radio, checkbox, ...) by registering + * them as Formly types in app.config.ts, the same way 'dropdown' is wired. + * No changes needed here or in the field components themselves. + */ +@Component({ + selector: 'app-dynamic-form', + imports: [CommonModule, ReactiveFormsModule, FormlyModule], + templateUrl: './dynamic-form.component.html', + styleUrl: './dynamic-form.component.scss', +}) +export class DynamicFormComponent { + @Input() form: FormGroup = new FormGroup({}); + @Input() fields: FormlyFieldConfig[] = []; + @Input() model: Record = {}; + + @Input() submitLabel = 'Save'; + @Input() cancelLabel = 'Cancel'; + @Input() showActions = true; + + @Output() formSubmit = new EventEmitter(); + @Output() formCancel = new EventEmitter(); + @Output() modelChange = new EventEmitter(); + + onSubmit(): void { + if (this.form.invalid) { + this.form.markAllAsTouched(); + return; + } + this.formSubmit.emit(this.model); + } +} diff --git a/angular/src/app/components/modal/modal.component.html b/angular/src/app/components/modal/modal.component.html new file mode 100644 index 0000000..b0e0fe1 --- /dev/null +++ b/angular/src/app/components/modal/modal.component.html @@ -0,0 +1,82 @@ + + diff --git a/angular/src/app/components/modal/modal.component.scss b/angular/src/app/components/modal/modal.component.scss new file mode 100644 index 0000000..2172cbe --- /dev/null +++ b/angular/src/app/components/modal/modal.component.scss @@ -0,0 +1,204 @@ +@reference "tailwindcss"; + +:host { + display: contents; +} + +.modal-root { + z-index: 1050; +} + +/* ── Backdrop Overlay ────────────────────────────────────────── */ +.modal-backdrop { + z-index: 1051; + background-color: rgba(5, 10, 20, 0.7); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + animation: modal-fade-in 180ms cubic-bezier(0.16, 1, 0.3, 1) forwards; +} + +/* ── Centering Container ─────────────────────────────────────── */ +.modal-container { + position: relative; + z-index: 1052; + pointer-events: none; +} + +/* ── Modal Dialog Shell ──────────────────────────────────────── */ +.modal-panel { + pointer-events: auto; + position: relative; + background-color: var(--clr-bg-card); + border: 1px solid var(--clr-border); + color: var(--clr-text); + border-radius: 1.125rem; + box-shadow: + 0 20px 25px -5px rgba(0, 0, 0, 0.3), + 0 8px 10px -6px rgba(0, 0, 0, 0.25), + 0 0 0 1px var(--clr-border); + animation: modal-scale-in 220ms cubic-bezier(0.16, 1, 0.3, 1) forwards; + transform-origin: center center; + filter: none !important; + backdrop-filter: none !important; + -webkit-backdrop-filter: none !important; + + // Responsive sizing presets + &--sm { + max-width: 420px; + } + + &--md { + max-width: 520px; + } + + &--lg { + max-width: 680px; + } + + &--xl { + max-width: 860px; + } + + &--2xl { + max-width: 1100px; + } + + &--full { + max-width: calc(100vw - 2rem); + width: 100%; + min-height: calc(100vh - 4rem); + } +} + +/* ── Modal Header ────────────────────────────────────────────── */ +.modal-header { + border-color: var(--clr-border); + background-color: var(--clr-bg-card); + padding: 1.125rem 1.5rem; + + .modal-title { + color: var(--clr-text); + font-weight: 600; + letter-spacing: -0.01em; + font-family: var(--font-base, inherit); + } + + .modal-subtitle { + color: var(--clr-text-muted); + font-size: 0.8125rem; + line-height: 1.4; + } + + .modal-close-btn { + color: var(--clr-text-subtle); + background: transparent; + border: none; + cursor: pointer; + transition: all 150ms ease; + + &:hover { + background-color: var(--clr-bg-hover); + color: var(--clr-text); + transform: scale(1.05); + } + + &:focus-visible { + outline: 2px solid var(--clr-primary); + outline-offset: 2px; + } + } +} + +/* ── Variant Icon Badges ─────────────────────────────────────── */ +.modal-icon-badge { + width: 38px; + height: 38px; + border-radius: 0.75rem; + display: inline-flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + + &--default { + background-color: var(--clr-bg-hover); + border: 1px solid var(--clr-border); + color: var(--clr-text); + } + + &--primary, + &--info { + background-color: var(--clr-primary-lt); + border: 1px solid rgba(99, 102, 241, 0.25); + color: var(--clr-primary); + } + + &--danger { + background-color: var(--clr-danger-lt); + border: 1px solid rgba(239, 68, 68, 0.25); + color: var(--clr-danger); + } + + &--warning { + background-color: var(--clr-warning-lt); + border: 1px solid rgba(245, 158, 11, 0.25); + color: var(--clr-warning); + } + + &--success { + background-color: var(--clr-success-lt); + border: 1px solid rgba(16, 185, 129, 0.25); + color: var(--clr-success); + } +} + +/* ── Modal Body ──────────────────────────────────────────────── */ +.modal-body { + color: var(--clr-text); + padding: 1.25rem 1.5rem; + line-height: 1.6; + + // Modern subtle custom scrollbar + scrollbar-width: thin; + scrollbar-color: var(--clr-border) transparent; + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-track { + background: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--clr-border); + border-radius: 3px; + } +} + +/* ── Modal Footer ────────────────────────────────────────────── */ +.modal-footer { + border-color: var(--clr-border); + background-color: var(--clr-bg-subtle); + padding: 0.875rem 1.5rem; +} + +/* ── Animations ──────────────────────────────────────────────── */ +@keyframes modal-fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes modal-scale-in { + from { + opacity: 0; + transform: scale(0.96) translateY(-8px); + } + to { + opacity: 1; + transform: scale(1) translateY(0); + } +} diff --git a/angular/src/app/components/modal/modal.component.spec.ts b/angular/src/app/components/modal/modal.component.spec.ts new file mode 100644 index 0000000..c9ae45d --- /dev/null +++ b/angular/src/app/components/modal/modal.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ModalComponent } from './modal.component'; + +describe('ModalComponent', () => { + let component: ModalComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ModalComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ModalComponent); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular/src/app/components/modal/modal.component.ts b/angular/src/app/components/modal/modal.component.ts new file mode 100644 index 0000000..dfa0f23 --- /dev/null +++ b/angular/src/app/components/modal/modal.component.ts @@ -0,0 +1,128 @@ +import { + Component, + ElementRef, + EventEmitter, + HostListener, + Input, + OnChanges, + OnDestroy, + Output, + SimpleChanges, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { A11yModule } from '@angular/cdk/a11y'; + +export type ModalSize = 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'; +export type ModalVariant = 'default' | 'primary' | 'danger' | 'warning' | 'success' | 'info'; +export type ModalPosition = 'center' | 'top'; + +/** + * Professional, reusable modal dialog component. + * + * Fully integrated with the application theme (supports Light/Dark mode via CSS tokens). + * Uses @angular/cdk's A11yModule (cdkTrapFocus) for keyboard accessibility and focus trapping. + * + * Features: + * - Responsive sizing: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' + * - Semantic variants: 'default' | 'primary' | 'danger' | 'warning' | 'success' | 'info' + * - Title, subtitle, and badge icon support + * - Custom content projection via [modal-header], [modal-body], and [modal-footer] + * - Smooth backdrop fade and panel scale transitions + * - Accessible Esc and backdrop click dismissing + * - Automatic background scroll-lock management +*/ + +@Component({ + selector: 'app-modal', + imports: [CommonModule, A11yModule], + templateUrl: './modal.component.html', + styleUrl: './modal.component.scss', +}) +export class ModalComponent implements OnChanges, OnDestroy { + @Input() isOpen = false; + @Input() title = ''; + @Input() subtitle?: string; + @Input() iconClass?: string; + @Input() variant: ModalVariant = 'default'; + @Input() size: ModalSize = 'md'; + @Input() position: ModalPosition = 'center'; + @Input() scrollable = true; + @Input() closeOnBackdropClick = true; + @Input() closeOnEsc = true; + @Input() showCloseButton = true; + /** Set false when you don't project any modal-footer content to omit the bottom action bar. */ + @Input() showFooter = true; + + @Output() closed = new EventEmitter(); + @Output() opened = new EventEmitter(); + + private previouslyFocusedElement: HTMLElement | null = null; + private originalBodyOverflow = ''; + + constructor(private hostRef: ElementRef) {} + + ngOnChanges(changes: SimpleChanges): void { + if (!changes['isOpen']) { + return; + } + + if (this.isOpen) { + this.previouslyFocusedElement = document.activeElement as HTMLElement; + this.originalBodyOverflow = document.body.style.overflow; + document.body.style.overflow = 'hidden'; + this.opened.emit(); + } else { + this.unlockBodyScroll(); + this.previouslyFocusedElement?.focus?.(); + } + } + + ngOnDestroy(): void { + if (this.isOpen) { + this.unlockBodyScroll(); + } + } + + private unlockBodyScroll(): void { + document.body.style.overflow = this.originalBodyOverflow || ''; + } + + @HostListener('document:keydown.escape') + onEscKey(): void { + if (this.isOpen && this.closeOnEsc) { + this.close(); + } + } + + onBackdropClick(): void { + if (this.closeOnBackdropClick) { + this.close(); + } + } + + close(): void { + this.closed.emit(); + } + + get sizeClass(): string { + switch (this.size) { + case 'sm': + return 'modal-panel--sm'; + case 'lg': + return 'modal-panel--lg'; + case 'xl': + return 'modal-panel--xl'; + case '2xl': + return 'modal-panel--2xl'; + case 'full': + return 'modal-panel--full'; + default: + return 'modal-panel--md'; + } + } + + get positionClass(): string { + return this.position === 'top' ? 'items-start pt-12 md:pt-16' : 'items-center'; + } +} + diff --git a/angular/src/app/dropdownmanual/dropdownmanual.component.html b/angular/src/app/dropdownmanual/dropdownmanual.component.html new file mode 100644 index 0000000..6185f7d --- /dev/null +++ b/angular/src/app/dropdownmanual/dropdownmanual.component.html @@ -0,0 +1,259 @@ +
+
+

Dropdown Component — Usage Guide

+

+ One reusable <app-dropdown> + covering single-select, multi-select, tag input, and grouped options — switch behavior with the + type input. Works with both + ngModel and reactive forms. +

+
+ + +
+
+

1. Single select

+

Set type="single" — or omit it, since it's the default.

+
+ + + + +

Selected value: {{ singleValue || '—' }}

+ +
{{ singleSnippet }}
+
+ + +
+
+

2. Multi-select

+

Set type="multiple". Value becomes an array.

+
+ + + + +

+ Selected values: {{ multiValue.length ? multiValue.join(', ') : '—' }} +

+ +
{{ multiSnippet }}
+
+ + +
+
+

3. Tag input

+

Set type="tags" to also let users type free-text entries not in the list.

+
+ + + + +
{{ tagsSnippet }}
+
+ + +
+
+

4. Grouped options

+

+ Set type="grouped" and groupBy to the field name holding each option's group label. +

+
+ + + + +
{{ groupedSnippet }}
+
+ + +
+
+

5. With Reactive Forms

+

+ Bind [formControl] instead of ngModel — the component implements + ControlValueAccessor, so both work identically. +

+
+ + + + +
{{ reactiveFormSnippet }}
+
+ + +
+
+

6. Option with Short Description

+

+ Options display both a primary title and a secondary explanatory description underneath. +

+
+ + + + +

Selected plan: {{ planValue || '—' }}

+ +
{{ descriptionSnippet }}
+
+ + +
+
+
+

7. Paginated Server Search (In-Drawer Search & Infinite Scroll)

+ + API Paginated + +
+

+ Search box is embedded directly inside the dropdown option drawer. Searches query the remote API in real-time with 300ms debounce. Scrolling to the bottom loads the next page of 10 items. +

+
+ + + + +
+
+ Selected User ID: + {{ selectedServerUserId || 'None selected' }} +
+
+ + {{ serverUsers.length }} of {{ totalServerMatches }} users loaded (Page {{ serverCurrentPage }}) + + + Scroll down for more + + + All results loaded + +
+
+ +
{{ serverSearchSnippet }}
+
+ + +
+

Inputs & Outputs reference

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyTypeDescription
type'single' | 'multiple' | 'tags' | 'grouped'Controls select behavior. Default: 'single'.
itemsDropdownOption[] | any[]Option list to render. Supports { label, value, description?, group? }.
showDrawerSearchbooleanPins an interactive search input inside the dropdown option drawer.
serverSearchbooleanBypasses local filtering to let the backend API manage results directly.
loadingMorebooleanShows a loading spinner in the drawer footer while loading the next page.
hasMorebooleanControls whether infinite scroll continues triggering next page requests.
bindLabel / bindValuestringField names to read the label/value from, for custom option shapes.
bindDescriptionstringField name holding the short description subtitle. Default: 'description'.
(searchChange)EventEmitter<string>Emits debounced search string (300ms) for direct backend API calls.
(scrollToEnd)EventEmitter<void>Fires when user scrolls to the bottom of the drawer to fetch the next page.
(selectionChange)EventEmitter<any>Emits on every selection change, in addition to ngModel/formControl updates.
+
+
+
+ diff --git a/angular/src/app/dropdownmanual/dropdownmanual.component.scss b/angular/src/app/dropdownmanual/dropdownmanual.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular/src/app/dropdownmanual/dropdownmanual.component.spec.ts b/angular/src/app/dropdownmanual/dropdownmanual.component.spec.ts new file mode 100644 index 0000000..b75956c --- /dev/null +++ b/angular/src/app/dropdownmanual/dropdownmanual.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DropdownmanualComponent } from './dropdownmanual.component'; + +describe('DropdownmanualComponent', () => { + let component: DropdownmanualComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DropdownmanualComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DropdownmanualComponent); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular/src/app/dropdownmanual/dropdownmanual.component.ts b/angular/src/app/dropdownmanual/dropdownmanual.component.ts new file mode 100644 index 0000000..61b8dba --- /dev/null +++ b/angular/src/app/dropdownmanual/dropdownmanual.component.ts @@ -0,0 +1,277 @@ +import { CommonModule } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { DropdownComponentComponent, DropdownOption } from '../components/dropdown-component/dropdown-component.component'; + +/** + * Living usage guide for . + * Demonstrates single-select, multi-select, tag input, grouped options, + * descriptions, and server-side paginated search with infinite scroll. + */ + +interface MockUser { + id: string; + name: string; + role: string; + department: string; +} + +@Component({ + selector: 'app-dropdownmanual', + imports: [CommonModule, FormsModule, ReactiveFormsModule, DropdownComponentComponent], + templateUrl: './dropdownmanual.component.html', + styleUrl: './dropdownmanual.component.scss', +}) +export class DropdownmanualComponent implements OnInit { + // Static datasets + countries: DropdownOption[] = [ + { label: 'India', value: 'IN' }, + { label: 'United States', value: 'US' }, + { label: 'Germany', value: 'DE' }, + { label: 'Japan', value: 'JP' }, + ]; + + skills: DropdownOption[] = [ + { label: 'Angular', value: 'angular' }, + { label: 'TypeScript', value: 'ts' }, + { label: 'Tailwind CSS', value: 'tailwind' }, + { label: 'ABP.io', value: 'abp' }, + ]; + + fruitGroups: DropdownOption[] = [ + { label: 'Apple', value: 'apple', group: 'Citrus-free' }, + { label: 'Banana', value: 'banana', group: 'Citrus-free' }, + { label: 'Orange', value: 'orange', group: 'Citrus' }, + { label: 'Lemon', value: 'lemon', group: 'Citrus' }, + ]; + + planOptions: DropdownOption[] = [ + { label: 'Starter Plan', value: 'starter', description: 'Up to 5 team members with standard community support' }, + { label: 'Professional Plan', value: 'pro', description: 'Up to 25 members, advanced analytics, and priority email support' }, + { label: 'Enterprise Plan', value: 'enterprise', description: 'Unlimited members, custom integrations, dedicated SLA, and SSO security' }, + { label: 'Custom Contract', value: 'custom', description: 'Tailored infrastructure, custom billing, and personal account manager' }, + ]; + + // Component Models + singleValue: string | null = null; + multiValue: string[] = []; + tagsValue: string[] = []; + groupedValue: string | null = null; + planValue: string | null = null; + selectedServerUserId: string | null = null; + + countryControl = new FormControl(null); + + // --- Server Search & Pagination State (Mock API) --- + serverUsers: DropdownOption[] = []; + loadingUsers = false; + loadingMoreUsers = false; + hasMoreUsers = true; + serverCurrentPage = 1; + serverSearchTerm = ''; + totalServerMatches = 0; + + // Mock server database of 50 users + private readonly mockUsersDb: MockUser[] = [ + { id: 'usr-1', name: 'Aarav Patel', role: 'Full Stack Engineer', department: 'Engineering' }, + { id: 'usr-2', name: 'Sophia Chen', role: 'Frontend Architect', department: 'Engineering' }, + { id: 'usr-3', name: 'Liam Johnson', role: 'Product Designer', department: 'Product & UX' }, + { id: 'usr-4', name: 'Priya Sharma', role: 'Engineering Manager', department: 'Leadership' }, + { id: 'usr-5', name: 'Lucas Müller', role: 'DevOps & Cloud Lead', department: 'Infrastructure' }, + { id: 'usr-6', name: 'Elena Rostova', role: 'QA Automation Lead', department: 'Quality Assurance' }, + { id: 'usr-7', name: 'Marcus Vance', role: 'Security Engineer', department: 'Cybersecurity' }, + { id: 'usr-8', name: 'Aisha Al-Mansoor', role: 'Backend Specialist', department: 'Engineering' }, + { id: 'usr-9', name: 'Daniel Kim', role: 'Mobile App Lead', department: 'Mobile Apps' }, + { id: 'usr-10', name: 'Chloe Dubois', role: 'Scrum Master', department: 'Agile Operations' }, + { id: 'usr-11', name: 'Vikram Mehta', role: 'Data Scientist', department: 'Data Intelligence' }, + { id: 'usr-12', name: 'Hannah Abbott', role: 'Database Administrator', department: 'Infrastructure' }, + { id: 'usr-13', name: 'Carlos Silva', role: 'Solutions Architect', department: 'Enterprise Systems' }, + { id: 'usr-14', name: 'Fatima Zahra', role: 'Product Manager', department: 'Product & UX' }, + { id: 'usr-15', name: 'Oliver Wright', role: 'UI/UX Specialist', department: 'Product & UX' }, + { id: 'usr-16', name: 'Ananya Rao', role: 'Frontend Developer', department: 'Engineering' }, + { id: 'usr-17', name: 'Noah Becker', role: 'Site Reliability Engineer', department: 'Infrastructure' }, + { id: 'usr-18', name: 'Mei Ling', role: 'Machine Learning Engineer', department: 'Data Intelligence' }, + { id: 'usr-19', name: 'Gabriel Rossi', role: 'API Platform Engineer', department: 'Engineering' }, + { id: 'usr-20', name: 'Zara Kazmi', role: 'Release Manager', department: 'Agile Operations' }, + { id: 'usr-21', name: 'Arjun Das', role: 'Systems Engineer', department: 'Infrastructure' }, + { id: 'usr-22', name: 'Isabella Scott', role: 'Technical Writer', department: 'Documentation' }, + { id: 'usr-23', name: 'Felix Meyer', role: 'Performance Engineer', department: 'Quality Assurance' }, + { id: 'usr-24', name: 'Diya Sen', role: 'Cloud Security Analyst', department: 'Cybersecurity' }, + { id: 'usr-25', name: 'Benjamin Clark', role: 'Integration Developer', department: 'Enterprise Systems' }, + { id: 'usr-26', name: 'Kavita Nair', role: 'Mobile Developer', department: 'Mobile Apps' }, + { id: 'usr-27', name: 'Samuel Taylor', role: 'Observability Engineer', department: 'Infrastructure' }, + { id: 'usr-28', name: 'Amira Hassan', role: 'Frontend Developer', department: 'Engineering' }, + { id: 'usr-29', name: 'Matteo Conti', role: 'Product Strategist', department: 'Product & UX' }, + { id: 'usr-30', name: 'Rohan Gupta', role: 'Full Stack Engineer', department: 'Engineering' }, + { id: 'usr-31', name: 'Grace O\'Connor', role: 'Compliance Officer', department: 'Governance' }, + { id: 'usr-32', name: 'Kenji Sato', role: 'Platform Architect', department: 'Engineering' }, + { id: 'usr-33', name: 'Siddharth Roy', role: 'Backend Developer', department: 'Engineering' }, + { id: 'usr-34', name: 'Layla Morales', role: 'Design Systems Lead', department: 'Product & UX' }, + { id: 'usr-35', name: 'Alexander Novak', role: 'Data Analyst', department: 'Data Intelligence' }, + { id: 'usr-36', name: 'Tanvi Joshi', role: 'QA Engineer', department: 'Quality Assurance' }, + { id: 'usr-37', name: 'David Fischer', role: 'Infrastructure Architect', department: 'Infrastructure' }, + { id: 'usr-38', name: 'Noor Mahmoud', role: 'Software Engineer', department: 'Engineering' }, + { id: 'usr-39', name: 'Oscar Lindqvist', role: 'Technical Lead', department: 'Engineering' }, + { id: 'usr-40', name: 'Sneha Kulkarni', role: 'Scrum Coach', department: 'Agile Operations' }, + { id: 'usr-41', name: 'Hugo Blanc', role: 'Security Analyst', department: 'Cybersecurity' }, + { id: 'usr-42', name: 'Sunita Reddy', role: 'Operations Lead', department: 'Agile Operations' }, + { id: 'usr-43', name: 'Julian Romero', role: 'API Developer', department: 'Engineering' }, + { id: 'usr-44', name: 'Yuki Takahashi', role: 'Frontend Engineer', department: 'Engineering' }, + { id: 'usr-45', name: 'Nikhil Verma', role: 'Cloud Engineer', department: 'Infrastructure' }, + { id: 'usr-46', name: 'Stella Maris', role: 'UX Researcher', department: 'Product & UX' }, + { id: 'usr-47', name: 'Zack Evans', role: 'Test Automation Engineer', department: 'Quality Assurance' }, + { id: 'usr-48', name: 'Isha Deshmukh', role: 'Data Engineer', department: 'Data Intelligence' }, + { id: 'usr-49', name: 'Victor Hugo', role: 'Principal Architect', department: 'Leadership' }, + { id: 'usr-50', name: 'Maya Angelis', role: 'Head of Engineering', department: 'Leadership' }, + ]; + + ngOnInit(): void { + this.loadInitialUsers(); + } + + loadInitialUsers(): void { + this.loadingUsers = true; + this.serverCurrentPage = 1; + this.serverSearchTerm = ''; + + this.mockFetchUsersApi(this.serverSearchTerm, 1, 10).then((res) => { + this.serverUsers = res.items; + this.hasMoreUsers = res.hasMore; + this.totalServerMatches = res.total; + this.loadingUsers = false; + }); + } + + onServerSearch(searchTerm: string): void { + this.serverSearchTerm = searchTerm; + this.serverCurrentPage = 1; + this.loadingUsers = true; + + this.mockFetchUsersApi(searchTerm, 1, 10).then((res) => { + this.serverUsers = res.items; + this.hasMoreUsers = res.hasMore; + this.totalServerMatches = res.total; + this.loadingUsers = false; + }); + } + + onServerScrollToEnd(): void { + if (this.loadingMoreUsers || !this.hasMoreUsers) { + return; + } + + this.loadingMoreUsers = true; + const nextPage = this.serverCurrentPage + 1; + + this.mockFetchUsersApi(this.serverSearchTerm, nextPage, 10).then((res) => { + this.serverCurrentPage = nextPage; + this.serverUsers = [...this.serverUsers, ...res.items]; + this.hasMoreUsers = res.hasMore; + this.totalServerMatches = res.total; + this.loadingMoreUsers = false; + }); + } + + /** Simulated Backend API call with 350ms network delay and pagination */ + private mockFetchUsersApi( + term: string, + page: number, + pageSize: number + ): Promise<{ items: DropdownOption[]; hasMore: boolean; total: number }> { + return new Promise((resolve) => { + setTimeout(() => { + const query = (term || '').trim().toLowerCase(); + const filtered = this.mockUsersDb.filter((u) => { + if (!query) return true; + return ( + u.name.toLowerCase().includes(query) || + u.role.toLowerCase().includes(query) || + u.department.toLowerCase().includes(query) + ); + }); + + const startIndex = (page - 1) * pageSize; + const pageRecords = filtered.slice(startIndex, startIndex + pageSize); + + const options: DropdownOption[] = pageRecords.map((u) => ({ + label: u.name, + value: u.id, + description: `${u.role} · ${u.department}`, + })); + + resolve({ + items: options, + hasMore: startIndex + pageSize < filtered.length, + total: filtered.length, + }); + }, 350); + }); + } + + readonly singleSnippet = ` +`; + + readonly multiSnippet = ` +`; + + readonly tagsSnippet = ` +`; + + readonly groupedSnippet = ` +`; + + readonly descriptionSnippet = ` +`; + + readonly serverSearchSnippet = ` +`; + + readonly reactiveFormSnippet = ` +`; +} + + diff --git a/angular/src/app/dummypage/dummypage.component.html b/angular/src/app/dummypage/dummypage.component.html new file mode 100644 index 0000000..a4534b5 --- /dev/null +++ b/angular/src/app/dummypage/dummypage.component.html @@ -0,0 +1,2 @@ + +Lorem ipsum, dolor sit amet consectetur adipisicing elit. Doloribus velit magni quos. Animi nemo quam obcaecati? Cupiditate dolore sed id magni, facilis optio fugit mollitia minima recusandae placeat, quod molestiae officiis est ullam explicabo illo impedit consequuntur accusantium in aut facere neque consequatur ipsa! Quia ut maxime modi a in ullam pariatur incidunt, rerum expedita sit eius ipsum! Cum eum nesciunt pariatur eius. Amet magni, facilis explicabo cupiditate reiciendis quae a, natus aspernatur alias aperiam quibusdam molestiae laboriosam quaerat dolores asperiores! Excepturi, ipsa dolor numquam possimus perspiciatis animi asperiores quam vero, consectetur nesciunt quas ad facilis deserunt minima neque nemo? \ No newline at end of file diff --git a/angular/src/app/dummypage/dummypage.component.scss b/angular/src/app/dummypage/dummypage.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular/src/app/dummypage/dummypage.component.spec.ts b/angular/src/app/dummypage/dummypage.component.spec.ts new file mode 100644 index 0000000..d9b3017 --- /dev/null +++ b/angular/src/app/dummypage/dummypage.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DummypageComponent } from './dummypage.component'; + +describe('DummypageComponent', () => { + let component: DummypageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DummypageComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DummypageComponent); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular/src/app/dummypage/dummypage.component.ts b/angular/src/app/dummypage/dummypage.component.ts new file mode 100644 index 0000000..71c4ce3 --- /dev/null +++ b/angular/src/app/dummypage/dummypage.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-dummypage', + imports: [], + templateUrl: './dummypage.component.html', + styleUrl: './dummypage.component.scss', +}) +export class DummypageComponent { + +} diff --git a/angular/src/app/form-management/form-management.component.html b/angular/src/app/form-management/form-management.component.html new file mode 100644 index 0000000..7e536d1 --- /dev/null +++ b/angular/src/app/form-management/form-management.component.html @@ -0,0 +1,214 @@ +
+ +
+
+

Form Management Directory

+

+ Create and manage team records via ABP Modal forms with dropdowns, inputs, radio selections, and card displays. +

+
+ +
+ + +
+ +
+ + +
+ + +
+ + + +
+
+ + +
+
+ + +
+
+
+
+ {{ member.name.charAt(0) }} +
+
+

{{ member.name }}

+

{{ member.role }}

+
+
+ + + + + {{ member.isActive ? 'Active' : 'Inactive' }} + +
+ + +
+
+ + {{ member.department }} +
+
+ + {{ member.accountType }} Access +
+
+ + +

+ {{ member.description }} +

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

No records found

+

+ No team members match your filter query. Click below to add a new member. +

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

+ {{ editingId ? 'Edit Team Member' : 'Create New Member' }} +

+

+ Configured via FormlyFieldConfig[] with Formly & ABP Theme Shared +

+
+
+
+ + + + + + + + + + + + +
+
diff --git a/angular/src/app/form-management/form-management.component.scss b/angular/src/app/form-management/form-management.component.scss new file mode 100644 index 0000000..8cd1891 --- /dev/null +++ b/angular/src/app/form-management/form-management.component.scss @@ -0,0 +1,6 @@ +@reference "tailwindcss"; + +:host { + display: block; + min-height: 100%; +} diff --git a/angular/src/app/form-management/form-management.component.ts b/angular/src/app/form-management/form-management.component.ts new file mode 100644 index 0000000..4065e5e --- /dev/null +++ b/angular/src/app/form-management/form-management.component.ts @@ -0,0 +1,317 @@ +import { Component, OnInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { FormlyFieldConfig } from '@ngx-formly/core'; +import { + ModalComponent, + ModalCloseDirective, +} from '@abp/ng.theme.shared'; +import { DynamicFormComponent } from '../components/dynamic-form/dynamic-form.component'; +import { DropdownOption } from '../components/dropdown-component/dropdown-component.component'; + +export interface FormRecord { + id: string; + name: string; + role: string; + department: string; + email?: string; + description: string; + password?: string; + accountType: 'admin' | 'member' | 'viewer'; + isActive: boolean; + createdAt: Date; + [key: string]: any; +} + +/** + * Form Management Component + * Dynamically driven via FormlyFieldConfig from @ngx-formly/core. + * Opens an ABP Modal with the dynamic form and renders submissions + * as responsive theme cards. + */ +@Component({ + selector: 'app-form-management', + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + ModalComponent, + ModalCloseDirective, + DynamicFormComponent, + ], + templateUrl: './form-management.component.html', + styleUrl: './form-management.component.scss', +}) +export class FormManagementComponent implements OnInit { + isModalOpen = false; + isSaving = false; + editingId: string | null = null; + + searchQuery = ''; + filterStatus: 'all' | 'active' | 'inactive' = 'all'; + + // Dynamic Formly State + form = new FormGroup({}); + model: Record = {}; + fields: FormlyFieldConfig[] = []; + + readonly roleOptions: DropdownOption[] = [ + { label: 'Full-Stack Developer', value: 'Full-Stack Developer', description: 'Angular, .NET, PostgreSQL' }, + { label: 'UI/UX Designer', value: 'UI/UX Designer', description: 'Figma, Tailwind, Design Systems' }, + { label: 'Engineering Manager', value: 'Engineering Manager', description: 'Sprint planning & leadership' }, + { label: 'DevOps Architect', value: 'DevOps Architect', description: 'Kubernetes, CI/CD, Cloud' }, + { label: 'Product Owner', value: 'Product Owner', description: 'Roadmaps & user feedback' }, + { label: 'QA Automation Lead', value: 'QA Automation Lead', description: 'Playwright, Jest, Cypress' }, + ]; + + readonly departmentOptions: DropdownOption[] = [ + { label: 'Core Engineering', value: 'Core Engineering' }, + { label: 'Cloud Infrastructure', value: 'Cloud Infrastructure' }, + { label: 'Product & Design', value: 'Product & Design' }, + { label: 'Cybersecurity', value: 'Cybersecurity' }, + { label: 'Data & Analytics', value: 'Data & Analytics' }, + ]; + + members: FormRecord[] = [ + { + id: '1', + name: 'Asha Verma', + email: 'asha.verma@example.com', + role: 'Full-Stack Developer', + department: 'Core Engineering', + description: 'Lead engineer overseeing ABP basic theme modern dashboard and reusable component architecture.', + password: '••••••••', + accountType: 'admin', + isActive: true, + createdAt: new Date('2026-02-15'), + }, + { + id: '2', + name: 'Rohit Sharma', + email: 'rohit.sharma@example.com', + role: 'UI/UX Designer', + department: 'Product & Design', + description: 'Designed the DelightERM design system tokens, responsive card layouts, and dark/light color palette.', + password: '••••••••', + accountType: 'member', + isActive: true, + createdAt: new Date('2026-03-01'), + }, + { + id: '3', + name: 'Meera Nair', + email: 'meera.nair@example.com', + role: 'Engineering Manager', + department: 'Core Engineering', + description: 'Coordinates cross-functional architecture and sprint deliveries across platform tenant services.', + password: '••••••••', + accountType: 'admin', + isActive: false, + createdAt: new Date('2026-01-20'), + }, + ]; + + ngOnInit(): void { + this.buildFormlyFields(); + } + + buildFormlyFields(): void { + this.fields = [ + { + fieldGroupClassName: 'grid grid-cols-1 sm:grid-cols-2 gap-4', + fieldGroup: [ + { + key: 'name', + type: 'input', + props: { + label: 'Full Name', + placeholder: 'e.g. Rahul Sharma', + required: true, + minLength: 2, + }, + }, + { + key: 'email', + type: 'input', + props: { + label: 'Email Address', + type: 'email', + placeholder: 'rahul@example.com', + required: true, + }, + }, + ], + }, + { + fieldGroupClassName: 'grid grid-cols-1 sm:grid-cols-2 gap-4', + fieldGroup: [ + { + key: 'role', + type: 'dropdown', + props: { + label: 'Role & Designation', + placeholder: 'Select a role...', + required: true, + items: this.roleOptions, + }, + }, + { + key: 'department', + type: 'dropdown', + props: { + label: 'Department', + placeholder: 'Select department...', + required: true, + showDrawerSearch: true, + drawerSearchPlaceholder: 'Search department...', + items: this.departmentOptions, + }, + }, + ], + }, + { + key: 'password', + type: 'input', + props: { + label: 'Access Password', + type: 'password', + placeholder: '••••••••••••', + required: true, + minLength: 6, + }, + }, + { + key: 'accountType', + type: 'radio', + props: { + label: 'Account Access Level', + required: true, + options: [ + { label: 'Admin (Full permissions)', value: 'admin' }, + { label: 'Member (Standard edit access)', value: 'member' }, + { label: 'Viewer (Read-only access)', value: 'viewer' }, + ], + }, + }, + { + key: 'description', + type: 'textarea', + props: { + label: 'Description / Responsibilities', + placeholder: 'Brief bio, responsibilities, or technical skills...', + rows: 3, + required: true, + maxLength: 300, + }, + }, + { + key: 'isActive', + type: 'checkbox', + props: { + label: 'Active Member (Enable account for platform access)', + }, + }, + ]; + } + + get filteredMembers(): FormRecord[] { + return this.members.filter((member) => { + const matchesSearch = + !this.searchQuery.trim() || + member.name.toLowerCase().includes(this.searchQuery.toLowerCase()) || + member.role?.toLowerCase().includes(this.searchQuery.toLowerCase()) || + member.department?.toLowerCase().includes(this.searchQuery.toLowerCase()) || + member.description?.toLowerCase().includes(this.searchQuery.toLowerCase()); + + const matchesStatus = + this.filterStatus === 'all' || + (this.filterStatus === 'active' && member.isActive) || + (this.filterStatus === 'inactive' && !member.isActive); + + return matchesSearch && matchesStatus; + }); + } + + get activeCount(): number { + return this.members.filter((m) => m.isActive).length; + } + + get totalCount(): number { + return this.members.length; + } + + openCreateModal(): void { + this.editingId = null; + this.model = { + name: '', + email: '', + role: null, + department: null, + description: '', + password: '', + accountType: 'member', + isActive: true, + }; + this.form = new FormGroup({}); + this.isModalOpen = true; + } + + openEditModal(member: FormRecord): void { + this.editingId = member.id; + this.model = { + name: member.name, + email: member.email || '', + role: member.role, + department: member.department, + description: member.description, + password: member.password || '••••••••', + accountType: member.accountType, + isActive: member.isActive, + }; + this.form = new FormGroup({}); + this.isModalOpen = true; + } + + toggleMemberStatus(member: FormRecord): void { + member.isActive = !member.isActive; + } + + deleteMember(id: string): void { + this.members = this.members.filter((m) => m.id !== id); + } + + submitDynamicForm(): void { + if (this.form.invalid) { + this.form.markAllAsTouched(); + return; + } + this.onFormSubmit(this.model); + } + + onFormSubmit(formData: any): void { + this.isSaving = true; + + setTimeout(() => { + if (this.editingId) { + const index = this.members.findIndex((m) => m.id === this.editingId); + if (index !== -1) { + this.members[index] = { + ...this.members[index], + ...formData, + }; + } + } else { + const newRecord: FormRecord = { + id: String(Date.now()), + ...formData, + createdAt: new Date(), + }; + this.members.unshift(newRecord); + } + + this.isSaving = false; + this.isModalOpen = false; + }, 400); + } +} + diff --git a/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.html b/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.html new file mode 100644 index 0000000..ee59cd1 --- /dev/null +++ b/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.html @@ -0,0 +1,32 @@ + diff --git a/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.scss b/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.spec.ts b/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.spec.ts new file mode 100644 index 0000000..7ed26c2 --- /dev/null +++ b/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FormlyFieldDropdownComponent } from './formly-field-dropdown.component'; + +describe('FormlyFieldDropdownComponent', () => { + let component: FormlyFieldDropdownComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [FormlyFieldDropdownComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(FormlyFieldDropdownComponent); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.ts b/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.ts new file mode 100644 index 0000000..13c8cda --- /dev/null +++ b/angular/src/app/formly-field-dropdown/formly-field-dropdown.component.ts @@ -0,0 +1,68 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; +import { FieldType, FieldTypeConfig } from '@ngx-formly/core'; +import { DropdownComponentComponent, DropdownType } from '../components/dropdown-component/dropdown-component.component'; + +/** + * Extra config accepted via `props` on a Formly field of type 'dropdown'. + * Mirrors app-dropdown's own @Input()s so field configs read naturally. + */ +/** + * Extra config accepted via `props` on a Formly field of type 'dropdown'. + * Mirrors app-dropdown's own @Input()s so field configs read naturally. + */ +export interface DropdownFieldProps { + label?: string; + placeholder?: string; + hint?: string; + required?: boolean; + disabled?: boolean; + items?: any[]; + options?: any[]; + dropdownType?: DropdownType; + bindLabel?: string; + bindValue?: string; + bindDescription?: string; + groupBy?: string; + clearable?: boolean; + loading?: boolean; + loadingMore?: boolean; + hasMore?: boolean; + showDrawerSearch?: boolean; + drawerSearchPlaceholder?: string; + serverSearch?: boolean; + searchable?: boolean; + clearSearchOnAdd?: boolean; + hideSelected?: boolean; + closeOnSelect?: boolean; + appendTo?: string; + dropdownPosition?: 'bottom' | 'top' | 'auto'; + virtualScroll?: boolean; + errorMessage?: string; + searchDebounce?: number; + onSearchChange?: (term: string) => void; + onScrollToEnd?: () => void; +} + +/** + * Registers app-dropdown as a Formly field type named 'dropdown'. + * This file does not modify DropdownComponent — it only wires it into Formly + * via [formControl], which DropdownComponent already supports (it implements + * ControlValueAccessor). + * + * Register once in app.config.ts: + * provideFormlyCore(withFormlyBootstrap(), { types: [{ name: 'dropdown', component: FormlyFieldDropdownComponent }] }) + * + * Then use it in any field config: + * { key: 'teamMemberId', type: 'dropdown', props: { label: 'Assign Team Member', items: [...] } } + */ +@Component({ + selector: 'app-formly-field-dropdown', + imports: [CommonModule, ReactiveFormsModule, DropdownComponentComponent], + templateUrl: './formly-field-dropdown.component.html', + styleUrl: './formly-field-dropdown.component.scss', +}) +export class FormlyFieldDropdownComponent extends FieldType> { + +} diff --git a/angular/src/app/home/home.component.html b/angular/src/app/home/home.component.html new file mode 100644 index 0000000..e3ffd70 --- /dev/null +++ b/angular/src/app/home/home.component.html @@ -0,0 +1,281 @@ +
+
+
+
+
+ @if(!hasLoggedIn){ +

Welcome

+

+ {{ '::LongWelcomeMessage' | abpLocalization }} +

+ {{ + 'AbpAccount::Login' | abpLocalization }} + } + +

Getting Started

+ + +

Web Application Development Tutorial

+ + +

Customize Lepton Theme

+

Learn how to customize LeptonX Theme as you wish.

+ Customize Lepton +
+ + +
+
+
+
+
+ + +
+
+
+
+
+ +

+ A unique community platform for + ABP Lovers! +

+

+ Explore all ABP users' experiences with the ABP Framework, discover articles and videos on + how to use ABP, and join raffles for a chance to win surprise gifts! +

+ Join ABP Community +
+ +
+
+
+
+ +
+
+
+
+
+

THE OFFICIAL GUIDE

+

Mastering ABP Framework

+

+ Written by the creator of the ABP Framework, this book will help you gain a complete + understanding of the framework and modern web application development techniques. +

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

+ {{ context.label }} +
+ + +
+
+ +
+
+
+ + +
+
+
+
{{ context.title }}
+
+
+
+ + + @for(item of context.items; track $index; let last = $last){ + + + + + } + +
+ @if(item.icon){ +
+ @if(item.iconType === 'image'){ + + }@else if(item.iconType === 'icon'){ + + }@else{ +
+ } +
+ } +
{{ item.title }}
+
+ + + +
+
+
+
+
+
\ No newline at end of file diff --git a/angular/src/app/home/home.component.scss b/angular/src/app/home/home.component.scss new file mode 100644 index 0000000..3f5f305 --- /dev/null +++ b/angular/src/app/home/home.component.scss @@ -0,0 +1,25 @@ +/* Styles for the home component */ +.card-bg-image { + position: absolute; + width: 630px; + height: auto; + bottom: 0; + right: 0; + z-index: 1; +} +.starting-content { + position: relative; + z-index: 2; +} + +@media (min-width: 1199px) { + .h-lg-100 { + height: 100% !important; + } +} + +@media (min-width: 768px) { + .h-md-100 { + height: 100% !important; + } +} diff --git a/angular/src/app/home/home.component.spec.ts b/angular/src/app/home/home.component.spec.ts new file mode 100644 index 0000000..4efbb17 --- /dev/null +++ b/angular/src/app/home/home.component.spec.ts @@ -0,0 +1,88 @@ +import { CoreTestingModule } from "@abp/ng.core/testing"; +import { ThemeSharedTestingModule } from "@abp/ng.theme.shared/testing"; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { NgxValidateCoreModule } from "@ngx-validate/core"; +import { HomeComponent } from "./home.component"; +import { AuthService } from '@abp/ng.core'; +import { vi } from 'vitest'; + +describe("HomeComponent", () => { + let fixture: ComponentFixture; + let mockAuthService: { isAuthenticated: boolean; navigateToLogin: ReturnType }; + + beforeEach(async () => { + mockAuthService = { + isAuthenticated: false, + navigateToLogin: vi.fn() + }; + + await TestBed.configureTestingModule({ + imports: [ + CoreTestingModule.withConfig(), + ThemeSharedTestingModule.withConfig(), + NgxValidateCoreModule, + HomeComponent + ], + providers: [ + { + provide: AuthService, + useValue: mockAuthService + } + ], + }).compileComponents(); + }); + + it("should be initiated", () => { + fixture = TestBed.createComponent(HomeComponent); + fixture.detectChanges(); + expect(fixture.componentInstance).toBeTruthy(); + }); + + describe('when login state is true', () => { + beforeEach(() => { + mockAuthService.isAuthenticated = true; + fixture = TestBed.createComponent(HomeComponent); + fixture.detectChanges(); + }); + + it("hasLoggedIn should be true", () => { + expect(fixture.componentInstance.hasLoggedIn).toBe(true); + }); + + it("button should not be exists", () => { + const element = fixture.nativeElement; + const button = element.querySelector('[role="button"]'); + expect(button).toBeNull(); + }); + }); + + describe('when login state is false', () => { + beforeEach(() => { + mockAuthService.isAuthenticated = false; + fixture = TestBed.createComponent(HomeComponent); + fixture.detectChanges(); + }); + + it("hasLoggedIn should be false", () => { + expect(fixture.componentInstance.hasLoggedIn).toBe(false); + }); + + it("button should be exists", () => { + const element = fixture.nativeElement; + const button = element.querySelector('[role="button"]'); + expect(button).toBeDefined(); + }); + + describe('when button clicked', () => { + beforeEach(() => { + const element = fixture.nativeElement; + const button = element.querySelector('[role="button"]'); + button.click(); + }); + + it("navigateToLogin have been called", () => { + expect(mockAuthService.navigateToLogin).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/angular/src/app/home/home.component.ts b/angular/src/app/home/home.component.ts new file mode 100644 index 0000000..d1589e3 --- /dev/null +++ b/angular/src/app/home/home.component.ts @@ -0,0 +1,92 @@ +import { AuthService, LocalizationPipe } from '@abp/ng.core'; +import { Component, inject } from '@angular/core'; +import { NgTemplateOutlet } from '@angular/common'; +import { FormFieldConfig } from '@abp/ng.components/dynamic-form'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'], + imports: [NgTemplateOutlet, LocalizationPipe], +}) +export class HomeComponent { + private authService = inject(AuthService); + + formFields: FormFieldConfig[] = [ + { + key: 'firstName', + type: 'text', + label: 'First Name', + placeholder: 'Enter first name', + value: 'erdemc', + required: true, + validators: [ + { type: 'required', message: 'First name is required' }, + { type: 'minLength', value: 2, message: 'Minimum 2 characters required' }, + ], + gridSize: 6, + order: 1, + }, + { + key: 'lastName', + type: 'text', + label: 'Last Name', + placeholder: 'Enter last name', + required: true, + validators: [{ type: 'required', message: 'Last name is required' }], + gridSize: 12, + order: 3, + }, + { + key: 'email', + type: 'email', + label: 'Email Address', + placeholder: 'Enter email', + required: true, + validators: [ + { type: 'required', message: 'Email is required' }, + { type: 'email', message: 'Please enter a valid email' }, + ], + gridSize: 6, + order: 2, + }, + { + key: 'userType', + type: 'select', + label: 'User Type', + required: true, + options: { + defaultValues: [ + { key: 'admin', value: 'Administrator' }, + { key: 'user', value: 'Regular User' }, + { key: 'guest', value: 'Guest User' }, + ], + }, + validators: [{ type: 'required', message: 'Please select user type' }], + order: 4, + }, + { + key: 'adminNotes', + type: 'textarea', + label: 'Admin Notes', + placeholder: 'Enter admin-specific notes', + conditionalLogic: [ + { + dependsOn: 'userType', + condition: 'equals', + value: 'admin', + action: 'show', + }, + ], + order: 5, + }, + ]; + + get hasLoggedIn(): boolean { + return this.authService.isAuthenticated; + } + + login() { + this.authService.navigateToLogin(); + } +} diff --git a/angular/src/app/home/home.routes.ts b/angular/src/app/home/home.routes.ts new file mode 100644 index 0000000..b04601e --- /dev/null +++ b/angular/src/app/home/home.routes.ts @@ -0,0 +1,9 @@ +import { Routes } from '@angular/router'; + +export const homeRoutes: Routes = [ + { + path: '', + pathMatch: 'full', + loadComponent: () => import('./home.component').then(m => m.HomeComponent), + }, +]; diff --git a/angular/src/app/modal-manual/modal-manual.component.html b/angular/src/app/modal-manual/modal-manual.component.html new file mode 100644 index 0000000..8fd6e9d --- /dev/null +++ b/angular/src/app/modal-manual/modal-manual.component.html @@ -0,0 +1,211 @@ +
+
+

ABP Theme Modal (<abp-modal>) — Usage Guide

+

+ Built using official ABP Theme Shared components: import { ModalComponent, ModalCloseDirective } from '@abp/ng.theme.shared'. Fully customized to match our dark/light theme layout. +

+
+ + +
+
+

1. Basic Content Modal (<abp-modal>)

+

Standard informational dialog using #abpHeader, #abpBody, and #abpFooter.

+
+ + + + + +

About this Platform

+
+ + +
+

+ This dialog is rendered directly via ABP's official <abp-modal> component. +

+

+ It seamlessly inherits our global CSS custom property tokens for borders, surfaces, fonts, and dark mode overrides. +

+
+
+ + + + +
+ +
{{ basicSnippet }}
+
+ + +
+
+

2. Confirm / Destructive Dialog (abpClose)

+

Compact dialog utilizing abpClose directive on cancel button.

+
+ +
+ + + Status: {{ confirmResult }} + +
+ + + +

+ Delete Project? +

+
+ + +

+ Are you sure you want to permanently delete this repository and all linked tenant configurations? +

+
+ + + + + +
+ +
{{ confirmSnippet }}
+
+ + +
+
+

3. Form Composition with Busy State ([busy]="isBusy")

+

+ Full stack: abp-modal + app-dynamic-form + app-dropdown. +

+
+ +
+ + + Assigned: {{ lastAssigned | json }} + +
+ + + +

+ Assign Team Member +

+
+ + + + + + + + + + +
+ +
{{ formModalSnippet }}
+
+ + +
+

<abp-modal> Inputs & Directives Reference

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Binding / DirectiveTypeDescription
[(visible)]booleanTwo-way binding controlling modal visibility.
[busy]booleanDisplays a loading overlay spinner inside the modal while processing async tasks.
[options]{ size?: 'sm' | 'md' | 'lg' | 'xl', centered?: boolean, scrollable?: boolean }Modal configuration options.
#abpHeaderTemplateRefHeader template projected into the top modal bar.
#abpBodyTemplateRefMain content body template.
#abpFooterTemplateRefFooter actions template.
abpCloseDirectiveDirective attached to any button to automatically dismiss the modal on click.
+
+
+
+ diff --git a/angular/src/app/modal-manual/modal-manual.component.scss b/angular/src/app/modal-manual/modal-manual.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/angular/src/app/modal-manual/modal-manual.component.spec.ts b/angular/src/app/modal-manual/modal-manual.component.spec.ts new file mode 100644 index 0000000..9270c9b --- /dev/null +++ b/angular/src/app/modal-manual/modal-manual.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ModalManualComponent } from './modal-manual.component'; + +describe('ModalManualComponent', () => { + let component: ModalManualComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ModalManualComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ModalManualComponent); + component = fixture.componentInstance; + await fixture.whenStable(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular/src/app/modal-manual/modal-manual.component.ts b/angular/src/app/modal-manual/modal-manual.component.ts new file mode 100644 index 0000000..02bf8fa --- /dev/null +++ b/angular/src/app/modal-manual/modal-manual.component.ts @@ -0,0 +1,158 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormGroup } from '@angular/forms'; +import { FormlyFieldConfig } from '@ngx-formly/core'; +import { ModalComponent, ModalCloseDirective } from '@abp/ng.theme.shared'; +import { DynamicFormComponent } from '../components/dynamic-form/dynamic-form.component'; + +/** + * Living usage guide for ABP Theme's official . + * Demonstrates basic content modals, confirmation/danger dialogs, + * busy state indicators, and form composition with abpClose. + */ + +@Component({ + selector: 'app-modal-manual', + imports: [CommonModule, ModalComponent, ModalCloseDirective, DynamicFormComponent], + templateUrl: './modal-manual.component.html', + styleUrl: './modal-manual.component.scss', +}) +export class ModalManualComponent { + // --------------------------------------------------------------------- + // Example 1: Basic content modal () + // --------------------------------------------------------------------- + showBasicModal = false; + + // --------------------------------------------------------------------- + // Example 2: Confirm destructive dialog + // --------------------------------------------------------------------- + showConfirmModal = false; + confirmResult: 'confirmed' | 'cancelled' | null = null; + + onConfirm(): void { + this.confirmResult = 'confirmed'; + this.showConfirmModal = false; + } + + onCancelConfirm(): void { + this.confirmResult = 'cancelled'; + this.showConfirmModal = false; + } + + // --------------------------------------------------------------------- + // Example 3: Success Notification Modal + // --------------------------------------------------------------------- + showSuccessModal = false; + + // --------------------------------------------------------------------- + // Example 4: Form modal with ABP Modal + Busy indicator + // --------------------------------------------------------------------- + showFormModal = false; + isBusy = false; + + teamMembers = [ + { label: 'Asha Verma', value: 'u1', description: 'Lead Full-Stack Engineer' }, + { label: 'Rohit Sharma', value: 'u2', description: 'Product Designer' }, + { label: 'Meera Nair', value: 'u3', description: 'Engineering Manager' }, + { label: 'Daniel Kim', value: 'u4', description: 'Cloud Architect' }, + ]; + + assignForm = new FormGroup({}); + assignModel: Record = { teamMemberId: null }; + + assignFields: FormlyFieldConfig[] = [ + { + key: 'teamMemberId', + type: 'dropdown', + props: { + label: 'Assign Team Member', + items: this.teamMembers, + placeholder: 'Search & select a user', + required: true, + }, + }, + ]; + + lastAssigned: any = null; + + onAssignSubmit(value: any): void { + this.isBusy = true; + setTimeout(() => { + this.lastAssigned = value; + this.isBusy = false; + this.showFormModal = false; + }, 600); + } + + // --------------------------------------------------------------------- + // Code snippets + // --------------------------------------------------------------------- + readonly basicSnippet = `import { ModalComponent, ModalCloseDirective } from '@abp/ng.theme.shared'; + +@Component({ + imports: [ModalComponent, ModalCloseDirective], + ... +}) +export class MyFeatureComponent { + showBasicModal = false; +} + + + + + + +

About this Platform

+
+ + +

Projected modal body content styled according to current theme.

+
+ + + + +
`; + + readonly confirmSnippet = ` + +

Delete Project

+
+ + +

Are you sure you want to permanently delete this repository and all linked data?

+
+ + + + + +
`; + + readonly formModalSnippet = ` + +

Assign Team Member

+
+ + + + + + + + + + +
`; +} + diff --git a/angular/src/app/proxy/erm-global-search-contract/dto/index.ts b/angular/src/app/proxy/erm-global-search-contract/dto/index.ts new file mode 100644 index 0000000..e9644da --- /dev/null +++ b/angular/src/app/proxy/erm-global-search-contract/dto/index.ts @@ -0,0 +1 @@ +export * from './models'; diff --git a/angular/src/app/proxy/erm-global-search-contract/dto/models.ts b/angular/src/app/proxy/erm-global-search-contract/dto/models.ts new file mode 100644 index 0000000..64debd7 --- /dev/null +++ b/angular/src/app/proxy/erm-global-search-contract/dto/models.ts @@ -0,0 +1,15 @@ +export interface SearchItemDto { + id?: string; + title?: string; + routeHint?: string; +} + +export interface GlobalSearchGroupDto { + groupKey: string; + label?: string; + items?: SearchItemDto[]; +} + +export interface GlobalSearchResultDto { + groups?: GlobalSearchGroupDto[]; +} diff --git a/angular/src/app/proxy/erm-global-search-contract/index.ts b/angular/src/app/proxy/erm-global-search-contract/index.ts new file mode 100644 index 0000000..f320a6b --- /dev/null +++ b/angular/src/app/proxy/erm-global-search-contract/index.ts @@ -0,0 +1 @@ +export * as Dto from './dto'; diff --git a/angular/src/app/proxy/erm-global-search/global-search.service.ts b/angular/src/app/proxy/erm-global-search/global-search.service.ts new file mode 100644 index 0000000..53b3f9e --- /dev/null +++ b/angular/src/app/proxy/erm-global-search/global-search.service.ts @@ -0,0 +1,28 @@ +import { RestService } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; +import { Observable, of } from 'rxjs'; +import { catchError } from 'rxjs/operators'; +import { GlobalSearchResultDto } from '../erm-global-search-contract/dto/models'; + +@Injectable({ + providedIn: 'root', +}) +export class GlobalSearchService { + private restService = inject(RestService); + apiName = 'Default'; + + search(input: { keyword: string; maxResultsPerGroup?: number }): Observable { + return this.restService + .request( + { + method: 'GET', + url: '/api/app/global-search', + params: { keyword: input.keyword, maxResultsPerGroup: input.maxResultsPerGroup }, + }, + { apiName: this.apiName } + ) + .pipe( + catchError(() => of({ groups: [] })) + ); + } +} diff --git a/angular/src/app/proxy/erm-global-search/index.ts b/angular/src/app/proxy/erm-global-search/index.ts new file mode 100644 index 0000000..885a954 --- /dev/null +++ b/angular/src/app/proxy/erm-global-search/index.ts @@ -0,0 +1 @@ +export * from './global-search.service'; diff --git a/angular/src/app/proxy/index.ts b/angular/src/app/proxy/index.ts new file mode 100644 index 0000000..eed8c5e --- /dev/null +++ b/angular/src/app/proxy/index.ts @@ -0,0 +1,3 @@ +export * as ErmGlobalSearchContract from './erm-global-search-contract'; +export * as ErmGlobalSearch from './erm-global-search'; +export * as Notifications from './notifications'; diff --git a/angular/src/app/proxy/notifications/dto/index.ts b/angular/src/app/proxy/notifications/dto/index.ts new file mode 100644 index 0000000..e9644da --- /dev/null +++ b/angular/src/app/proxy/notifications/dto/index.ts @@ -0,0 +1 @@ +export * from './models'; diff --git a/angular/src/app/proxy/notifications/dto/models.ts b/angular/src/app/proxy/notifications/dto/models.ts new file mode 100644 index 0000000..8675d04 --- /dev/null +++ b/angular/src/app/proxy/notifications/dto/models.ts @@ -0,0 +1,7 @@ +export interface NotificationDto { + id?: string; + actionTitle?: string; + action?: string; + creationTime?: string; + isRead?: boolean; +} diff --git a/angular/src/app/proxy/notifications/index.ts b/angular/src/app/proxy/notifications/index.ts new file mode 100644 index 0000000..ea6f69c --- /dev/null +++ b/angular/src/app/proxy/notifications/index.ts @@ -0,0 +1,2 @@ +export * from './notification.service'; +export * as Dto from './dto'; diff --git a/angular/src/app/proxy/notifications/notification.service.ts b/angular/src/app/proxy/notifications/notification.service.ts new file mode 100644 index 0000000..2325cd7 --- /dev/null +++ b/angular/src/app/proxy/notifications/notification.service.ts @@ -0,0 +1,42 @@ +import { RestService } from '@abp/ng.core'; +import { Injectable, inject } from '@angular/core'; +import { Observable, of } from 'rxjs'; +import { catchError } from 'rxjs/operators'; +import { NotificationDto } from './dto/models'; + +@Injectable({ + providedIn: 'root', +}) +export class NotificationService { + private restService = inject(RestService); + apiName = 'Default'; + + getList(skipCount: number = 0, maxResultCount: number = 10): Observable { + return this.restService + .request( + { + method: 'GET', + url: '/api/app/notification', + params: { skipCount, maxResultCount }, + }, + { apiName: this.apiName } + ) + .pipe( + catchError(() => of([])) + ); + } + + markAsReadAllNotifications(): Observable { + return this.restService + .request( + { + method: 'POST', + url: '/api/app/notification/mark-all-as-read', + }, + { apiName: this.apiName } + ) + .pipe( + catchError(() => of(undefined)) + ); + } +} diff --git a/angular/src/app/route.provider.ts b/angular/src/app/route.provider.ts new file mode 100644 index 0000000..4fd4e99 --- /dev/null +++ b/angular/src/app/route.provider.ts @@ -0,0 +1,59 @@ +import { RoutesService, eLayoutType } from '@abp/ng.core'; +import { APP_INITIALIZER } from '@angular/core'; + +export const APP_ROUTE_PROVIDER = [ + { provide: APP_INITIALIZER, useFactory: configureRoutes, deps: [RoutesService], multi: true }, +]; + +function configureRoutes(routesService: RoutesService) { + return () => { + routesService.add([ + { + path: '/', + name: '::Menu:Home', + iconClass: 'fas fa-home', + order: 1, + layout: eLayoutType.application, + }, + { + path: undefined, + name: '::Menu:Manual', + iconClass: 'fas fa-book-open', + order: 2, + layout: eLayoutType.application, + }, + { + path: '/dropdown-manual', + name: '::Menu:DropdownManual', + parentName: '::Menu:Manual', + iconClass: 'fas fa-chevron-circle-down', + order: 1, + layout: eLayoutType.application, + }, + { + path: '/dynamic-form-manual', + name: '::Menu:DynamicFormManual', + parentName: '::Menu:Manual', + iconClass: 'fas fa-wpforms', + order: 2, + layout: eLayoutType.application, + }, + { + path: '/modal-manual', + name: '::Menu:ModalManual', + parentName: '::Menu:Manual', + iconClass: 'fas fa-window-restore', + order: 3, + layout: eLayoutType.application, + }, + { + path: '/form-management', + name: '::Menu:FormManagement', + parentName: '::Menu:Manual', + iconClass: 'fas fa-address-card', + order: 4, + layout: eLayoutType.application, + }, + ]); + }; +} diff --git a/angular/src/app/shared/shared.module.ts b/angular/src/app/shared/shared.module.ts new file mode 100644 index 0000000..e4d2f39 --- /dev/null +++ b/angular/src/app/shared/shared.module.ts @@ -0,0 +1,23 @@ +import { CoreModule } from '@abp/ng.core'; +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgModule } from '@angular/core'; +import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { NgxValidateCoreModule } from '@ngx-validate/core'; + +@NgModule({ + declarations: [], + imports: [ + CoreModule, + ThemeSharedModule, + NgbDropdownModule, + NgxValidateCoreModule + ], + exports: [ + CoreModule, + ThemeSharedModule, + NgbDropdownModule, + NgxValidateCoreModule + ], + providers: [] +}) +export class SharedModule {} diff --git a/angular/src/assets/.gitkeep b/angular/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/angular/src/assets/images/getting-started/abp-blog.svg b/angular/src/assets/images/getting-started/abp-blog.svg new file mode 100644 index 0000000..881609e --- /dev/null +++ b/angular/src/assets/images/getting-started/abp-blog.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/angular/src/assets/images/getting-started/abp-community.svg b/angular/src/assets/images/getting-started/abp-community.svg new file mode 100644 index 0000000..5260071 --- /dev/null +++ b/angular/src/assets/images/getting-started/abp-community.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/angular/src/assets/images/getting-started/abp-support.svg b/angular/src/assets/images/getting-started/abp-support.svg new file mode 100644 index 0000000..774bca6 --- /dev/null +++ b/angular/src/assets/images/getting-started/abp-support.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/angular/src/assets/images/getting-started/bg-01.png b/angular/src/assets/images/getting-started/bg-01.png new file mode 100644 index 0000000000000000000000000000000000000000..deec8634ed35cdc05593ad921048d93e98f878e2 GIT binary patch literal 22111 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 literal 0 HcmV?d00001 diff --git a/angular/src/assets/images/getting-started/book.png b/angular/src/assets/images/getting-started/book.png new file mode 100644 index 0000000000000000000000000000000000000000..a31327dad88abb5f598d09da41f6316f275011c1 GIT binary patch literal 294908 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

^=)cdd&0Keu_?eZ+(R?Dc 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�Vy_O@6!tKu<)`72-ho5H|Cn)o* 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 + + + + + + diff --git a/angular/src/assets/images/getting-started/img-blog.png b/angular/src/assets/images/getting-started/img-blog.png new file mode 100644 index 0000000000000000000000000000000000000000..97dd835b3a328e3b25ca7b0a1001dc8274007b05 GIT binary patch literal 30220 zcmYIP1yGyK)(!-M1_}WR1Z#1M6$$Pw?k+6^C>GqM6fXseyGwB^?gfH7E$&vVxI2ZP z@4NTTe`emv%+8y4&z?QD&p8{asw@M>CdUQ<0AM-UH|hWYDhvQXd4>sk8p$mc4Sf2+ za*)+?1^`It|9Md4)ai}^02+YY8wpL1`Tf>V1Bm;~qwgcuyY|Zm(Vtg$!nPV$_4WDF z`G=0cT~OF7mfmLV^3?z)mN#R~&lic`I;=z}?0s))X>fl&-{RH~afcm_9dfswbcU71 znKDcl_raViF5UV4wq)!x6GC%C&#WtfZR$tl6LE?=e3jXB{3=bL6UqL&ERob(oAW;u zj=_5-lZ;|n5>{h14N%7F1cUyi;I(fqW3o8N;oPpFfr*LF8xM!*?2UTDEcjWJxc?!k zfRXjwQs!Cl=7h8!)8T7eWB9*BieW>7r}Fz1ELugGD0)GmkI-(-Qb<&a^gk4gW%ob| z@f-R39%m5_^t2zc(X{<9Gq{+1UuB$BeSQamOJM(f9fY1XcG>cZ!OJh=3nGwG{lCM~ zq1B&r%K)4z%4KH&C?`?Zrh|y6!vChggbhjmsqrt<>x=*uV)B7YM8R}wD*5^|}i`b)K}>qi;tgz^xV zvN=wH{{NCO=95ffOIiC}0!K3LuQ0tI{~Tkh>m`5o``-)c&k}P1CfS>5EA;QNn`6mL*G7$nKE?f0$_md za=iZg>6}+ZIfFPqnQ$M-ISIRT`tMqvhjfB@$&Qi@N|$LC|FaqJAnrkuD0vLdrk0mW zSj=Zk{g`W@whET?HI3HdrVL<~+CQ5a9uoF?>k-zv@E`#7?y=|sz-t^dU;CbNvLb)9 zIDLcKAr*%&r8}}ID5{>X*)jk7*M3Y%+0o}R?s2aVvS@P`#QGw59#vRH zU)|!iRRr6UlXQ->{!Z6di8$k`lJL2wEBtzTJlFHDQVtKO?lzAdWU90r-$gAR(Hp5& z7R$*r3xLEr_KsbNZV|~=$rVU(3nE_!YJ+g*dY!PWDCO^b>owv3$UdhXlFcg;Y{11e za#OrKDmsVL0`E2)H3!gYn&@JM z;fvIQ-+icvm&u$9`O5wJA4PBh@hV6czD{mB5Ju4^{`rkjBH0*~u{+BGk0!2Vl6kF| zdn2&6jmSn>0OgCjK<0)Ei5ZTJ-VN}2_Fd{ngDnpLc6?q?iPBpM2HUesELhR}zgzGJ z8zG+KubeU!Cvu4~7Pl%>+W%dy^?LPpj25vw(;{G_a;TCbpS!YnC&&bN4Yx(rSP#lj zaezM9ri85zSp=5+Ymvb|*#+jP<-eR!#GUy+Vx|xo84)6AW`;?XJGL?*4gfpkoA93{ zZ2<}2t}9*xN!Rx9;6sDjE_NfAp67QmUy^bW|7uN+a}kQlh~!M6r+$FGU}EN`9mh=5yn&WPLv@CL}F{Qd#Z2Zf|d$4?8zT%^m7PmKX zGS~NyhW+B1J=f!RtWr5}N=Us3Tz)yzu;GWyuEQj`v!0sGWrCpVH zxJ&6Qvbr^J;`(hOBoH0SNw8iM^{@4i{|dLd^2QrZ65!2ATOb<5NNBgfKbgHkvxfX( z^kFRXo9SH7)8(EC$^hswf8FXF`&02N&IGv0RDbT&Cmc0HAeiyPoA)Io_$FV5RpwvU zAH>_6oK;iVsvHgA>}(Yiu5|pdaCnn*829^|nt(~*T(V@>YRIP&i)Anm;U2EtQ;=|S zmpLiGts$h-KwNLi`CuzVRS&80Pk{av-2hF{#xNz7(O%Nd%H)t#hgip4Z}O5ET{B-8 zpLSN3VvaGg3t8YqsR5Ag{asU0!DPV0wF2hgb==vVhcbkRuM|iFY^yBm@`rh0ud$q>2w{w5tf1WsuWO7SN z*Dh$8B7dDAz5f@5UiQCBwWNYpuTbjOEc+cg{!Ys2X6QfF_oK9F1B)wVXZ@1EYOJwA zB@c0>co&h9oc~UPvq-2TKG&h(UsINrMWG_|OI}fE%Z6)s9S~~S!Y}+QRF;m5DON$E z9T;3@Bw{(xXLj&N0#?zwfPt`N@~<1$%#upNp=7U+tFNx=K3^$66NR2$yX2r}S^aBXex~s^O?3UQ&Ew>3y4+mH zyyF&C{zz;VgLU0Fb^SUE82By)WFRT7_sP#i9QEt2&^&LKWQO}9|Ld<#QK(3@L=&>u2fHk08gs%BXE*GUC9g0! z#!pgu|1nP02f6}Dfw0*b_}2!1DR4yu0Fj(RIkNe0xE>51-(+%XuEflm!t^j=(v5wo z^GIXjSerMQ*|Oqq$okJ}a5p7)oQO(z3DEdZYJKls<9zM?&S4k5_z7=Re?xrpKT6c3 zT1N4iZ8-*$uLmJMQfHvjFEqDFXR+<+2i3g!H~ODn45VlFkJ>19TX3VUP&3XLBm|{~ zl@!vM4cd-d=?ajEKC<|M2bRtl>;3+94u7z1Dtn-7y&RL?f43>CU7#{KATA$GG7VeR zgRXy9#t_f+cE^||tA_$=Di>0x``dIP-AD}u6S#OCKprwBQ=uM>l5On3?J~;y-`po2 z>+^6|NhvRpKH%x?gHad$n(h>sLei{mqmS;peN}~btlK}rkH^>0D0sN7(fHJtR9In@ zMGT=k4NTqPhTck?#A;E1oZb&uRZ{o%I#FhFnzj5^ zZjNA$g$d=}tue>!SLqaCzpXcJQq`W}p=G|?=%_QcJ~QzaSreQp0MSS`Q$vH?TiLOGo@m z$a}>|vnkT`e}dWTnJ{O6qes7YPU3Ij_{?`Cd}L$$T!dv%`iH<2UfK}nzDcGXu=JO~2G-9!LtY}Y?N z)cmxvEaj!(lQeqy^*5Q&1e)?Yjn{#$-X|0#M2Ws~4Kd$$_NL;D-8aWe z6$hrxTy(QG^M%e;a2p0XvzV%kji21SpMwp*Q?yuUtj1K(7$Yv+=BZAvhrN`k*^L9! z8qzHEw#kYPmTixADJReU38HMgAGWbCx^d9|gw4CqH$(85s_hE21_IJb{yy1}R0x50 zG5<{lAkyVL;JMmPyxfiyC``g6`vu?Nkab06U9Wlf-)$)Dqg_h zu%M!J_e50WqAhgLis4x_B0+>iPym_etPQ#COK3(?S9_FVsf_s2TGDrbSDrVYNeNhV zos^W|Sx&v@tJZ-Qg__$cTpJn;S1+Xs2gpU%p?F=B!A<;v%W7teO?=bIHzQNd_F+1= zk5xlG_xz1u;nVf5;)`(<{ZZW&I^r)$u_{~jr+~CLZSFad91=Hxow7L}4WoHecrTo2 zt1D77zT;uPG#urKqDnvJ_(~G|9wIx zX$Ypp?0J@t)VUMWljg<+Kv@;uHk!og{lrD8U#wxAdjO3%Y?T??pX2edJKd-JER1Ig*YR5fBSpl$D5#?0{DGcf(y z{6gWnM9J5Ay)tlk_PhP>LuNx4Ds97;APV&wL{Kl>w;?I+usVJuCeU{zhOFL2W7r5P z?bH@2VZ{FD4?0XT_oO&I_}iHc0CAZ&lRpvWxujjR_(n=MPVx2JC&QtEowJgW6u16; zp9*jt!;3j`fy~SjvMf`l#;8F-}aEtf52V%X3q_p94)PoTNl7J*)Bk zHe^uatN#AVOtH?No%ul+DyLCZ=ff&`M?g_?*Os`2MmC!ACK*RPHM+Cvz;=PbMVznc z1do&fz1|Ztds^1L9%?bL&y=zgbI zjRaEsy1d9swej_5p<{a`{c*c4~bCHNv1I} zbk(z+(7NA7~2CEf0e!udf;#(%#g`)8x;~j+Cr%v=SxeA?+c!la+TPtj)5| zEk+j(kSg;8ryV%i(wG#_8-6HkF!4(k3FuC+8?shhKo!(taCjp|)KzQD-&kYw0{Cj~ zTBQqIZ2zD_eR_G3%?**XlU7}JQ6ni4q4L61jL47xrK5U|FSxwz57*$oEN*|pGuil6 zEyi1TX~~w-6ePiUNDC51;M zVe<~HSgp0$Ag-jB;Zij(rduy=teB*+iu{8PM&*SI8VkT>@_}IFaQU82|0VBNdi$D6 zcWZo)IX?c##7r3e{*!7uEX_ZdV~eF}2#y_PBnjD&I8TmhoctrfJmY*?`VP<dw1-^~x5JaaJ2KTZqJ0-jX7!r;W{U20QOd%jYlC`M zySI6Tj;!|2q=7QSh=KS9=u7WT48CTOyGc{X{eYM1N{MkzrX!a~K|07r{`Sx|<-n0FzNGEl;sJAdSnf%BeSfQNH?Wym+nYQ)>8IH+@rHfW1VCI-xA-J*Gj-wC29W-sc@EbqUiViRFs5X`33TUwBs3f+y3k4JQccegQMmB#R|_eR6x`XXNy zE>rIa&(zW(AG|3`MowKLwV52$NDECF41D?maA_r==HpOOY+iP7 z2@FM%24oKo(j-HC=!6==f!GnrVZf%=ij=Ytd+GX1tD`p7T!l|u1%I7Cc&c-=%KZiY zfHe$12qx8{LDL;g%bvMeb*_+X*nh71b2VjPp;77S?c$2;WA;gU^2IP*U;o26LSBM( zinM-g(q=|jg>=#MF?UU$f?=<*U)o6Ro2h}wpCvw$p;lc8R%AREevKj?JTby{h#VWX z^2tZ~6juG0n-?o=q$FtT!x2*X{4QT4ExK5_aV|mKnroRm8^SD)fYhDVK^XS+yS}z7 z8fbB^oBzzx)&5nXZc13vPhZN_zpb!Bs}fm3dj&JoC@N+dEtv5S)2J5gD&M*uvKHcE zo)i~AbYVi!Q!|dHUVJHR23=F8sTnn@U@x@Ns+L!I*11R7Z00}lE%ogc!meEx`_0=O zbDonOy7**RS#M_1bpd$dlfP0_VgxF?6v}GIdwh_wFHMcB_(!g`E}Rb%Q8PPNt5tdv zb?91lunWYi-KM$N#YiH?x>piY(qaR+!<_3Nq5N|)cf8Sy<9iX|XqguU)iiO7hJuNb zN@i=gR~IdXm-z_glOU?bKaM31ylR(J?i2dMd*ce$pYqRj;%*?7;?3*O3g>)0iA)qsH6 zdh?hWS6aeln$o!W=<@Moy3s$;ey z`V6JZvW%m;LF!vM+uZu|7rZkJ>7ll(w_rxu4NZ!78>uEf-jv0<+@Aw*H!_HK@|>hd z&?z4rw(O;H%$bQ)B0l=!r9AG86!n929)yzL0?xuvgpQ$Zc~E2vD# z<^U8k(z+1y{%`B{G|`2%)Ft>*+Z^D4w6CdOFd%Z67HB^t`!)B;cXT5x_M1xnzR8-& z1&G(gcGZLKmrQy!O!n65?aL;2OLURU#g$e+)PE3g;rV7Mxj!MX>Q;z_w!NmDt>OLP zKUlm!`L=E(Yrdt4@P5eL}srZh-;|HrK$?ltxHwA5+x@cBk;b0`y{FF$r=q_1a=cO zTN@T>tKcs^$jaJh#JzI>`k;N(%QIv{osEEOsXEP9?!qU2pfFX2NhU2YZ@1rIi_L5b4nMfAfGb5XTyyp`!9 zxuyyN^I464s>X4i6OsvdV5HOxMrNq5`H|}fc!k;>urDO+fe4u1c67saLut|}_O-3j z8&I@*sV6Ig7BZ{an6Y^8m6>?JP%^|D^U0vtw&t8{v>v;wtHimD(767ijdq=N59;?p zez~?x0=BxgmHvNjwLg8;P12NfUdhmiRwzr^P}8Enu{vT9^oRnlKUcU=6o!m5WoZ{FnavGK;8$v=M}9gV&%KajMz1QRh;6d=1|~}+%-(m8_!D^5RC00ttAA}uNAH3zZ7 z$+z4%=)@{0-il^iHE$%^CW=)Y9^@SN57;NU6siJCMgmPsz3s3b-Q=v(--s0>N zw?gcK1FlUqWaV_>V1%ju@i{z=d)w|nkhttver^ToX0w^}-I3xyP|D0tiy zcLbi^Mti+!p|8YW*w;di+8IEpsaBFXzp@dyu6O=dhxq2G;q%E#5v58!DEp)Np}|J! zVnM9m+1-3cb;p*A8w49B#=1wp?P2~@U-DC%m@f~}k7FLgqTdhG=Pvkq7g6&B&Nt6K zfhvkk9XhhDs=2uN8<|Do#1uyGn&6o!G)9hsW^oewIyV*E%<3Fp3}Fb8m@b32GkchHhQx z(U%OWcgA%SRry5+i>%igv;yUUSYH{xN;egtQfJJD7j8wp;atAL~Oag$ZPn4k#AH76;Tkn|2cNB;&fsM zy46|ld6;ibWnKwESFGv~;A82L`Y2IGj);i;_zg8U&HUvSraQ^(d(geeoU@&flBZG|xq>hukeAej4kmPV8}2UP9iTdua}aQTd* z2PAFQm9}^IdyJn*F5kn+=~FWcJa<*_b9Mqs4Rf#OgJYIoHZZikmXHDUhio=IJm_zm3C9ms8-f zO%ZiiI4&Y^{!XKceS-JZ_AxfLKxH*bTPIw+F6{;9BoNB3o9(~T*(R9X?Q|nV+23Vq zy~B!99Je0$NdeLCNf%o!pL1SoOf~z*>HIopk{?f574U-72-H@svVPCDBwz0`q{u$6 z*zGlcx%Bb4;rvr&jS&V1{b3*)_h$;9P=u$q#_nBi@b5-G$7LnVleNj_9sp^j5;Q&~ z1G3vVq!OKtw4pZolAbahpNUWP{(cFF$XsO4PkOxd`2h{Ev&mw{f*Ji-Sq9p4hj#(E zv!{h`9hyEe(XhZkUsKVOP@q8)IVpeo=vWgza@~4>6;8=(i%QkY|JMuf#yv26hE6exVZ0PacVB>SsIi^sT%yEs+^U^S(7<$(B+j$k--#-5m78=>MG?c ze=+`kZNtyjGSdA{go^K-C069CW++)^_4b{{sB7AmB|DfaU3`63;NfkxanJym3&5BC zV?RwZNfHdq7&;4%7TPO_!w~y)h?Z)wG4^@o&r?!~;tO8!W(DzzRmh(BrK)V#U)mW8 zRHsUUH4vRUWZjq~h<62Rev{;uQ<+3`zbY3+=;xeu$NkMV)?Od=m_OCy*F!#mr)#t@ z^OFn_Rmv}-8%g4VN!f7Q*STH>96Y@qJ_U4O0DcYhB;2j`b9 zFSP9O!hHk11zW*4=5{!za(1Q_3!j7=m<3{|Vo)dM5C#oZxX4$&c&XazZpS^dTdTfUGVpp28t~>jRA$z+ zK@EHPmDzmzBZnZ;VBPd2k7?0QE_tL;fWM9^!x?CmrXFS3E3be2H&hS&Mu%ax#$;*Y zuoT-u6<9Spi~Wb9M`ws8W@5XJkUmNOmZCT5nnlTXlS!77D6nB`Y;7~szLFd2=oS=^ z(>t!v>h~wYqHyav@F}GGGSEJL$fDZu0;E|kQ070MlE${lp6mulW5V|9dDl^Y1rogR z=C3mhC3Q(3wp(?d=k)Cbi=kLvDwW76Z}QOfS%gV}k&`i2_KjaUP7PX*SU*My&kAG( zcH|dLlFF51IgwJkh@qqMOnAWPh;V)DcFli`0wl{yDIn3o1j1duhpYac(UGSBo zVNt9KkNJDk(W?cE*Bp#&ZE$c%@HK%C09+x1|=#!Ba9 z{lVfm?LQqejk6t3fvs&jHWe0UX#Vi=S9T)^Yx<6#T z{JV(WVq8e{B@GGuO1W;das6Hmz>mQ#EW-B$`cG8H>SAHfcS__7*xJhagNFM$V&lDbIasPSxjEzQf?51WP!JAwr z#$&rQ4e03!F)rJrzSj=BRK`3hiJs^xArXi1X@#gT?EN=wRQy5&P$(w=1q$ot*jYMr zfn2AzMiN@b0F}DAzO80#v*KEcr=S#}B!Ham8lMleoeOH38Aqf3Lhbzx;f6+=D$mZn zZi_Tn^S|@U^1t&By7O~_1TuhlhKt@k!QYrLOqhStx9eZ(t*-Ufyq&uPcFzUbIEc5= z@n-zUvZtu`YMk3Ao`*RTH#h+hrbV@u5X7Fz7$L*RsjsJue#u0 z>SDi+d>>1bc}5%5e|Uy)CB}G`AZf7v=AJw-d%9m^wZ}U{@rNOzulFzmm14ZkvY;X67=8U5NRX z2XkTJZK2#JGle4O{)QVmeeP5`{0CgNTo;?h|JZ@&^V|<&yl~||;95M0I@4m%QWyeM zrrA*`m#BPgiDpd|%!}=$!&F8(Ht?6hc*{t(xtnzo!k8Koh&PpJ7+m$v<6utlY|4V` z6h(D)ug=$87hs8)qF6CwVg#f_<+-f?GJ>?0L_D*B`!geP<8v0%R#xmJrl7F=)MCC? z4BvG}qc|M)rxF)nYHM|)`Q`!sAqnCQ<43VrmxatFQ3)^Jt8pq`t+Q|jgu@qFUjX&o z1_srp7PiNf8S5trgI|cuHt^Fqvn1vQ;5;$3tEtvP5l66Bfs5XNLnP@2-dC)@*bCVs zdikc#7!E|DZqkFepAuCs8^jkvP2&-4bU%vO2euy-cBTqr_7FJ5K$*oA2ED4A$u9WX za-$QMNy6s&RC((e?rS&^Eor4(SOk_^+EuvW>5!W9Eib(mwWpmj`V>fBLpAbcyYE}s z8!gH24-%O^Z9|;E)o}9E_#78ERRC`<->f1fIqvNKpOsKn1xqtoqEe;I zWQ=puzI93Gj?b3hiW?~6bsa{^8NmAtqh#KOd@03ELWJbI{PiXzYU(Vn8TAv4cYfzYnMDzYp1^r4+cgbD2r2{kdi)17fIZWoEIlBCZU`xX|WP;d>m4t zYf#Cb?v=rXO4Zk8ck{8g=Le2t-|@ZR{-bhnONRX!VY%JNKWT<%j=pQ(BFN7VE7gk;HWnN$QB zmxn(2#}5~r)rgE*9G>vg{sYuz~|kI!bUi}V!q$*^q8gb>XHnDKkim) zzVkJAYI9hlZ#ONGu6m8J7Zsy!8bnchfkl@HJv{0QQ#*V z>)8(BZ}D#-Ef%r~!b15;H-qh23LJp;+2WeyXldC}2TxHZQ;?OIFLR($E!)#Aj5562 zqyY=v=8s&twe=$$vO*|gED?0JVXqFcA-RCQLJ*pBBf;VrZbp6y5Cp*Wx4hnJt_OpbrQ0%}`3+*Y2@&KiHZPoHXeJ@AJr*^9f?VqL%S zHS!sME(Q~GDicf)IJ)<^67RyCZS2@=Z?C}gUWscBBq6Lj)vK;u2AVvtzE`dRWT%pL>5^1eA+0x20+ug8HNkRMrF)^mq zt43tATr*2&q~ezd7BTpGTk=%5jIYW@)0(YGSa`!qF##05pP4WkXQztk|wy29{mAb zBXO|l(Gb-%^0GSa(8kbMFGG~e0enHj_5SxvO|RPQ19fao;x%obu-rCeaJd?w$We*a z@Q`Y^q05t!bwsn0Zj(#NP zlj7g0C#F*d{lFgf_XmlBf)=DDyez?qW=y%tLD~=-w4Fmzs3|OEf9Wn+;JpTmh!GnM| zvzs>hRh8D*&Bd#N+9lXB)u-{Kiyj@LEZ;W{rqV}lcq2L^M=ka&tGZ`u1pS5*U9ouz zlAr2qn*;vQ`Nbnlv%}QKAhl`@`9W*$7JH33w(iDru44~Nj*zKS8u+9N|C4s{pr@5J zN)y?H-PWCWwv^hN_oG53NZtyrx=?5vek;)LYF^Bypx6A64V1Tu1h*>^v)A<+dCJ?N z?yI&dgZJO?&ZaYk^l*ocnwUGS*NTIViKFaQ!uslTh!8Y|7v6eAHucK8^aX>_eT>t< z;n|Q+QskqAm^rwvPcTdY-1JvYs26$~O?Ckc`XdWce6**k%|=uZ8T(i8wJJ&oim8L~ z&*?+66ceexvj}t%@dz1DgtRBpVIAMCQ>)j@3t<|X*vGSYTAnM*mu8Z_3jdO5-E@p% zyPQ4khsfob{XieeF>>#DL&t0(Gz|lLJmV~xQ;ve4nO(*ILiQ#^%4*pM=+#9dZdg}m z5Knj&k?zwpOm9QkhCVz)OY6J<)z2ZV?OR^^MU z-I2|b-7SW<^LIkYS~#U&lyR*@W6oVOnD0N(7wixs0#26Ez(TJC@S3ZBpCOv7w3!zo z^5@W86WhH}7jSJy-&82+<`gJ=!l95V0C~)NJ;lD7$5%~wpM)_Pt6AkgQm1k-|J+Y!dA7VMck{-O~ zC$EvR+ZjQ=8wp_@9<8GGi%jCoD( zjq?3sh*wl~;JNYo>q{&TK88WXuSk&xRdfW4eqyS2>Db4!E1{PjBFiY5 zSBnMe=g8h$f?*q5o}FKXg%^T=2*TZzo*%3lEqtezJLcj*mI(4pa$hQ_uHTNUx^VM! zE-Ud)1@S!!W7(QwG|fyWb)8U>Gl_ub`SzE$qhheg>##8O|74U`YMS-ZT*(6QLWAGKYGlWicXl6*f2R3 zuTe8SWmrx#WH>P%9SQ_yHFYqfie@vQhg?KrHL->TEa3PInxys#Nv(w7EDiLu_WVR6 zQGq&tVc{RKsLB_SH^Hx;iXSCPwC-ZzBf|In!Uwru5(mCe7brdciQzr#>U+x_Da!2S zZeQ1GH1__>S=5x;nM~=d1dV5xE!Ukay}->L@HgLT)Ol1z|HM!CV#jBzF1e$%@=wVS zc@iy%yYpS*WVmGSM@mH^ms$X{80C{{K=a+WjaCN(p;FI7csHVi*Rz-#7mHWkU5PnE zif`q`%#rAcU{JBkKH<;DbV8vp6FGSmICq6FtCkgZU%keN0&PO4?aI@k{ZeI+afV?R zUAKVRE4>?zE>6EUYih716Gf>fLoH-Z@kueysq^73&wlN_5n?FGJD zI)>-UG{)R!7koZtRSW)&5lJ&fYGcxq%~11^wt7c|dycaiTy^Qm_6MtT0%BCKJG9XN zRn_$uQ9ZVAWF7L%uq0y{TQGVGhm)CHxcS+N(AN8@v`+w@90I!!-k(I^m{I<@~7*kPklH z-STo_!?fypaN3uP?YG?kE@s-QRK!Sl4mtq}?-~!WLcXRjdXFAXrK8WEGXj1TBj?6q ztBbAe-l_xH7;f&C_BRXy5+9n;f@H~jjj1Br%@U(K?}F)*P;bNUz1Ub zgy(PO1mc%@J79tI!vQ>!=rY=&yTA1aOU88fwC#1V^|XBL9Obr+H{LvEzR1eErZ3K5 zrqmQ7Lw(b6-ig9ASJw@LS-%qxk=MRKfKXF(_MeM)wGXtHLqd7RKsv$)eozQ9Ef^Ig^TQdqv6 zei3h_HH*5us#j22UDk4(sIrJxw&?7=$M|;6srQYk5RWI5NG^sH-eUI@M=&9g_z0H* zP8JK!z7whz2u?>Djm6W`{O#ToMvAPg9-HinvOzF$#Gvs|pMixG!TLR1*A5-M)9-LX4PHci@41L{7 z*61&lkK*ShHLWl6E+Z|A#(;~nK0l7mIP*(>_Iln!c7jerAnl^h>yVZ7)C?$A52+wm&;@Vf;dI-MDfy9ne|Q@b1LZ(A?N}icOPIZ&vFM=yPCo z1GF9;*t<;;Sw01#*y_i$O?2+g9~b+YQuwEVq1~#nu{9k+$rNS+1ShHxyT+T7Q`(ij zqSMmdglzWAi;p2h0ZK(RUYr516bMANcIPJgm)F~4z6m0nX7M0hKjcZ z*HM&cvVsF%|0$j#aIH|bn{T~6Z!hw$ zfL9n-IPHOtLJfQe@<(^NHoha-TZcFT->{YPI!A6NUze2iCv&+NOo}V6;k*VSuND3VmaHh z9En~0O~P^A7uW9~J`BOm+t1Tx_bf$6kKV73z?$(OL8qxgbMW8W9L+Mmx|?{l&U53t z=wp{?lO2lISfxj(IE#|cx%j~vhp)OYirI!o+@lj%@<>6C#`RS7G#IK~b=5|3Fx zz!wgwhKoa{));6RjjmWm`ZKO@_1sQpu)lBkOASol-+{MFOUC<0PJ`#@O6!Icf2@z# zg)JR**I)ekl*rdV%{EC&W|#i#x2iYh$}ciC9A4JCbX8Uy8(qFaLRF0xe0gngIiuX| z&dkbGXliud+9CyhWoYS7bZn^eT@&brjcSqyuKLtzMN*02{xpLg>v;X5gonJ)Xo>;Q zq!UW1wwmvl8UD2s%yTb%bxOwVx%eRz^5fE&t!kJ(r4B6O=}qK;yK%M zXR!I2$y6j?GfA5#tlL6YNuaPEecy$)B| z3*IkFDihX!Gl~Mp=bkQ-;d(u_&=slR;*6(?=!X(N0k4l_uTn1`OYMv(caWejDJf}GG^!@6)rb;tsf z(?`9Wy%-WO{)~ygt6`CW+s%lEJ0qpBUNK=s$Z3N2^dif>mJg3Z$A?P!ji-H?OsNw0 zn`!(H--VS8O8<7C8zhqrk22{lRSsfFORL#@qeSR_(o+s04*~Lk?-1Ldy0t?b?dE8L zOVSQG^4`a!hbtHNPP2wbcam1h#bsHCu0hr4j$7vdUfdP3g^0xk!qTuD{&WXteqK=} zwxSL$O^=qm>rx{CVwL}GEBBtf+-T-m338+*ts?g6rVy9ow(Ed8>AUalMQb1JUz(>@ zodww@3C36)G_N+WqA#g-j8^J#mdN~iuNDWo`bA;$ZA=5gGaI7#0{fqC$;|KLwtmhkOsC;F(b=T!2sU^J8`Q^(wn@rc_%nrHJF2;#9 zU$$r)gT`cs3v#7ytoGehJWv}^HbDRkqC{0+o%V}{{@VA?nI{$J977F3&WPG{{<1B< z_K;T+a&C{TOHu{ll}CSgafzzjF4ks~Qs5yt zlHr*>IQ{(aN3@2dMDR>i?uUSH5IiJGqcJ@LC%VE&6Uwn#DK33s>)mqV%)pW!A2w_1|Gpe@!R18b)cEM@pOVluMu7f` z@R_9~DiovY`G9EX(!GUw41!Tp0#$gal#kD*d^H*)_1wwGr+t9Xsebc=Rw4LK-CB3K zo=$BFG~6xy1x?-;4gW)MAj9dKk@nI#u$N`fo1a4K>>8xR zXIrwa0vWT|?6~$;SW}@}YT5psS&>@e0Qv6cdNNE+Wu|V7-Qv19= zGtS{`uGmvwDxziNCQC!kEJGl*3yixAGy{oCvr^&CfBSP(>e0b+Cs3Tcl9(EzrDdxb z1m!hoxxs4x^7s+OK~P_w4U_*LE+wpt9e~FukDzFR7_-O&882;BAaD?SATjoYs8`<3I$2E% zxv_LK8H}t&eXs%@mzOUyBNf74wAQ8c*{Xia!P#QoaG;P-lY-v&xl820<%_B05G@^B z%>Za!0nW#bXpby&1+?_zBA9ohaXwv6p)|I~Q}&%jyi6Tm_EZl`0?#{4EV<^BPX=-8 zIGAf%|6faI!PZvStl?mxxVJzk?yfN)ySo;5r?|TmC|0C6 zoV?$4en56sviI6E^UO2%qGiu(ZxB5Y1~+lWqiXm}qs#_swtQ_nQ^-;)(&$8QlZA^@ zrIvs(|9964Mj+3*aRvM(aRsYUl6fbkXy?7$0&=gopX?rmdM*g#GxeI{l6}!TkcoM! zaJ{tcKSWW^b7dRkbvrU@+4rPL|L&Bf9|=yiDa4(_nhhLvyDYxlm^LXGHPRb_NYCwm zQ1W%i^hMj0FC&cCBO5X0roxqu{Ib%CBqAAPW^D$bXvU7{bJll)Pb1smtbRD|xXq-n zrk~$k{3(_`_{7UrDo{Kx`%qbIzLc4o9HG}Ph12=gh^-olDpE^~^S-HY4Wd!1dOb2v z{BQH?l;~=)u(8k&-gt?wZr%iNDNZM!(jozxsU~*z000JX03@7+|3ncYM^+aY zom8xu@e?NfSymMLvlu6qhcXy1gQs4BVe#y77sFK?qxx^boL3d0$vYpAz-&h^UnZtM zG^Bi!o;5}I^_8BYpy(jir+baLLJ=STgKd>}-I1v?K>-{xcUXXQTTac-DLR#hJlK9{ zDqUVff0M=_*jCIHe)3$p-UdArYsa`&pEe~bzmfvXo2rHn<>t2_v|f-9c9(Wlo1URLV;4%FT#{= zpShDKol7IDG9bwf!j5O&TGr`VT6*>tk;J3p>kqom!J4|U>C_f();`>lM5p=!-HhzZ z{JgV6`Z?4;DdxmR>$IQlV8&gM%QHc9tTK1HE{+59#X=ORp*-phQZvpFVOuvVtsd;5 zYX4Nepp?~jxc&R22PGAvzh0j^mm9xo`ltsZbh-B1GP$90l&P6#VAdrYDL+J7hi#eD zuEEMfV!w03%~LWdqocIa%ITsn2n?!0NMF1OdHKV|Kbp)vq&=yp{L8-2HEe!)GfJ>f41~)*PZa=Fgq< z02m86D<*PIpkWA#VH@511hY7>e%SkuohtbccJyl1FMKoH&^&%vAQtR2;$;8grg^&Z z`jc5S1-WVd&EbW7=J$X-W+%OvR$OSoD0b5H+*euXh+dM)0^u~ZXk})wcSw9Sc0V*2 zj|Wcghl^ePoxl3)Achk`!H6xy{KC-Rld+fZJ;WlPlSLr-pan^Wt{Q$POmeyMHz!zZ z^#wDbTR`8L#hRQl9U4*K*Wl)I5t+XY6&~?L{?&Dvzvw1j3HNp&JlaeC}o1*h2`M#b~_@HQ4$PH<&5Uc zGE&3u9Rzv~{1Ax=Ln*IPQZ_BA-4(XrW|_J@Z8h;C^Sk1+ZMToR9vhUqAxjlv-2?MO z#EpdUQX>#oEsAzfRF14aH67$*ZEs%YoexLP?0tsMCR|3Dp(oTYPr)ftT`R@*?;L3X zI~pXfa6t|e7JuAk4(Ww%A3t!;720i#&O0Y&N9Y9e)^3rGsv{St5bQ5l)HhQx`HjAv|6v>JzPFWL&uyI}^+T~sq*Q`nTP_-rQn@JQJm`q2?nc}NAZ4RO}nkV zH9(%>+YGc=Vvtlh`&>|8k1Cps8jhX8W`U~BNbW5lZrGi{bmNRj$gHu6ZCa%}7g!PQ}Yyjqe4rQBsg&d74bQzhNsKArrz{8w5l=Fn};pqm@=Mxn|t zukq}a7Y_@_ak^a@qT#=$Y=Xa&%3^^cHxNp_b5fR~K@kZd;=Bd|ccdO#tTSl|s@2VP zXA@pBcZuw%@vy__L?7H=ffg6pjm=*OtO({c=0Xp293)AmywO4N#pQd;DWOCcLUHRR z%m9jZ4`-k<_BILti3F|VLU#cxu5&%}3EOWJk-qkC1|g6AXR0BMP@u7{q8nx|C{RQ= z)*Y^KTi&s&lU(ngUJ93%@!KV3?)s?~8}`yjd_Pm}(K8Rf=Z#N4uw+r4Zq*_gFU64z zkTST+`jXl8kuOZtOuIyGl8YShK?wK^S8rap7mba^dgK5wQnH~x(yzYuv0k3|PV5M9 z<#jj7kMsV$L{Sq1RxZ-W@2%_*c&L` z+!>E*waefL^V5qzQIS#>u&M$9QLjAxC=#>lRUH@+H**^%?|~%MPu6mo$;gWPmIXd{Joi{AmNFZ*2Cr4A)V&74wRLwm_i(1Nz$04gFpF-ZL%j6!<* z^}G7ESwaqU!MqP|tTjJ52~bqsodG40e!;;X&vyamUBR%_315`HuFp-6h|G^zY*}B$|Nn&J`S9)LAH*l7tThgqN1g5&NL*uZDvbhXOzO%4A({@00^AA#(!llqVgTTO4YFnBt%V9 z1Y;vWA>Hh+IYL&+1kCpF(9&)(q|!n~JP3)t5pvtt0={YN5tw)w3v|{i%X4 zv1Kn)Bi3+>wOH-761xjPailL6s61>De#PZeTYib(#Kn^Q#YrLKue?7wyUZaeY}L7r zG_vQOO`+tM5K%;DFlWW8M*wcxpGa{KKi)&ww+EB=MNC3AI-K_Jo1eYI)TtFzD%4#! z)ajWPs;aPHCgT`(NQE&|tLv|7S|JmzM?KdmLWd`RfBt1vJr4AaDX{ z(Jzd&8+E1Kn-%=cw1%&Gi%Aj}`zH!jP|PgCjse(zhI#k?X^GPu;EOjSMRfR(L39a) zUG%GnnD!zFNXv1nlsl{L;4Euigk*lwV*-Rh{h>Q-rT;p#*n!|5zIy_BOu=e957Tie zr?aUf4zfiLw2MQFLQ3u{BP0#eW_HwcPDg^uF;zouLde~?RYg;i7sX)-JZ&MnN2sz%9VK{DH-#5fGhCEpZ_lTy=~yLPSU=mIj~p)VY9 zXeatt><(zzZ$QRneKb4Ol;$tCKrJv$Sy*lfC^TFJ&VDL>^^LRR|A4-bd12 zd}!VcMY?wkBCzn?7viIfCP!Np5oB`0AP&D|DU3SWm82A!k+wHCo6QTqnrUl=3#P+y47XimBsQcVbDu{&8S=AmLOnO97SkYSPf+xxYrfo_p`gMcA%gE2q% zBPmKZV;_v~Tid z{TsXWM06}I|h zDyTgnJJ1eiH#Dddgcv(>e3)MsVmG6F-ROg$po!*+&5^sQG^;7D7nBV9*!);U$W6va zfkxVbZ&drXhr{BpC}O5@g6vdx10t=CzVZsbe5>`i7PRa+-ne!k{m`5^ob_zTN9mVdeRBmub5-1 z*?z&*TNbI|zf07sishOfU&3|2Hnbu@Ov(4xh-M_DqWc%l;uX1XWckV!nXv0_sKV*0 zTk0oJ0WLjux<}aaI@GsAzsgj$yKtqsP9AoL>)0+`JYZIXQ>mR#QC)G?a`DfB{ z_W>YR787!jV?eY7r2`7EZ;1dUWQsD2Bnc0m+&}ja6ie|XJ%+4joor%wZZrlA1|TCy zVe#B6`HzDhh8+RMRrp7JW;dSKWYc)z4L&Tf!c^K6&xuE~s!&~dVZc;5env_}_8xOUH;zFC4ZXMLBApW@PM&1c+Nq{M z;jw=jKuGzSy$MpSosos}*ip*U8)2+bC?toQo3~zR44lIYOfIJ4AfD^O$CvR?JG9@+ zb#YH4Ly*+_GVRoHMK^m$MHsA_jQeja2t1K4EJG>gAxQ*KQ0ga0ES2mZ_IP=NDe9cE z=+Jq)jpdn@#AV8;t*w3ffPRZ{#nVK17`$zBf7BU)35MUnq`|nO2z=Nd!4DMH1eK1( z)QrQ4LS{vZuSA}`z#3^~W-S){Up~}CG3%d2&Z4qSRCK>$T9o|yN=c?4S#Iy&$x420 zZLD;ZL^UFMTXfv*gGwKbI(;(yu~8Tk0YZ-&y3|Xx8>Zsj16>*F7v5l~miAR&o1{U5 z8RPbqLlS{`uGe;TqRd@9@NH6V9Q5Dsy1zx+fL#PjA?+odd~0AU!q3~{L$b;sA#rf$ z0hDD_H}B!Sl0F6_lE0FY67$e%i`yWUc^@G(P~|3i5PS*oyVEd2-6QdUNBS6KZv4Ldb59Ncj9u107GOUYg`Eb z_+d9&9EnsJa*vc|&Y+f=XOoUaW*KP3AWTh{s6v7{YqNs~+m_D|*qvZbO>|9b z!P3%`4Ie^HlT08Nwkm+e-NAU*U-Z?ZBjN7yEnZ+5tK&$_&k54pBjby0Y^&Kgf&`Xr zhV3o3LZrfKTJwsiAfM%jD;-qVY$K~rXhl~kV?Vqt8fh?I8y5@8Y|jud(GtOSiv_yl z6Z};}dZm1SU*MPmo5vqw)vDoRi|0-1-N1kHce=_6N1>QQDlnF&vZrr2sZq>GY1@kE zAO;%rM<9&S46Ia5Ese;`0G5w9-8)GMBO@a{xIE?<(Ojfik)4T7 zC{;StZ$lD%&t`1$W}}KFN7Z5cyoq_a4a8PsI%m!@Q3ME&WEt^Q<));)#1{!N6vUOT zjC3%;NUfVST&~ZZ$ijC`R9*tHIDKjvP`b5u<+D-Dolw4hELbrT-l+O3a57vfirgfv zSM}SEDiH2eg^Lh=moPv7L}8#(Kmn5lJkmKUj&f9~+w$Ybl5gQI*??bdH&x|}~xB?<6o*c-sv(Q4}$(TV1_68U_b#p5yFjPK= zTZ@<)3KH*=^^oAcC42*a(5u_3)8XBpi6xFuxUcWjM}R6#J!)+AA%Ye-3u5SIOh4m; zI2$=^yY!>8s0_N~{_NJ+xkL)aCyKxVZx)$BiQYp{FkYB$JG)=h-_H$%0=K~|l{)_f zJrfo2j@&X89a57+LNK}u8}W=w#5{AbhwR@T_iEk~rWw>jl(*k_NC?^V%_59{Y;UnM?3+Uc z*?NjBP%*ss|9ktd9^3zIq>1PyMNE6O)piyJ8J={1HDK}x+!K_R-ABP7palE6-3x}9Yvg@X9Er8r%O*(@u79K?5tm=5E7h_ zGZCzbIP(inJ!%>f5myWPnH>3Ibx?BmEzBz+FP8CH8aUos`K_AZ+hZ)yykd@gXtKjs zv1I@7%v9t*$7oFz&la(HG<$er0AVTke(1m0p1AuZcY)-_PI+s8CJ8;)g;Zt%+IzF4 zrK2OCKMCBwMqQ)jKn6Q#Jj)Dl%rwCl2T#j7Eyfv^{Z)+`Zv)yU-nqcX`|EZO52bZ8 zmu#s_Zw2pRMq~m^sOQU@)g9-*|8-bna%ni%btou%J~>Txen&h8#sN5>**9V0phkQ? z(k#{Q;+@L(u)^1wf+l3)cd#)Ao>aK%BRa*QSkD8}JZXqA)a}xXV^PTMB{Q19F4s0u zm1C7Y`IlmOR&5;VYBh}yNVGm-4OqF?XNHXm%9#Wz3C8F|`6u9?`+`KSy^046qg4#A ziz?Bt@BDZVBEsiTVcSVzN!i8r?ZwkL;QZDe6qt{Y7k)QmxIxFeO~wLcc2>cy$=v*T zV#jPYC6BddDdQmo>1Edg#>J0oaqt=j4G>(xA}JA1lYC>|czVWtRp>;OHj)KCRNp>% zubnsEIx2gJe%o6WP2UaV{W`81NItYzpx&gK%qrM?EqbiKID;k#$t1j7DL+}&z+H6q z80mk7zWC|w=h1d9)@d&=#02ZVpk;R@UW_Nw>Lu<|Gr`QT(q5v$Cv}fhXt~NrNrMbl zZhZEG5Lp4uxw>-b&ehx1`S7r#;yN4^DfAbfI7%mu-!2X-PsN~sZ7Bv`y;(d*g!AS| zt*l51YFoiu){mKwWv0bb582|r50&c&e|yPz`UeV=i>&L<&^?ap&@-W$KI2%hUp7P; z;vkkTDKrJNVi$ibX5OH8hEo@@Tzoui%1E2A(!(eN#DpMt>}4$DXCXzw*S^}c{ljO& zq0ZRw@8|K~2{^0Guy}kQPMSj56r|WhA2+faj8)cb-<|uzvbTOWKf1MEE!C5G3~yN6 zoJL@N=B6y>H@1%dP9Ef4D$r9|oZ9vUhVG9uNFIrcw--jmD8*>P@0&(+7t^;sEmhwuQ!1(VDaW#Ai&-6cATzddBbe z=K&j-u$r4|w_MdMAuRQZ`LAQ+u(9b!T^VWri@0PBnYq+5Uqyc$^3W+8BHnXsMQ)_? z*mN{>mr zJo0U8A+~$nPWBlwQfhOI#8l#0`8a^>P1`1e!yLo10Gg8O%b_6u8V3UkEM4FH+S5Wv zxVOz&robF8|59-gU0ap4G?TEz{dY-$q0S%CFZ*tPb{*;saZ4~(VqaGQ9F;wI6`LUT9`0h>)Mdz7LDxV}*G?T3B_YHa`UIEw(H;K* z4FDiX{qKx`l=@9h{r0jExAV-Z^Q{V=)=9>@fIsw~pV8c-YM$RSs!1sGeVcZ-+-l}p z)92p}6pf}o{rp?-ZTJvZ#XO;T?Z76D@`hQ1u!?~+jzkjdF_85g+<*KO>1~NC3isu+ zh-ixLqd>~fr*gaK8H3%f8yzc5!&qaud>ANR-=K0 z!qIk5eL~&=0;GTvTx~6@bjlzunz`%WC9#Mx06Aa(2@8Xm-kveHt&t_PjhKS7GwO%e z-jcYJ6SSbg{HfJckV{XxCJ3+OQiqb z#SS!#8#XhgXE*udT~s9sKuN}LgBy;?NI&4G40Lc6d^cErlG(gpy-X5cc zv!TXE6AiksM#yl!cAb(JZ?@@->)7Kgbu1Y29J3BMMD9rB6buyM?fQa!g|ML+q6 z5ifQXwfb8KDqi<8Sy3LjknvR;c=QbmF{8byScWYjs z`4RX)3W}|ZOTn_?8nv^s%dpX&oQqHb@PEOE%d`Xb3gJuMAG#4-E5*JXk*#Ij;bIt3 zd$w7+1yFoXF45zsTytmPrvcz-+b32^7k9hH`{WF0q!JHNF?=HB)eb_tHG}f|XLea{ zV9X&z#sB>TYmR4x8lUBJ|GtU)^29VoVQo7fLUEQBIN^;RE8inQ3c&f9UgotslSh;rAHkrFcrX2@Ct-pS1zngUbe~ao z@89V8N{xOP%d(Vw^8f1TS$+?RX!a_1-hLMwxmz@k@jgul`GN3&nos}Ii z@Ds3>!tepQwJSLuw}$qL|FQ9`wdKy^U|J2;oE%sXj1-Aa4qY2+ATL1cqK}vG1gdoq zzhS9{7q~kMd%)!PR@HxZS+exraR0YuIQoe1VW%5=ir0IcigR2Wf#Y067$=LK$yPJ` zhfEjp(Nq(GdpL^6ay)oy#C;k75o22dIMoIBH3}-ZlrScq@jV8FYWJCk*Ez;O7umVD z@KeZi4C+lUK&h010S!!)*uwe7o@8)>IYJQt>X-xqSJoc>u$KtcWUQJb$~Vj9*@_G4 z=8}(Po64u@gJWkxdf)!%Cei-vMqrCL7GZ;Tw%S!6%VNok)VGUT!69bh!aHjn&*N*K zlA$>iMY8@RF3s|8N?CT;*hRYc>I(1F+=f_QPr0|{ZX<36{aTAINZ3m@rkzC05`gIQz&g3@~kUIoC!`N7z9l^PL{S$(JpNek6K_r3ZP68UzX zV|PB*h1jkXfy>Bl>HLPI3Iso5qdMPSTJ=5hzT(TV3CR((s?h$m2b%qg>`pxt%ILE# zphp&tG-|UUasE~Ge4QByEWLs26;#kz-jEJgoxc#J{I&-6^@{XK)w-bm)MgE(W{aLn zE^x_V3$}yKSlnv!dX4GFruoE{k1ndh^#2U~)gK+YaVy`w@W(ifjnmU1u~GIE-vi*@ zT5meB)gAb=cVhc}Fkj}l7sNP^Ydqq8qC^^Szehgk75Nn}){F0vScGz)JAQC% zHwUE!ry;k<%k(4vhgWP(mm75MI{9(opHu#$_Hl?J5Ev^J(_#oVAp-tMQ#v1tJdw5W z16`YBcdIvKcPdX|_wUZ&?rxUydBzbUfrFAvX2|Km9)@Ox?pM5` zceQe>ynMH7V;X&_^*;;nm%CzZf-J@}GBu-3>snZTF*jT)rzTr|1GV3p@wK@H!*NF(}iS ztaRJN`5(U&gg-lUZ%j2?>DqpL^IX{n09wxg4iGeCl<{87fbq1jmnoXX*|brbu1$?G zMP`|>&+oc1sEDxvxI%|iI|=r)sZ?}DY?z!VcSgfj>A5F=7B3=mAn_dJDR>Z+kiLcXQg8vJ~R>hJp)|+Pp5xvDn%(Yxf642hKrn$ghw0wUi z`dzhzW>W#~GKW0}}V40LoL*x5N~dIq6(gnyC6_?btKJtH&xmjSaw~eL@SqrIrq#mW`bIhR?Gm9jjLYNG^dEc$TZy+0O>6R0d{xx z9}{SzuhbHZ*AgVpmU3n^tbNm$DjP`F0A~o7ger)g|A_;N>@3rHpk0!P`Zz z4&{12yT3VD#2WdJ0*HZ6w&brnw{p%@UN^G(49w?c}mv0AIqBdimmn7ysv@z&R4K7Wp}X zMl5LH1A?B0ERqsQNf))z(&A|e=+2qf~dA&2FL86NQvM`z50 zAFLN2Rk+m$q#+8fMlXddLPI5ke=ls zA%;v3stKu12(@OE%sn^%o#>i`#oM)`C+LQ`L)ZS)F)z+$g*>NH&ylB2T5cAZHjscMp2-g$%}@^WzesgkI~54JgM|MY2j$G8 z|A-aV$<=?aWJ$I!a0>qx=&y%P9H9r@H|LS5(I`{B0-MSw9Gk=z{S@5py}vXMSd5cB z?SL}4XO1$izKrDuFR#3aerGf?x!X<;Jq;w}Q0UL!>EcW1$?61Zku|og2t=IHEPcyO zWd)xn;E8e1pasu9y_{q`IB8mu4qi)eBjpAwzozLv;F|d{#ARuiJcAG3=SqI1h#vFZ zh(6wh48Fz4O+6yZ0Hek3qefkQjh!TyA-TqnoRJcfOfX^Dh7iPg-~4 zquR>lzx_*kwO0XCZi?>fYMqmNpve$?Ee4~yliH+cQ>^oz&*sX`<(q6X+xa)_LB!QH z4lEYl-xm5Dct0U}IGxAoXwI)f@XQ%L*H7vf_h2EJtJ- z6|QW~@mSbciNC5y`%mVv2zF(6?Xhn8L2M$rjnR>_{3}#qPdjrQ0oGqaQ}pSXPHL-f z9iNDlM`hj~L(C%Hp5BL@h1ABueh}58B4ms_tYKo!`JyhgwYlyHN`eqON>We!SNOF@HBtyiDl?+aMJ5&HPR9Tbm8GbcyFo(KwU7~^L1ZS8fR zk=?$?V5cS?l{Z5`4-dckddL5gq?3Nv_9q}Az15UG9MkrS8eIujNesgwarScH(Hp{>U{fm=!K0#g%i=0#c3nm!XB9YX zTo*v|NkLFbleN3i7`Hvw=P1%UVEL^R<@~Y;yOK@}K%F*KJr%$gwQza7hhgYCtquD` z9xPW@9|NUvzXJJLGS!kWzo8*a(Qs9A{Dk02=kYV<^$iJT z_jgK>jw9}Sm!^KjmR$rUk5SBUgCU`{h4ZXc@%w@lwVN5@L1No0C2feywt6YDo*dF= z%kYnl1{Q}SctEU}(_$%MMShA=F93#+6owMkhjTxY)Ai(8KdHi(tnZm=&Z7>NWs)(> zTZ`5eiR(_63Js@2?zNGQX*u(fUy+*I5?8dUdPb#ixgciN%a=&p@28lEKB9h*?UyOx zF({SpjJ}fJa!JeWTvz{7OfzGoZ-_Wwfiy0vzU6h~PZ@8pD}u;*{%5gLY;7{YKtd}O zdb+L$7Mg`UhQdggV|iQMIShhaXQ9SHEckpL&)k>B_c3>s&jW2u&t~hHU-nPjC4l5| z>K>kyxRG8=c_n*kmrk`!`_JQU1K+?!_jLvmYt!ENDZ)(^>1qr}TG{mg9qVPj5O|P| zkOyOe<6o{$dh%IRM)DLZNnEYeiQfxpu8}8sn1`CxDdCY5vhjd4x&F#PAP9l{)#FX8 zyQB0y$ou!ioeD*jO8(5JN(U`?ySaM5nfnC zzpjLvh=Qy{i}cnDkFhS|bPuD5Lhg*62=Qzvb${sxX-ALgul%5MF2*RZ)r^mQG)3Pl z%31ccAF9zPfy(%(6W92sy~Vm*5od8mc9#9;(;6?})#(4!c7pQ7?ov#rfj3ED-e>S= zGTodqN%IY~XIOb5{rF4KO1v*yD$L2rrbsQzTA_^fYEw?|jZH)mA457mrMh(qiOb2T z`WaF1X-^$;Ql71t${F%~JA)po(N~fu!**!o|uE01=7?~^-dqT%R40jpg`{u;x;! zcx7c}J2#DDHm-}#b(VJI3CR(_FN>tck_u!x!r>}Bs-Y_1FUi_v$ReA~1Du+jX|ok$ zF>{3zPw}A0u-ua=noj0$OO!MS`t50M!Q;7;qvHpbYAG;3|M|BSAt%q<(((Ggvp+xb zdk#9f;)f~@sRu>@aXf6F8 z1EgqT;xJ^e(3Q)rAQ)Uou?U!Vb~26E>jkFC%?wP#&G|(J${DI-w4-P>$BOCV?-;Uk z_JYqaR*C-sYw$=@xe0&Jd>b>w>I$^8Acj45M@De7JmW#@Xl-~U9%CGvL<_ordjhKq zO%EfzTyjocz8{ zfbnOhQ~}A&@yE=ifxn@4%@Mv9G`jb0~T_@o{hSuzYje z^><@}NVd`5DU}v9Tr{RO#m`xJhhvhC1e{@BH??R}s7+~+>|I%mY_XsJATMDqv-2j_{Js-hka4(>YUC5!(6^T{H43Mu9f z!8=tGZyX#7cI@jvH9fX{92_PbHAOjtfZ6S~m|!v>{7eQd^XG=>&~jRv(`hV!!yONo z>*_f%gvK|<^*5h>On1MU$N9tg-@gSxWXcrgl)uOgV=g}7SI0u88LJ<1 z{P2E!Wd8U-t24))W?%o_zX#dx0eiT4++zogV)CLg`~Nv-tf$W?;{~ zr1JAXe7}F6>U{nTWY;6F7H*q2B}zyNt@SK#RM{Y* zWiYzke+sVbI&d>}+H>2_d@)#M%)X{j@o($*@00>B-U|(+Mllbl$)@BbB7-!x#2e*k zzuVOrwbfeCww{*yxr}GZe(a$;*NF3cEJ;D15))uI_3wnTatgQ30}mbot@3%rVysEJ z8(+cs**nFv_cl~2Ko@A<=q-_c*JOTdh*-=5|_{kJ@vY>jOI4QMwAuDE!z(;jLgrzup_%5?I)({ zUEzsX)N-Q>>B-xqZHaCsZ*YL2?;mImo)i%Iuu|gr@pm-K6!XMCSuzcU67&V{1#FO4oKk$&2v;6Elm4D6dHF276Z-zL*^iAwV-!y+CXJqgyyWOZT8Y2o0vHp}DLsz{|mkS{OO`8zw*YR87 z=Lvs{|A^&QH>TCRmA`%>M+e&hGYkeuvyexr{BEr2YFqw&U29O$ScwWj)ygApu0@*yI2wd2S4gH=wbSz?wG#*Bt+Jo=n1^cg~|(kz}nz3o=PHWUDpf zC19w|b)-SPzPQ=x7scOaC9Zg+to~~JXgaC{(qSF5m5|-H;JBN<@M-5rlCx{$V$0Qv zf2?;d!x9Oo1yWy0rJ<%%-dfqW3Iv5&Ry!`3D^ppGwe3A~tjK(uCEt&jF)b|GGvto^)~q523#!h6@en7xs@+Cr3Pn7)6F9# zVh%UpFD;}BEnOzNHd%KK4P`g-Wh*}?OX_fmC^l_M!bpb__wN0RmgLv?P+4(%<}PlvMf z;givp{s4`(HQN;CA4FO5*Llqrm(9)ejk|yPG&^r*{9G5050B4JeZfuMs0?aqbe%2; z1Uo{~#mSt)@{umSA1RzCYw}G9d?8cmJblIgyCx=3?HX&Z#t`wE$TOerEaTM95L2%# z*yU8v&U=3Oi|-M;s_xWg(q8&Kr?4AkNf<5nB8P3*?n~E>kE}aa2eu4!%@VfYd&N49 zJ;N^%JwpdgHQ9UV2|shIN2{liSM&5R9Tlg>=Qv?FXbm0i1@ zs+mr3H2WWsbFgx2VchVrxoa)JgR!Q+22?k-8{oFc$!;?v_E6bPZD*Oz0Z+zq?RH8M z4Jr_G$ktZQ=&gs;{R!RgJrF@~tZw<;07N(BbE>`#+{znTDXvlj?8iIgiYWhCpZkwe z7t737d+aWt?SLrF468Q3VdCxQ*6qRP>YupWrj;D8`uKWm!Q2Kj1pru6>nYWCfJst= zl2CD@8%nu!5qX=ueGRiaXdkPl1>pN;6>inH9fMms^=~c~Mpp<+!T+4;X8}*kOu9`V z%X%&OH&;Ijd3y)Jh>IUqPA$r<*(A#a8C==`58=q>ldMYGem4hc4>U|$#sRgD%o%J_ zxjkQV*`iZE=$+@K9tZKB=8mBeIpF1+-)H`<9w1(K3n_8?HD7fZm{iZAq-z8JMA$0o zbg71yl~(|JM4bG%qw)X?F_WXXbm_5T4azt;WZtWB3QBl1{rGRQVX!7;QguSTOo{K5 z_w5N+Z>?^)n`X^s2qL1!J6mkDhHeWr1Vp&Gp|@Wlbz=qTQ9%q=KJCzDv*p<{4`D{N z(#6oh`F2-c=L9uJ=TB<0en-ssGu9+`t9R6;uyv-TE zuaX*B2`uu1w?PPX!TILHq>G5{IGjLs)8XwtcL((I)lgvgRxeLuruV0mYYiJ)q~<1+I?5jhC)>alU7%MS2CQPys838SC_#=7eDT|*<~Xs zP_;LrQuRcQkn!82Md|U|tvFg`^E;GrkBjMTRHVlnakkn#NK(a8Tpu`hB0cb+Xt|mI zyD<~K=dPZ7^7ER{k&z{#cg*?I*|lrnsOr&fJKNV9TQx}pF1<%SBD1jco^@q+RL}97 z0^0ki1C)nvynyK*KsBT!X=eRzwi0@VD{wI(vv;+*+f(IoT!_M5FcT;C6o>+a9qiWp7l1yH|xv?de~L zS#{;I2tiWvYzg<#Z)#hD9y0ncgEi@ENi=J4F3G$m^|UgGFKc@m5kHR1nefU#vJ!Bq zPSIh^2^>oJHBBR?F*7H({EE2Z{^9p8D zbO&n)Y9s|~F!#Ywwn_!f3v-BBSpV$w>;f5V1DLRJqcQ_QC86wSJ&4467Df|Jk7&CS z1baZB;AZdNQdv?D{OPu`>8@rF*7Y}Zr|$;OW^<4BD%Gw^cf!+nQa{KvY!-@2Gy23w zJ&1)JlKmHc7y`;*NL;y!< zRZD9tCaR#tvd6+#I;8Kkqyn_R?PqMMREUBQELQM3GTV~@vBv%a;tlMMIC9ZPO6r@! zFfib4B5aU2L0wBTCdl8?4+0#c*Iyti^tBB-84H-LWy<9K%9V-QMkW4h%+<#sLy zl|(_O{!Z)E7jZU{-K^zXHMX2Joowd6T~lB>@>x|TFU|)QOp_vgT3z0qmd?wOBwzT? z_XLom3pnQULr*7t&59^S?M8Z|u8mxn5A5+@3irIUskfbX><`kiYkU(PWY!bV(iG~K z@GPD?NP3oT(67Sn6j-p@>lrE#evorjn8?{=1mAB+kje^PEMV{b({l&8yJV(I2JL+t zgY2}*bsUHUlCk^?n?F)s8XLPDupr7JmX3ZIJ4rnmg$)PHsU;P^R|mM)g;zFOg17t= z1bhxpLbHRv^}xtH4w4GZzdg1hfDMnJ(hy2ayi zx57C;n0zC+WEXZbr-%M5d5hVOOp77%f0no}%SIAcmPH&$juzO2^0KQof@}DePyB)a zQ_Uc=Ao|8R%sUARnZ!`kPNEykAs!;(zSfSaoQ4X*ywSBeGL#hI%O3u%#uveh?u(#` z8$gkjcd{q_*r@Jeeq?t?$A$RS$-8Wn`sHwzcrvKVZE2m{hweT`5VA=hYE$4in?p+3 zLDS39C_mErKAMy^QTc@o%Y3^W@8{;RAvAd?tq*Gf-#6`F6f+F0- zH@*B^;<^FrgY#CndE!p=Vvau8mcWA$9^>5?J)__TH#VAKM~1rj)1a&0^gYY)WC7ZP zxoC8Q!zVsrn|?Rn*@8xXp=E;I1A?uSv3%dDQ{-c_s>+EoEAd12n_^j+D(2RWmr_H$ zI~zd6v~6>54Pshq$lGw6l~&(R1MSsYvyJrs4e{P{k?LqWx~AXjo=uZl+uaDR-)ldw z*1@|Z5(kZ(YM=^Q`H$;pX8m0eEC3Qsk)>)1tm?2Q@CVESZK6Ydrc2)KK1UcQ2K>Y) z8Eg2+IJ!$6&>>cE2bj%Rv9rB--~MYZYkY-HggLpk-bdq+yeJUMMc-q zEZ>8y*qu|fEew_BAw2C?2lH%Sa1Y*{lex)4`O~2mJzaUSduRAx8mq)Va~0+YeR}<} z8sSW+S$Ky^JflOq$cO<-z%MV0yEO|J57#9pk#HVNjsMGvAIs)z5<>|k5_Isb*Utt- zV9kAkK$86w_sskodCL7bk8jht)a~Y|ytp$C3q^Zc4LVw6?@oQ132NQOq#?;WaGdHS zsCv+C@L15yA&PY@?0om(7C?-rYIIgtfN+POZ6MT#ZU;&*d`^hPY-H7Rb-!i^kjmN# z{`Oi5oqn2MM3K6~SQ+Q9&_q-@O{3hNM>v@J+np`BjL>6w^iA5MD=%;QyCAy8j^>4C z#BBycN<#N(BO{n`TrjuBy~K?^Y$&u2^^tPJBFk^(K)l%-quRS6Q>u!WKT6D8SwbCm z#s_FNO1H5(^#03-h=g*R!OnzAfL8W5pU=|BeGr*pRnrFA2H{1V%! zcHRbrsaRs$g0+>H5uI5k6=SbkdJUj4*KC??)>7zc%yISYsb(I{&BxO?*s?1S-7k~1 zWtiqmgSs;FfmmAj^=wJ0I=<=Jvkag~w|{wkSg9W0PHkvZ#|AocAwD(_|TI|3-+t+ZNeC zLj6T9aBs`86`jt+I<(k?!_WO@m2?)pc=O9ht0wG3C)z80osqU!bNc=j)VgEba^${L zj5e#!forfx_X!1m#dP+*R`p_LbB?3c?aMU~buaba9A{`EXYO5{A1lt_VA%DA{w`G} zI`@F#cv*nvvL$}YM0A(mj3RXCva$ZZUp;C!>*R(9_s<9a>4L5vLjuxB^U-{8)woej zx5*aWU%oyPVF#T`Bk|Us#85Dxi=to1_To*y*C>_k&hiZ2!MO$XRn0W2xY0Rm{sN?h zdm})Lj74H%J#m{c+z8=9)p6ztRt*b4f%glr(JQa3tGUx(Ybj*d4E?&wMx7Zr4H@gc z6m>5LGYv+aAcDjqj29-g;J zd$%emfJ=wOE@=N!NfP}`sMR6ASU?7*34xut{m?r2!r1B1Tp z(2d#dAzt?McqV$I5qHg_wDDl7TS*L*1_O@nq5MsOZJW=lHJ)}`y}}3t=aE@U9O~Cwzuq%y?b7-b}1@I z8F>IxRYNChUXvM!Ji)bj*u-Sg?VIr}t~PuO;rB~QK(|cTi5vK()x!5j;mu%MgIZs~+2exxI5Yg5n1PVrh zmg&))0l5qw7)=!Lw&iE28JpZZ9CG0_nBH*s%@L0Q7#Q|9V==3 z0%kia8>k=dnPYJK^lb<(XT>78ck)x5lnN)UiUm=t_%fuG^tQ z2Rod6tTIX`cd?Ya$BLy)CY`L>kufmqwQ`tVI;*#Gn$CUC-f6Jceaw=@)1_yyaj&jT zEaLk?i1uak#kp6H7!(-nx>fX-O3L=tPf6Ie($B+m5ADie(43g@w?XKyy|VV3iwC62 z|GXD*X$9Y)mZjWe8c8hoJqMS;9@jC;iO5P}%dz`camDN8e3WhiC>7D%^cSbpdjSBs z!z|QpOfnMKijDxK^qX0TF$B>5AFZZRj!$|H${-uZtJ{yn&FmziaGfx}ZF{#IX4kWg zq^o%J#&2}MoQpfyv}f;VY3J0#J>j;odZ*#iQx4=}Tjx?udU$D_I7%W;E7(yjq8jOPf#_NefWE$rOa^aMpYyToPsT zJ3*JJNWTCCD$(vz-Kfl?a041MyLg)ev{2h6e!PDz8 zeQ7XLw{Ez+TMHbW&TT5aG{QIW!HQ$WB+s~e%Z^kb8L&6wslNDk7ND@^@=YzmyQb%0 zmZAFfbYycwQMs+f4-I`HxJrcOall9hYQEEsxP;of+d`Cljuq4>tH#` zPBQL%4W#Dit7N_~zP5x5RaEN_8AzXix=gL$7}BgcU{d;%+uhLjQ%J@_HRP5dTRbm> zqV3??aA)C)L6+iQ)iKXILO$btxOT`CoJf^TRSf{Re>;5@vk+4)8FBP&W7Ymub=(Si z#>@TY2Fu?D*`U?8UT&~sSFq)JTLixXA`Uuo+OAt^7AfMG{ zNUs~u?x~h;*_;O|yz3~ggx?r$T^vn$A7RRtWj|_EaeB=vZ>~eqnk48Is)mCl4vTla z$5k;p%T^==lKus#l!kZhe*CprZ^#xg9FQ2?9!ub4s+E*Nw>2lf7KBep4 zIfnDKx!PR%<_Y#ouho(IIfq`B^1$iZuOVZ+L2Ox$U7Y{G0C~Bu0LJ=Lu39v{)o2Nl zX=j(YW7J4Ux8fnd$|-tRY*~=}Qpi2$U~X2r?FkCP$m#t`EKPW5r^$Ef<>m6c0tFWj zT*rTOdX}hfVM`nfo`-~E@097CPyQ(L77hIT9B7ApW`eTJrJF7l%~)#s`Ped^wwklS z40+*3!vUK~_hvzvqN$`z zz}e%X-YdG%*iIe-*k@_x6~^dfJ?0gtI<-yejk}fj2I(ABrV`Z=OfU z8TEz8e=$;k*AoMsK8)aCaqzel_;iOL{#*WLt#;v&MYI5k6?OCdD)F?{=BRpi;GGQy;WRumthKoxQkXNI+hWJFSt#nbERKrysoQyO*;be`t06 z!sI%L8lIjjc$SG0Xq=Mjbuy;oY;a%uylCf#%xUQqGcnNh(*0%k&yV1RyLxebHDZ$s z@6V6k=lGmBLXoss9Jg}slMcv;vLE^7t(Ya_cT3u&5IbHMN`7=N89&-`{9x04F~>6z z+7BK35|_b?jWqAgJ;8KAm{^cO7mE+DU$~6shZ0d8T=jFy-I>2~q0F4gNY>l?$ z)7R;MvPHHZYgnI1_8$;fV=1n5+0C`A;pr`+tG}Hol-U-k`E+%M59PNV{$6pVa$qp@ z7i6mYM2=O}RYubq-`#!2PWovftOn-Yx^`Cm_cU{xs&`Jy(c2_=!rog~gQ6{5TLVL! zN#hx~_PtM2bnL%YEK8_|UNE6m+x=4t#rEYyGfL-<@%we;#qWz%C=k=i`>3gx>GZXy zHMvLC!-Dp6FdZlF%$ZARS8SapyU_jZmdMD6*8EvcH`@eIoWbCVZqkf6l9=`3wT79b z69jW5PAA19RpLvZ4>CZZFB+blsiJ7DQEPb(h*_;LjU-4=NWhS!F?evbx_z30uQF;F z3k=}X*47#rbQ`1Dc*~d2{nC1Ud%_gsizTXW*dEg2MtEpNZ1P3#o)*c7Sx0dXG-n*b zjl?hBu6Y4|d(8wjmV!fMzikSunhZzYDlbT$ij_BGXkvl(ft8E*5lRlsaXvTK&JnkZ z+}@85JTJEP_&)H1A4kcq=ocbs8%@5k9+)4&pJ`JgiA<1N39C^R0kOfkpc}YNPKnb1 z0wcnIvj7(%Ud}DaH(?yxPk!KCUbCjBicyO2Veb!P|0dbEer)gEe2^42 z;QqE{fc0SJ+zu-idE$zY5t$|6lW+CumNSm8f(CevyOEUZS39YqoJ)f|xsst2OT@Z5 zf;+ItPa_~b%292t!1oVsle$wE4(-Ly?Acji{8L5i&j>*T`R`-rH?VyA`o0Tw^U+W4V`1b zkS7j*^A!X5eb~HDvQHxLy!%A{uwcMlb*YZw;~kx@h~NoKrGXtox)ZONEiL0`hZuv) z+!<{~_UDZ#NK5CM!rtcQmvl4U{r)8^ucJU@3dZ)j%4sPDLfObS+6ww7BM)(;Zm{4Hdi^tdCP_U>Hwl#eC^n+nLL z*)-@+R`d##CxRo#TG{l-DYZTok$8pNc%LJmDKU>dypa!fJ#>MWO1t*Z+S5%@WF{GD z09?a%@Hr4OFyT*pU;SnqHuJZ{5BBr1C8Hb=sXrVYargdVrdwN`^-4y}SYpBaO)l^R znR%D}s=?A-j5u08_P>5qg9>LOH8kj19JjfK?<*Q)5>-;%MzWR11HQY}-|6>z2P>kU zGGYTSafWQt^tW2{%p)J*TJ!VvJYtX68F$w!oYR$Ox>6p@U5wBs#URa=(+K_wNJbXP zpW}>J*0O2+r{06V#Z<<&nt{hJJ)kdz7sC1}wuEhF`gvY6N^bt+R{ApxjxHBDKgc_p zKv=!`OsWhNXV-YQzvsVs+`@ECti(A+nZI%(Ejnf(vUBSj}8gk7`P(wyu*i-4GmFET7N=ZOKRhL|&cv)99TKJ{%l7nDr# zl2!ETN&Za}b5oL}yp;*QBBcx*p)_ z@(Kox2>AY26}Rsca_#c`u_pop6%PTE%m(#Pqc5Q`&{o-!X4>P*%tGB6iI7>W50Jq3 zkrwWO9$Yt6+=n}NI<`y2!!?Ol7da)PSza?MZ!BHvS~$v-6S^&rUWAxlN)Q}Iy5<~Y z1W7xsFE733w=d#cc*I%L5c*Nu3`6Zli>!zLQ6Adao0&~hBc7n(Vq2t?v0C}}=l<>Z z=tum~dhrJeYfgk}Az=Brfb84ii%U%x2{ZdPG038Xb92dS{@9qwbuMh&44|m^dLUYx zn5C7B&0tIjk1@j&s+{p_bz<;}aKhk@>)=#_LRqF*Aud8Ko2zHS6klG5<6VHK4kL{U z)5n)JVq_h}VPxtW!5I|=j%-=k@!IBC4pZKen@L|z4D}PQhunkYamFvuX-@b|i$4gt zPr2Yy?FfsIB?D^EW1Laf;snSR|4_U^rMRO=WwW6nK53(@cV=1K@wp3C_t4at;ner4 zL)8#5X-{lzMl@2`uPWkcF?E_txxPHC=iHpv_u7B00K@KXODQ)g9zB%Iwx^VQ)&YyZ%|c=68W&kp&qRT zyO7R3`cZur2F5bLn>r-P-y;(ZbpXxa-b;JF5;vvgXy^Q}pp)mXu|Z^=*<|psAn%L`8dlkjoHHEJmDon4H3h#n8 zne`(W$Jb1fddI5wQ~}aV&(@PyFkZgn`sB>i*f@PV!+2i}QwikR39Vtkvq_0-)?Ja> zEq-}S8(L&NYu%C~esfPe752wnbY!#;e{_6l>cbgL_*}G9;?~bx6l0h~AjIx*a2-qS zk7U_&jqkgioEV?D=5RuY{rbMf#mQ^GG1=+}}Z~=l6r8Il{4yvzrCsCU3z3;tA@d zY|_NDJ$O1j!f9sCVFP;z(kwWbf!fX=uEQUHNaTk`=aP*pi#s;Jsj4Tto48VObGA4J z@Zc+Jw8OC&N@U{9F-P_O_0KKQuZqi8pu%wsU3R+S%yh>Qx|y;L^TdH$Pw^z74u*cz z6~kptlila2*rIpI5$b$-*HS)C+lgC^gXD!ba+k5n=V>0Hhan_ zQl6kQQmB0BJ1(Q#jW;yp3Rl1ze9eEFV?rCyuOwz|FiOldGP~|>p~yV)3?OmYqvA}Y z5v*|4z&|j40DI=I{hN0_N%X=dOyT(l2EVTy7>=3fJT3XFL^^G*tJA5VQ%^|tETyau zQ&ewK&4(K5O4DPxpII27_4CFX*gbcbIUauC%B0c*43ex8dE(yif0aeITiA*>f6*(q zNOtrRl3vB=Dj7sJJzBM32@3>%5=H~lp z9zTM+=cyIm2dp+buzVY*r?(_6MN6d)9#?)$S8E1wuCWj+jdnS%jKfv;MjjkP{+7iKwi8;( z=3&%$of@}oFQ?%H;a~IG4Jhv=1|4Vp?yaXuMLy|4WSS>zom-i1>3fT>s5_~W^kix` zXRL}ng%mI?7bT0Sj&)3NEo?lksgLs_UqCb=k~jQeCdZ#(IvjC9884hQXoibf^TDzu zwqFw1x51C`pc(RC0smWgi3{MU`k*zb|6Aq*HDr%ZEIT8wF^tXvhlURpyE;=*0ub&2z{)JS`dIx86HuVn~re-zLDUc0rW6}r?i zOBk~@dqFs_6dotg27TTxxwu4!OFzo`YSTWFn`6XeOm<2w)ivZi6)P#9zL0e&&B}a^ zW(jZ59XmJy{P0#88U$=%9|9w+#@ny{Lh`lkiXNy#h2qP%)Wn&rW4vi7$t{SB7($lb z<4KNA7WGSuGmT(P#ghV%wZ6|YruO)ugzmV9Sew^~qe8_)?xDcag{Ftv{+|Ra?A-`{ zc_(f+cg!BL9z*^MU6vPJOW&A|bMIRBPY5qx*V*?)U*xU2(mtAvTH_m`5}^n^lDAFz zp{ZB;6RCu$qT0DfTIy#5J3ZRr?y+4q=MmULq$;x9*tk!9!8CjxMFzcrQ5s3>uzd-X z8jLHsWhi}tg!%=eH7`$uYte=Wk~4lYX}XVFo*9(IysITn#&K8zNBF*3G;NxkE`dnI z1d!~rEgU>i+5O4+cnu7EtCpv}mgED}55-Qya8ZFw$*umR)wHjU`pPG3)tsNN%DM?a zFBjTU6e{|^`PdTMsf?P3ZWQmCX8<^BsEUcV%WSe0sbj22maIWi&yM#ZUHuGxNe2USOiXTB|m2$t@%cOOr1-cT;F~dzF!M#`2tI z6%;8+AmkvHalKX%!g4YEi))JtCIH~&QEuU%c-^g_1xwVct5~^rY5&39G3ZNF&KabR z0NT}3g6KPS>gANcMA9!S#cz0xo+bDPk#9Z^gKLyZDJe6@c~_gbl0dA1`*ETl2WnRU zlQ5FCM#-XFixMQot@jGPu|#?0&HHzd!+`*R^iPZur}`-aXdpX=r76Y+z~KB0|CKMg zxuZ@l%$^92k6$W_bh?`{oh=@`y+A=RRwykwT-k0E2QzT3ADN+dSaozt(f+Y?$>aMs zsDH?R(#=?_5XAx$tE=}0-ry_2iBNHrVUja8c9}dLd~qCX;M(r%aEh&S-1gLs?zQn!Y(;7Z zVzjNBeaN>a$Af4C$NLKvAZw zM`hH{V!XuqNmFy*KyF5^!%5c>9*gJw`4ROg{I7X2i5pjJMPTz^#y#HS$C*cr@0fo| zO7ol5ybcankpK1kPeqm-ML5&O?qkk2mBSf@)U(G`p}rR1Je;R{ZkCecJ(>^c)l@c& zM#WtW#I1NomcJd8VJ3s}{s^NZxez(jwek(H&o4NWH;W=HK2Ms#3#gxMrrdil&nr`Z zkw*bJ$)KQ@ZZ_+_(C8O;`4Tf;`Uk^M-hLT&dQ-0;Ynz(w5%;>pq#;L*vdP3V=HI;M z{Z@^VuS>`u30Wf|cuk~LhrTGiXW`NXYcEP*2$LWCtBE7WVeM{nI^&COZ)SXH(mhnW z;GbfpY2k3V-QtVTSj7xp#qDJ8Jd)8;KuSTW^*|c)P7rtenEBPYR0GuDT zEBunRiC`6Gj>Kt{K~~4oI==VqQVdHN9vq9Sv+HKQMT-7fFr&oGA~LrARs8fa{i_-K z2mT8qLUL?zK^Ab@D%7rgs+}C+`+JHwt4k?7t*d2|XIp+CSBlgA3x1x@m*o6}@D^dpl1sNkHf9INc-(by zf2_ioh~6rNv^V{!_+!uxU!7lT0sU0h=9VTf~ajR8Qa}7k%{V8h?401RbFopcpl67oF)_a$B|2vLES( zsqJ8ST5&4;VZe$4H&u~giFZHyG$_Uz$@6^j7k~MdNDG1%x$NuPJqRyD%|othYo6Rx zT{bk8U89eiqqM`YtaFa^+sLyd;hDGZ@P!r+c~-j3(SH^P=Q#MsdZSNl7Cc=6bB zak%X5ZjWLeuOCTYV68}`CPVkm{5;7OgCz$(+dycAArS9VclZjo1KZm!ptSd`Ll4=_ za7owupdW2irdab{VLJgb7)1(Knabmm@V}qlz5BQ__R&}Cl}b@eV45eAq3DviE*swy z5}KZ$&+grrb`X3AG<%CnZ{njfRJsZI6^6|KU*f?FhgfFJ-%#Y7eM}Lk$Na!S;m3W! z{Lg3lQagO!PeXKw@Age5Q+Hvo{mhUVaRv+nxd;p_HLzJ$aEtZ4OYbE&)uaLu6~5$N z&9SFt=5>rEZIL~Ec%^?ya;%u^VU(f10+(z5nfQ$8JGsa(aaU&q&_d2J!iwdLW6<>J zQw-`HebJ}>{n6u!@aRWhHCe4v4BDcXqR;}o(cUHt-(O3XiLd8DSaFJMJj&MTt=?+~ zV;cQMH9Nn52Y!aZ_2Amrr(g6%QaFa7L>0sai7U7 zSiMjP^b~T4T|{!jXi^7O)fVl}bd5f_RTo2xNO=Ab<{OY)ur^HW=lH0#`Xm@CTast5 zjPqjw3u%xwsrs9~y&QHMc_3B~GXAEC$137`3b^S%uWQ?5V2##oS& zqyPnXi}arj3M<^uyth~K&(;lsTR-2IRQioe52XBWn-BA>thl#6FU7a$9;rI=P0OyJ z8vJAVn#LC`n$nwjww+vDV!?!>B&2>sm9K~XugDxIR#~p&dA^MHezr-5$y6TKXf+@* zGgj_j{%KIL{d zJcBw#x7-&1zRH&~_kyv0Y>a&KQl=R*n0g&Mpcu?X(~>z zd47z+z(&0BqLTKJE2Qr_bFmChAxO2%@aIyY^ix`Ygi^WoQ;_7CTFB_BS5 z=l0b)Bzbw2-bzGjyI@2G5NpY;?d+5KV$V9FyMXMFMZ&IJxXmoyJP5|XceC+RXDynk z-?}7oXhWssI*$6P9;N`QqkF3Vj8kLeoK#%FJ2lu>u2M(3QA)S;q?~JcHR!Y~lXSC7 zck{6sZ>ASKKX0)}o@7<14_CP01i-pZ%Vsw<8G`9&)b{6FWYA&2qdc@dQd5^9hQsTy zD6Wf*fak4>n3}sKLuTli|NcddzLZD)o?g1O76V^uOe@=v6O?m) zg1qiUI&fm9ks>4gC(4Yhh`b<1Ipj6AtkRvsAWU{Cf}FbTj!rq12Sk%p#soej7EB5H zpGUSZrH5DBskJ7wLkJ{WV1&XnY6nfyadx1iD0xwMbpJ;ByQ|P()>&bH zDw=K&QWdHV)`;E4xE!3fBxQQjuN*QDzfDUYogmW`ulKtJC?n2!ink>^$ZhDP7OdaI z7|4{Y@Av0xFg!seDzc<%W^Z$wcvsK(z$pOTPe1*m^P?7RfHwcj$7!8QnB?wk7~2tI z#`P%X+jJEWpJX8IYDU_M+_KZzMsZn4O5M40Yws8I%M#dRxq2dB{y>%NuLb=va70p5q8n4F~755B9c@+$OI(>461W$ zR~1*~_vKSPjYQmr_{ara$9nFshF3TdUv^RNQ-+EbQqit9Zg#ty^ z9|;J1)tl;&vY|6nbWC;n6Bt25P5ng>g|fNddZ*^6S8-Tjyl04-;S*VgES0JW87Yz)ukP6GMEz_4)3>qP~Y>oCA_$+m^MvVR$=W|#@X{N+B z*){Sn;O1km?2X-%SjTW?g6}C1bE2WOB{FAdhW8(N-E>Q~|FmG_6c^HB^Y~=3swJ=! zXs8zGQ1ipw+fe(7^b#;HJP_(3g=xGE;+tx1Ihjp1as<{zuFHjSLOXJ7GGA><3f4at zB!pnPUN}MS6aWl(!?BXV9xmi(DV%G-k)((V)JihH9l*bQlq=8nTqj5{0HY~m;%qnR zu1^gM2fG6OMVa6M2doNqDS!NU^f%c1&a{o#%i9$?0gKQajzmc}g>C}@3!vN2E*;Ds z#OoxCl1i9gq*2Sqx4$mYisJ1v)9MUX-nvpk*|d`}3uYl73AC!F#~g*E>9PIPn0~KV zk7Aq63s0PEztdT0mw5K|E$@Tms#@4v8?2qbg*qE4rV##G*Vtf>-Qc;BkD$?Pz8G6R zlV)(t@i9@;gx3s~a3Q0Z&RC{?t<9muBc@w)l;Cj<_em8nlEo1)@v-;sFWMN+Yfx$U z@Wky?B@`n46zGnfx`{wF2?xo>9ewAlg~uFY&2u3l@v!JNJQqfoPP*og_6{7h zH)ggdg9?ki+r=ISiPy-<=eP>6)vLWr*)M+g$YTJWvc6U6v8U8ElHrb9GqF{eKD(kT z-ARn*HQV(&8YPX8)TAl$;8L6hf<ykJTlv(>)>)>q_58#}0I5?UKB(tUX@w7npDj z5;Vy51iyMM^YMdrBi?hw$J3mY7bR!Oan;!amSc9Kn9gDRBYu(olxzP%rSomo%czx9L)U&+j@9UC%j?(Dcx1_BAZaHR6ml|+1lz6 z#*t*d%Hr99%OW^zwN5F67TIb)R=~V=zHQCkvU)fzgASrSy_eD16ntfbAwp$CNtXD- z@dh3Kt6yUp5BjkatW7b;jv;7NM+%32Jt&z$-QdX-(WfkkfZhKS|0@XI56Tj7zFM65sX_ZEif5ZxI zuTR`BLR}UXpvO7C{xxF)*eK#oUIWKlv`bS)nDf^;CN_AkLkNA#&k%9UB#uR5f%VRF z79TFh>iU<0`p=It4_~x21bqMzm0feqG_*eQ4N8(TwXl2glVg4G=*E9(Q%XgF1#Yquat7bKARbB~iJM!;)2X-$kdyq8Ce(9Rqy)>&N<0w>Gn3XFACp^;q# zz#mv2@VzKHd@A`po1B(OpjgkJ6VCW}Eq#EelR;HM1#!xXma2h6k_cIX$%g+w3ox(rRjK3+$)7zQ zaQa^k1WynrFi4MS_}`N$qM8j;|_tDwwMaM;68CD&$D!e?RB^Y^#U$ zZ94MuZ9)}i3I!u;F<{qane&q=Hf^~I8Tobl6LUk*)D$JsqB;Do5J$*QlfpP4+$7(2lr^CRlZtw}Id1DaAc7bcxpTi6 z!w5VqSq%HL-Cvy3{wF}HY}h$BD9%KT#xjKeSVl92rT?di_#U@?z81^m;FI{$)*@%U z(t{m5V+YHLgD(*RF>gt_+!q2!5Nugx?ZL$Kl9AAxfGGCgIlY`_#PcE}CoH48hOY)U z3&(>ATxz-MY)8c@e5A|cTTpZVMPvSt1rAOG>qO{;4RQ)%IV3+HCou2y5K41YzVmQ% zYlqZL;0?L5DkeIgvJ9vZM=|%cnUlf;^SpI(tgdbqV6Fkh0n&WeX&+kGn>8qW>zeU& zeIG8-VX5XHjhCO}R?FvXQ_qO)b1Ua-g&VLd=M+&HPNfyDfTOtu{vT0a85U*teT@hz zf{N4-0!nv?fOHNiB_%aTHwX+}(lH?2J%BVwORI!*Hw-8-Ln92G{~Mm)d%fT1KDp01 zd#}CLp4uj=K(<%Tz8AHxmT@=cVm@diI#s7KJI_<21x0k^dXVtGP9Uf4XtPXQ+DQFh ztHJ)%^NJkTP=*Ou`6dixD2Qk&dc8BWB|hsqDf%wuS-FqyyjMj{PUSPi+n6WaJLms0 zt&2+(N9aMVGy10So|^pH|E=x1RxVZX!PIO5mJ)}OcSN~xo?iV2;uevx*LC)Mj|q?o zj)u@v5tG*@RsS|7Z7L*1?2-l9%c9y&hS*U4`|6dMt!+DH^Z=dGKL@z}5k)tjAF za(^*Zz4)gjx&XFWs7L&cd@j*A1_$jJ<;Sv#1Ve(GXb_#Ax_RXV*RtBL<~1fpj&?KjT|RmOgpUKcS^L_2YZ zc66v^_7?4U!_RCq8(1Rqj+=pyy74lRdxPhZ#8Bvb1L;(d<`t62@9J(?asxQ|ZOyUB zWtGC07m~R!P5ypdgNKPrfH?Lx71Qa#4WQWHTHjI#U{gZa*kdg((+}j@XHWZYFKKa! z_`%MemzNt|@6$#V6G0Y-EA}513^FbTzgo<{P}D5wDmQ+bjz=EeWqb;|`+)n=p>nE7 z2aI$_orjTeUXlBe%jWluu5Jl_cJB@vPX`fj26_?NU;}RFfh(8Knhv&JW+iDeEOwjT zdWaZAPpZdY3D~<{7Iur58)ceaxsnJG%~@z3dVMaB&k+)lh0bA^f1j9a3vN0o6Szd) z%~7&1&nI1z@{K$cz|3he{Ae&kk6}tn{jT+%H@ieG7o% zDnx#N@4gje0rJm}c$S-(P+iY)95{(z2jFjN%my;VksM%+-B!W);1p{%ED-?^P?=em z-80{AmT$xm+kLCO{XEAqmo0Ca}1j8r?T& z`wt`~Eqi2pETt}@#7Cr6StugfEpK~Iz^Yc@U`g)-;DINlp~>gd5@+MZ zjY_W`yIczj*Pgwca3`S=iF;ui=Hw^pY&v-R5U7@5wgPCYrAW$A%6l%Js_nw`e6^i? zX@CIly8XK1zNYs*<6G2(quwQUS2Kk|2My51Aa@r{0^Qo^scq^#eQ$*(kYNCS=w zK_xrE)f;pZ{wWm|9ObUplI-&jbiQU5+$Yw(9iZx1k@vc{3qkB)m&%Tf8lOn73u1ub zapN3r3_s6-GtWbzTW=A_3j;#Io^GVmEv~uk$VaA@ci%!vPq`j+EiC?byrs1(nyVcG z9Iw#KTMPOt{8uMrjWl>NCxR)R0%r;BQ}Mg04By*rRBF2 z>EW6rYD>vjKEOq(qY|O1MB0UQXQH38d+a#u5me01>^6VmVXDJj#{srYlzj=~s{{Jd zjS6L)y6*vru@905R&m+AW_Jm`ed=<4({8bB^22s>;fh{>V@y`RgFOq~bB)XSRjI1| zj&z3wVBr5Uq`w`Mr*N$0a??Aei+wn?&|)ru)3gI1BaUrR0P-PG0f}8cNJ_KTX=YsMb6c14X3w; zwXOdnHysyw?A&xr=Pfqw@Xp>&u$*YU^@t*8CgCC~LIg@H&HXQxg!Td3Y}rxz{Kv99 z?#nj>p%&9D(9|`8BO4CbVvD*vh}9#1nd5^NLMm+ z+uWOT6TAE{#@k)I`PhIlQM_=PuH|8+($c?32LX$TdW%=hA%N!<<+G9ggj0-D@R{l8 z?dUO_#1p}8Xt)r?Lp4nhNUVu|O#SzBkA-I-c<}xQ&bX;%qyQjoG zbLWNd9KMnN$Y>aDD1*ZfZ)teq6J0RzjO!17F9VboHuKfXc-gV}<{u zW=aAy1_e_i$H(ZL&0KXIFu^7?uft+o^BS7SXb=mQHGtl(_vc%Pxkow)R0`{nTvp3B ztQ-NfO^SWT1onI)kNOqeG$Pb+pjpVBW=SgzX&s02kbL=eUkDp#Y)QV6SDe{s0kHu~ zywtw-ZRYtiRdiW%5vUZm3!q4thJ6DNx0Z-@<-)q3TXbW#H5-i|AaZ|DJcLVaH#v;{ z%7k1tDE33>U~iV>uQdA~AKcl?EltOT+P^WxJ)Qj|$ub7OCk%F$`QO8({?lB1em(uV z6c_9wm0r3oLes;d?vfn4cs0zIYp+bR^N2NF88f~i*xlb=I)hTPBS@N!@DGc>a=a{} zf+ze_ld^X&*g{n%qu$ZR{f*N$-Ohk)Cf}`(Ism-tH%&m!;x_)mC@SZmYiltrF{5b( zt~4>%2<0pD-0<)>mGN>lgI~SsT4Kt<8V^O;o@O>$_Q&*Nox|ym6daY;o5)vj&Xuddw^6LIp>LaC)lF!LYqRVW;e3Y??EKey6mB=PSy)Z;buago z+8mRPQ2p#20Qm(=#IPN$xf3kqSFMEQl8z_1_NBSbIeY1wrdzBF#ZfBw=IgEZ-Y$3B z=b`&T83%+Rs-$`>LCLVTR`efEqy+R8F)trn_mA?=v}a!Zd(Se5{-s zo-PRXz9jb6o)E4-J=EQ7pWyV^Oj52LFF@BjO-`<@Kf7a((__OsN-oSF~DF&V2P z-G|`nz2M$G3J+0^;;T$UmQhH#0D*-6r#irh!R0o10S0LEfkbVqJI5@p%r(lXvjFmgM-gNlX96G)eN*Ux zgE7BeWI$~_bc1{EAGr9R77nycA)<^y(5$t!#f@MS?iAjj@oYTHXDh(W<+<6YSnF}> z8WF0D&m8eATsR| zlf6xcdppWEiAo68VcBK;R|{!sAOpG~W<}-Yv!1oe$P;w2@6OGLld_j)G+3#SvVgdY zcTl^`qpP|p4C`&;n5h{E%m*S^ci7<9_ho>=Ywng$Jc&j`uabXOwg@Li`#D=_!O*l= zq342q`PRk6z`l1y_1v!ioZg|$Eo9)}uM9s~E{JA>MXu`w$sbYJ@=JjX&+~v=*;DVu z<(jD7GR&`b5&fAyou_6!FvQA6ML+KGr|QNL{(H>N{d7-xV$Mc1vnFQRT^pm1m26Aapq!-Lg!p`j)SaaYtb@p|MA5JTSVIWt%+bfzGJH} znB97_jAjP`nVnRc4`2OlLve!ge-rNPbsa2&^M@^c#Gp548TY9lF={p8K(!1nJN>+A z>oU29+Rn2yGHTvl{lY1gk7dgn_C{8v2}nktL24Xhom)$&1k>3br{DQk;v}k>P|e?J zkW2INNp+I@Syr*0e>5-Xv42fA`T;ko6Q0g^K@L_^*+F=^xCNP2-wz=NnbWzIP_gUx zdi*vGrQ%|I9;IuvmGDcd?SJjtG2gx4bF#N>ZQcF~-)lst8^SQ6 zNd?vT&$b@D&yQd0lI6=B*5|3()jC$?`#WAaY@opo*1+i&H986$!EWjawD%Zr@mHP) z?wWB*(P1V#j^7Nt);Gho2W4I-gn!*NerK3%XKLzN`pl_kXNqfUIB&2-cUr7)KDk}{ zmqNLVf3=IyuEYc*bTgS+q-vV@5kP?;fXd0lV>@xCb-LOcPgx-j!ksI2Td*^$1;b}x z;`~hsX^GlJQ)hjKyZ!hmF9!QbQBl7^f*IUtJHjMrJ_|eDDNrSl1_(gKEtVb?o&H;< z|2tfGo7y)dz3o=KUQz^i9>!#8%!s36%|=)ARTVV)vgGG?oU3mvjo;*xX>gyFIuEfF zzOA`|UwNm*-WFc-&)f5;gzw|bTPwbsmC82I;wsmE zIl;R3tZd>Sc#Qj);?nHylw!S_aPBGc!fB6+?Fr3_O1`S*$nW^<(FxYHPU-PoIne&~ zGz)?)Se1M9q_kUrnltOXxo!|(VLfWDdphDkH1k2j*}&Anh@R36GjpjsYVApBCtosv zxn64i*St88vPTvWTJhx`eCel2e-8`g^dmE-gj$zDCEXzjF6K0gvp>g6#VvF;ZsUy2 zw7I%EMh+`k=%@;%UT?hL-7Z@Nlje)PAd0VSUmA< zz)*>WdbOGccUO6q=Z69kb(g-SWG$!M@Wc(fZ7tGvOawzpY3SpcwV{;Lo|>dqS#vR? zwU?Tht*$@wvMO;B^%62D`tDRo7(v)dOuSv5cX{oow{BZBEVyc2L=9EH*y>VB#%PXn zYtEO8!{Np6g!~4!WxL z&u_Oj=Yrdo3#c1PH*=eqZ+#@kX&`--V5_lH18@pQumsbw1XV}a6O?|KPD0#Y?SXSj zH_J*HP{--blIeb{aeB!rddGl{Q3sn;tfwjBKaCJT4S>0(ky<`FdC?R`;>iwOG~wvm zjsJ0_0h%wX)lLAikO-ksW6rTX^|Z&L^)$uL^?oGR#P7 zQ&H#@(vJ7~PBV?sl=^{figlU;4rz*esz1ws2o?Tg^wVnqJgLuQ8Nk>NU;6rcHd?R| zC*L0PDl#?KfqPNNfPXG4AnODObV@^{_-Wr|D6*7TwgRuboj`0GgLb6>p(}xlR{Xw+ zbL{Cz?IqNv{`NFo5zHlogz1sZ6w_=6j!wg>bQH`|_TW99z#J`pQwN1fo%OTqA z_W+@kK=ZCh%0h6Q{TLoUxdu3^b65s)fXh&uwVC}4;`d84#qV-98Q8DDzBrhS0rW~R z^KzA9Yhixw*$0077V+q(RPma}FGT-y^Cdy+G8SVC=|qh#gf4{Z?}$Rpod1d-X*dP3 z&FW6B>&9!uEnH)Z#nMe|rLHfGaJ8-CH~B4}m06Ev={I+!1S!B5%C~7eCN|P)*o3x( z6)wWD&ehLn8pTauLwR?1!CiDN?)Lbw&)ugO7aGuz2ZT?ZQwd?wU5Z=5nQ|UBk?J|k zW?hJYP7xO)gI}68ukH=@@e5*m`d#TFJzJaRLm^rudFz@G(VR%^*6#oO$d@B|KEVcZ zn)OdKHTY|-X5HsHNY?4>i!<`liGN#O^7!SdHE|i-Lq@*J0mt(=KVL6frHS&p@qZS% zo2Tr^L9i|{5jEWKthME})l4xBz^uI@rHr+d{E)q*zo-UCFR;agZw=j(jxHo%lcq1o zmJjpl62)Kp?bT1EtWT~3`T5IuT|HItcq&b3VT&F2-}vg@Zs{os{(LhK z;E|l}<~1Gw_)_kq6h9BL<8WWlx$1^%{)ySd{`74!@-vlxk9CY)Jlq(6{TL^2mj+RU zQ&~w}i!9Q}smY0SKk9SMV-Um^N#?bLJAX|5)R%@%B1sf~cBm`oy&l_l+L&Q~Ub1`x z|GkM3)W}|=a!jgx`HZ)DrGmS9`%SW>pHlz6_U(J~87@N?a{ew=y&5wU$A%@^(&ii8 z#^+6ni8bh#C4IK9n$b|Y3 z`e`N1HPsLCoHFENsK_lqhS4SM!KTGPz^}paEdg6_e}8&u{&L+u3o0t7(Xc0G>OPTa z61JHW&&0@z3%tVxumeCgxh|g&$BUd!e;VRRnJ)^>PPJ6b&}JC+YV_40T-5n}1-OZk zYb6eZ)sGL_|0_G3!vxUEe2`qP0=Hr_O!~YiF_ zEBljnYl>$smX+JylRds(<-r^*tv!0yzdmpC()dG0h1z}$@4cr>I|Yf%Y3^B#jtLGA zCayCue1t_N>V#(BCZ#a2VH{f40oydXwwMMCV;dswRV_i!y*I$sfAyz^Ip4Ki9qSb* zcA}#oni+723!&7~i_^8b<3J;b%{$@Sqa}Xt@!{e=wgewDi;O=9I$y{p8wFIwEdT|w z6|N(tl0PU2^RlsUMyp*q%wD85ztmJ0{fPU;v31=-s$KiGUaH>IH?QHK+U_LO= zac=a-$Jq<>Ma&$*1rIKd;I<;IjM)%Z(>v={#lSR}0&Bb{A5p|}|60I=Ett1)$-B|1 zLNIE26Ry-~sB^NQnedF$L;-h_+QFJ()qMg#WNQSu$^IfDR9QhSUte&6zwv>cs zTej;sQ{l}sI_Qg?f0e){+!DRK(dJ6M!^aUaBL>o%n25pYtY<=@+UxpBnJvrLc0c=E zSA1e;7)F%|h2*`_68%gU%JU=j)#=oNkhW@M76nOfv)B97j;AGJ9DP~Q?q8hp*<&bk;xmGS zV5aUXWg;Jd)qD%-+C_xo33&{gZJ(jB%K^_rCp){y@wtw^J+5WIK9J04nuWX^yB#4u zhlV8QItQGn+9?QtGgQq}Bu;2b6C^WL&%%=uu=$(v_{#deh4x^%uQZl+FFYWal~5)y zYcG{>)zft4Dv!vPYQ1}?f@D0*oQmXv=mt5GW*_L7UTTG;f}DiBVy>h|yHuvU>bt_Q z&ckm`=gzf)K^GG4s~4QJ##c{yv)YrAtK$KMFzDYc;Tz-gCoIo5qIz`V?xTbW;%=pQ z_x&NHgkUfsL*b%hgN6St(VvM+tMjB4fJ9inLg~LK{MJv~ieOI&Alm5VyNwRAi%I~^ zVBo(cZe76**aftm)_+#`_TMBcymr!t6)qYGd*QYgE!{c%+3iHSXL?+KOes* zn5zCN)nb@lPa7?`vI0Pve)WY>4k`=XySHdMsg-YX-TJ`k_Iu( zQR=xzli9c#FW|OvtKHog_XxuoDju?r)D-)RihkDG0rrrigukM?P&Jr%u`ny`g{KTf z?QvKkTg$ok8@tgs&tXbMAVpl*6%Wkpzq$Y#uJ;phTqfzv9^F~$>XY2hjWv9X{#2Br z0wx0hvOXcsN$#JeGrwRLz)1M5ENGb`x%~}_cDptzRtcn*+S632S{)&AoNCPZ`0LTcLsoQ~xrTAKCkM5No>v>Uszi5Lize2VVZf;x5NdtI zG(d_u%=`7ANe3`jYIjGxaZ#&gYP_$CA5#9;lEix|SYq#Mn1nV!JijXPhb$D3*cod@ z12;v!FLjdbkWLP4D0q3`g8G~aW?c(o z9u-j}7`e$XrWh{WPC`n6I$S@G!ZaHJm<9jq8n^=&dtVj(c~66Bu-cgA`5V!OB{(U8 z@?%_JNE5VL( zocScQ=UB2pC=h?M+JR6mC%MbG_1}L}`VliJF2(MU`D}#$ zB{UvvoMH?VP7(6$F62QnM3M{1Z-BKYD3c!`UiJlfR$v;K){U-Ec;C{~fhs&Sqn$3X zE-wu!rMV?)KY47;%Fcl64E4@t&hgQxy8>yFhQG*^I*)qoUvCQS%N`-)O7yg2; z9&oEo%yN&}Xut2P5BMdmrOTBrqb0?c!DWA$VWO6_Fnbx+f`V^18bt~C@Z~keQ2Pnu zxU}=06adO)@ZE{deRS&&%|5ajeiES{Bq|t2!ci@s=Ih75V85KATF4+r^vkv`=Yfz7 z2i-h`eqy70#3r6rhuwAJR{Mw{&eUmK1);FdYVCYS$CVM>JiY$XZ+DF8Cj0h_Xii|D`MHs zf9?aq9MC#^8_I!cpt&PUu89MbDL8-*0gNexc_}r68DFwauy;s127Y4MGST<6KwvP^bnw1R}Fo6a{o zCQGro?CxB_**6?9k2UN*4-1}EBf&#Y^GXQ9ouBIWG|j5kFTIqzL>ZW!FFh9J2KH`c zs=KC!Wh!$7Ygw2QD4J{v25=vSO%9ft=AJ&*r@EzC`kRcj3dX6@JmHoE$FOKazRtPR zBxip!C$PlIxMR^gGi7pJ?VkK{CWB=OR&5PSM8jLV0lR;K@)I6-eMOu?vt&)+$Japq z{9n(=*BajY4H@rY&S6jtC%7rGVi?gS$lABi9bZcMYd zo7Q!)>lf60#J6sQo6vFDKu7hx&bCVJ6s}{GsV>F+g}_ls`y%Bdy@9i0eH&%-xjW;52$NE>wwLy zGL0dyXMeot-;1>?*to1y-Gl`GU`f4uL5`NfC-#EX#FpltWblxP>13;Syo&u`u|}4e zXjt@EMR`*1wmtC-iwNh((+3e$%Qt!mf4oN+vyYGZOnpX3zb;W*Z7JX2Hh2*@4 z;mN?_C~CR2k<%q0Er_9`szzqGQirVL`4U9;L!AE+G}_m8{P>{V43JP%QM6o3=kN|7 z*tq!Z7sQVNa$CzMz42LwNwH&JiW`C?aiBQ-55T`*2$HlJnaks#CtM1gV}Ipe@q6Ca z*8xb;jNxs9J6u+P@B*ZGZS78 zBwE*2kh_MagmUuv=u{}ADAWLfTCm`+owv?TG9R{DX1zYYhavL#>b`p&XlYYrI_r_% z?aBJX@hxasVd6zM+4`kU3!tU1{S90RVkpggo@Q7X4|}O0$HfB%%PM6PH8z4Obk@m+NHhhWb}d4P%+W^~x2*kH9~WQ2J&`X}7Wv&A_ktC8`fl zfrUA1VvUNt!Hr$?&nCjKGL4r)SZ4$BC=tngHz1SgViX27_j|=X=!QMWOSJsL0AS|h zqe>oCwZK8Ki$U3>7ze$%5bJCcCrhh+0PrF+5cG(Jr~%scm9Nq8?$%s2WWH(jk5!tf zl^QDb7x!aVbZP_6x)*7qkFU>9Y_ivzO6-M@*+V)2N-}5YKRD zV@0K>Dp$w1cBs50{4>;v64TNqrVRe_(z;*OFit#&(q$@C=IA{Oy>_B5C7zAlZJ})~ zvo_?87Rf8kLcG+_oecy&0-rIWd?45&+eZ;{g5b4Baf8-ie#X!-5fxdVv$f~0I#sq!@C_ss8bVr9* zW{RcpqCAK4P(B$?!+&bjp|&cL6Eu&*XQJ8241d;S0PE5+LRlxYq^36#3uXCR(EqMm z@gyTKoRqxouN)I7shf{8*48BR_pQLW~zdWVlUbC#u(%iXuFmY zE0!?U=*Bt?!~rl|Wa7RLt=?;I4F&p=mI|%ak2ITmAda_dqqvLF z%4$Sl=9j2nrxwbc^0(cqb^Vmq$niKl=;IOYXNrJhCZn@#4*8K(?W_7sF!>gG?J?O} z({((xD$XWU0`la|*yX1$0x9Z(G)kcCLbeR#(qauaB=Aws4h$G-d zpGzvrn-LBI*{2J=-}?X?=xV#Qfu{^{y8;gh)f!!@w}{k0zz?}>6y`Vh+Sl|+PY(CL z;|c=5tj_m>yw{qvpjYSBJNd-*eC=Wr4CerLN;DBKXsRx=59<|5A)6{9UtJyq41EyN zgu+BPM-<_L)imggvj)>0rZ#XDhD_=q+?+tg?442iD{?9kjTcR*Cbpw7kwVGnrXc9& z=fJPw`7IUYULG-&=#)xr>9JyIw_!yaiuEjY30Z@;Kf>TlCF0C`xKaZvuAW68c~mU8 ztIEsw>YNffT+9XMFpMlJ%88XwBT8glJF+X>+^WFy4PjY(0GNGvf^&R+!@gV|(3Z4; z?E{(q5?v3z_e5Z`E@53}erLeG3E0==1PeZ$=;wJU7vsB-Y3dpb*Tlh#CKS$|lq2Rf zVw`wPvIVo;C8%Q#NvMJoSj-wuGIj-sO()EL<$Jp30UJ=vvW8<&nUcLjneL(Sp2cmL z(bn?|@RJX%|I$V9BHt4QCzJx?;cadnqeTIoxu0aTqBKTa&JN6WDw?%lb1A54MC4!g zRUAMj3l`o@R=ABb-VVz0?sud|)6a$+e=&j8p7-)3!i#1!QyxCTmLF4ocEq&N?=G#*0v)z#pw0*8#?7UxRTpi+3Y@fJc{>F0 zIfa?ZLYHuFVJOW;!ZHGlhj3e`N(s3L7O3LfkY~P8|9Tt@pWalG*mwFWAKGJ$C% z;RP`$4Fx-@P|Nn%(fLR#hCF$Y;OFFP#x+sx1!;BSK{$7HF65M>jIDirL+fDBQRWD^ z7Zn4&3ciD54oJT6vSf5Ek=+%6_8wMmLj9c7Ub1!}^nX?K%SW z*5SYoo@5+FZ1QY|4-FE|d*Zv4%O2eV$#ICw#4C zw8BfY*n=8@#?Qa}apt$0=w!5C>euT!H4b?i3K|6$GATqg<8@op?Z5mmb5-XzjQLUHTP`#(mhOC zi{m1kl{@*%*_VoFeCJAo!?8Y+tiL}enz{!xZ76t_VmTT!GjRJIdM$A&7F$|AA%D6o zSZnk(p+u(XTNjZ&MO)&ecxZY$-E1YDIbF6W;)lMI9Wgh4#qJ3$M zUg{k3tPU8sjoOLcJ2#dFckv4MUzJ}t4C)_U>G4c2Hh<6iEkE?cKGR2z&Hy#Cvf!y< z%~D)S9Gr$QkaNch%*D=HjL84p?ggwo4Fa9JpZMgNeSM@}PuEb8(y)gwM?_h}vA!wS z#Mg{tcyfZ4{omAG!zZhQh2%QU{0p=0rs5+@6C}JXXGSYZt7FAP8gb1i&E`dLCuPi0 ze8j@FoTqm)Drq#S+6rx8N09qwC!YiPRCc)eOU-w%{fVrgSM1TkMebID9VpYHNyVw{ zyZX$s*1(fp9d8Z2H|X+LampN-aIYax@B=B4*Si}l8RluLyB^O2bD_hPkNzH}I@@*W zHz9$`9_#!CuW4pv6Lgew-hipfsj9~*o!`xPBSR`MK=j92@RLyBpM$=Bzn=D!d#8tF zif3By6;25omqHV+ezbfJlB3yJ6hF`?d<2go$_#$*R5eKxS~l4 zB+^l{s7L1EtdqX3Ii%D9Cwbx7Qq`7u67?p+W4^fb$j=uQQomalets6`&Go!6RED3_ z`s-@=uZK`sd!f0&{8B?@p!Ft{)y|CI_5#%}(koXYIu^RX++Q=@#IrE!*prgP^t$~m zH%r2X-BIhb6RUW)b4Ik&eu9=-GRJv9up;{&VF(zvG7-ijss75tnQ?#{#Irg!u6Cow zuLwe`GjNO5feTeoPH^85x=Jn6R%2*ju6c`Zw45hf6DsSWlo_?#-0hogsl>O80-2O- zJpeSD_Pr~!1mp0dZ*j8QQra2V6)a^1yO^NE)w}Uy+0)Adnz=o^%5WES85#!W~4w_ zBtMi|ejOMlPM#M!?Rg(%2}2P|jn`{&w`XV{e<4?&j>?}sOvDLYgRKEp3-=(w8!e@!8-Tk)@6%>jE2Ue>4b#H z%9uyp>jx!u_unsZ5E#DKnng7fRnGYF?PrI~EJSzezcX7Mbg>!=q6hqHaBsoym%qm5 z?4bRXMNNSELQ*-; z)6t}Zz9i!ZQsdQHYFf;54mQP?-}2$VPV#zP{g>Z*vDt_tyMm>+NAk&NV^;?rQu1te z!Rb2Fsr^mR``Ruelt*3Q_X4|ec+c7GEwkpW0Sw9KL5)~0Og4C6>C4n7u10FG4P%~`$MKTHalla`)Ll+}k)rcA91sj$m< z^iO*a9ZiOkD9(7><01z^Z&4-g+h8ec2qKbEQD2|4W65+ZiKF*P23qG5BfE4+ez zTYVZJ>Z4Kmp}Nntp0OK&UZuWW-qB|vA#F$k`DgWBkkuh{ZJA~*#p6NqA)gp@TwFw{ zLbpaFtJc8p^#B7tJ6~7(AL7fb-R;_M5b-++{d>;mg050OD>JU%0NvACd9sJScG&IQ zab7xRSzpQ$^&~8eCZS!6W4&?3?cV@hhJBmC3lMy|G%jM{g&UX~F?i3rfxZJ~(=$rK zFEk8nsH5S9?>v8`+L|WVK%88Sq>v0l2=6&4HS4h7RojLu)Q6_{MyHt{%qpJ^cfLkf zjyv5;N^^nTJ<&3${G6_gO}J`%t!CYNcGYpQ67LJK`g?vjt!XXHcuSXBoyVq6xAY%G zb?tsp?D#1i=aKY<+xXhTO~ej!tD%HqCpC^8qvY>x6EpJEYQ8&Xs#Z8*iZNVNuW zlTT4rR!|T*alW>nKb`UAx^O`#oX_1yjX7DWu}ra-#POeaeVD)&X&89>U8!lS802~} z8RqY?Ht<{7I;!8VR5LmoRnP2rR3#NdJ1Ie7O+%g(?ixu$F< zAZDvi0k)b9ua5FDd%3W>X|3GMva7rE<)*nJv*G2Y*Iai8s*cit+UnuZ4Q=ygHR`=z zeLwq2^rgBldyD7s`1YP&9`5nBh=sn(I1t|HnU5{W%`h?&I9JUK#jn3O|G4PwC>!19 z1X=x7*?5{#_Gt!1LW57 zOQdM-r$AI$?BEp z2E;k{ru1JMqJv{P-$(2ufOJEO`n%Eu4&p9OXGV`4;k)RH-SP0n(6$P0=gGP50p1eS zU?3IAk@KI4u#Pt+44Xsm7eTeO1D8kgJIB;eUkbH@Mcxy-b%h>Jf~O1w+?5MQ_FTWa zY1jQ#zsejwl8=5l7Z>tVwa~IZEFvNxw70q{$)=_%3G!Pi;DKms%>0L7*vm62l2&iY zQr+Wte_>BVOi_P^hy{U5`^m|Po`QtD&XM;4(i-1$po?;+DaTN#z0ClJnct$XBf*K* z(4NGZx(Nx!^)#)fLQO`5HM*_V!w%ZiE%`9yPhQQ@Wa{zXORDspQEmjf8FkVrB3g3%7Fq zsdm?>$M5a?5>A5u-bZ?$#r%Z$H6hy`HwBkHta$=t(FtE6_lI*z-?Rt;js=y$*sPVF zbZys*Qn`zdMSG)3!t=V3^Nu^R##`BPe4S3DbG604X$FFVi zK?5uSs*X+GcqsYlAU4;*(2>vtr^tpXB?o02xMAO(dvy4^{kZIRx!0GJi%>i(r!>~M zUD;Z2P`_O*{RYChJ&*ky9Q&yOK`|6`BvfsH);4hxL@}OUaYo-aL6{Ic1XEwG5%$?S zk%bjRem_D=9nF?G-|I0Fb{e=k(0knq1RbB<;1@s53`XwDtKem=r>-6T$U68}uprn? zU^(qwl%w6e%|I-5EHi25W2_hb;k*?f#s0?yD2zrORaTL4tDte3>()cv$buo+jYV7!U>>>Az=3U))zRIiz6ulL?>G~7b1pDYfJVfRc(gIcYbff zD$Z0TsP*~lcRn(SohGv8?A9FtasBRUiQLn-mYsze5tyYiHb3HcGMZ$q zo;8E>ygGk6L`jd$fwpr0!PPLt?xZ+)Vb|%q>dd^3H^tXWqA<-I!in! zqD#+$p024+3X<80$Ve~5T(dyG{ZU|0fbfY%mE^p6h;P0t8`y|0% z1XeA8dJQWbAIC>G4N_LFk(};IkD9)2I@9SVkP;#wLPB7&dP7crP)%kGWmXZ zh7*bgrPApw^4E+~;3qWRH#WA`^Hc?qWc-JIdDStdhEw}<5-+h|1aimu8Kc68CM5~w zA6WPKu}zCYV}@OPl(a0}nyXZHhiLBychz(OI}=i4d-ioBxA7gPt^3qAhs7L7!fc`5 zjqF#d=bcqOdt0NAWs?-L-cI>;pbhjS^TNKTZH|&m)<*;hk_vwH%nXImm@GARv2@K7 zIC@3oD7uPTojDiZIImxgxaBT21MwBX;m1{jrgcW}$Q~p`O=raAsmQK!Uvuzdc^PS+ zuTkmtXMY$;`Nb-uN;95+&CtU=|C9BHz7$U2@`U>#&%uWD#7X03sDjcXzZk9doTug{ z>Kda-346kOM?7=y1wFpjH?OoxFPI;M_YvX<<@XdtIozmN28hP+-wcT;eyKwd()7lG zS|5Kxrib_Cu?n+U3vpRLH`s_e@L8~HSXkg~ckH`w1oQBf;BVTnSD9D5AMfh+3dt-| zCf6mQ#*viKwlowIg3A~dLoc-323FEjUF3lW@HDvmvr z5_@~XKR@ll8JO!@7(Ddd3bO3bPX`b^5dN+s=(WL}eKo5C8)yAIcKIcb-8ZDV?{!GT~F2&6WNg2P) zQQxdeo&2ERKc7M4To3fihv0bkFtraIa2Z>0kbcu@i9qU`&{pXWPAhEjHc7<{$S&Nb zQKf92mA^l!wd{-XWj@BNS{8@7gFIh601rmuo_%6`4!zpjp%{%Ld!B3wD;rXjdeH#{ zvm2eN>APp0bH#JPu4rE+c-CH;ACpeYrl?KLS)y0royJDcp+mV(b`vMmlm@q3Glc`2Q_tprtGhQblKR3 zFBc<4(k`nnze<9EOj$_i7gqMwkc6d!aX0VS1JX{N01z~{%-HET@BTdVDk*YOr;1dh z8mSumTXKQwp;0;H4Q|sX14VO#m$y#t)NY-{<)*BGU%ORU{S1|YhHhf6SJv+C834If z*fN&deRKELsQ>QsZoy4YhE&^jQMgQEl#a@n4)og9@#S+TvTdSQm44NV9@DR#*7}pF z(R;^g4nm610Q)bk1L2fqE)q0IjDFMRL_Ti% za{|mqPob~myevA=aP!DN9Q>@qA;rujlsm;K$~l`dgV*6)fT{mu3R->H`2_m6=e zqnhK;^qIeO#SV~0Pa+r`kKm1^ZHM*mYz0>(R{Km|Sm0=npt~R;!rzSlueR@uhAaB| zmP(=%o#>GSgAlz$jV{`VXwibij9`>e6QcJLBhiHry_eAvbr5CrHUy&$M)Zu9=gR;2 z@ILRycRla@aMwC(ox9II`|P{#Ilo=5wE4q!kPTNmC`~kegGlko zj!t6sg6mGDGnw7d7e3pMnj{8&)qLo|+2THH<=3RhA2Eh^QT({o#SuwpP{RFaGMZR_ zTmv|$f4b~rAz*?Weqm8Y+NeGK%7a65#Oa> zJ8P^|Lhm%g@9^JPu4AxZ{#3uA#7`Zc7U2KL^G#`RiW~PJR~eJL2&L69rrR=+Ycq%> z!LC46ET2|epu0s|cLtNcrTX05Ws<{0NZO)dJ#l`iV}ibaGTF7hjB6&*kVPD_Tk8vz zU`0B29gEB}j`N*#ZTwOzI+Q7)yzj<%m*SDjUC)~q@#W=J@hlhI2D23{{3#SX1|ZQe zu9X0C-)?V6?o1Hgcr1xy6D;M4+?tquVH8=zWBp7l+IrS6OW=;E7_P=3!BMLMwEzg=-O;??78R?H`q?M4B_vm{cez3sSRAREBsJ*(;c!OrT z#C(Y0$}QBVV!rhd>}Zm}rW(S+Muh9D6TV7o()^>2AmM(@Vz%ROF#|>=u$e3-_F?&) z^YIC%#gkmYD_%ovOM>U;=cz7R*t2ACty}eqZQkn1sdLCtEPQdT)+LL@{K7m}v1E$uSBzHb0c2ln%T*#&>mzLnESSYWqQ)QlD+> zknBZ}rMA4>LXNtIZ{l+e-?<4{&2+vJL(sVzn7-R$m>0LShU-!Sy_h45IiZG7OKE7; z@P^~1X3dsNt^D_eAOI$&95%~__0xuz+8_J%meg~x2O7yukJZL?n_vUQhf$FY3lkctbd1Z(u>>Ur zvjzDZOv?7qj2pJXFgVT{jBk= z$uhNGhHG^+--hAI+-P^7@4C%~2Xa9jM2cjNJk}^N-Q844uL1W5 za4seh?l!QHPsDk&bFUFrb1|HnZt@Q`1fI9wF{W-xg>f(Fh`0+s5Yc{Ki9>h!4ZL^n z$U+pSRTIOf<>c?_nTu*$t{mt}eSD-Tl0^D};|6BqYG*nVLhly~&D>Z&rkRU+u`pkj z_gZ!@6-?o#24;04i7}+IBmStOu7@Y*4OH!>S<<7t&7LFHxW+SUWyXbuT-ZwP z`}87f>}LaQ;=TBF%{y?nPFd@qyETOc4{k5l$f<$lPnZ()3Bx%y@lk0!r40h&xFwIb zo`55WNtvV#fCC+mn-R9Xm;fQ-!N8P<8fo(GWjmPt$jHdzZm^MG&%?lrAB}C+-6B9m zxE0yLGeVG*i&Ko&{KV>9pivs3T6ep9m3AiCp~>*@0vcN;U=^VKjqP{UryC-A@3O;q zagF?}n}$brb&;q$GmyBB9A&4wcMjbTZA8)_c8)L(FDMJ-Q*&{!W0Y!b+mR0kW?w&l zynSr0Tqei!p(pF&?=^l01wqZ9A-JNDzP?6|G~398-OK&b932y6A}-d6oRV!4m$jw2 z;_HQe_;736{JXMIJQy7a1ZY)4MXvJoD5~v_#bqYSPFO^Vhc^{k7wk1NTmdg zctY`TS75!**ZRSJR*kd28YT4ZNssVg+@||%EI&DNu*A$oHd?Iup|w4*&GBcAoJ-Xv zUUsT}Gs}F2lXP*02w5-tCBU{nX-@*J-*j^TCcKLGnQ?mq?Uegwv2U)%w>36tqst_y zHe7zXSiaTd&oANr!tp(3ADwUfsW`F(o&V8f(>bc+imFg^jf6}V2TfXX&pRNUZAkSz zcfVz^yi!J{s^GmedElynrHDnEaoecD;ErWsYPbQC+cCCb!;pLuXT{YeeWSILmn_E8_ncC0K04i6`VH;xD$O1Xkg{7hptt(b?t z<$F0dugfL*201nb@r7Hq`kAH)f3sw%w_A_(>wVqkdLhbdj}gFvKe<&WGt3Bjaj#BW z{L*>a&Q4?z;QaPYWV6CxzyVLz69y`?h`kDqPF6*|^ujc&MYOvCsdhqb5v(^vGEZ0a`S zDKk&LS*7+3={wfXm8KF4u63VgxE4~<;Li^RB|E`X?$_n0b9Dpc;7!=1hwC9_mIBX* z{Uhu0Ao;n;=RZ^~U_&}V^3Gj0lix-)=kHks5bW!sKnn$Ax~sl(B~yXmS?@o7b-{v5 z0!zT}v&uD=)ezsC3rpo*-=OsTlz8Es^L$>Nc|At@gO5)7TiaW3U?PoGz1_&UGKyno+)6RCCPAiub}G4-oFr<`-}iH1XZQ-Glyc?=lxA77 zf~-s1(a2AR+7`orZ$L@~KTS+FH_nrwP}ivv_$-MmQgbZdZB6C{At__}TAHROEDw5^ zYo_Scm(dhcm*<*q!&pp*Awl+0BluY?#I`g4vYy2{&Mi0DxY8{ynY=u3a}=5$B$(^!oh;oT>!;Y%>K?;XmIP z!=3lo>+Zx`$8^zkwe#asM3q6N@0I7ySl)V3d_gqj;LG&|hr?|J^w)A9k=b`54sCD? zlWUDa*no)TnGU5Tey$bbg6*F{z>;Wkc1Y~MlBb{L`y|z)i;$D&a>1ke71g=+icrm? zxUS|fagCa;)y8{O%i>;{6OLMVDm$uTy8Tw#rKj zMKw2yveyjv<5Y`fPrMmUf1QWdp&mAgnGAR2tUg5FuqY5Z-tpPZZ|PgmMR?ftYhuc5 zJES)nMJW^Y5sNz4n3l+LMWOiksNYfXdMEZWjm?hTLRMRa#q7$ zK)UX*QYpqE3VV19EY%Sii=$Y|n$I!^o(4kG1V0<0L{MPst6!VOp?4q}?s)T};#1hK zjvNBTLmFWFQ2Cq$xy2!ISH^AK_|6W~2pb}bDB;3+GLxdQ3bUK%Y|`5k`t{n(vc%tj z)MOT$K{fj8aucYl7n0=3KD||1$L}1;QoH6+XcjjYmA56=|4LV5PpKdY*X&0u>-fS> zBw1f`u5UL6E);oe+H$VDxvj?=26`xh$nSr(i7nz-#`QH+;)Hwk>0}-R+6)Fdgvq++ zo5#lp99so4*u-XwK4bQBa?oM8)1In9uBvJ_k|~40?d(uOBw^2nwfM^?rc+M60PF%P za04@?3StNe=r+0s^`T%gf$exF5=&v6EvFx!*4G*6wz4WZWQ*~R=oYXENHj^RkcQXY zX*>1%*~v1CoAps6%WukU-8O1r^MGLbOB-@ZeYeSnydWZm9&2%rz-i{#AkNqz{Hp7x zSvrI)64n*-^AFa7O}3tHD>}_ymRz5%9`07m*gv5`$+1czEp;gNzNRA{x>6Uc`qXU1 zk0T)svsQb>3(EKSuVOXLfpVB=AL+@G$wKwQba{VWQgnY8_qBAKi;;$zgKWJPRK?^% z*uVZua+1)~Va{%1_7IWqzN1u_HR4#%?oAX-an#bYX^2$HW1PRL=vn7uXmIZN!rAQZ zT9Ko<$W~pRXxY3tozns1wRESx=%$TC8C4TETLHHvK0up|2q4L4bGWs;&I3 zamnWqP#HA6%!`QnDT*+9-}P7-WcA+XQ!l;3jG_aG=c+;5@=&rbS|7zHO*QxX6*HLS z<}|Owe(_8ewXNdt55X!!7-U;|JK@vNYs$wL8g0z-ol)_s^%h9paDeV&%zjpWfF!Iv z??in`P}h}eT<;DBeOS3YB)YqZ;6_dVTm39|M$3(J)~ec&weluw9b5O?OuOxr zxA&OMDsd_9g;YTl)SM=rBgP1RyM0>25B`%|E!fGZ=zgpxCgFJfiy&}bsyy3CN5nx@=cS|`PdP?mLxut`9>1Zt0KUL(+4|B0MGoi;~f-k7c1Zw*S(f zH5B;jv_)^~Al-mLM$zL(jCO+vA(%135>lJqA+Gl*geQq zm&Z@m#b-tcXolb*kMC*~BMqb&sH7M!wj9I9D+>KwVA1eLBM(jAG$1&EPWeL~7WuA! zGs5)yMo?H9C#4cp$9Q0Cw@&W9e2;;NO)$a%Z{BiW_YHo~A79U^AZ90ue=mZ3`L$r^%ZEY25c=-^Zt_ zXp-YehZcUjAEjIi%7kJ2WUQ{=W3Vk<1}vd`Q<#Nis`vZYR#KM~Z+AY+T7hN@hY_8c zm0M|xdZxvxM-Y%_M~;5CSt#p)EiD7JxO{`^w>h}#vRo^aZtwHCxby<5{xk74CSMfq zJ?7+S(cia7r0tq;Za>Qr43ykGx&mqzSRD%<`PT{c%t&`yNCJoe1bGy5EG8->9W4%5 zImPsur%z*!t+kLD=`tRJE4xx~lcz721c$WXu~m`JFnI4_SGoccQjFV^VQb;5w)3Ty z_hHk^m;?zs%c>&qBO&%;UuvInG<`&|`3ay~p!T}; zC~3aj>K8=zERgiV?&*>gm?19oEsIE!`9{hbC7TO!+1dKab+)Ss9)#zm@g&iP2n?z! zs%Bp;UN%PpxzBZ9&2m2e^x$Q5B?>}@YuX?8u_#|eDo+d zHW3tDwq1UXKAznOl>a;9$pHgg*0a&g!o|Cj!4}XDGH{IR^hv9?i05PiHy& z6%y&|Stdhau<3j)MX`H?pXqgIL$#BHK}u2@kpx$QsFPF!>KhQpD`z@Dmj>stn5uB9 z7Q(4nIQ&9CI1F8P3Ef{;)IrOP1koQq*8}J+5D7mOyMLHEN`tg zKgmq(A#^&T`jdCwZu~KWNVy}jXLm=C#VjhFds$tIW1Y&1-b4`9hiv|ReK+V;il_AU zuATV`+3XJ)g^daWR}~4jMf)MM+m-fJlAro z24UheJLk%~Y-Kll%!AQEj@QU9g3!GUjiRq11l4^Ci+3LvKsCR!#UXvyZnRCHhW>Uu zR+zX9+}!R$9KEL8o+;Lu{gW&na30HF0v)74#X`&%Q-y}?_wwv#_Ed@C_=mFJA7qvF zUA+oFH__=X%}ck|dos*fTLqOj>Yci)tfCgY~p>LXITwP3!vV8hrlY7#(8L#WqcIIP5RSCC5efn4O=}7|+^Ij|dm2TtN-N4aO$; zpw71@g_O8Y6{;4U<`=q|<*!Q~8#VIler2VCz5FhA{pYl2r`+6+;ah2$?pv9L^D=9} z)bZ1L-6y-;BeJgTOHV9=?TCz8#o6{9mma8r&6)X%yt)#A*9YJkBn0bXjl2`uK>KmG z+&6Ql0ft32v*dE*xqs|r{j0J>%18}zN23aBwH=pw9U)Sd2HuxSY(s!qbmc*5_*E9(5W z+BWeYr{xxb-N#ajg3$HpGOjENG40t@I%vcm3D@uLw*ElGU!g~!Hg- z2B?Tk*1Ok9q~E#9!r?mLiH^IE4rSA&{Ut2CkZY}AljDt&4`vaKXA0ja2hRod3GUCl zo{4H;e)}nB?#*|^^Kq;biNv(ud6fM+i)na65p&^X!@Phz-r;@pFyqdD;sXUM7+F8o zz7KbjzA=XiX0iC4XWt&Rk;r0Z5)UlPmG!c)6n_cn-)bN36@5(5sm`iuw!(UQ6yO^d z3PQi;@ZfE{Xzne2F0s~z%SZW*Ug6WC0F=iDxw)tRwJ6QH9kARK^5MFErJykIamV4N zm*nje!cbdxgPh%XDRgsM^sbt-?G!GKmfzDT?Ku+Zx=uw&Bgx z-&{q<9{Sd|q%&(acP-GWO8GsFIShWaI~bEOOgM75!Bt5|be)an;Z{^Jy`6~^*H(xJ z*4^Hc2Rpby>B~$3Y=uPXwsT6r!nf6{{ z<1@O(Nd;UcKbQKl-e_4fP`G>w`bMgR_?ss^WCOa^SBG8{@6n=yeqbe1B!1S=q07_F z26o9MED2sU_U>g?EAH8;6eQQ=UJ5RSw17qn9%3BE%-4;(Q8obdbNs*O@D6S8{@kcEfCE1ZqL?ZpIZM$;xkk7$R|ovkD$(A&Z4Wp;NRcXuw;0`zZiLpf5E(SY&~C#vht@~ zKFaY0<-wmYoyB|`W+Dbu^}DUC+Pr%Ho1%6O+;O?pD?*Fz{Pg?muwgj|$vd~%e({I` zs(I}R2@3a!n~T=7-eMl>-jxC~1k|0k{e$6ecX9gFPH8kI&(!T-_gErZyk01HuEzN|KETK#_iD|GIn#nx!~lSySj}hu|0n;-=?Y)0vs$ zKn>JSIT`+SP>D_B)VBuU`Bd*KjqZvQFSt6;&TIgk8;{00j8(JqoqJgd3ui;JX z&wnGlgQ+7+UN#?$D@0TQ&tEcbG?zcDjr^_dP)?H@n+g;S1|%7wQrC2+Do8|ApWy*Q zIdrNIs2%~#o=1LfDL)NVBK20+clpfWGFq8`I7xvWa9to*h%T3$DA%&Eq|NQfuoQ?z z)Nco6?D?0sltH}TiW&fawg5=H3-=lC8@NH4xLRfNcej({*qw?!}=kP^=UvnqbA<9oj;1cb60jg<{1uxH|+1?of)myIY{RzUlov z-;b=Um2+~*oVjN9-ZRM$Rb?4m?3dU80037`_MCc#tau*wY(4U6d~XSgP9{ zK6eF5d73j|B1UjV-D6jzeivC-4c5?=$cv)xNEGqIQK0gpiZ06&76fdov_+FDH$k?Q z8$-)!T`<}qZvmZ1h%bWa2gugs_Q+-21n)F-gT&u`gln8{pggE(0p#}}KP>3}yT>Ll zboS`Qz)up-Eym5;MZVeREWpeEuDE0~pY7<%3#K3eVUjn30MY;Un1TU(&nFT{_it(7 z7BnETVeP9h@tZyvLX0{o`WshISWp--G0ktxg_ zn4Lr5_1Ubjh3R6+2pANM6mlZ7D!KZclzq^VixFr{GcHOigY$1ySyc%l7kv~+0>1iL zW(9!Pym^kpe?6*FqL({5rGM@d4d}r&MeCiqTFWedKZ@*~vNECXA!iAyEWN@I_0Mbh zXE{u4I$!i>`&cr9l*gM$>MznMCmB#fb(Za^FO3bm-~KI7 zmigwQf?%D|@8TFK3U_)>)timvV(c*jZBI=h2u)_>CUmaSAh9+IB}62Olxu?^&-MBC zy^FtPG)2_^^T>rx8Dw&vCr^~hafZ;)FV7o=^Jg1qw*4&@dUt=X(aC5;=cA7e?vNML z&R?Y6?%~3+LTMFHGuJ#_`W(xn@C^iVOvwH>RQMNe*4CHz>}fL-7J6q1RAk!JZC{BN zMICvE+5%$ojCawm7V4Pin(VBO2JR@2LLa=!tS#Qycsc-^YfN$RS<8HDo$%618H`>R z)Pvha1;7k8cVi%I6x@5QwJ?c)mU)FEqSS8CCL2f_pmCbN9XZQ2DD?i5^WcdvF=gjy zQ`*k?z>j7~VFH+0z#^)d|5X{mACi`f{;=%OFJ}WC@#MG~nyEW2@3NoYQ5*f|xUgy0 z&G6&`(2(!2U!oT8rSXIjIq}jsboV4yv5{_3bT5TAkPzEJgC7q@U;Mzer+SWV zSNt;Ez;1C0N*xe4?|)D`n*5WbyP1g_UiC}(wi7_Ws*={>P&h>qLbgU|#B?hN@`Ik> zv-OXErzieM^;3h$Au2zE8|VAAN{(o8bD({9EsA(d+|+sVb_AyHR@)4;B!}wVfE@$C z$^aI{hpRhMaWaArh}&tHn49)X^9JA`slN*jgXc02P)_L2m60T$qKHceMge%uawiJ0 zQfac!`*JIjxTpm`u_F;>0x`iyzaR(RsC&h6c@5qj(RojA0M4{SpX?@UQS5D4^afHJ z@-G32acLS~M?+nkwf6+$Gs<+S@+?e63WOw88>`~RxT5r5|BIIUp522|tmaB$1ZJTx zD@=$gx2{~jsmxMC)^bdp{Zdcyg3}8)hG3ncOZ3ROWJoc4{?iTlH4ul4J`l{}g~8vg z<%b6u)+*U$TI|+cqjVPrS+=8|{)=A%!hgmn#@i|I5Ef4atDL@Ojchll=XrJWq6ric z9{Wvv>%hRPWlS&iBu7(cb4L?TL=&UODErn%@BZMj49K6YR*DW z3UluV;aay0;Cw%|czLbX`w#ueo~(`U-fAaaj5TK9$7n*sSLM*6+Xe5RX#fxb3E{=7 zi-=nKaH@E5;(9jpjCg8@Oj9*ERwK2&P{3brl%E{xaS7q2Y9`ol|w);iG zjlv|@{sQlCbt`TzyNaWW!74?A!$oI7^rZRjWL#9}Tnf_5T@w(h0d3I$8IL@m50wIq zpxEZ0A4r1&ZwXLSUYGnOT$7nWB3!1;@7lTIpweADftKw@_GUbD&d=e>+0=^r&=m{wo(?`yd+(`0w+S@QCs3>b!M?nx;swQRqcytv$_sNAUgjE#*w0zh zjlzXFegXc`b()V6F1p9xDa+g}%sY-ddHgsXOok7^2Yh9DS@qY6Nj!Q(nYbeQ*E=;= zeqLptN4gwRY1lzj#Tk7o}v&kPO zReXuGc`v+s`p0AlgYd&rd*JleE1T5)TrwTBBI^PpBjH-T%^2R9Dl^hju3_vjp0uPr zbULTPxuwtiY)wGNF$R{U6ONK;)>LOv1D+kc57&cf^JV?^W&xCU%_mu4VOZo!p#A~} zRyuY_zeXT)BM9+OIYGm>KN8yd?vrZ!o+Os$1;eV`yg%5?#WOblk|5NkPqSIT?lKu04?&=ZUOQxA0rRql6T9G)0fzJdaA6hVIBQ>B(o@N zx|=*~q}ibx&?HD0wKwfPaRd{N6trjAU-xJ=M#VKhFVYJ9WERLx4Igo1$}Qq0t&+P6$W zl`B&;E@0np9cA-X+w^V({y4z9yN>c2tw}$_r{uM7H9?DdgDSq$2(*clKnmNTG5mE4 z;)r{%Hwk|+Ljmb~`5eEZH=4U~9_A)he(JCh{r7N&)V9Jga~f4dvSJiGgo5OaNQ%=u zh0Hwr%9&4$H(qXy=V_6jcG4niZ{yWDn2{FVKX_@sS5Ts+7;JPCjbcH}7O3Jb#{$6O zUjPkEZk@P3Lz-u<031RAzcYk|KNosfosWU!96jk-UhM5>j`Q4oz!T+-mKj-R2*kR6 zB{nI0%}G0Jx&)i?rYoxoq#tG)ux?&sadq?=~$Y7tD zqMVhBL_m_jtWMXG!`i}uC4H5~t%=8L%1q@e^tQ5Q;n(Y~(B?1N85z`7GZMB| zh5Ffj?c1(0lg)>>cBpy`5d|UrjLF#kiYF|`qy2(}VA%+w`}?Wy1e}zlZ1;Sr^&*mh z*p%p%G2Ax}BNX4(#{JI19l9g$ zA?pUc!!BLE31`@qO{LL{<4eH6RW0L6?|enie3Ajo_7cK^2PBz zhMBp$t-hJ5@gohTyYrd#^AiB8x=P~bH%c@DdHtHUdND{kzszj%ql@8-|4`fK;DG1u z+yQ(MQJvcNH+Bs#%HRqvwMc3^J5FF`y@~(E*kq$uHN&pd$5A+Bj4b|KGwB4g^$HONJr|13xMX zs~wb@KfXBmGcdgtOx1bFz4u(U{I0gv*wTd7Bj{%KH+EGIWw?Eav(LZ$6Csw+#yQ(7 z^*M2~*5iz#i6MlclbP=y4*iM=et`!0Cbezu-@(Jk;x|Lzk@%<2^`36N{#|uGW+}AjyG_+#)sA%7!B|h_z^0C<&7tRY>ul-dzIigio zaC~_41MJzTSe&)RP?F0=IEP@02LdY}ycWQUoT*)Bm?1U2=_J}xrzB<>tg=2YE z)Pk4?uD)hEnyP9%<&d$o4fVJ7oC$I&q^%Dum4^(>MZW_Rm7RmY>(=5D?Iiy;(((c{ zQ9O(a;;k*rHbb)Uw2NJZ{6bv|%A$v>m7QWS_r8{fqr0azONI>ksP|VfQJFi+a&Jbq zGZ!t>&=?V*O5xlLphc0PS^*$au_$JTJ`!$Da!ij+_qIN9ki|r@x)dN8#2xX#4DFHV z>dD=J1SFWC_k17)nM-!tnbeJ(Iqp+EgVnuR{S~!Ugv(j2ZF->G)X}l@Y*(J_hj+%CV`8Jzr3iwiesiKh z=2e!8D7~HgM9mJ;8nYe!JK9&hU&ku>ukqVHRXvrpl~%~IJ1hT)4(Y`akC9u;b@MiA*&`Ur}bXjo!1*>mqYd!@U6HMOINf5R^xO#!J$S@65BpI2cRMx-IDiQ0_i z9r&iDc+5xVwE5yjy`zIv@>Lz4iz6eEkqdq&x2vhZfJ#c9Fv-!2PCsOI<0=mZ%=a30 z_kTCbP?Kk_KV)@Kf`7(L{F=yNy>R4}xDXcuWdDZ%`FW(niihHEuK%D6@ zYb1CH#=?U*8*q{=KnukA%eka&l$Bbk04T zg!vfp!^6fGCg*3!Fd|g{Vu}Z?P4cIZ`B{6R5N?Ix5x6<>1>Z|+0_aMn2|Jk^m0ErH zLg2L@TB|9RUm!pYXKI{j-O%LCNGk0ZG2spUCB8Ti1T{NAjt3sj@9GT}3~$X}$ur&; zI|kLn)pA8oSEN;-`NPda5l4zL_Iv{>(meAUIhw*QmPCLF@#W>Q&D0E@PPm4NK=kzX z$dy z4XnyOFzW?oXNCkE-=Dv$paIhlfn>3Fr-+o&rqIHyR#M8bJbN%3N^yzy2^}-Ln=9Q z``889z5sr6c{r2gLHei~j9veAa6YymvdH~AB9R3z9^mX$Bd7!4ZaGv;1s{MtiIf9T zqqd#9dn!2Tx1CEl?pFIwKcGBqXG}=Wdh=0z)l?<}UmP#!cg*FJ6>=kq2hs~3#^C<4 zwP+kna2GP&dL)4%FMD}H@n~AE*QZa8;R;+gj;iy}59~LwFkrlLoX8uYX2gNedg4#& zl|}}l=QSxpc6nSwM58_hr&BXA$Z#~e#BWA-m%f-_hx+lUQUieFBW*iFRFw z96r=xL&CiUSu$e66J;#+fCEjD+y=whcgXmjQgcwTXYnhxKn^AS~ znV)EGU*0GIf3Tj$H9m)e^_{F1#JnxJEdOhIj$H$Y-ii!V9E>BnP9nnJzDVq=?_S;w z1|f6^6v)OO2)lYJZ}-}$19IB`i!1_Y0`{gEHW zu1yru%Da2iF~No?pf?gK13#{M^Od-NR!iX(&vTDFB0Y%7uSv!Vo)~Kj1&|2edcS3R zyHI}f<<9%M0)9R2ip%>#Yn4f7NwNHLqOs(xN6g37F&+^>P;OL}qR02kRqc+E_b$#e ztW=1e*e#6C2`<8pPyMaS`%4K9X8tM9AK|gm8x!Bcx$+_n+IcsI`zQ6b#^9a-#HZ+S zBP2PU!Muvq2<)ca;HDK_q$m1q6mGTHO7;)S#C7%;?wpUASt!grQnND-{2*pjz!b&# zHQP}r?EDx3mk(}49bipBfvmH&^OE{XNNw8S2+q}IJf*nt@>QwA^!-Anw};Vh5Nd-i z-|3&L*fhyNCa`k%V(D!gC)0Q0gK(94)=U+yDdS7d8-PDO)=m6S&?pYiEJfzQ#7n+I zbH}XloU4dJBm{*M)L*x?Z$R;F6I|S}gCmS)w6>Xq0`X!xHSbQOt64f;uYKdbTLs%7 znK@r(E?JWtA%HHR_|g~thJYAmAfW20c4u|3uM2tX&*6hC^{6*<8l#qoO)bhdVj!EdhdY>@r4I4c#O1y9<|5sUlR{+9|X>Aa#vZH~01^SntY zs#PdG8ivRhy!OUN$&b7U~_q*6UGBA@q<2(3nl9?1G5CE$0S-&RfwCLv_9!CNN zLM+{V?%uEkjh6L0Y^@PfuWpUhUnt1~K2mMi@c-FkH!sN9iFCPbhuTJ1U_`v@AgCet z)mCPI4acIWmjlE<){H_xgv=&^(a^JQneeqZSRu%}BlL?T2Re;3&CRQ;Yu2DqlkZQ; zWWIP`nHTR0rkjO-9uIZ@#%6i%C?|KatpbU81yJ-A;EW9Dy=h!<8w46R*O4S^cRB*} z`JC9P=~cc(uX3-s-1$hsQ_g1>_K@iqX!TC}`55)%e~ob|V|nlNUMGamhPOuabN9Cd z@u5cX=21CoD<$`7s7a_QDJxxRiXzEN4kDlMA}nxsGm8}*d~f6Gr~VRqm#sO~Akj@w zOg6}i#FyGd+3d-sW=vysiO_9~Y2>yuMzRrTyF=%oiVC6mo9TvoF-G5~BXiNe_Et8R zhez-`eW-eAd}u$E`N&C@2DfuxT(cneNvz?#o6-bb8R>XTA=Y>7}8)&%2 zCGY(t64gWLgYdZOM^hJaBUBBy3>vIHlp6EA&ZGJWm$a&MAM~bpO&<1*lvDx*3;>al zd~kSZiN&zB2maHjT?CG^(*8O)ubukO1RNXg>n z8~A+Od;Pon+uRMa^uuWJPzj2)+Vc?4YIw3xxi$ZvmU_@vm$yg?Vv#D2N!bEvp|q02 zy;k#WC5zk#sM$Xr?l0Wg+^N}1K5aM2`suwYdCtON6pxy?a+W6@ln=x$ENs%Iu?%a= z+2Pa5h^2A$`4FCAgeQV1qPfFFo>a$(t?gA_t(jgWe$Fo<;#7Uj1?*6l!P|R!#C#I* zQ$Kl_nl~y6<*!h_k%Q=tPb9z?Sz_BV576Fa=WMMpS~PW;5eCMeFePQ0=}IVPUcxo$3O z?xt`cuQG_1cGV5CFY)J!NnuUeZTh?jIeLafM__Fdu8qFhWiMkl3L`%;x5{;B-m&y* z9I+Tc4=6B9LSCW+?pF+Qi(FpxZO}SOa>ii3A+ZL$YE>z6d)vv%eJ8s2jPW3_VqgkIgd_!-nnbAyk{{icG34z($F-;m1|0~)(`FSlin2QtZuU|S2 zkjb8P21P{k`Io2{fx&gxDIbzbV{wK3&8>})jh{nnaW}TkPue1MP)qla%_S&)Vq;Q9 zGK2oZ4G(vgLbD}(_7bw8ya{xmBSIU%2v>7)!SwCY-*wKaqLAT4-qSlZG3)6S$UFQy z_@O_qap~mhh4EX!=&Q-VUH#)x$lGzLeY8T0{UU?Lp}4c9WMRm*A{S*|i#& ziUW|ReaLkD76-*YW}%MI8)oCDJTQA#1!J4ZZ^85?S(ue`@EzYWPO^aAb`TTD=~N+g z$jMWViyGr!um|jDYqN;qKi-D-DOWf$^YfqTFQWMNOeGPXsCr;K+uQAdT)T-e&Q|% zV(Zh7cB;pU)QorX2&MhR!ZJz}ZF7Fu#gAn>zrj?&CMGSfxsh@*!>!cjyr!7kCSSs$ zqQs?d=E1iyrJ8_^b*UxJ2JV}dEo1AXB9T;vvXt32sLyqRAnofMEBXypY`y$VwQjAH z2@^))1a%x4d~LPTfNa|xHp2l8oBh$%QcU5AtW{=q_`b8hh{qR`T@~%&BnS8=a`Dbx zS>}eu;hegGQ8sgGJ-exMRY-i2llQAhI-6d!v~*H=HrDV0p=Y?-R)@=ZSjo`l3@lT| zToA>(Cw_M9RXlbhh)^R$*f z8dE#V(wMM#M-liV5{^dcJ_Dkrunr*Udn(V|uP|ex$7bacx53IMp}MogCq3re6-T}--kAC(Bd;d4b9CsCi78ZAR0;M`fJUM=fO zG!ZwIR&%lScP@ALBTb^BzH^kQg7JMYSNXVFls#_Y2h%gbxcXO(= zrGetx$SUQwmo|Rj&CS=FZjZJTBNa<$*G2AbtijAUbDrb1cZh7rNn!*U3S?46D-Dh5ogBEQkrjhp3| zv}UJYOwD^3E94J9&|jDQMj$_i(#V(-osNSQg4PWc6!rd2{t`)4zcVyEmDP@1Bt<_U zsP>vX)jEW(dUFVYo9n%YA%4S)6Ugd<@!{F}WGnOWaepkE|AW!U3@Y8x0AJ}T_#TZl zMe$^?gvH6#O?ph18i(fxvDI`tmybhtbcsfv9%cLwGZWojd~ij&DPm{Jj|dotK*?`^ z-Sg}Yrg<4O^6q`OTL>cEWD@;x7zpv$6&cQ!{;3y@_N4fCi3x zDG(w6D`$wiQYnYL-UGwZhvz>thHGB90 zSW#HRP+puy+t|&kheF_tqWL<(q)y3f1m29}9dlkYe8!3kY-ZMOyjdkrJY*ne<}ZBd zOjMv;xii781;72&xfkYd45kIsO5%@P2q#A5(v)+vEBNSAO^%yGED<$5Y8sWHJ*j##A&TCw# z-sGHP@jc+|%kH#>ucpY0+5Yv)Gq;4-%BPF`;*&Vmhzrp{-s(o#j4n&91sO3?7%T#4?)#fYwuis12p^YPW_Ei!eoQYM_})oR z2P-2i&E(8gjUdO!)HKL1%US7!`ZP(7p}Ua@Cn^PpS39lNUPH{Gp?<84E zhfR3VP&*0zhOI`T43};<(X|iSqX9FJ51ih84`liuy@#i~q(D zzH;%9IeC?k(VF&6d9hg#_#t5uhJF_()bdiE%#lCrQ|MY4AdFnZr)Z>q7(l{N5lxJf zn)|xQuXPn(*=jJ0FnX(g@>u(;DKwEKuMa*Ele!vy$IxJB1DrzvO>3%~80*=j>c2nc zMU-C`)Ix}oPzzcu)2a(hn*Q^P{3w-T>&S=^SMnyd@O!hLOK-~RKQGWVh8ErG2#)l@rCQN#RN>YlrJEPPH~j1KkMQzTuVeQT_ZESnK~IlZ0H|c*MyE zYy^3oD=~XV@=D})May-HH(kCIJh$%WXm$lcSaYsH$wLQbTnbY%%)TC@PBW#fy&bgu zTd$%O%}grdQ=AX91uQ@y5^0mi-{~q(;NZp07w~LX9g_S;L}chWmZPYWRk;ff_fAMm zAc8-{Hzu1@8O#Kf*@dA_KlnDUwh;ftr(=DZEqBmrMDq3Ijbu0864^^>l*RSNw6+vC zFDf36f6|XNn(>p+_(mu1rB#`^ab5UI>JdvEkY#*~fgN{*O7EUE=8_TN=#zeY<0;gO z$kt8XZXcg-9EH+~x)opz3fLmcS)^PF+Ey%9zlu&KabqTQXj`6v~R z!^%Z`=&kAQTI}XIh!o9R;U8d3_dt<;_oc91=b6jm#F_K~Q|&YVgX7+Kl~MYEdl3zA z$}e?A7T3||LeaaR|N8Fzq@x+egX#jVJ$~071@E&?TOk{LFCX*oEDTmIltb^XVA}AF z*Z{M_Orr|#SbJ6w$x2tUOFttzy>m=mk=6~R5ju$4|HymUP*0E>q}dupVp*5h*|U(T zYQq`TevOBn;TEJKUW{824VkcCarAlE4#czQ>84D&0Z0}v5{LYAUK%%`FXrbiv3lXp zWdcdk21em4t~xRI-IFGt0WsQpPI4YeUlxX(3uO#Tifg{M+Iiq{nQIFx$G>HgvD{4L z(ozW&UU?#@h?bt8zT8He?T;*FZJ|Y^%V7NXTl5!Sv@XE->c)fxjjqU}Z9PBA-a47; zl3OnCbH2vdgZmsXo2-M%4$><^?L{vl*g8Y|2P71P(;oJT{U)G9^4Z$6lejX!uH4^R zY6~O%CIxn1#-c&k)37s)PVYYHX8#4FQ>a_$Xp-_WZGTk>S19+FvEeN|`uhEcAw4+D z6ygCUKywSmdY-`%Swe5sk6EyWiTCfQL8F^zBC@aUON!KFdz{lbktBSbp58I!aKB z6N3)4+h2oIB5xEugQ@k*)Ud-SP(X5ryoOPsk_Ce`Qy9|uy=<8{rK%~wu3GQ#GvXI{ zczxeJ#}-JN*K$$N_{Dp$3HaqWitr>#eXNB#FuGa8*p-`Sqe~WT*!ofwRW!~y>OkH{ z%R=RA^5JCh%z2BhFvd&R_@&poefeJ(T@uh&`0a+hv?(UN=!Hn%k6ygBJh|>^I6CRk z03c>?g#ocpel>>@yjijlIzlBEocu%0d~h)S_XGnn60gI>Z>VTB1Y1z%eCyek+|FV) z{x=@10h}~aYwT7)Qa82D+&L1Om1&H*nd1C_uTr_;_9l?f=GzEP^pVA5&d|OlH@R zEecQT;^Fed2+^cAtwFJJJZpCS5~qa6xpXlXTP&{RrZ+hqGw{c)ee_MsHF3wTF;XBv zWO@ATlls^9Bko378W7!dP0<_{g+}^2>RRW{SF?qW5hjdx{`%$X)_atRqc20rQ%~+F z^!SP1PWKi99WYUIX-<7veAM&yM>ejr`U){_=32Xlc3(HhumZ$(nt>ZGxU(`JO1{6j zHO(P&55`&Lee3FWE(L>b#Z+6B#3ej9E&h%UU1iyclFH9G+moK*wdAmY@qOdFR5Dfa zOGNu9dHTAb2_)@~jgW1%Z9NKk$@9Cn4*Wq2cX$TPpXt)HeA(%jrB*eXoWEc@${>Tj zN|DxcaRGIC|Jc|^=b+RPu)gD2rfmetdKsZ)7Dkv3%v%wFj+?hP?94)wrpmFH6L!Ma zL%MN212K>_G6@=g zz~z1s_Dw3vV?8)Rx=D?k9+|#T6deYf^a1rd`sIjhOD)2dQAN!ETw=M~U_;UJ^(G^Sw1Q+_a?Enk>|Efm3JM|6EJ=ajsHw9gQCb5h@tXOU=t{SOrZ;ziLcl1U z#N#zdo{XzqVfVI)Zn-CcTrLSz(Qipe`i$;A6Y&t!Mvz+aIb%|&J6}^1XZ~?(ZtUz8 zOCz7A!p9R87C??Nr;H?ilSur?1d_N>5d1;PeR7Q{FvC*L>y|jebb0T5prFM! zVSRLEd~c>Mk8UkSDob+w>3XxwYuwmEls|fRaOQOH2W&;*#dEw8`8zghx{}A@VY!_u zCifu1i?L&8sqs4D7j{QGWVt@$m)zaQNDs-US7F@n;?1KGLS}%lv5FU8B>T%l(!KSO zp8(GFnft~zVnmnlo}%5L)aIo^O}ZgFRY_DRxJ^1nQn(!<=IwC?v&)aA>t!^! zoe}+ecZ+MYuQBr4|A{)c8o#((HKp+=zU=AF_GABVus)+7g}O&^qR8$o$>%w#v|NI~ z*cbe^93a%aYS!hiTT-faUqg<>T57;$zb~-#lpNT1_A675k{usLPls+yxd6N-?zK~s$YlhoS_Pf@m|DyC;2eEusyu$r|aLt2h=7Jq;f;r zic9-z9?JJ(6p}Jk>b%`U^p9hRMMF6=7~mS2HqB@b(8Wob&G7^KyhSDs*Aw9jo4l5m z_;cqwF^Nff%cHaw%z3SDwC>}T_ZZ%u6bUEq-`lC12tYi(><7^@8@@Bb0-=-TQPuS2 zl+h2J?DpU_V7U1Iaq{VDH0_adH+UEgq~XeIu~b&!m53%Bo4Uvm4lLfU;42Wv=W;%2 zog!$SERxVG8B$xEoZj^LjlB`{ZheqY@&!#@OFRf^(T_W){8Vxl*%|yTv0eJSg>id3 zC|*Y=9EU!aN6Y>4{_m{1S<(S@2CYr_5I3p!Pel((XjVL|>LowdOzj>KjX`W+bkJly zuA#B@BDbIAQUZ}Mr&y;|a;S-PwToj671^K*0@lBO5c%agNb?nGTz%Gb&oD~?*xX$N z3Ztf%nYpAe{9|hli!dZ-TB0?Q8vcr=EA(>T$z_b4uGxrAcsa9~Smjc-ckEmVppvv$ zJC?jl$;yS6AaRX<76tb?K;{MCUTh*ZpA9Vg3g( zv+j00M}1*4qf!cQTfM4Ic!YI$AjimCd5_w|&ESR1G<3Q|rEU=sAk4-e^XaE=rUTU# zO|us!I@Ry|mW^MW!Y&TRn*$r_fr=FGVlN7W3q(ru8V^o}zO*O$_bF$J404*Z{i!f) z>RR7j>U-~hKR--YGgR5qeQNO)#)hbv!f5xU-KH*em*%$>;n|zEdgJ*S_M=do^HGuQ zd`&oYsusW^Fg+spxPY?J< z7(8f^=^&Ep{p1|>`0XsBE*}sLu?zakk;+bLOM(wFcpwsf(D`e1V|!Vz?5z3Zcybfz zyIwBpU}~*75dnTP{fNMV`uch*&pfBI4XGzL!mvI6LKVmk;A4lGJB-Z`PUvB4Re8wT zcZZeR+5frLx6Igd9koFQW+3l2q9RQqrsBS3WC(<;DlCsl65e~FsT;pPJ1RSf+L#cs z$ZJ`<`Y0~MS(K%hI#W_s7LP`26|*Q=H90jk)r||Q@~$l2=fvU6^e5p-W5O6YueS9n z)>xtq$B3(dyW4PZ2G4r<0N?kc%9OJWzsAjLK{mZ8vvz+v*V5LQ{T%R{Ep|R;a~YynW>;?6pLHk?K^?q zjQ!!9-Oj(mUQws=H%%Bf^xM4Le*GuWi@2ftjxc)L`piD^)n%edh+)Ivl3h}el`kDqUH;&~7ncoAV} z;8T~^_6JNGz8LDqgaf)rU(NgV<-%LhP?s10{DM_RaP^;&kS<>64;^}5k6nJ6D4`d>CO)jOSMf%)c@yFYs&8Y2~$cUUGPQ#Ew-7=`?)6)K$ zY2D%E_SMZ%%i4qg6jpBpJcCI&7`o;PpLi<(e9vupF(0$$a!8DtZc>er*-oN0R_m{T zqA~en@>sb3)S+(acpOhali68?%;sgI{;KpT(*A?b%S~sYY)r8)a)u)-{mQhDDTUC1 zNN!|=Q?7TR86Q#mHtWI_IW?l|uMU$emDy4<7(36^aDBDt&7wq2JdT zEvz>?@RBGgsMri{g#uB9dACM#&=QddwxA2C)ebd@8)zd< z-I0(Mz^cd=o1{=A%j5P(z{_;)uQ%zm<==25(MW};kTR6ryy{PF%s=m$-IABjlwo2g zFY>g+kay@~3pfot=IHe;ascclw$O4rb%hx<5uG?;1;`9Kpa@N(Q z?cWJ>9uo?~rZ_vcM3T<}G;qh(e!e{nk^yk#>Zm3oAwnF2#!&IzwU8IQt9=$&`rQ=| z9n%nH;Tf#%*dzqx&=|?T{}L&++*5vZbRxMt^s!vl#;W)_)+V74*|Ow1yYq*&-Lbg| zeYvh0ps6;08B@R=yqJ6W#a0u>W=1|I;bN47EV zmO1x}$44w9iZ8t+_;12S+o`ZKA_26KROgP0rfTBO&Lc5 z)zR5m{C48);ZBm-Jk#)&+DgGMYwKf(YK8#&MHbY4G?ML$AwH1PC7`Ie)N6dD3f9z9 zm$>pZM_I`W&BIHs0ctRQ^7D=s;Ukycgq%d%$}Nt?P^dx5$+>fp+jvO$D)1p>^No;3 z(#))AJ-6i4%pW1Vc4j{ZH(hT|_tM3`L(j?k^Cw*SMfw-~nKRfPDMiHU#?D5@uFa=u zbhn?n6AzQ{YO9`5E`gR-{9hw`{}BmhlXyu)7%pgTA&J-4)K@=9l(5L1&_g(B%9xoN<8lL@rSy%^5<(MxREL)Y!CjD5*IRAA|)3az5(X6{`>MUNX zyIM=U7nJDEV@OvB1L_+gV4v_dFn%T?_9(8uE!`bpxfm20aZ=(H23`vC<57Sp{1|E;|Ha$jHi;3nd{ z3}^d?Iga|D+pUhy9d-`6d}-4UQ@`fK-*LO7 z6lI7vw|G+d5RCl@8Ht40dKiY{nOQ3|kJ_zu7{T+5Cs$L9~dTph z^OkQ17Z16U3QgKsMAMoVo&I1%G?HqbNYBdHXMKKUj~_G)RJor!?rzg+Ay^UIka1tF zZP(wpqiAi$sTiHDhc*}>3(xMHTPoOuIQsq6eR0%8c2)VbA2L8|x@Ikt-*#m9#@Zvh z)~EuXjq4@OmY79StPQ*6(o-!@X?Nx=5w<7T^wY!jcO+Go+5S?4?((R683-1YZ;ymU zt53@w)ROdw0#yX*l%v}SQm~?+zJv{&8rM1-CH|RmYs&MWs(*OVzbfE;P?I7)l8Bh3 zzFHX5_iC59na~$JtBbk&M6@8?T9akG8oa8;+|@?Ek^rv-yh&0-lr)#!MvEo`$x;Ph_t>pgX}r1$%J81Pof%zt*1j)2zPS#1KXsqJNl`vZssLk)qp*d zz$y)glJ?OTU*J#u9EuV5#8?*;`%f%QAbXSa{mUzN`Okz$6nt{?;V)^+_cR zvW<_+X@0&vIvqF@2l;{GX^y|*Q>4?OqLPiEUrJG&AssT~>KR1O=hmk0+h}Lb=MLO{ zH}_kk!#m$|&Vs(1_w%9Pk~R5w|ldSsc-ikS>_P2x#RR`bzf*_SfII(pk+H?~A^4Af@NmU~^dAy~CUpzb0C+SZscpm*NGw%O}cG_!yqjw+h z9ZAgIvagRDEH~M%NfV}*J{MKR#KF0O zdldUYbk2V0c*1{1(jBhe9tBfVWzQb}a1p-He00ygb5^H98el{Ckh34A^TFYv&yx1_ zJf{M=qQu_O#3O8>HF4U`DE~gy^aDUmp5x>eM+ny3rqeQ~{+UCpml8f{0vOlP&V;ic zp*GZq8f_izXuUjG005{&|NSq3-0+0<)#kI%@CxMHcRKX)Hu%PSwPttE@xRQi$4Mss zpOe@?yhlo?J&1#+rOy(A6kEIULhjovz0E81EEr$1 zYKO`!ms182y>K36->@MC-DeKoF&+r17Bf&qc}=Y@F6bm+ zLM>t`3!{;A?=0P7|B5e5ja>RAzV<>w^qnYMt7}FN?56d!wkS?TW$o6&U_x0VyGfAf zmkDgj=*9vRzJ{<`g_lsl!J~sVrHp6L-Dlks{Cx+Ew@OG^sZRQS3eiEmM%5%ABwtHGtKnz4>dXHt;i}`J`kwYuQqr-ggn$Yt<(Ci^0qJg}Q%RA= zr8}h&q`PzJ+NF`u1r}I3q;p|GLIH{Q`g{MspP6&-nLBgN^UO20c2R1!V77?oU6$u^$ zQCHfxM=%C3BufDyU2vdz-Ab)<`znem`0smpvc$IS_23=8I;kSmhY;rKI+yKt=%L)d zeaIdf5wxu{tR-3LA86G95*I}5G~T_A@c(5#RIhU<(f^YTGiBRG!0Jpq+INm2ECT-3i-#p8KX-z^^;g?yeBN18K&!IwjbM`i)4Vu&{dZ>}HRlq# z7AZ{V+{_~3VT zDpW2F&TzFl|2!m5QtunvvbAYgW;st>9P+npD8^m;Q)vR&=8vKnoct!O*y*^yMY%J< zW0$$F%`!q)L5@rA3L!`oW*4bn1(G(7Lp$0q<``Ez}O2y5o;6O`E#xyZKWq;Q; z*M>ykMIocy*i3k899C=nsvLFpOF2{JV7GAHhU-G}`sxnVaK2MW&NuZpU0@{fapWyf z7l1IG86WRie(VOYk!8Z3JSwX7rG0X%8^5RNdhy7BlhVDi?&2H^8#0;LxZ2gRy>r*d z^_S=&Z&Eb@`okEkM_SsX$-3L5#V(bOSt>UV+1H50KXkP!ICTtZ`)qXu9$-4r7g8l{ zNEOEhff?Pl@5hpYqN-k!nN3Tm%8-CAIsrWjX<4t)M} zk9Ppe%U9CQDRH>J`-K#N==c!nvC@>q{p; zdrD0D-X+_RJn5MtQ@({~9J7K`Gr_{#GLZy9i5Wx*NiH}=BN=ET0{YCG2&ic-S`}#N zMA?_Os&(~s+av@>_`N*!0cwED3^yu|*-J?*(-t}>^Q;Yno_Oz>rVn-h>ZkZ0!bQ5HVR-p* zcJCE}8`**55f3ufS2Y<&@nejJ*}9JD`Q+bTnUeIq_hyfPg4#ufczok5Dke@UDLzB# zP3E_`{bx8_C*UWt@uz%2WAWA!_bPD&%T=Sg_G+v!lvYIS`}xH50+tb^twyJlbQ(0& zO<2y*R=VD08({4jfAMmi3csmms$Yhz3U^_l6JLCCs~DheUDNc-rFRBtRvH%$F$SZl zvCLY3omdmDC{(-!b^X2_X-s%rX1@rEWaMkFK-$P_x(WdMWwP_W7vI(>P}_Z1980aO znVHhlzLtFGCmvmcN7i41^Ir>*(dj$$ku&0MyGtNHx{Mcu7vqa1iM-Zo`N39Kv#hcz zgH)P^z_W=Ybaz$pE&%p?+eor%vHR<^Q+lsP$h)6;HvUmktvXE~%?B1Ozdv*4H0;?I z9^GEiPfi}GoE^289*99mDUm3u*{aV;_>C*i6_D!HxZpV4dOcd0(^{?OBJ$Whm-%EV zs2m)kU2^7JA){1V+o(X%7_;Kn*R6nG(Vwk;G+x{~DPiS7rlIS}A?+;3k zw_#y<^Gq5yJ@*C!QK64zuhBn_kDteoLo~do{X)``A)SL9bLUj8vF^L=e(`Uev)|jn zx&cC0vLHH0*PQ?8A){k9vbWr6g?{Gvl8`Z)sAB||*>yDRZI4XeOnuyPR-s^tA%|*+ zRXs2FltbpW%mgNLvRN?W1^`ZREH=e%1tJSiSD4l{Wos3LIRBeICywtwlKXP+#f*DL z`LO6i+p8%1iWLs#S4$PH(HNTR;B1&sFKa-Y^q(H}qJ6&(dmw$xdAj!V5 z>EIyJd;a1DJMUcCtOUs{qEd%+Nw6J=7^#GDSC#KuQkW>@(hgPE5sVp{|ktTE`f;0wkUC++FNAKW=~w z?Y*nCtnQhYm*HA}%+#_j9svGwoitx2jy{V@l#-C_$(P z)e})-pAXt)|MYH_p8^u;6m^}XB?LF`RD}NheG#2+rkqx#fT+Rv-4Cpx5o~jW`?wS| zr~0sw9kJ$342`JBjcuN2>ZhVDBj4C=G<4>gt5z~t6O`oQvhX04a%Lu`y=K|;k|lTw z*=$}O>LQ#VsDYM4vq#XUT@2b$g@Nez(SVwabunwNdhg_t8J${_-7k~(&6qtqZ}NR6 z$0ioSLUZrIqeu{F^7GVcy>RHt7&G;%06w#JPwB*x6*A7#zG1nz{zr-qkIG-Xe5t)l%rA0n>wa`y&? zrsvTHH#dl#qJ3G>#?dI%_{FBv&i|J%5cC6DqL)N3Lr8B2kWg&mUy z@_{WlRX_#y__9OsOfhj0Y_=Ry6us)YWp!sksICqJRFKAiq{g`Jiu?6l&bIw-l3Hk| zu^rL17l9Ytt#j)Q0c!g4TY7__uGfwC(`9S*>>)?tImQ z)*zMa;f-740$k{qggKMuO%c+gm-P?5$_HjhR$o>Lflr`06qBaEJ+eRVM0N+dMdNAx zOch{^y3Ka`EdH{6^2F3wkC&Xz_5cJ`wX;ts-70=3hWP64w@_-E74W#iK}F+*m|9=; za@QCgsjM2)I|9pGz#L3H>oYGE&cw-*dnxY3kwQ*gwc@4f-XjogBV%4eA^WV*Z^La* zv5V_7K0f>XUFwagZq)JpGyIbrB`yEJXj`k7GzXya?W)B0|}(p>h~-E-Yl=N>68^yBAB%tK#3 zwfNMn;$A6rDjsg}Ka#em`Q7NpvhbV5JBf_9*Qeh=28D}ujbd~$kt)p+r27EdSoU}3?lqj*$tbByy0U* z&V!i9-^T5Zp5Vg9tk_8lUA$sMi|r;cEtfBupJLy@FqjOf6c=B6=lu?JEkfqwQ{6bM zgsu0U<(^d__sTwgjYC>!ovR_mHEBv@ujwi{eX~oD=K^W}W}P3z#1Z;$6w}1`gtdIs z3;yi;;>#R|qZQKJ*tM(dl_c8(iJG^*R>2DQtDfm2n_gn^sb!UNP`B4sjb;jh4wVfJ z)ck9G3oMtoZL!8M}e(+Uy&WQSJi7X-5NXw0dHlzv= zJ{2ss{n`4JnP)LO)D4A*0Yxe*c;|ZXKfOS6z2S}NlU3!vlO_hr(Jjzo#Ol?qi~qei ziI{k9KKfTNZVsN{PafgMON_j`Cb@_ZAxFa_MTN+o2&2WXShQwCqL8x+#?|=A9?V=t zQip(<4E?Q&$b z(-9^J-`UC5d}>2>!t3TswF^$<>UP@Q%jD3{M1m>Ng~35Xcb^`L@%SB9gCx@e1@hh! z^UKz(8vU`ExY@lu>jZ89Q(7fuMVP-?<|l%?VM{-FxjvLWd>oRu3duvW90>u-K$|$s zu#Xb3E{D6ABnen>_(0%Rw(Xxjd0jS*pjd}l2_shJ@fkxN;nFnfOKT=#Xex_T@N+7y z_p}Hg%EvNe33JPDvjjR7EYC9V#PEW4rpi_x;=W#XJV2Z#ZHK%@FFzeS!%=K&9ll&H zOu!MFxF?~E?Kb%lGx-)DlH$b1p%BLC=5$bbB)WhZ03GA(hLKlbXqIMp30QD*e{dP! z7uVwQ zlk+2cqriTl2{bh%zO_-eRx^ejj#TnxqXNY15==ABTSQfi4<8;!3F=Q(byh$ASv?DO z{MhZWNByQReC^L)(YEykO7UI*G7o=km|~tbg^4udyW(;zX(k^UvFoxHbqL@NZB|EZ z^GrZX)Uuf!5$<6IFS;AvU3<*9{9)6(oBBB8W&FI#@E0|oPieU+M0~SpD++BQtmYt} zN&26=Cs@y*E%1u~lZ=U2A^WHtY3y4K1}OHJTB^+P)+i|6=qnsVH}zZ{WqcmO)sdw# zcE~!HBrz0+i$8HwrQb2U&ywN1P~Y^4i)+$E(>BSSM7V`LWaIksbg8-j6TUq!*M$KI z1Q?_yvTNe+$WH!6FVgnh=XUAWSnJSsLqwmqIBC|3qV*?@?sr+nk%C~WRwLx;yZSy{ z)>ml4J>KH>5CmcbF9(6XFaeW8pgc7m-kJ*ihZzf<5$8JlqeFF>mj}rfdzX*YX9pk^`>@cV*KT7IIK%g}W4v0M#^lJ%s)4wiI=bD%7bk`q!2`UJ~ z7jM=no&OmJIHV?U2thY4AKzoA~5r_aN0QddAJyl(`+(<`n^u zcXU2A1N~01v&@sG|6WMAb%;caq2OozH2qX5cChZ{=+=-mlXkKpI{W3ny$KV@=cslg zY?SX{m&Qw&X-Y-+!vw)%ng+2*h?V}2s>=<>^u16lZ%}Ro7jTry9jdzr8hLlnc5yz7W{|@@|G_f zbq}oxetA*H@#&RX1~irS$JA|v6@*(ROVA#kOT5G%1)RNszaYuUb^1H|O>J;O*t-3x z<=2B^YraVTWs~$}Jkg?`ku z!PfvTBK3HA3x=(kaU(-22yJ&v{9ty1Z#BndmU6R?hR=&9;;jw6Y0c7p2GICH#Kj28 zXElZVQ(Foz5SKcsN!!v|0-KH(y{f>ujgq`(M+?OAx?M}ydVbU%7WMp+b@<6e0h=x0 z1WsyMjMVY?mXh?;l!@FcWbLGlb2PlrW;o+GG(!T|huDl^=Y2wxk>g z1Ih|nU+?{J_bzOIkF>Yv)zi}rM*e3NUXH)|!B9#`q*e#+l`G~+&L8Xn?z8WC@1YPn ztEVc9F=19HYaj0;H?01R7p~;9%<{i=7t};V{tkn;;FMoI!`VJVreQzaE}tS61th-2Z?BvY$3=-5$?m?C%}gI6P2vc#yuG**Y^x3x>K$Ii;a?Fmf>}7z_r7 zmX}0X<0QP1rCTmv^CwddlYaqQp?mH-#lU-&WmNfc_u&ySy{x6ARI_hy+`yWte zHbxG65D$k342Mr2)nt`D>2Upp4eQ7c1TI}$1}6Js9%&#+E-wOKD!{P&BM$=5o>-(&NRb2{R zW;`MhZ=1x(kCcZU3Q0MEgydd|+C!IlYwpLy7r7XVPCF6vpQV7B?%0-o=WzlFXj9vV zhR^GjB8n5LfQwo=sh3(l5S-0Cw_)y&ud*h{(9$s=lq+r(mINwEd z@YWAM0FoUYF#eKz%9X}a5&wx>6dbs_MZKenAPNbqz2U%RV}*%94;X&ZLXmMihaD~t zPQ9u>|5QPGQ~4S8lDpZ$*|=>Z6%2c&j9;BfCz44gHTuS6pEJG+DcRru&~>a!B9p>~ zsRa8dgYt~!7}yk|EQq-Ni;;75{sO3sio{>F7H!qXlCOot)^R@c;oIXCer8Y*;-#!c z)syH@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/angular/src/assets/images/getting-started/stack-overflow.svg b/angular/src/assets/images/getting-started/stack-overflow.svg new file mode 100644 index 0000000..2b09789 --- /dev/null +++ b/angular/src/assets/images/getting-started/stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/angular/src/assets/images/getting-started/x.svg b/angular/src/assets/images/getting-started/x.svg new file mode 100644 index 0000000..422e2de --- /dev/null +++ b/angular/src/assets/images/getting-started/x.svg @@ -0,0 +1,3 @@ + + + diff --git a/angular/src/assets/images/getting-started/youtube.svg b/angular/src/assets/images/getting-started/youtube.svg new file mode 100644 index 0000000..1d38b17 --- /dev/null +++ b/angular/src/assets/images/getting-started/youtube.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/angular/src/assets/images/logo/logo-light-thumbnail.png b/angular/src/assets/images/logo/logo-light-thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3918481aa685480be0c54b0d70a99a5986e587 GIT binary patch literal 9230 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 MU)LDY2zE;NA05R;CIA2c literal 0 HcmV?d00001 diff --git a/angular/src/assets/images/logo/logo-light.png b/angular/src/assets/images/logo/logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..761fb4443d597661e7700574e52b787d7ed7255b GIT binary patch literal 33228 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 nuxmBTJ6Y+ll0437Z literal 0 HcmV?d00001 diff --git a/angular/src/environments/environment.prod.ts b/angular/src/environments/environment.prod.ts new file mode 100644 index 0000000..c7fcdc5 --- /dev/null +++ b/angular/src/environments/environment.prod.ts @@ -0,0 +1,26 @@ +import { Environment } from '@abp/ng.core'; + +const baseUrl = 'http://localhost:4200'; + +export const environment = { + production: true, + application: { + baseUrl, + name: 'newProjectConfigure', + logoUrl: '', + }, + oAuthConfig: { + issuer: 'https://localhost:44355/', + redirectUri: baseUrl, + clientId: 'newProjectConfigure_App', + responseType: 'code', + scope: 'offline_access newProjectConfigure', + requireHttps: true + }, + apis: { + default: { + url: 'https://localhost:44355', + rootNamespace: 'newProjectConfigure', + }, + }, +} as Environment; diff --git a/angular/src/environments/environment.ts b/angular/src/environments/environment.ts new file mode 100644 index 0000000..663951d --- /dev/null +++ b/angular/src/environments/environment.ts @@ -0,0 +1,26 @@ +import { Environment } from '@abp/ng.core'; + +const baseUrl = 'http://localhost:4200'; + +export const environment = { + production: false, + application: { + baseUrl, + name: 'newProjectConfigure', + logoUrl: '', + }, + oAuthConfig: { + issuer: 'http://localhost:44355/', + redirectUri: baseUrl, + clientId: 'newProjectConfigure_App', + responseType: 'code', + scope: 'offline_access newProjectConfigure', + requireHttps: true, + }, + apis: { + default: { + url: 'http://localhost:44355', + rootNamespace: 'newProjectConfigure', + }, + }, +} as Environment; diff --git a/angular/src/favicon.ico b/angular/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a4e8ddfccec21df09d5b32644857347d8e8e794 GIT binary patch literal 1406 zcmV-^1%djBP)LoJbIgO-~@II4Xq`#1)X-u>A?@ zNNth>jn_BCCFaHd%u}M2q_2mc6AiE z1VGFDsyTxM1}aKXv_&;(teFr(FpTnHVkZxX8$(n~At<|Ote4?cJFx%$PDTOT4x&q< zl}H+&89{VIW#B;H)lh*=eoPJ1BOuEbv8fd!ZNU{X;=6#hsh*8SR|#Oo@sh}D0_{y2 zYX-lj83!e7LxJ7b{N^K|IsvvU)mCQwKnI1?{OMxZU$@6_V>FuM!9jI4TO`txCl3sn z4Mm}2Vq?Aw6V>J`>$CSK_Lqt9iJZ%0x$o@7(nUR`^U!$vTg{G+9S<=sMH@k-a{kuC zRR`??(t{KU(aBz0V68Kk$BLPWgPgAeBxoCmGzcJVZn>AY9_sTF?Fa^h5QSj#^RfNR zB?lU}AEh`w%V8GcOh_?@5N5BUs4CIXZM0FoQ)(e&(yy!Ib^_$6G)(rHF zT@(hQ3p&E-{;7-`dwizrfI!gU8e%J?dkdPq-xQ*v_u!jZ1!<}400Yk#$yW-ZCjYn$ zJsH6K2bJ~eeQrT+W!-l!;r}IIr7H=;-#+@Jp2`bHpJYA93WF!RW$R?12GWv6HX5 z3+So3nzs@bjg8OB#bJoZ$iF{LraSXoe^@^J&8kp~_MW{L&&&7bt#9U9NU2UXc*C(I z<;I%lB{a9Jh26TwDVsZ7zfrpTalJqw{yzHoX3oh5mx6nI1IgVBnEx%o8xxG%kMq`w zB@IUu?hbw=0}<3e`t`+hgv8e9owx*4wKoF2P*)dDGdUEnLDbH8Y0;SV zQg_q;uC@u&`C{DQ(QIG%47hu#x=u*axW*l1@~GM}cNvfc|$@oS{OjNEH@f4B%v=egs6i5Gj;X(7@{ ziKN`(xu+lkA3^4V%fQvxSVk7N(_-j55ls2xfKZXq`pC0)Z7rcEr{IZXnmG7T6^SYn-F66datn4#+xleJ(A;X>+)mBc1kJL~dXUKh$-j z_=ZVDc?cm$q6^aQiD)zmvTijWLxVS}2o&_~x_VT+nGNa$>*byoUoZDLP@aujPv22z z*<{Y)YVX8L0)8L78fartcgORb$dU)HepSA-0P3u_)e~U9NM@XDMdn_Pw5zHCa2AEX zXc)iq)r_-|K3t2N&ir(JNg)rUoIyVD)H*fql|UDh$B`fs z_-3^5Q@sKKwrmOBMiZutY&_5*M}dHH_-Qm{{y{cpS#Kl>Y!-?<(hZvj8vv000hUSV?A0O#mtY000O800000007cclK=n! M07*qoM6N<$g6uww1^@s6 literal 0 HcmV?d00001 diff --git a/angular/src/index.html b/angular/src/index.html new file mode 100644 index 0000000..96f0784 --- /dev/null +++ b/angular/src/index.html @@ -0,0 +1,16 @@ + + + + + newProjectConfigure + + + + + + + +

+ + + diff --git a/angular/src/main.ts b/angular/src/main.ts new file mode 100644 index 0000000..1ac6099 --- /dev/null +++ b/angular/src/main.ts @@ -0,0 +1,11 @@ +import { withValidationBluePrint, provideAbpThemeShared } from '@abp/ng.theme.shared'; +import { provideZoneChangeDetection } from "@angular/core"; +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; +import { provideThemeBasicConfig } from '@abp/ng.theme.basic'; + +bootstrapApplication(AppComponent, { + ...appConfig, + providers: [provideZoneChangeDetection(), ...appConfig.providers], +}).catch((err) => console.error(err)); diff --git a/angular/src/polyfills.ts b/angular/src/polyfills.ts new file mode 100644 index 0000000..1a05fd5 --- /dev/null +++ b/angular/src/polyfills.ts @@ -0,0 +1,54 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ +/*************************************************************************************************** + * BROWSER POLYFILLS + */ +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/****************************************************************** + * Load `$localize` - used if i18n tags appear in Angular templates. + */ + import '@angular/localize/init'; \ No newline at end of file diff --git a/angular/src/styles.scss b/angular/src/styles.scss new file mode 100644 index 0000000..67463d2 --- /dev/null +++ b/angular/src/styles.scss @@ -0,0 +1,470 @@ +@use "tailwindcss"; +@keyframes donut-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +:root { + --font-base: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + + /* Primary Brand Colors */ + --clr-primary: #4f46e5; + --clr-primary-hover: #4338ca; + --clr-primary-lt: #eef2ff; + --clr-primary-dk: #3730a3; + + /* Surfaces & Backgrounds */ + --clr-bg: #f8fafc; + --clr-bg-card: #ffffff; + --clr-bg-hover: #f1f5f9; + --clr-bg-subtle: #f8fafc; + + /* Borders */ + --clr-border: #e2e8f0; + --clr-border-focus: #c7d2fe; + --clr-border-strong: #cbd5e1; + + /* Typography Colors */ + --clr-text: #0f172a; + --clr-text-muted: #475569; + --clr-text-subtle: #94a3b8; + --clr-text-inverse: #ffffff; + + /* Status Colors */ + --clr-danger: #ef4444; + --clr-danger-lt: #fef2f2; + --clr-success: #10b981; + --clr-success-lt: #ecfdf5; + --clr-warning: #f59e0b; + --clr-warning-lt: #fffbeb; + + /* Input & Dropdown Theme Tokens */ + --clr-input-bg: #ffffff; + --clr-input-border: #cbd5e1; + --clr-input-border-focus: #6366f1; + --clr-input-border-error: #ef4444; + --clr-input-text: #1e293b; + --clr-input-placeholder: #94a3b8; + --clr-input-disabled-bg: #f1f5f9; + --clr-input-disabled-border: #e2e8f0; + --clr-input-disabled-text: #64748b; + + --clr-dropdown-bg: #ffffff; + --clr-dropdown-border: #cbd5e1; + --clr-dropdown-hover-bg: #eef2ff; + --clr-dropdown-hover-text: #4f46e5; + --clr-dropdown-selected-bg: #e0e7ff; + --clr-dropdown-selected-text: #3730a3; + --clr-dropdown-optgroup-bg: #f8fafc; + --clr-dropdown-optgroup-text: #64748b; + + --clr-chip-bg: #eef2ff; + --clr-chip-text: #4338ca; + --clr-chip-border: #c7d2fe; + --clr-chip-icon: #6366f1; + --clr-chip-icon-hover-bg: #e0e7ff; + + /* Shadows */ + --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.08), 0 1px 2px -1px rgba(0, 0, 0, 0.08); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.07); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.08); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); + + /* Font Sizes */ + --text-xs: 12px; + --text-sm: 13.5px; + --text-base: 14.5px; + --text-lg: 16px; + --text-xl: 18px; + + /* ── ABP Standard Theme Tokens (Light) ───────────────────── */ + --abp-primary: var(--clr-primary); + --abp-primary-hover: var(--clr-primary-hover); + --abp-body-bg: var(--clr-bg); + --abp-card-bg: var(--clr-bg-card); + --abp-border-color: var(--clr-border); + --abp-text-color: var(--clr-text); + --abp-text-muted: var(--clr-text-muted); + --abp-input-bg: var(--clr-input-bg); + --abp-input-border: var(--clr-input-border); + --abp-input-text: var(--clr-input-text); + + --lpx-primary: var(--clr-primary); + --lpx-card-bg: var(--clr-bg-card); + --lpx-content-bg: var(--clr-bg); + --lpx-border-color: var(--clr-border); + --lpx-text: var(--clr-text); + --lpx-text-muted: var(--clr-text-muted); +} + +/* ── Dark Theme Tokens ───────────────────────────────────────── */ +html.dark, body.dark, [data-theme='dark'] { + /* Primary Brand Colors */ + --clr-primary: #6366f1; + --clr-primary-hover: #818cf8; + --clr-primary-lt: rgba(99, 102, 241, 0.18); + --clr-primary-dk: #a5b4fc; + + /* Surfaces & Backgrounds */ + --clr-bg: #0b0f19; + --clr-bg-card: #111827; + --clr-bg-hover: #1f2937; + --clr-bg-subtle: #1e293b; + + /* Borders */ + --clr-border: #1f2937; + --clr-border-focus: #6366f1; + --clr-border-strong: #374151; + + /* Typography Colors */ + --clr-text: #f9fafb; + --clr-text-muted: #9ca3af; + --clr-text-subtle: #6b7280; + --clr-text-inverse: #0f172a; + + /* Status Colors */ + --clr-danger: #f87171; + --clr-danger-lt: rgba(239, 68, 68, 0.15); + --clr-success: #34d399; + --clr-success-lt: rgba(16, 185, 129, 0.15); + --clr-warning: #fbbf24; + --clr-warning-lt: rgba(245, 158, 11, 0.15); + + /* Input & Dropdown Theme Tokens */ + --clr-input-bg: #1e293b; + --clr-input-border: #334155; + --clr-input-border-focus: #818cf8; + --clr-input-border-error: #f87171; + --clr-input-text: #f8fafc; + --clr-input-placeholder: #64748b; + --clr-input-disabled-bg: #0f172a; + --clr-input-disabled-border: #1e293b; + --clr-input-disabled-text: #475569; + + --clr-dropdown-bg: #1e293b; + --clr-dropdown-border: #334155; + --clr-dropdown-hover-bg: rgba(99, 102, 241, 0.22); + --clr-dropdown-hover-text: #a5b4fc; + --clr-dropdown-selected-bg: rgba(99, 102, 241, 0.35); + --clr-dropdown-selected-text: #e0e7ff; + --clr-dropdown-optgroup-bg: #0f172a; + --clr-dropdown-optgroup-text: #94a3b8; + + --clr-chip-bg: rgba(99, 102, 241, 0.2); + --clr-chip-text: #c7d2fe; + --clr-chip-border: rgba(99, 102, 241, 0.35); + --clr-chip-icon: #a5b4fc; + --clr-chip-icon-hover-bg: rgba(99, 102, 241, 0.4); + + /* Shadows */ + --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.5); + --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.6); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.7); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.8); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.9); + + /* ── ABP Standard Theme Tokens (Dark) ────────────────────── */ + --abp-primary: var(--clr-primary); + --abp-primary-hover: var(--clr-primary-hover); + --abp-body-bg: var(--clr-bg); + --abp-card-bg: var(--clr-bg-card); + --abp-border-color: var(--clr-border); + --abp-text-color: var(--clr-text); + --abp-text-muted: var(--clr-text-muted); + --abp-input-bg: var(--clr-input-bg); + --abp-input-border: var(--clr-input-border); + --abp-input-text: var(--clr-input-text); + + --lpx-primary: var(--clr-primary); + --lpx-card-bg: var(--clr-bg-card); + --lpx-content-bg: var(--clr-bg); + --lpx-border-color: var(--clr-border); + --lpx-text: var(--clr-text); + --lpx-text-muted: var(--clr-text-muted); +} + +body { + margin: 0; + font-family: var(--font-base); + color: var(--clr-text); + background-color: var(--clr-bg); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + transition: background-color 200ms ease, color 200ms ease; +} + +/* ── Global Theme & ABP Component Overrides ─────────────────── */ +html.dark { + .card, .card-header, .card-footer { + background-color: var(--clr-bg-card) !important; + border-color: var(--clr-border) !important; + color: var(--clr-text) !important; + } + + .text-muted { + color: var(--clr-text-muted) !important; + } + + h1, h2, h3, h4, h5, h6 { + color: var(--clr-text) !important; + } + + .table { + color: var(--clr-text) !important; + border-color: var(--clr-border) !important; + + th, td { + background-color: var(--clr-bg-card) !important; + border-color: var(--clr-border) !important; + color: var(--clr-text) !important; + } + } + + .form-control, .form-select { + background-color: var(--clr-input-bg) !important; + border-color: var(--clr-input-border) !important; + color: var(--clr-input-text) !important; + + &:focus { + background-color: var(--clr-input-bg) !important; + border-color: var(--clr-input-border-focus) !important; + color: var(--clr-input-text) !important; + box-shadow: 0 0 0 0.25rem var(--clr-primary-lt) !important; + } + + &.is-invalid { + border-color: var(--clr-danger) !important; + background-image: none !important; + + &:focus { + border-color: var(--clr-danger) !important; + box-shadow: 0 0 0 0.25rem var(--clr-danger-lt) !important; + } + } + } + + .invalid-feedback, + formly-validation-message { + display: block !important; + width: 100% !important; + margin-top: 0.35rem !important; + font-size: 0.75rem !important; + font-weight: 500 !important; + color: var(--clr-danger) !important; + } + + .form-label, + formly-field label { + font-size: 0.8125rem !important; + font-weight: 600 !important; + color: var(--clr-text) !important; + margin-bottom: 0.375rem !important; + + .text-danger, + span[aria-hidden="true"] { + color: var(--clr-danger) !important; + margin-left: 0.125rem; + } + } + + .modal-content, .modal-header, .modal-footer, .modal-body { + background-color: var(--clr-bg-card) !important; + border-color: var(--clr-border) !important; + color: var(--clr-text) !important; + } + + .btn-close, button.close { + filter: invert(1) grayscale(100%) brightness(200%); + } + + .dropdown-menu { + background-color: var(--clr-bg-card) !important; + border-color: var(--clr-border) !important; + box-shadow: var(--shadow-xl) !important; + + .dropdown-item { + color: var(--clr-text) !important; + + &:hover, &:focus { + background-color: var(--clr-bg-hover) !important; + color: var(--clr-primary) !important; + } + } + } + + .nav-tabs, .nav-pills { + border-color: var(--clr-border) !important; + + .nav-link { + color: var(--clr-text-muted) !important; + + &.active { + background-color: var(--clr-bg-card) !important; + border-color: var(--clr-border) var(--clr-border) transparent !important; + color: var(--clr-primary) !important; + } + } + } + + .ngx-datatable.material { + background: var(--clr-bg-card) !important; + color: var(--clr-text) !important; + box-shadow: none !important; + + .datatable-header { + background: var(--clr-bg-subtle) !important; + border-bottom: 1px solid var(--clr-border) !important; + color: var(--clr-text-muted) !important; + } + + .datatable-body-row { + background: var(--clr-bg-card) !important; + border-bottom: 1px solid var(--clr-border) !important; + color: var(--clr-text) !important; + + &:hover { + background: var(--clr-bg-hover) !important; + } + } + + .datatable-footer { + background: var(--clr-bg-card) !important; + color: var(--clr-text-muted) !important; + border-top: 1px solid var(--clr-border) !important; + } + } +} + +.donut { + display: inline-block; + border: 4px solid rgba(0, 0, 0, 0.1); + border-left-color: #7983ff; + border-radius: 50%; + width: 30px; + height: 30px; + animation: donut-spin 1.2s linear infinite; + + &.centered { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } +} + +.abp-logo { + background-repeat: no-repeat; +} + +.abp-support { + width: 178px; + height: 30px; + background-image: url('/assets/images/getting-started/abp-support.svg'); +} + +.abp-community { + width: 215px; + height: 30px; + background-image: url('/assets/images/getting-started/abp-community.svg'); +} + +.abp-blog { + width: 142px; + height: 30px; + background-image: url('/assets/images/getting-started/abp-blog.svg'); +} + +.logo-x { + width: 20px; + height: 20px; + background-image: url('/assets/images/getting-started/x.svg'); +} + +/* ── ABP Theme Modal ( & NgbModal) ────────────────── */ +.modal-backdrop, ngb-modal-backdrop { + background-color: rgba(5, 10, 20, 0.7) !important; + backdrop-filter: blur(8px) !important; + -webkit-backdrop-filter: blur(8px) !important; +} + +.modal-content { + background-color: var(--clr-bg-card) !important; + border: 1px solid var(--clr-border) !important; + border-radius: 1.125rem !important; + color: var(--clr-text) !important; + box-shadow: + 0 20px 25px -5px rgba(0, 0, 0, 0.35), + 0 8px 10px -6px rgba(0, 0, 0, 0.25), + 0 0 0 1px var(--clr-border) !important; + overflow: hidden !important; +} + +.modal-header { + background-color: var(--clr-bg-card) !important; + border-bottom: 1px solid var(--clr-border) !important; + padding: 1.125rem 1.5rem !important; + + .modal-title, h1, h2, h3, h4, h5, h6 { + color: var(--clr-text) !important; + font-size: 1.125rem !important; + font-weight: 600 !important; + letter-spacing: -0.01em !important; + } +} + +.modal-body { + background-color: var(--clr-bg-card) !important; + color: var(--clr-text) !important; + padding: 1.25rem 1.5rem !important; + line-height: 1.6 !important; +} + +.modal-footer { + background-color: var(--clr-bg-subtle) !important; + border-top: 1px solid var(--clr-border) !important; + padding: 0.875rem 1.5rem !important; + gap: 0.75rem !important; +} + +/* ── Universal Formly Validation Styles ──────────────────────── */ +.invalid-feedback, +formly-validation-message, +.formly-error-message { + display: block !important; + width: 100% !important; + margin-top: 0.35rem !important; + font-size: 0.75rem !important; + font-weight: 500 !important; + color: var(--clr-danger) !important; +} + +.form-control.is-invalid, +.form-select.is-invalid { + border-color: var(--clr-danger) !important; + + &:focus { + border-color: var(--clr-danger) !important; + box-shadow: 0 0 0 0.25rem var(--clr-danger-lt) !important; + } +} + +.form-label, +formly-field label { + font-size: 0.8125rem !important; + font-weight: 600 !important; + color: var(--clr-text) !important; + margin-bottom: 0.375rem !important; + + .text-danger, + span[aria-hidden="true"] { + color: var(--clr-danger) !important; + margin-left: 0.125rem; + } +} + + diff --git a/angular/start.ps1 b/angular/start.ps1 new file mode 100644 index 0000000..dac71a8 --- /dev/null +++ b/angular/start.ps1 @@ -0,0 +1,2 @@ +yarn +yarn start \ No newline at end of file diff --git a/angular/tsconfig.app.json b/angular/tsconfig.app.json new file mode 100644 index 0000000..f52a541 --- /dev/null +++ b/angular/tsconfig.app.json @@ -0,0 +1,25 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "include": ["src/**/*.ts", "projects/theme-basic10_1_0/src/**/*.ts"], + "exclude": [ + "src/**/*.spec.ts", + "projects/theme-basic10_1_0/**/*.spec.ts", + "projects/theme-basic10_1_0/src/lib/tests/**/*", + "projects/theme-basic10_1_0/src/test-setup.ts" + ], + "angularCompilerOptions": { + "extendedDiagnostics": { + "checks": { + "nullishCoalescingNotNullable": "suppress", + "optionalChainNotNullable": "suppress" + } + }, + "strictTemplates": true + } +} diff --git a/angular/tsconfig.json b/angular/tsconfig.json new file mode 100644 index 0000000..1a7d552 --- /dev/null +++ b/angular/tsconfig.json @@ -0,0 +1,30 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "moduleResolution": "bundler", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "skipLibCheck": true, + "esModuleInterop": true, + "paths": { + "@abp/ng.theme.basic": [ + "./projects/theme-basic10_1_0/src/public-api.ts" + ], + "@abp/ng.theme.basic/testing": [ + "./projects/theme-basic10_1_0/testing/src/public-api.ts" + ], + "@proxy": ["./src/app/proxy/index.ts"], + "@proxy/*": ["./src/app/proxy/*"] + }, + "useDefineForClassFields": false + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false + } +} diff --git a/angular/tsconfig.spec.json b/angular/tsconfig.spec.json new file mode 100644 index 0000000..d383706 --- /dev/null +++ b/angular/tsconfig.spec.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "vitest/globals" + ] + }, + "include": [ + "src/**/*.d.ts", + "src/**/*.spec.ts" + ] +} diff --git a/angular/yarn.lock b/angular/yarn.lock new file mode 100644 index 0000000..caf478b --- /dev/null +++ b/angular/yarn.lock @@ -0,0 +1,6153 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@abp/ng.account.core@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.account.core/-/ng.account.core-10.6.0.tgz" + integrity sha512-y5i+VHltaW088qgXI0ma2y7KT5aAmM+XguGISTVGQFxhE/m1ZslybJ8+RcvTHsCxcezUV2SC79LNtR458XUWdg== + dependencies: + "@abp/ng.core" "~10.6.0" + "@abp/ng.theme.shared" "~10.6.0" + tslib "^2.0.0" + +"@abp/ng.account@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.account/-/ng.account-10.6.0.tgz" + integrity sha512-GOkFrKPyE4dNpJxg8RxjPzbIbXsK4GfciqDRZpW0ooJAwd3IPkiU+GMkcdm/s4FYTifP1I/ok2btgUBqsDhxPg== + dependencies: + "@abp/ng.account.core" "~10.6.0" + "@abp/ng.theme.shared" "~10.6.0" + tslib "^2.0.0" + +"@abp/ng.components@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.components/-/ng.components-10.6.0.tgz" + integrity sha512-C78653VVTsuP1zNCxy3fm67FYEqpW/4h/MfCqfjch3I64+XIuWUk3AKgSu3tBBWaZXWwHJqdh9qOAwB17PZEew== + dependencies: + "@ctrl/tinycolor" "^4.0.0" + chart.js "^3.5.1" + ng-zorro-antd "~21.3.1" + tslib "^2.0.0" + +"@abp/ng.core@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.core/-/ng.core-10.6.0.tgz" + integrity sha512-BMtjbwzptbSGKqBV7kGcYZ+6Rq7/Yfs87AenaDtqe4jn1XT/uH/pmbHsIhGL436HIzZUbfW5znJbGqnZ31WA4w== + dependencies: + "@abp/utils" "~10.6.0" + just-clone "^6.0.0" + just-compare "^2.0.0" + luxon "^3.0.0" + ts-toolbelt "^9.0.0" + tslib "^2.0.0" + +"@abp/ng.feature-management@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.feature-management/-/ng.feature-management-10.6.0.tgz" + integrity sha512-gXUaXf7DbNCC7z8VSrX4VE2x7hc8vdzLR5UId8wTinRhMXD0y8OIbfLkrSfab67D51p2Ty8mNCMQyirOQYr5YQ== + dependencies: + "@abp/ng.theme.shared" "~10.6.0" + tslib "^2.0.0" + +"@abp/ng.identity@~10.6.0-rc.3": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.identity/-/ng.identity-10.6.0.tgz" + integrity sha512-nXK97bgo7/WEA5bY2B911R1ickMDJuRuZj4DGea2HaSJbu+5FKpP4tqYSZP7+Ny8U5OSnR8IYa5+ePhbGmhXEQ== + dependencies: + "@abp/ng.components" "~10.6.0" + "@abp/ng.permission-management" "~10.6.0" + "@abp/ng.theme.shared" "~10.6.0" + tslib "^2.0.0" + +"@abp/ng.oauth@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.oauth/-/ng.oauth-10.6.0.tgz" + integrity sha512-Pwf9el0OHrnL4xXLdvThJCkxcgaluQaDpqskvXEaTwi7NAPeECXASuFCL2tbTW345+ztkxV4gUTKCnhtq3n3MQ== + dependencies: + "@abp/ng.core" "~10.6.0" + "@abp/utils" "~10.6.0" + angular-oauth2-oidc "^20.0.0" + just-clone "^6.0.0" + just-compare "^2.0.0" + tslib "^2.0.0" + +"@abp/ng.permission-management@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.permission-management/-/ng.permission-management-10.6.0.tgz" + integrity sha512-Z31aqzCrslxUxmvEWnls26DrkcUZLfdE/uR2kQNzLGHig6AD8gfShrqURwZt5Yx17f5JtaYwANZuH3psS1MWpQ== + dependencies: + "@abp/ng.theme.shared" "~10.6.0" + tslib "^2.0.0" + +"@abp/ng.schematics@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.schematics/-/ng.schematics-10.6.0.tgz" + integrity sha512-hZB/tik5JpKUsNH8zBBNiZZFSfbtnO5jFdGEqhS0URZqNL3PMWeTH5X9e4oYJ4QJkG2vbhRCXdyPd443W8KJzg== + dependencies: + "@angular-devkit/core" "~22.0.0" + "@angular-devkit/schematics" "~22.0.0" + "@angular/cli" "~22.0.0" + got "^11.5.2" + jsonc-parser "^2.3.0" + should-quote "^1.0.0" + typescript "~6.0.3" + +"@abp/ng.setting-management@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.setting-management/-/ng.setting-management-10.6.0.tgz" + integrity sha512-ZPgdWZ3WXS4tXXD7JdH97EJ+RVAO/gYSmB21Y2gY7AjcIdH2jstqGHg8DmRi3FBJwWibO8TFK2CEQF8hErhiZw== + dependencies: + "@abp/ng.components" "~10.6.0" + "@abp/ng.theme.shared" "~10.6.0" + tslib "^2.0.0" + +"@abp/ng.tenant-management@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.tenant-management/-/ng.tenant-management-10.6.0.tgz" + integrity sha512-QqLuzjqBxwrGbVYg1UuqmX6xvOK9Om/8/tHn2sLsqam4rEoFfcwYqX6eSQ8N62c0g4m2MPoLX3hlxcIrliJwxw== + dependencies: + "@abp/ng.feature-management" "~10.6.0" + "@abp/ng.theme.shared" "~10.6.0" + tslib "^2.0.0" + +"@abp/ng.theme.basic@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.theme.basic/-/ng.theme.basic-10.6.0.tgz" + integrity sha512-9avt1xqRHZQ4LtySz18cEAp3g/FcKZ5dVH4Rx5ywPmfvyxGYEoLuuh1WvuvhnO9MCUtp19O/i2ff+jSkfwvvVQ== + dependencies: + "@abp/ng.account.core" "~10.6.0" + "@abp/ng.theme.shared" "~10.6.0" + tslib "^2.0.0" + +"@abp/ng.theme.shared@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/ng.theme.shared/-/ng.theme.shared-10.6.0.tgz" + integrity sha512-TYrAR04rOduqIRTVBd8DcTO95p6V2KtiIuXfN5r6lJFNJHx1yiB7R9hQ1IFL5ThxNflisMd8vMvV2klvyeZvjw== + dependencies: + "@abp/ng.core" "~10.6.0" + "@fortawesome/fontawesome-free" "^6.0.0" + "@ng-bootstrap/ng-bootstrap" "~20.0.0" + "@ngx-validate/core" "^0.2.0" + "@popperjs/core" "~2.11.0" + "@swimlane/ngx-datatable" "~22.0.0" + bootstrap "^5.0.0" + tslib "^2.0.0" + +"@abp/utils@~10.6.0": + version "10.6.0" + resolved "https://registry.npmjs.org/@abp/utils/-/utils-10.6.0.tgz" + integrity sha512-dQaHPKNKcsyeyCot28UOwOhU5ykS6tqVVNXqRvQrrQIvqj5tOAGtWMeXRP1eP47JRCmF4kOgOSZcMvVnuoUrUQ== + dependencies: + just-compare "^2.3.0" + +"@acemir/cssom@^0.9.28": + version "0.9.31" + resolved "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz" + integrity sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA== + +"@algolia/abtesting@1.18.0": + version "1.18.0" + resolved "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.18.0.tgz" + integrity sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/client-abtesting@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.52.0.tgz" + integrity sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/client-analytics@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.52.0.tgz" + integrity sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/client-common@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.52.0.tgz" + integrity sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw== + +"@algolia/client-insights@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.52.0.tgz" + integrity sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/client-personalization@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.52.0.tgz" + integrity sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/client-query-suggestions@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.0.tgz" + integrity sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/client-search@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.0.tgz" + integrity sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/ingestion@1.52.0": + version "1.52.0" + resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.0.tgz" + integrity sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/monitoring@1.52.0": + version "1.52.0" + resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.52.0.tgz" + integrity sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/recommend@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.52.0.tgz" + integrity sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q== + dependencies: + "@algolia/client-common" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +"@algolia/requester-browser-xhr@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.0.tgz" + integrity sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w== + dependencies: + "@algolia/client-common" "5.52.0" + +"@algolia/requester-fetch@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.52.0.tgz" + integrity sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g== + dependencies: + "@algolia/client-common" "5.52.0" + +"@algolia/requester-node-http@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.52.0.tgz" + integrity sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A== + dependencies: + "@algolia/client-common" "5.52.0" + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ampproject/remapping@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@angular-devkit/architect@0.2200.9": + version "0.2200.9" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2200.9.tgz" + integrity sha512-kwiyEFfJsnJ4o7ondW8KswwJbp+qri5yWLS0wMMG+uBwOolZfrQReorqsQNCALhwmojhDNZc0wEWXEHEhKnotw== + dependencies: + "@angular-devkit/core" "22.0.9" + rxjs "7.8.2" + +"@angular-devkit/architect@>= 0.2100.0 < 0.2200.0": + version "0.2102.22" + resolved "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.22.tgz" + integrity sha512-7+jlbVdPk1TKqbp8xmsMnRsXsnOilD9NH4OGKu2YtNL9mg0y8aB5ziBqvm7IpeHysyi9ae8XTabajq99ItM9gw== + dependencies: + "@angular-devkit/core" "21.2.22" + rxjs "7.8.2" + +"@angular-devkit/core@21.2.22", "@angular-devkit/core@>= 21.0.0 < 22.0.0": + version "21.2.22" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.22.tgz" + integrity sha512-sJoZr7cGfw3imZaE7caQGUB3XiAMGLtpzEmyTe6LnuixVJbJYZBjlYk9AFoW8RJT5hJN8hIe1MLQdAl23kMlLw== + dependencies: + ajv "8.18.0" + ajv-formats "3.0.1" + jsonc-parser "3.3.1" + picomatch "4.0.4" + rxjs "7.8.2" + source-map "0.7.6" + +"@angular-devkit/core@22.0.9", "@angular-devkit/core@~22.0.0": + version "22.0.9" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-22.0.9.tgz" + integrity sha512-u53kltrh1ZKHSqGfEDbPW2RzSC1WBPpan3LN61TuzjAkiHqqaQXrN6EmUvYkX3CIT5PKhO6RPRsptMH9y7hs0w== + dependencies: + ajv "8.20.0" + ajv-formats "3.0.1" + jsonc-parser "3.3.1" + picomatch "4.0.4" + rxjs "7.8.2" + source-map "0.7.6" + +"@angular-devkit/schematics@22.0.9", "@angular-devkit/schematics@~22.0.0": + version "22.0.9" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-22.0.9.tgz" + integrity sha512-r7tPuiXI7pnwcaLQY4hQLOM9R5rkKRc1mKhQQb074Shh8XzTcTaw2ktDXLeiJm/SUUWQPhaxClnjjO3qU8AJRw== + dependencies: + "@angular-devkit/core" "22.0.9" + jsonc-parser "3.3.1" + magic-string "0.30.21" + ora "9.4.0" + rxjs "7.8.2" + +"@angular-devkit/schematics@>= 21.0.0 < 22.0.0": + version "21.2.22" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.22.tgz" + integrity sha512-qhpaXOV4R4Db35bIcgCrJoBMdgTIqipsvG55BVEYtNbVjFxmMWam1nh/OIDTNR54fmpB9/y1LBK1Hm4gVEnAAQ== + dependencies: + "@angular-devkit/core" "21.2.22" + jsonc-parser "3.3.1" + magic-string "0.30.21" + ora "9.3.0" + rxjs "7.8.2" + +"@angular-eslint/builder@~21.2.0": + version "21.2.0" + resolved "https://registry.npmjs.org/@angular-eslint/builder/-/builder-21.2.0.tgz" + integrity sha512-wcp3J9cbrDwSeI/o1D/DSvMQa8zpKjc5WhRGTx33omhWijCfiVNEAiBLWiEx5Sb/dWcoX8yFNWY5jSgFVy9Sjw== + dependencies: + "@angular-devkit/architect" ">= 0.2100.0 < 0.2200.0" + "@angular-devkit/core" ">= 21.0.0 < 22.0.0" + +"@angular-eslint/bundled-angular-compiler@21.2.0": + version "21.2.0" + resolved "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.2.0.tgz" + integrity sha512-J0DWL+j6t9ItFIyIADvzHGqwDA1qfVJ9bx+oTmJ/Hlo7cUpIRoXpcTXpug0CEEABFH0RfDu6PDG2b0FoZ1+7bg== + +"@angular-eslint/eslint-plugin-template@21.2.0", "@angular-eslint/eslint-plugin-template@~21.2.0": + version "21.2.0" + resolved "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-21.2.0.tgz" + integrity sha512-lJ13Dj0DjR6YiceQR0sRbyWzSzOQ6uZPwK9CJUF3wuZjYAUvL1D61zaU9QrVLtf89NVOxv+dYZHDdu3IDeIqbA== + dependencies: + "@angular-eslint/bundled-angular-compiler" "21.2.0" + "@angular-eslint/utils" "21.2.0" + aria-query "5.3.2" + axobject-query "4.1.0" + +"@angular-eslint/eslint-plugin@21.2.0", "@angular-eslint/eslint-plugin@~21.2.0": + version "21.2.0" + resolved "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-21.2.0.tgz" + integrity sha512-X2Qn2viDsjm91CEMxNrxDH3qkKpp6un0C1F1BW2p/m9J4AUVfOcXwWz9UpHFSHTRQ+YlTJbiH1ZwwAPeKhFaxA== + dependencies: + "@angular-eslint/bundled-angular-compiler" "21.2.0" + "@angular-eslint/utils" "21.2.0" + ts-api-utils "^2.1.0" + +"@angular-eslint/schematics@~21.2.0": + version "21.2.0" + resolved "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-21.2.0.tgz" + integrity sha512-WtT4fPKIUQ/hswy+l2GF/rKOdD+42L3fUzzcwRzNutQbe2tU9SimoSOAsay/ylWEuhIOQTs7ysPB8fUgFQoLpA== + dependencies: + "@angular-devkit/core" ">= 21.0.0 < 22.0.0" + "@angular-devkit/schematics" ">= 21.0.0 < 22.0.0" + "@angular-eslint/eslint-plugin" "21.2.0" + "@angular-eslint/eslint-plugin-template" "21.2.0" + ignore "7.0.5" + semver "7.7.3" + strip-json-comments "3.1.1" + +"@angular-eslint/template-parser@~21.2.0": + version "21.2.0" + resolved "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-21.2.0.tgz" + integrity sha512-TCb3qYOC/uXKZCo56cJ6N9sHeWdFhyVqrbbYfFjTi09081T6jllgHDZL5Ms7gOMNY8KywWGGbhxwvzeA0RwTgA== + dependencies: + "@angular-eslint/bundled-angular-compiler" "21.2.0" + eslint-scope "^9.0.0" + +"@angular-eslint/utils@21.2.0": + version "21.2.0" + resolved "https://registry.npmjs.org/@angular-eslint/utils/-/utils-21.2.0.tgz" + integrity sha512-E19/hkuvHoNFvctBkmEiGWpy2bbC6cgbr3GNVrn2nGtbI4jnwnDFCGHv50I4LBfvj0PA9E6TWe73ejJ5qoMJWQ== + dependencies: + "@angular-eslint/bundled-angular-compiler" "21.2.0" + +"@angular/animations@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/animations/-/animations-22.0.8.tgz" + integrity sha512-hdBlckl5mARzuc5gt2siydIAxeJbBiRneg8V0kazEDH6xNkNp/1siro68ZaHgTY5dCUEOec/eC4zbhB8AlSLhQ== + dependencies: + tslib "^2.3.0" + +"@angular/aria@~22.0.0": + version "22.0.7" + resolved "https://registry.npmjs.org/@angular/aria/-/aria-22.0.7.tgz" + integrity sha512-elinnulWH/AgRajJ6tLEFP9nuYlX/6Q/vbm5STmyBzjdaRA7G+/XZ8m2aBlFkt1Da8jIJbgqqfXYKTI8FLtRTQ== + dependencies: + tslib "^2.3.0" + +"@angular/build@~22.0.1": + version "22.0.9" + resolved "https://registry.npmjs.org/@angular/build/-/build-22.0.9.tgz" + integrity sha512-j5eYaMTGFXdPVSX0xtWRRWHE2Ezz2CFiBPsAKrWHitvzccv95nURQYk5jbB+FHCYuN60zJNoTZMIlT7rXYAvag== + dependencies: + "@ampproject/remapping" "2.3.0" + "@angular-devkit/architect" "0.2200.9" + "@babel/core" "7.29.7" + "@babel/helper-annotate-as-pure" "7.29.7" + "@babel/helper-split-export-declaration" "7.24.7" + "@inquirer/confirm" "6.0.12" + "@vitejs/plugin-basic-ssl" "2.3.0" + beasties "0.4.2" + browserslist "^4.26.0" + esbuild "0.28.1" + https-proxy-agent "9.0.0" + jsonc-parser "3.3.1" + listr2 "10.2.1" + magic-string "0.30.21" + mrmime "2.0.1" + parse5-html-rewriting-stream "8.0.1" + picomatch "4.0.4" + piscina "5.2.0" + rollup "4.60.2" + sass "1.99.0" + semver "7.7.4" + source-map-support "0.5.21" + tinyglobby "0.2.16" + vite "7.3.6" + watchpack "2.5.1" + optionalDependencies: + lmdb "3.5.4" + +"@angular/cdk@^21.0.0": + version "21.2.14" + resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-21.2.14.tgz" + integrity sha512-806REq/CLf37nEhmmd8Q+ILN8z/RVG2vk2n8YZ/4TdHpcBCi5ux4AxLbpMmduLwGPOzPagJ6ggRzE5fnX0rmcQ== + dependencies: + parse5 "^8.0.0" + tslib "^2.3.0" + +"@angular/cdk@~22.0.0": + version "22.0.7" + resolved "https://registry.npmjs.org/@angular/cdk/-/cdk-22.0.7.tgz" + integrity sha512-Omh8YkevuG7psuOw8KvPbPINxwqC0iqfosC6monTakb4xX6qP2wprF71PLIFiXSP2rl+OxHLRcf3nPchsPCE5Q== + dependencies: + parse5 "^8.0.0" + tslib "^2.3.0" + +"@angular/cli@~22.0.0", "@angular/cli@~22.0.1": + version "22.0.9" + resolved "https://registry.npmjs.org/@angular/cli/-/cli-22.0.9.tgz" + integrity sha512-nkdz9sc9OjTLBG2QwPH8HuFc4fOl489AzrKInM2y+Q0u1+/HFt9QpSeupPnDJeOYGImDIP0B2VJJ3teDRM1DGg== + dependencies: + "@angular-devkit/architect" "0.2200.9" + "@angular-devkit/core" "22.0.9" + "@angular-devkit/schematics" "22.0.9" + "@inquirer/prompts" "8.4.2" + "@listr2/prompt-adapter-inquirer" "4.2.3" + "@modelcontextprotocol/sdk" "1.29.0" + "@schematics/angular" "22.0.9" + "@yarnpkg/lockfile" "1.1.0" + algoliasearch "5.52.0" + ini "6.0.0" + jsonc-parser "3.3.1" + listr2 "10.2.1" + npm-package-arg "13.0.2" + pacote "21.5.1" + parse5-html-rewriting-stream "8.0.1" + semver "7.7.4" + yargs "18.0.0" + zod "4.4.2" + +"@angular/common@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/common/-/common-22.0.8.tgz" + integrity sha512-FnwkXndUgAyWk1/p5flMfocIUtuuneJ01mxC1FxRc5/bdWTyNVeQDsM9Lw4PEAPc0AHu//EnblegRq8o6LGdUQ== + dependencies: + tslib "^2.3.0" + +"@angular/compiler-cli@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-22.0.8.tgz" + integrity sha512-shBqaUxMtqriv4UG2MHmYT8GSvDizI40mUFkOfeQ1yRJ2C9dk0TnWKPwjSO7o6bs6UiU6V8Y3uSWdmfCGVVZAA== + dependencies: + "@babel/core" "7.29.7" + "@jridgewell/sourcemap-codec" "^1.4.14" + chokidar "^5.0.0" + convert-source-map "^1.5.1" + reflect-metadata "^0.2.0" + semver "^7.0.0" + tslib "^2.3.0" + yargs "^18.0.0" + +"@angular/compiler@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-22.0.8.tgz" + integrity sha512-ot7rvntfkZsPHmp8yl6PWUj/yG4e50X0+YeR7QYy/rEYKBiIg91w8GwjxSzaF4g5+bzJGDv7l/XnachKm0IySg== + dependencies: + tslib "^2.3.0" + +"@angular/core@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/core/-/core-22.0.8.tgz" + integrity sha512-HagZZVzbtXd+ZhMb++k/HOtr/UTiBROHHH7xutgYgnSnPRXX0kCca5EQ02OZ/OCWfsMP5liSJDfwiePFULKA6Q== + dependencies: + tslib "^2.3.0" + +"@angular/forms@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/forms/-/forms-22.0.8.tgz" + integrity sha512-KlLJE8rgziSBqCQy+cqCHPEQPGjJEY53i1vZbpnBoLXhnwswLJ3O0c76RHNpIrlrvr9v4p3b2/LxSE8wQmdStg== + dependencies: + "@standard-schema/spec" "^1.0.0" + tslib "^2.3.0" + zod "^4.0.10" + +"@angular/language-service@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/language-service/-/language-service-22.0.8.tgz" + integrity sha512-mPSWGX1t09Bf0c+JXtq0xUNbyGAPCnWJndbn+VPA5fmnNDbVZiINuDn8MhXnYZAqK1GCvl/MTtg2TKFUWHnU0g== + +"@angular/localize@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/localize/-/localize-22.0.8.tgz" + integrity sha512-jKP+bwzjB9i6GgPlrGDzzXPpre8+/ERR9luvQsLxEKX+hWTNYM/HaDIyzWiouVqzsH+dYP8nJLqdrJm2FxYzyQ== + dependencies: + "@babel/core" "7.29.7" + "@types/babel__core" "7.20.5" + tinyglobby "^0.2.12" + yargs "^18.0.0" + +"@angular/platform-browser-dynamic@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-22.0.8.tgz" + integrity sha512-HQ5GeMoKqd2eMy9hHga1F0yumhrt4gVlhoP8YfmQnZWluVagdyinUpGdd3dNiuYjLcbHB+KXdW9c6LnqEmU+dg== + dependencies: + tslib "^2.3.0" + +"@angular/platform-browser@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-22.0.8.tgz" + integrity sha512-FllGHCayu5Dv82HAA9ORL04Xf+In9JGMbQ1Vn4QnhrAVxBz182vm+ZwszLzRDSAwmfeIjZDeK49tKAcqHR9XNg== + dependencies: + tslib "^2.3.0" + +"@angular/router@~22.0.1": + version "22.0.8" + resolved "https://registry.npmjs.org/@angular/router/-/router-22.0.8.tgz" + integrity sha512-9NO5K03QqfWMWWZ+Uu4WqBSLw/YAot918cBUFdgl6mTUOfoHi/xWO5pAt0SEpbXMHmWafJBdb99GRlAGybGSTg== + dependencies: + tslib "^2.3.0" + +"@ant-design/colors@^7.0.0": + version "7.2.1" + resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz" + integrity sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ== + dependencies: + "@ant-design/fast-color" "^2.0.6" + +"@ant-design/fast-color@^2.0.6": + version "2.0.6" + resolved "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz" + integrity sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA== + dependencies: + "@babel/runtime" "^7.24.7" + +"@ant-design/icons-angular@^21.0.0": + version "21.0.0" + resolved "https://registry.npmjs.org/@ant-design/icons-angular/-/icons-angular-21.0.0.tgz" + integrity sha512-Io1DSg0JyzsxQtF2T9LfQSZL22d7zSYyNz0RiUCOhtMoDnnGis1oU6mPs5JzZTRtVdgpuLUhS6GVTlT+dmP1nA== + dependencies: + "@ant-design/colors" "^7.0.0" + tslib "^2.0.0" + +"@asamuzakjp/css-color@^4.1.1": + version "4.1.2" + resolved "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz" + integrity sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg== + dependencies: + "@csstools/css-calc" "^3.0.0" + "@csstools/css-color-parser" "^4.0.1" + "@csstools/css-parser-algorithms" "^4.0.0" + "@csstools/css-tokenizer" "^4.0.0" + lru-cache "^11.2.5" + +"@asamuzakjp/dom-selector@^6.7.6": + version "6.8.1" + resolved "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz" + integrity sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ== + dependencies: + "@asamuzakjp/nwsapi" "^2.3.9" + bidi-js "^1.0.3" + css-tree "^3.1.0" + is-potential-custom-element-name "^1.0.1" + lru-cache "^11.2.6" + +"@asamuzakjp/nwsapi@^2.3.9": + version "2.3.9" + resolved "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz" + integrity sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q== + +"@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== + dependencies: + "@babel/helper-validator-identifier" "^7.29.7" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== + +"@babel/core@7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.29.7", "@babel/generator@^7.29.8": + version "7.29.8" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz" + integrity sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg== + dependencies: + "@babel/parser" "^7.29.8" + "@babel/types" "^7.29.8" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + +"@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-split-export-declaration@7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + dependencies: + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.29.7", "@babel/parser@^7.29.8": + version "7.29.8" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz" + integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA== + dependencies: + "@babel/types" "^7.29.8" + +"@babel/runtime@^7.21.0", "@babel/runtime@^7.24.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== + +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.29.7": + version "7.29.8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz" + integrity sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.8" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.8" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.8" + debug "^4.3.1" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.28.2", "@babel/types@^7.29.7", "@babel/types@^7.29.8": + version "7.29.8" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz" + integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + +"@csstools/color-helpers@^6.1.1": + version "6.1.1" + resolved "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz" + integrity sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w== + +"@csstools/css-calc@^3.0.0", "@csstools/css-calc@^3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz" + integrity sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ== + +"@csstools/css-color-parser@^4.0.1": + version "4.2.1" + resolved "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.1.tgz" + integrity sha512-YpAJZhaHplYQkG8ib+/Fx5Y0eF2lVWi3tIvMJA6i39TLyUNp2439cifzW8VMjhlqrBjHzK5hVGugRRm2zTKI/A== + dependencies: + "@csstools/color-helpers" "^6.1.1" + "@csstools/css-calc" "^3.3.0" + +"@csstools/css-parser-algorithms@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz" + integrity sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w== + +"@csstools/css-syntax-patches-for-csstree@^1.0.21": + version "1.1.9" + resolved "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.9.tgz" + integrity sha512-iGGw4OsAYsS6pD29MdJ2bX/nJx65a04ZZiw6x+VwWlP2DdXf6f++Zmuv/OzALpdyfVhjbduIIF2cXM7HWBIe9A== + +"@csstools/css-tokenizer@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz" + integrity sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA== + +"@ctrl/tinycolor@^3.6.0": + version "3.6.1" + resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz" + integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== + +"@ctrl/tinycolor@^4.0.0": + version "4.2.0" + resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz" + integrity sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A== + +"@emnapi/core@^1.11.1": + version "1.11.3" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.3.tgz#5e95348a42cd1e06f0b9aa380cd74091daa4d520" + integrity sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg== + dependencies: + "@emnapi/wasi-threads" "1.2.3" + tslib "^2.4.0" + +"@emnapi/runtime@^1.11.1": + version "1.11.3" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.3.tgz#84257ae3b0531eb2aec1ffa23d70700da007ba95" + integrity sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.3", "@emnapi/wasi-threads@^1.2.2": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz#c9bf72fd4be5b928aee894820e8d814ed73916e9" + integrity sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g== + dependencies: + tslib "^2.4.0" + +"@esbuild/aix-ppc64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz#7a01a8d2ec2fbb2dac78adad09b0fa781e4082be" + integrity sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ== + +"@esbuild/aix-ppc64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz#bf6e10303bcf2e7c686975fa52f937ec2728d8bc" + integrity sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ== + +"@esbuild/android-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz#b540a27d14e4afd058496a4dbec4d3f414db110a" + integrity sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg== + +"@esbuild/android-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz#0c6246bc8d2c4d172aac2db3fb1190d72bd65504" + integrity sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A== + +"@esbuild/android-arm@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.28.1.tgz#704bd297de6d762de54eabbeafbf55f6756abe2f" + integrity sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ== + +"@esbuild/android-arm@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.28.2.tgz#2d84ece6a4e2684d92be26ee13d42757d831c381" + integrity sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg== + +"@esbuild/android-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.28.1.tgz#d1cb166d34b0fbf0fe8ab460a5594f24a378701e" + integrity sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng== + +"@esbuild/android-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.28.2.tgz#fc38d4d6358d8dc1cf53f09f7589fe436eb64801" + integrity sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q== + +"@esbuild/darwin-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz#1034b26457fc886368fe61bbd09f653f6afa8e54" + integrity sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q== + +"@esbuild/darwin-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz#f83afeeac1d7dac01c7a2fd012b3e451a0591fcc" + integrity sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw== + +"@esbuild/darwin-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz#65556a432a1e4d72032d8218c1932fcca1a49772" + integrity sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ== + +"@esbuild/darwin-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz#510147c055a795588dbbe14fd6b1b8ad0a2f30de" + integrity sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw== + +"@esbuild/freebsd-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz#2e61e0592f9030d7e3dae18ee25ebc535918aef6" + integrity sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw== + +"@esbuild/freebsd-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz#093b9200ecf0b115ba4e5e248a7485c9c5f8bd5e" + integrity sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw== + +"@esbuild/freebsd-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz#c95ec289959ef8079c4dca817a1e2c4be66b9bd3" + integrity sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ== + +"@esbuild/freebsd-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz#0be22b6df925d213e841ea87123af5df80b0faf7" + integrity sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg== + +"@esbuild/linux-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz#40b22175dda06182f3ee8141186c5ff304c4a717" + integrity sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g== + +"@esbuild/linux-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz#1bdbc651cda9ba9995c53ed9c71ceaa65094762d" + integrity sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug== + +"@esbuild/linux-arm@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz#c09a0f67917592ac0de892a9be4d3814debd2a6c" + integrity sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ== + +"@esbuild/linux-arm@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz#beb12ad72b84f72d28488cc1b8ee9f7eb141d753" + integrity sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w== + +"@esbuild/linux-ia32@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz#a580f9c676797833891e519fc7a1337c8afd8db3" + integrity sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w== + +"@esbuild/linux-ia32@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz#b81f9d55529b45c206a46a138214b1aa6879696b" + integrity sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ== + +"@esbuild/linux-loong64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz#46452cf321dc7f9e91c2fa780a56bb56e79cd68b" + integrity sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg== + +"@esbuild/linux-loong64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz#598667241a04c99b76ed6ef940ac50038c419f98" + integrity sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ== + +"@esbuild/linux-mips64el@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz#4211b3184dd6608f53dcb22e39f5d34ee08852c8" + integrity sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ== + +"@esbuild/linux-mips64el@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz#1c51eb9cea903f53d97b5af3b1841db70f5596ca" + integrity sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA== + +"@esbuild/linux-ppc64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz#697857c2a61cb9b0b6bb6652e40c1dc5e1ca8e5d" + integrity sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ== + +"@esbuild/linux-ppc64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz#63dd61f17ceb31a81227f413feac8a71bc2c51f2" + integrity sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ== + +"@esbuild/linux-riscv64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz#d192943eb146a40ac4c6497d0cf7be35b986bf08" + integrity sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ== + +"@esbuild/linux-riscv64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz#3763b08fde5cf25ab1facb8e7752edfe45fbfc27" + integrity sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA== + +"@esbuild/linux-s390x@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz#acea0356da0e0ebc08f97cf7b9c2e401e1e648dc" + integrity sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag== + +"@esbuild/linux-s390x@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz#1a137ff293a82906eb3176385bd7e8e0e5cfb7cb" + integrity sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg== + +"@esbuild/linux-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz#6f0c3ce0cb64c534b70c4c45ecb2c16d34e35dfd" + integrity sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA== + +"@esbuild/linux-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz#268b36211c146ca54f8fe12c578a8d6ef8979485" + integrity sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ== + +"@esbuild/netbsd-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz#8bcd77077a0dce3378b574fedb26d2a253b73d36" + integrity sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw== + +"@esbuild/netbsd-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz#22571ad951d62bb6accc82d8d1fad5c8c1ac0ba1" + integrity sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw== + +"@esbuild/netbsd-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz#e7fb2a01e99c830c94e6623cd9fefb4c8fb58347" + integrity sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg== + +"@esbuild/netbsd-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz#42fcc57297eb0a0ca3f5fc475291f4c1a3f7c0de" + integrity sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw== + +"@esbuild/openbsd-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz#c52909372db8b86e2c55e05a8940033b5660a3b2" + integrity sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q== + +"@esbuild/openbsd-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz#9eb32af104ac3dacf4edca01f596664aab0c73ef" + integrity sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ== + +"@esbuild/openbsd-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz#c427b9be5a64c262ff9a7eb70b5fbbaadf446c6c" + integrity sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw== + +"@esbuild/openbsd-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz#febed2402d6088225e91f20fb4ce2522ad0a4efd" + integrity sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw== + +"@esbuild/openharmony-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz#dc9b147baca2e6c4b3c85571741ef4860a489097" + integrity sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg== + +"@esbuild/openharmony-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz#85641c3d466428bfbccea5f21c26836663fef5ce" + integrity sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q== + +"@esbuild/sunos-x64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz#ce866d12df13c15e4c99f073a3d466f6e0649b3a" + integrity sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ== + +"@esbuild/sunos-x64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz#a736f9d8962481045fc4c3e54f5479f22c870fb4" + integrity sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g== + +"@esbuild/win32-arm64@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz#7468e3692d01d629d5941e5d83817bb80f9e39b4" + integrity sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA== + +"@esbuild/win32-arm64@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz#ee5ab40fad186201b652a33f8a5eb149e9e42532" + integrity sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ== + +"@esbuild/win32-ia32@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz#a5bc0063fb2bcab6d0ed63f2a1537958bc269ec6" + integrity sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg== + +"@esbuild/win32-ia32@0.28.2": + version "0.28.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz#c40d28a6d99a127da6711f2afd74b11cb63b06a7" + integrity sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA== + +"@esbuild/win32-x64@0.28.1": + version "0.28.1" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz" + integrity sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A== + +"@esbuild/win32-x64@0.28.2": + version "0.28.2" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz" + integrity sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.10.1" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz" + integrity sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.2" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + 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" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@exodus/bytes@^1.6.0": + version "1.15.1" + resolved "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz" + integrity sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q== + +"@fortawesome/fontawesome-free@^6.0.0": + version "6.7.2" + resolved "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz" + integrity sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA== + +"@gar/promise-retry@^1.0.0", "@gar/promise-retry@^1.0.2": + version "1.0.3" + resolved "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz" + integrity sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA== + +"@harperfast/extended-iterable@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@harperfast/extended-iterable/-/extended-iterable-1.0.3.tgz" + integrity sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw== + +"@hono/node-server@^1.19.9": + version "1.19.17" + resolved "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.17.tgz" + integrity sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ== + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + 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== + +"@inquirer/ansi@^2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz" + integrity sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q== + +"@inquirer/checkbox@^5.1.4": + version "5.2.3" + resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.3.tgz" + integrity sha512-XEYX2WA8SBkLPczL6/yXPHLPCvDoptmh9v56Cy05BSV1Smk1vWy19bTC4qJBuIffw7+6l4CcaYYzGqG60RfW1g== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/core" "^12.0.1" + "@inquirer/figures" "^2.0.8" + "@inquirer/type" "^4.1.0" + +"@inquirer/confirm@6.0.12": + version "6.0.12" + resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.12.tgz" + integrity sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og== + dependencies: + "@inquirer/core" "^11.1.9" + "@inquirer/type" "^4.0.5" + +"@inquirer/confirm@^6.0.12": + version "6.3.0" + resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.3.0.tgz" + integrity sha512-pZHXJImFtERmSNMBHcjwuz8Ck5vEFEYNUZnwbb8aJpjHv/TwGuFErNxF2Hp8+V+pNJs2EYPMlyWscvFEqO9jOQ== + dependencies: + "@inquirer/core" "^12.0.1" + "@inquirer/type" "^4.1.0" + +"@inquirer/core@^11.1.9": + version "11.2.1" + resolved "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz" + integrity sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/figures" "^2.0.7" + "@inquirer/type" "^4.0.7" + cli-width "^4.1.0" + fast-wrap-ansi "^0.2.0" + mute-stream "^3.0.0" + signal-exit "^4.1.0" + +"@inquirer/core@^12.0.1": + version "12.0.1" + resolved "https://registry.npmjs.org/@inquirer/core/-/core-12.0.1.tgz" + integrity sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/figures" "^2.0.8" + "@inquirer/type" "^4.1.0" + cli-width "^4.1.0" + fast-wrap-ansi "^0.2.0" + mute-stream "^3.0.0" + signal-exit "^4.1.0" + +"@inquirer/editor@^5.1.1": + version "5.3.1" + resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-5.3.1.tgz" + integrity sha512-y43COoyVUjPWIobn2Qep/uI1drPS78aaZZZ9kVi94Tyu/GuW2N8d8Q4rifJXGAXCEAXCPTTMjD8gC1HyvM5ukA== + dependencies: + "@inquirer/core" "^12.0.1" + "@inquirer/external-editor" "^3.0.4" + "@inquirer/type" "^4.1.0" + +"@inquirer/expand@^5.0.13": + version "5.1.3" + resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.3.tgz" + integrity sha512-3NQJiXNJ/aj9wiAsr7pECdp5Qe9J0X9YUJCKsaFXS+ddOxfL6J4AIl3w3T4Gq3kK0WsQY5GMoDokK5X94m6lHw== + dependencies: + "@inquirer/core" "^12.0.1" + "@inquirer/type" "^4.1.0" + +"@inquirer/external-editor@^3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.4.tgz" + integrity sha512-tZbbaK2ovq6vlrRBNQvjrypmrED/p5x2ncIHQ79cD55tei3dD96v5glMMA+6tiq7K104i/25DVYKWVPJuV6ptA== + dependencies: + chardet "^2.1.1" + iconv-lite "^0.7.2" + +"@inquirer/figures@^2.0.7", "@inquirer/figures@^2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.8.tgz" + integrity sha512-tApbon79GM9ry56ja/Ud3SY2CL4TQsao9fIwDQbgTeNY55025GdMzQ2+UdegV/lx51VNGUB59M0v0nMpybYY4Q== + +"@inquirer/input@^5.0.12": + version "5.1.4" + resolved "https://registry.npmjs.org/@inquirer/input/-/input-5.1.4.tgz" + integrity sha512-3xQkQrOvgOzpSN2ciTVdRDlg1FWMCA8l+0KfB6SNlILoTCGzJTzO/gc0Rwjcb3usuGyKdaGtI6OiyMdeMeLWkg== + dependencies: + "@inquirer/core" "^12.0.1" + "@inquirer/type" "^4.1.0" + +"@inquirer/number@^4.0.12": + version "4.2.1" + resolved "https://registry.npmjs.org/@inquirer/number/-/number-4.2.1.tgz" + integrity sha512-5KaqwZNLRpUuWcoCrYghPP9TMaXL5v2Sk4xqePM7RCVegcJStoXdWibio60YIC1bec+z1fCyb67N6XPJIkZtGA== + dependencies: + "@inquirer/core" "^12.0.1" + "@inquirer/type" "^4.1.0" + +"@inquirer/password@^5.0.12": + version "5.2.0" + resolved "https://registry.npmjs.org/@inquirer/password/-/password-5.2.0.tgz" + integrity sha512-CvVcW09emkBESEOW+4R8CjLNkP3fB3XrjeL8CDvfpjgrJN+V9oerXmJAXXM3l+4xqYPD5Yaujzy/Ph0PLOdDuA== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/core" "^12.0.1" + "@inquirer/type" "^4.1.0" + +"@inquirer/prompts@8.4.2": + version "8.4.2" + resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.4.2.tgz" + integrity sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q== + dependencies: + "@inquirer/checkbox" "^5.1.4" + "@inquirer/confirm" "^6.0.12" + "@inquirer/editor" "^5.1.1" + "@inquirer/expand" "^5.0.13" + "@inquirer/input" "^5.0.12" + "@inquirer/number" "^4.0.12" + "@inquirer/password" "^5.0.12" + "@inquirer/rawlist" "^5.2.8" + "@inquirer/search" "^4.1.8" + "@inquirer/select" "^5.1.4" + +"@inquirer/rawlist@^5.2.8": + version "5.3.3" + resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.3.tgz" + integrity sha512-Mu7WrtmDLaXBDEyrRLS70SZgX9ZSm4Up1w0ZxiH8C1OOp9oaVCn2k8q3QGgmlnhsKYUhuaU3zFWhAP6wxkVIMA== + dependencies: + "@inquirer/core" "^12.0.1" + "@inquirer/type" "^4.1.0" + +"@inquirer/search@^4.1.8": + version "4.3.1" + resolved "https://registry.npmjs.org/@inquirer/search/-/search-4.3.1.tgz" + integrity sha512-0VWOvsHWI0rPj6CG70MoP4oXNCB6adcyN8bVFZXnh11eLDdPIK2f2XCmva78acPPDfJisfab7qNakwBh7hdBXw== + dependencies: + "@inquirer/core" "^12.0.1" + "@inquirer/figures" "^2.0.8" + "@inquirer/type" "^4.1.0" + +"@inquirer/select@^5.1.4": + version "5.2.3" + resolved "https://registry.npmjs.org/@inquirer/select/-/select-5.2.3.tgz" + integrity sha512-KuRTodDa6xBXX2noIpjuitpX/QT7Sfav7dIZ/OfUY54Hxg95nrGoshSzxx6Ey7qqLbImKdiGkSDt7KjPXjQgmA== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/core" "^12.0.1" + "@inquirer/figures" "^2.0.8" + "@inquirer/type" "^4.1.0" + +"@inquirer/type@^4.0.5", "@inquirer/type@^4.0.7", "@inquirer/type@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@inquirer/type/-/type-4.1.0.tgz" + integrity sha512-FMiJpuHUG3Dk0ex+UIXkre7i+i4OcwHWk9YdcVtZHFwb/r2rnrU2ipTCNAB7A+QOP0ryzIcqOfy76fRyyvOEAw== + +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": + version "1.6.0" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz" + integrity sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@listr2/prompt-adapter-inquirer@4.2.3": + version "4.2.3" + resolved "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-4.2.3.tgz" + integrity sha512-Co9U3AJ3LW0J8XBHjVoNKA79dMAyFt8EZH3OaKTMcDTj8r+6kG3vSUPq/eGLHT7P0iK3uLaFfhdFYd3033P24g== + dependencies: + "@inquirer/type" "^4.0.5" + +"@lmdb/lmdb-darwin-arm64@3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.5.4.tgz#ff51012dff6af26771f71abaa739b0f71d0018d8" + integrity sha512-Kk4Kz3iyu1QiLsLZBS9Af1eSKUC8VR2T+/jyE2iAyuGw2VwK08pp5iTbZnXn6sWu0LogO/RFktMxOjiDA2sS3w== + +"@lmdb/lmdb-darwin-x64@3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.5.4.tgz#1f8f1f571e07367ce3974ff50ae81719e5c8cfd6" + integrity sha512-BEe5Rp3trn26oxoXOVL5HVDoiYmjUDwr8NRPkBOdUdCSBEorKI+7JrZLRKAdxO+G6cGQLgseXk0gR7qIQa7aGw== + +"@lmdb/lmdb-linux-arm64@3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.5.4.tgz#88c345e5061084c29446f5778ccef5d499a5c42c" + integrity sha512-cUXEengO8o60v1SWerJTH4/RH4U3+9jC0/4njp2Z9NdmvaGzhKsbRM2wpXuRYrN8tytsoJCg0SvWEWwHAwLbCA== + +"@lmdb/lmdb-linux-arm@3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.5.4.tgz#a4ddcf697642d0d72b0c3a1eea7550bfdeb071c5" + integrity sha512-SGbFR7816uBcTHc2ZY4S6WyOkl9bICnzqTQd2Mv4V/j24cfds88xx2nC6cm/y8zGQL7Ds31YF/5NGxjgcdM5Hw== + +"@lmdb/lmdb-linux-x64@3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.5.4.tgz#72b3805f7f027f9df9a3af6a1b1fc30c858d486e" + integrity sha512-Gxq8jpgOWXwd0PUR+c9R2Ik1/uBnGd5GMIIzRRDqABCkvmjtC3KWcyhesV9jSPCz759isl0NlbsstZ2oyvk8lA== + +"@lmdb/lmdb-win32-arm64@3.5.4": + version "3.5.4" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.5.4.tgz#a23f1457106835c2270b3b05379f199aaa466bc9" + integrity sha512-pKv1DJ1bPZAaHkdFsSz5IDfUG8x9vntgquXF9/Dm2xuupcIe/EkLzylpoBxppFVK5vzbV561Dq26jNY2fIMA7g== + +"@lmdb/lmdb-win32-x64@3.5.4": + version "3.5.4" + resolved "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.5.4.tgz" + integrity sha512-JF1BmLCm9kGEVZgYmJq43zeQVdHVgAJnTi/NURWEsy6L1ZrrlSmdltS+D17QN4LODwf+1LMXAA9auIZVXtWwzw== + +"@microsoft/signalr@^10.0.11": + version "10.0.11" + resolved "https://registry.npmjs.org/@microsoft/signalr/-/signalr-10.0.11.tgz" + integrity sha512-FulOJ2EEtKvLQcswe/U7v8pzyXyk7Jua5xgWJPPwyQU/2Z9ORvKcVjyO75VvLsem+CJ1ORRexJ+7Bz1FCei2aw== + dependencies: + abort-controller "^3.0.0" + eventsource "^2.0.2" + fetch-cookie "^2.0.3" + node-fetch "^2.6.7" + ws "^7.5.10" + +"@modelcontextprotocol/sdk@1.29.0": + version "1.29.0" + resolved "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz" + integrity sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ== + dependencies: + "@hono/node-server" "^1.19.9" + ajv "^8.17.1" + ajv-formats "^3.0.1" + content-type "^1.0.5" + cors "^2.8.5" + cross-spawn "^7.0.5" + eventsource "^3.0.2" + eventsource-parser "^3.0.0" + express "^5.2.1" + express-rate-limit "^8.2.1" + hono "^4.11.4" + jose "^6.1.3" + json-schema-typed "^8.0.2" + pkce-challenge "^5.0.0" + raw-body "^3.0.0" + zod "^3.25 || ^4.0" + zod-to-json-schema "^3.25.1" + +"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz#22619f76a6b10ba78c8b74025b0d9754cad69cc7" + integrity sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ== + +"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz#c2fc0573afe08b0cf213e66eef76842b121d1577" + integrity sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w== + +"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz#4e3822f5522e18ed92611b894dc5db1bc882f39d" + integrity sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw== + +"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz#27ec4bc7eb6c311c982a50f1a6e1e1414638a6f8" + integrity sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw== + +"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz#37317d833c7d01d086f6155fa59c478adb6839f6" + integrity sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ== + +"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz" + integrity sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ== + +"@napi-rs/lzma-linux-x64-gnu@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz#e57d4306966078662038094fb38eb9146dc3aea9" + integrity sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ== + +"@napi-rs/nice-android-arm-eabi@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz#4ebd966821cd6c2cc7cc020eb468de397bb9b40f" + integrity sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw== + +"@napi-rs/nice-android-arm64@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz#e183ba874512bc005852daab8b78c63e0a4288a8" + integrity sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw== + +"@napi-rs/nice-darwin-arm64@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz#64b1585809774cbb8bf95cea3d4c8827c9897394" + integrity sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A== + +"@napi-rs/nice-darwin-x64@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz#99c0c7f62cb1e23ca76881bb29cc6000aeccc6f0" + integrity sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ== + +"@napi-rs/nice-freebsd-x64@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz#9a5ca0e3ced86207887c98a5a560de8cde5a909e" + integrity sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ== + +"@napi-rs/nice-linux-arm-gnueabihf@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz#b8a6a1bc88d0de3e99ac3fdea69980dc6e20b502" + integrity sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg== + +"@napi-rs/nice-linux-arm64-gnu@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz#226f1ef30fcb80fa40370e843b75cc86e39e1183" + integrity sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ== + +"@napi-rs/nice-linux-arm64-musl@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz#01345c3db79210ba5406c8729e8db75ed11c5f14" + integrity sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg== + +"@napi-rs/nice-linux-ppc64-gnu@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz#ce7a1025227daab491ded40784b561394d688fcb" + integrity sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg== + +"@napi-rs/nice-linux-riscv64-gnu@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz#9bef5dc89a0425d03163853b4968dbb686d98fd5" + integrity sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw== + +"@napi-rs/nice-linux-s390x-gnu@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz#247c8c7c45876877bdb337cfeb290ff4fd82de62" + integrity sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ== + +"@napi-rs/nice-linux-x64-gnu@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz#7fd1f5e037cb44ab4f5f95a3b3225a99e3248f12" + integrity sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg== + +"@napi-rs/nice-linux-x64-musl@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz#d447cd7157ae5da5c0b15fc618bf61f0c344ff6f" + integrity sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw== + +"@napi-rs/nice-openharmony-arm64@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz#1120e457d2cc6b2bc86ef0a697faefe2e194dfce" + integrity sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ== + +"@napi-rs/nice-win32-arm64-msvc@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz#91e4cfecf339b43fa7934f0c8b19d04f4cdd9bc0" + integrity sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA== + +"@napi-rs/nice-win32-ia32-msvc@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz#ed9300bba074d3e3b0a077d6b157f2b4ff70af0e" + integrity sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug== + +"@napi-rs/nice-win32-x64-msvc@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz" + integrity sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ== + +"@napi-rs/nice@^1.0.4": + version "1.1.1" + resolved "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz" + integrity sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw== + optionalDependencies: + "@napi-rs/nice-android-arm-eabi" "1.1.1" + "@napi-rs/nice-android-arm64" "1.1.1" + "@napi-rs/nice-darwin-arm64" "1.1.1" + "@napi-rs/nice-darwin-x64" "1.1.1" + "@napi-rs/nice-freebsd-x64" "1.1.1" + "@napi-rs/nice-linux-arm-gnueabihf" "1.1.1" + "@napi-rs/nice-linux-arm64-gnu" "1.1.1" + "@napi-rs/nice-linux-arm64-musl" "1.1.1" + "@napi-rs/nice-linux-ppc64-gnu" "1.1.1" + "@napi-rs/nice-linux-riscv64-gnu" "1.1.1" + "@napi-rs/nice-linux-s390x-gnu" "1.1.1" + "@napi-rs/nice-linux-x64-gnu" "1.1.1" + "@napi-rs/nice-linux-x64-musl" "1.1.1" + "@napi-rs/nice-openharmony-arm64" "1.1.1" + "@napi-rs/nice-win32-arm64-msvc" "1.1.1" + "@napi-rs/nice-win32-ia32-msvc" "1.1.1" + "@napi-rs/nice-win32-x64-msvc" "1.1.1" + +"@napi-rs/wasm-runtime@^1.1.4": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz#97e3d45d7424dc5da1d4e32f3bf3b292f6c1b44c" + integrity sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q== + dependencies: + "@tybys/wasm-util" "^0.10.3" + +"@ng-bootstrap/ng-bootstrap@~20.0.0": + version "20.0.0" + resolved "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-20.0.0.tgz" + integrity sha512-Jt+GUQ0PdM8VsOUUVr7vTQXhwcGwe2DCe1mmfS21vz9pLSOtGRz41ohZKc1egUevj5Rxm2sHVq5Sve68/nTMfA== + dependencies: + tslib "^2.3.0" + +"@ng-select/ng-select@^24.0.2": + version "24.0.2" + resolved "https://registry.yarnpkg.com/@ng-select/ng-select/-/ng-select-24.0.2.tgz#106c5af0b041351b2e817688347714c94affd204" + integrity sha512-EcOQanLp5dNxkDOxK75z7+B3gZW8LvQofzwL5AgWUn04EkJOXRI7Wi6Ylp7+jIAi9yPsTwjznrRd+wSl9EZGAQ== + dependencies: + tslib "^2.8.1" + +"@ngx-formly/bootstrap@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@ngx-formly/bootstrap/-/bootstrap-7.1.0.tgz#7c9694e8dc0ce2d922c66ef6bfa3f1d9291a2c00" + integrity sha512-cy2Qo1iw7K6FtWY9URah+12cZ6LoKoYytEN2uBSGnTPOEhRQ41HK7SQ0wxz98cujmbtFzlLjOD2HF59MWJkQ8Q== + dependencies: + tslib "^2.0.0" + +"@ngx-formly/core@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@ngx-formly/core/-/core-7.1.0.tgz#861cdc9df9a04c48e7849708ab783c385b77adcf" + integrity sha512-uyHibGYEW0MBEvWdMm39cUWrs/oWwUOKL5v24EDAEeh0oG1LJS0avAcpUBrMMcXT2TU1yCx5E1dJ6ihTsDZOcw== + dependencies: + tslib "^2.0.0" + +"@ngx-validate/core@^0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@ngx-validate/core/-/core-0.2.0.tgz" + integrity sha512-04iGHPCXyFCykAyCGehxetziOt69Lhk/6yWifhC/vc8PZJ0S8m3hIn6tI63pEdVoV95+Hc1GQ1K/wMRtRD0uLQ== + dependencies: + tslib "^2.0.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/agent@^4.0.0": + version "4.0.2" + resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz" + integrity sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^11.2.1" + socks-proxy-agent "^8.0.3" + +"@npmcli/fs@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz" + integrity sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^7.0.0": + version "7.0.2" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz" + integrity sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg== + dependencies: + "@gar/promise-retry" "^1.0.0" + "@npmcli/promise-spawn" "^9.0.0" + ini "^6.0.0" + lru-cache "^11.2.1" + npm-pick-manifest "^11.0.1" + proc-log "^6.0.0" + semver "^7.3.5" + which "^6.0.0" + +"@npmcli/installed-package-contents@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz" + integrity sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA== + dependencies: + npm-bundled "^5.0.0" + npm-normalize-package-bin "^5.0.0" + +"@npmcli/node-gyp@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz" + integrity sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ== + +"@npmcli/package-json@^7.0.0": + version "7.0.5" + resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz" + integrity sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ== + dependencies: + "@npmcli/git" "^7.0.0" + glob "^13.0.0" + hosted-git-info "^9.0.0" + json-parse-even-better-errors "^5.0.0" + proc-log "^6.0.0" + semver "^7.5.3" + spdx-expression-parse "^4.0.0" + +"@npmcli/promise-spawn@^9.0.0": + version "9.0.1" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz" + integrity sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q== + dependencies: + which "^6.0.0" + +"@npmcli/redact@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz" + integrity sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q== + +"@npmcli/run-script@^10.0.0": + version "10.0.4" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz" + integrity sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg== + dependencies: + "@npmcli/node-gyp" "^5.0.0" + "@npmcli/package-json" "^7.0.0" + "@npmcli/promise-spawn" "^9.0.0" + node-gyp "^12.1.0" + proc-log "^6.0.0" + +"@oxc-project/types@=0.147.0": + version "0.147.0" + resolved "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz" + integrity sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg== + +"@parcel/watcher-android-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz#99aaa3223d43807c9340af439cad7e9b6d26ada6" + integrity sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA== + +"@parcel/watcher-darwin-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz#024496e586b4744f09ce532bbe89fe38ef02a64e" + integrity sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw== + +"@parcel/watcher-darwin-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz#a4621df1359a93d39a332d9bab5ff09016a0608f" + integrity sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw== + +"@parcel/watcher-freebsd-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz#7f565ed1a5b3a5e604e6a4799121518265d62a3d" + integrity sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ== + +"@parcel/watcher-linux-arm-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz#ad7d3825e67b81999165da42593022045abc0889" + integrity sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg== + +"@parcel/watcher-linux-arm-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz#fe7d1cccb2c483215c090e938cf5cf404d2f9a8c" + integrity sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw== + +"@parcel/watcher-linux-arm64-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz#7e239dcb4646c4c79f006a7131a48238249530da" + integrity sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g== + +"@parcel/watcher-linux-arm64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz#c58b8d9c6d8d81594be00dd83aab741c1aaf7e0e" + integrity sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA== + +"@parcel/watcher-linux-x64-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz#5184fa9a770478d86e56875f4ee163a0abdc8791" + integrity sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A== + +"@parcel/watcher-linux-x64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz#2d1c55aa7246cbc7670e2612058a8a542c9cf246" + integrity sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw== + +"@parcel/watcher-win32-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz#15e09432040fee9e2213aa9c10ed589012526def" + integrity sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ== + +"@parcel/watcher-win32-x64@2.6.0": + version "2.6.0" + resolved "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz" + integrity sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A== + +"@parcel/watcher@^2.4.1": + version "2.6.0" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz" + integrity sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w== + dependencies: + detect-libc "^2.0.3" + is-glob "^4.0.3" + node-addon-api "^7.0.0" + picomatch "^4.0.4" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.6.0" + "@parcel/watcher-darwin-arm64" "2.6.0" + "@parcel/watcher-darwin-x64" "2.6.0" + "@parcel/watcher-freebsd-x64" "2.6.0" + "@parcel/watcher-linux-arm-glibc" "2.6.0" + "@parcel/watcher-linux-arm-musl" "2.6.0" + "@parcel/watcher-linux-arm64-glibc" "2.6.0" + "@parcel/watcher-linux-arm64-musl" "2.6.0" + "@parcel/watcher-linux-x64-glibc" "2.6.0" + "@parcel/watcher-linux-x64-musl" "2.6.0" + "@parcel/watcher-win32-arm64" "2.6.0" + "@parcel/watcher-win32-x64" "2.6.0" + +"@popperjs/core@~2.11.0": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@rolldown/binding-android-arm-eabi@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz#81bc32b79902fcd3875dffdf3be2ccba3ef8d794" + integrity sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ== + +"@rolldown/binding-android-arm64@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz#9b20ae8d8a5bb979ea6aa8fa4b7e11f58c53f775" + integrity sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q== + +"@rolldown/binding-darwin-arm64@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz#1031ee06b51c9134ba5a6da3a7310388875f7dd8" + integrity sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA== + +"@rolldown/binding-darwin-x64@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz#11cf31040b779dba8e61d932ae3c0ee81ef94ae0" + integrity sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q== + +"@rolldown/binding-freebsd-x64@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz#72d805b459ba4a8bbfc112bca4a1c70740516ae9" + integrity sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA== + +"@rolldown/binding-linux-arm-gnueabihf@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz#43b778dd021f50182a1efdb4149cd89cff86c942" + integrity sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w== + +"@rolldown/binding-linux-arm64-gnu@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz#e9fa7a469999c1346d827b29154068d1c833c474" + integrity sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg== + +"@rolldown/binding-linux-arm64-musl@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz#5e68dd6eb85797745f494dfe8c490c2bce4218a6" + integrity sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw== + +"@rolldown/binding-linux-ppc64-gnu@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz#2a0efc15437a55dd2caf58f0318e129d11d98ee6" + integrity sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ== + +"@rolldown/binding-linux-s390x-gnu@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz#bc2b0b6325d8aae0f1a1c06fb10d665c82258541" + integrity sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA== + +"@rolldown/binding-linux-x64-gnu@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz#e6e5022f6138fdc0d14cefacc67dc7bc5dff6430" + integrity sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w== + +"@rolldown/binding-linux-x64-musl@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz#c8b462609809237bbf6265491b1e78d5c260ed46" + integrity sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ== + +"@rolldown/binding-openharmony-arm64@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz#aa208791647b3b0bd23b372d5ee6bd5ed5988118" + integrity sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg== + +"@rolldown/binding-win32-arm64-msvc@1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz#a2a5f1a84555d00afe0ac0ff387878bcf4ada52a" + integrity sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A== + +"@rolldown/binding-win32-x64-msvc@1.2.6": + version "1.2.6" + resolved "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz" + integrity sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ== + +"@rolldown/pluginutils@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz" + integrity sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw== + +"@rollup/rollup-android-arm-eabi@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz#a19c645c375158cd5c50a344106f0fa18eb821c4" + integrity sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw== + +"@rollup/rollup-android-arm-eabi@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz#d03ba6ea54f9ec80688d153763cd325a2d2a5af6" + integrity sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ== + +"@rollup/rollup-android-arm64@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz#1af19aa9d3ad6d00df2681f59cfcb8bf7499576b" + integrity sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg== + +"@rollup/rollup-android-arm64@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz#db5e36aa8a955b4b5e0b024d671230edc5cdc191" + integrity sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ== + +"@rollup/rollup-darwin-arm64@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz#3b8463e03ba2a393453fea70e7d907379c27b649" + integrity sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA== + +"@rollup/rollup-darwin-arm64@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz#1ed1c43922e7b9b5d020ef65d8402e3c81edc86e" + integrity sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q== + +"@rollup/rollup-darwin-x64@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz#28da23d69fe117f5f0ff330a8549e51bd09f1b6a" + integrity sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g== + +"@rollup/rollup-darwin-x64@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz#0a86e782bf7a546e74f531e395e24fdb45c83527" + integrity sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg== + +"@rollup/rollup-freebsd-arm64@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz#94bacac3190f621de1355922b599f3817786044c" + integrity sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw== + +"@rollup/rollup-freebsd-arm64@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz#82fa51c540185b5063c8b3c63aac79b15f2801ad" + integrity sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw== + +"@rollup/rollup-freebsd-x64@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz#8a0094f533b9fda160b5c90ad9e0c78fca341788" + integrity sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ== + +"@rollup/rollup-freebsd-x64@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz#df1d73b567fd62e0cf21c9b57dff7f44bfd69638" + integrity sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz#3b7e901a555c7245c87f7440979bee0a1ec882bb" + integrity sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg== + +"@rollup/rollup-linux-arm-gnueabihf@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz#a585ba0418027a5b567693db3982e5e57544a4c7" + integrity sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw== + +"@rollup/rollup-linux-arm-musleabihf@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz#ee9a09b72e8ad764cfd6188b32ff1de528ff7ebe" + integrity sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw== + +"@rollup/rollup-linux-arm-musleabihf@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz#1326f0db22b690a92efd8eaa06e92268dc7d1bb6" + integrity sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw== + +"@rollup/rollup-linux-arm64-gnu@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz#ba483f4aca9be141171d086dbd01ada6ab03b58d" + integrity sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg== + +"@rollup/rollup-linux-arm64-gnu@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz#9491939f7cc43a5b26a877417faeafe69bac79ac" + integrity sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg== + +"@rollup/rollup-linux-arm64-musl@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz#17b595b790e6df68e91c5d02526fc832a985ce4f" + integrity sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA== + +"@rollup/rollup-linux-arm64-musl@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz#a53d93dac32acc671324af1153930ab5a04d8639" + integrity sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw== + +"@rollup/rollup-linux-loong64-gnu@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz#551718714075a2bfb36a2813c466e3a0e9d56abf" + integrity sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A== + +"@rollup/rollup-linux-loong64-gnu@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz#db6e06173efc870be49a2df692d0c0607417a679" + integrity sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ== + +"@rollup/rollup-linux-loong64-musl@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz#ba156ed1243447a3d710972001d5dcfe3827ff3d" + integrity sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q== + +"@rollup/rollup-linux-loong64-musl@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz#a60734a3de407bcf4bfe44d0b64222c0b9fb30bc" + integrity sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA== + +"@rollup/rollup-linux-ppc64-gnu@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz#6a957a709b86ac62ef68e597ac03dbd4336782b1" + integrity sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw== + +"@rollup/rollup-linux-ppc64-gnu@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz#28a67e15d7ba8630ef044980a39626e0627d6e73" + integrity sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA== + +"@rollup/rollup-linux-ppc64-musl@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz#ca4176b4ad53f3edee3b4bfa6f9ef48ff38f167b" + integrity sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ== + +"@rollup/rollup-linux-ppc64-musl@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz#77bb553a514942af54070756763dbb44c9c6cb2b" + integrity sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA== + +"@rollup/rollup-linux-riscv64-gnu@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz#4e6b08f72ebeafdb41f3ec433bd228ba8573473b" + integrity sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A== + +"@rollup/rollup-linux-riscv64-gnu@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz#ef9f31b917e3b310eac5b86d3b6626df7e543e3d" + integrity sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w== + +"@rollup/rollup-linux-riscv64-musl@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz#a0b8b8580c7680c8086cb3226527e5472253b895" + integrity sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ== + +"@rollup/rollup-linux-riscv64-musl@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz#68cf61a2fc02171d1fa62568b73c1d942f82e80c" + integrity sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ== + +"@rollup/rollup-linux-s390x-gnu@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz#79fe15b92ce0bae2b609cf26dd158cd3e2b73634" + integrity sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA== + +"@rollup/rollup-linux-s390x-gnu@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz#92d393ca47da0d03d1c1cffb3d7340f26c3a53d2" + integrity sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A== + +"@rollup/rollup-linux-x64-gnu@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz#6aa8302fa45fd3cbbc510ccd223c9c37bf67e53f" + integrity sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ== + +"@rollup/rollup-linux-x64-gnu@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz#f6e5c5c51f96ae298617fa26da54675acd60e3bc" + integrity sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w== + +"@rollup/rollup-linux-x64-musl@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz#0c1a5e9799f80c47a66f2c3a5f1a280f38356047" + integrity sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw== + +"@rollup/rollup-linux-x64-musl@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz#227a949c481909c781d8a39c280f75553cdd16bc" + integrity sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow== + +"@rollup/rollup-openbsd-x64@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz#5f07c863e74fd428794f1dc5749f321b661d1f17" + integrity sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg== + +"@rollup/rollup-openbsd-x64@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz#f57241ebdb73d3bc236e7b1252988408b2139c13" + integrity sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA== + +"@rollup/rollup-openharmony-arm64@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz#8e0d71324be0f423428b12b25a2eb8ea8e0a7833" + integrity sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q== + +"@rollup/rollup-openharmony-arm64@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz#3a9ffe5af71e8316dd2716b57dd64287a8c1fa0b" + integrity sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw== + +"@rollup/rollup-win32-arm64-msvc@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz#a553fdf90a785ace6d7501eed6241c468b088999" + integrity sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ== + +"@rollup/rollup-win32-arm64-msvc@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz#7d4a40396ae79ebc1e3636c1d566c7d1838b800c" + integrity sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg== + +"@rollup/rollup-win32-ia32-msvc@4.60.2": + version "4.60.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz#0fb04f0a88027fbfd323e25a446debce4773868c" + integrity sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg== + +"@rollup/rollup-win32-ia32-msvc@4.63.1": + version "4.63.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz#f234ab80141da45ebe85727f714eb20de2e72c2a" + integrity sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg== + +"@rollup/rollup-win32-x64-gnu@4.60.2": + version "4.60.2" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz" + integrity sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA== + +"@rollup/rollup-win32-x64-gnu@4.63.1": + version "4.63.1" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz" + integrity sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg== + +"@rollup/rollup-win32-x64-msvc@4.60.2": + version "4.60.2" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz" + integrity sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA== + +"@rollup/rollup-win32-x64-msvc@4.63.1": + version "4.63.1" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz" + integrity sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w== + +"@schematics/angular@22.0.9": + version "22.0.9" + resolved "https://registry.npmjs.org/@schematics/angular/-/angular-22.0.9.tgz" + integrity sha512-moQI3UnqUt6GZ81ykxJRUbf+IpM6SDFRyMMj6A2VNSiUGVpSAETNFIuTk/6YDzNG8yhMN9zOICeBwvvPH0ylbA== + dependencies: + "@angular-devkit/core" "22.0.9" + "@angular-devkit/schematics" "22.0.9" + jsonc-parser "3.3.1" + typescript "6.0.3" + +"@sigstore/bundle@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz" + integrity sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A== + dependencies: + "@sigstore/protobuf-specs" "^0.5.0" + +"@sigstore/core@^3.2.0", "@sigstore/core@^3.2.1": + version "3.2.1" + resolved "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz" + integrity sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g== + +"@sigstore/protobuf-specs@^0.5.0": + version "0.5.2" + resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.2.tgz" + integrity sha512-SQqvFMt4V78fdjcDdYX6HbiVSOR4QK3ZgwCa2KOsopAgPIHy1rU5UDUmzLl02r5oyyaYcYHR1hpwDRk/yUe+Mw== + +"@sigstore/sign@^4.1.1": + version "4.1.1" + resolved "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.1.tgz" + integrity sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ== + dependencies: + "@gar/promise-retry" "^1.0.2" + "@sigstore/bundle" "^4.0.0" + "@sigstore/core" "^3.2.0" + "@sigstore/protobuf-specs" "^0.5.0" + make-fetch-happen "^15.0.4" + proc-log "^6.1.0" + +"@sigstore/tuf@^4.0.2": + version "4.0.2" + resolved "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz" + integrity sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ== + dependencies: + "@sigstore/protobuf-specs" "^0.5.0" + tuf-js "^4.1.0" + +"@sigstore/verify@^3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz" + integrity sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA== + dependencies: + "@sigstore/bundle" "^4.0.0" + "@sigstore/core" "^3.2.1" + "@sigstore/protobuf-specs" "^0.5.0" + +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@standard-schema/spec@^1.0.0", "@standard-schema/spec@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== + +"@swimlane/ngx-datatable@~22.0.0": + version "22.0.0" + resolved "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-22.0.0.tgz" + integrity sha512-NteAxuMHNnXMeRun0qGZNz5ocoRmoypmhJtfvQRpO6umZPDVlf0+GzlEsTSOfqJNrKiYjtaMJ8EP+1lRYxrigw== + dependencies: + tslib "^2.0.0" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tailwindcss/node@4.3.3": + version "4.3.3" + resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz" + integrity sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg== + dependencies: + "@jridgewell/remapping" "^2.3.5" + enhanced-resolve "^5.24.1" + jiti "^2.7.0" + lightningcss "1.32.0" + magic-string "^0.30.21" + source-map-js "^1.2.1" + tailwindcss "4.3.3" + +"@tailwindcss/oxide-android-arm64@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz#848f93034155daf7892185028dfb18143bfc7d07" + integrity sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw== + +"@tailwindcss/oxide-darwin-arm64@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz#5c779e32c1c361beb75136fd8e2c627fcb9a5b28" + integrity sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw== + +"@tailwindcss/oxide-darwin-x64@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz#ba292ff52fa3264139f7fe7874719ce0a4666875" + integrity sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw== + +"@tailwindcss/oxide-freebsd-x64@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz#07e589487b9a636235a4ade48cefc1f9eeeec57f" + integrity sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw== + +"@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz#0c8abc228d9e19e0065ddb707eba52e21855b3ff" + integrity sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ== + +"@tailwindcss/oxide-linux-arm64-gnu@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz#5067dc7afd15d2b97adc77a91177dc4bec8d1b8b" + integrity sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w== + +"@tailwindcss/oxide-linux-arm64-musl@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz#29ae5f279be2ce64db368711985b6ad8e4562e57" + integrity sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA== + +"@tailwindcss/oxide-linux-x64-gnu@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz#7d693b40f69875744b499481359b227fd3ac3a3c" + integrity sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w== + +"@tailwindcss/oxide-linux-x64-musl@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz#6a55d664f47c5ff9ad3f46bf05fe07d410b8cfd8" + integrity sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img== + +"@tailwindcss/oxide-wasm32-wasi@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz#408a9bc620e68f1aaf0dfea33da7bd3b65f9e2ef" + integrity sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ== + dependencies: + "@emnapi/core" "^1.11.1" + "@emnapi/runtime" "^1.11.1" + "@emnapi/wasi-threads" "^1.2.2" + "@napi-rs/wasm-runtime" "^1.1.4" + "@tybys/wasm-util" "^0.10.2" + tslib "^2.8.1" + +"@tailwindcss/oxide-win32-arm64-msvc@4.3.3": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz#3d582b00180fa4680e0b6c90be69fa5f4a209092" + integrity sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ== + +"@tailwindcss/oxide-win32-x64-msvc@4.3.3": + version "4.3.3" + resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz" + integrity sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw== + +"@tailwindcss/oxide@4.3.3": + version "4.3.3" + resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz" + integrity sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA== + optionalDependencies: + "@tailwindcss/oxide-android-arm64" "4.3.3" + "@tailwindcss/oxide-darwin-arm64" "4.3.3" + "@tailwindcss/oxide-darwin-x64" "4.3.3" + "@tailwindcss/oxide-freebsd-x64" "4.3.3" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.3.3" + "@tailwindcss/oxide-linux-arm64-gnu" "4.3.3" + "@tailwindcss/oxide-linux-arm64-musl" "4.3.3" + "@tailwindcss/oxide-linux-x64-gnu" "4.3.3" + "@tailwindcss/oxide-linux-x64-musl" "4.3.3" + "@tailwindcss/oxide-wasm32-wasi" "4.3.3" + "@tailwindcss/oxide-win32-arm64-msvc" "4.3.3" + "@tailwindcss/oxide-win32-x64-msvc" "4.3.3" + +"@tailwindcss/postcss@^4.3.3": + version "4.3.3" + resolved "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz" + integrity sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg== + dependencies: + "@alloc/quick-lru" "^5.2.0" + "@tailwindcss/node" "4.3.3" + "@tailwindcss/oxide" "4.3.3" + postcss "^8.5.16" + tailwindcss "4.3.3" + +"@tufjs/canonical-json@2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz" + integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== + +"@tufjs/models@4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz" + integrity sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww== + dependencies: + "@tufjs/canonical-json" "2.0.0" + minimatch "^10.1.1" + +"@tybys/wasm-util@^0.10.2", "@tybys/wasm-util@^0.10.3": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz#015cba9e9dd47ce14d03d2a8c5d547bfb169665d" + integrity sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg== + dependencies: + tslib "^2.4.0" + +"@types/babel__core@7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@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== + dependencies: + "@babel/types" "^7.0.0" + +"@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== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.28.0" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz" + integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== + dependencies: + "@babel/types" "^7.28.2" + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/chai@^5.2.2": + version "5.2.3" + resolved "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== + dependencies: + "@types/deep-eql" "*" + assertion-error "^2.0.1" + +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/esrecurse@^4.3.1": + version "4.3.1" + resolved "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz" + integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== + +"@types/estree@1.0.8": + version "1.0.8" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/estree@1.0.9", "@types/estree@^1.0.0", "@types/estree@^1.0.8": + version "1.0.9" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== + +"@types/http-cache-semantics@*": + version "4.2.0" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz" + integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "26.4.0" + resolved "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz" + integrity sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ== + dependencies: + undici-types "~8.3.0" + +"@types/node@~20.11.0": + version "20.11.30" + resolved "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + dependencies: + undici-types "~5.26.4" + +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz" + integrity sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.16.0" + "@typescript-eslint/type-utils" "7.16.0" + "@typescript-eslint/utils" "7.16.0" + "@typescript-eslint/visitor-keys" "7.16.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.0.tgz" + integrity sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw== + dependencies: + "@typescript-eslint/scope-manager" "7.16.0" + "@typescript-eslint/types" "7.16.0" + "@typescript-eslint/typescript-estree" "7.16.0" + "@typescript-eslint/visitor-keys" "7.16.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz" + integrity sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw== + dependencies: + "@typescript-eslint/types" "7.16.0" + "@typescript-eslint/visitor-keys" "7.16.0" + +"@typescript-eslint/type-utils@7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz" + integrity sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg== + dependencies: + "@typescript-eslint/typescript-estree" "7.16.0" + "@typescript-eslint/utils" "7.16.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.0.tgz" + integrity sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw== + +"@typescript-eslint/typescript-estree@7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz" + integrity sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw== + dependencies: + "@typescript-eslint/types" "7.16.0" + "@typescript-eslint/visitor-keys" "7.16.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.0.tgz" + integrity sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.16.0" + "@typescript-eslint/types" "7.16.0" + "@typescript-eslint/typescript-estree" "7.16.0" + +"@typescript-eslint/visitor-keys@7.16.0": + version "7.16.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz" + integrity sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg== + dependencies: + "@typescript-eslint/types" "7.16.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz" + integrity sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ== + +"@vitejs/plugin-basic-ssl@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.3.0.tgz" + integrity sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ== + +"@vitest/expect@4.1.11": + version "4.1.11" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz" + integrity sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw== + dependencies: + "@standard-schema/spec" "^1.1.0" + "@types/chai" "^5.2.2" + "@vitest/spy" "4.1.11" + "@vitest/utils" "4.1.11" + chai "^6.2.2" + tinyrainbow "^3.1.0" + +"@vitest/mocker@4.1.11": + version "4.1.11" + resolved "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz" + integrity sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ== + dependencies: + "@vitest/spy" "4.1.11" + estree-walker "^3.0.3" + magic-string "^0.30.21" + +"@vitest/pretty-format@4.1.11": + version "4.1.11" + resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz" + integrity sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw== + dependencies: + tinyrainbow "^3.1.0" + +"@vitest/runner@4.1.11": + version "4.1.11" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz" + integrity sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw== + dependencies: + "@vitest/utils" "4.1.11" + pathe "^2.0.3" + +"@vitest/snapshot@4.1.11": + version "4.1.11" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz" + integrity sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog== + dependencies: + "@vitest/pretty-format" "4.1.11" + "@vitest/utils" "4.1.11" + magic-string "^0.30.21" + pathe "^2.0.3" + +"@vitest/spy@4.1.11": + version "4.1.11" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz" + integrity sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA== + +"@vitest/utils@4.1.11": + version "4.1.11" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz" + integrity sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ== + dependencies: + "@vitest/pretty-format" "4.1.11" + convert-source-map "^2.0.0" + tinyrainbow "^3.1.0" + +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abbrev@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz" + integrity sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.18.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz" + integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== + +agent-base@9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz" + integrity sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA== + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + +ajv-formats@3.0.1, ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + +ajv@8.18.0: + version "8.18.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz" + integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ajv@8.20.0, ajv@^8.0.0, ajv@^8.17.1: + version "8.20.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz" + integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ajv@^6.12.4: + version "6.15.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== + 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" + +algoliasearch@5.52.0: + version "5.52.0" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.0.tgz" + integrity sha512-0ZzY9mjqV7gop/AH8pIBiAS8giXP7WcSiUfoFYIzYAK9QC5c37E4SIVtJVBMwlURc0/uNt2o4RcNRvdHa4CJ5w== + dependencies: + "@algolia/abtesting" "1.18.0" + "@algolia/client-abtesting" "5.52.0" + "@algolia/client-analytics" "5.52.0" + "@algolia/client-common" "5.52.0" + "@algolia/client-insights" "5.52.0" + "@algolia/client-personalization" "5.52.0" + "@algolia/client-query-suggestions" "5.52.0" + "@algolia/client-search" "5.52.0" + "@algolia/ingestion" "1.52.0" + "@algolia/monitoring" "1.52.0" + "@algolia/recommend" "5.52.0" + "@algolia/requester-browser-xhr" "5.52.0" + "@algolia/requester-fetch" "5.52.0" + "@algolia/requester-node-http" "5.52.0" + +angular-oauth2-oidc@^20.0.0: + version "20.0.3" + resolved "https://registry.npmjs.org/angular-oauth2-oidc/-/angular-oauth2-oidc-20.0.3.tgz" + integrity sha512-SL0iV/WlrX35J4CXvc7VdoNhlol+YIo8c0i1NrfAQ70++dxLZjg/li6vNx7lu2sC3GElZLzmlbBZOvlvLB2Q5w== + dependencies: + tslib "^2.5.2" + +ansi-escapes@^7.0.0: + version "7.3.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz" + integrity sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg== + dependencies: + environment "^1.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.2.2: + version "6.3.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz" + integrity sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.2.1, ansi-styles@^6.2.3: + version "6.2.3" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +axobject-query@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + +baseline-browser-mapping@^2.11.12: + version "2.11.20" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz" + integrity sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw== + +beasties@0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/beasties/-/beasties-0.4.2.tgz" + integrity sha512-NvcGjG/7AVUAfRbvrJmHunDQS9uHnE6Q/7AkaPr8oKE8HjOlpjRG5075z/th2Tmlezk3VlaaS8+X9I1RwHJMQw== + dependencies: + css-select "^6.0.0" + css-what "^7.0.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + htmlparser2 "^10.0.0" + picocolors "^1.1.1" + postcss "^8.4.49" + postcss-media-query-parser "^0.2.3" + postcss-safe-parser "^7.0.1" + +bidi-js@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz" + integrity sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw== + dependencies: + require-from-string "^2.0.2" + +body-parser@^2.2.1: + version "2.3.0" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz" + integrity sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw== + dependencies: + bytes "^3.1.2" + content-type "^2.0.0" + debug "^4.4.3" + http-errors "^2.0.1" + iconv-lite "^0.7.2" + on-finished "^2.4.1" + qs "^6.15.2" + raw-body "^3.0.2" + type-is "^2.1.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +bootstrap@^5.0.0: + version "5.3.8" + resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz" + integrity sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg== + +brace-expansion@^1.1.7: + version "1.1.18" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz" + integrity sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.2: + version "2.1.4" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz" + integrity sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg== + dependencies: + balanced-match "^1.0.0" + +brace-expansion@^5.0.8: + version "5.0.9" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz" + integrity sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg== + dependencies: + balanced-match "^4.0.2" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0, browserslist@^4.26.0: + version "4.28.8" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz" + integrity sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA== + dependencies: + baseline-browser-mapping "^2.11.12" + caniuse-lite "^1.0.30001809" + electron-to-chromium "^1.5.402" + node-releases "^2.0.53" + update-browserslist-db "^1.3.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@^3.1.2, bytes@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^20.0.0, cacache@^20.0.1: + version "20.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz" + integrity sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA== + dependencies: + "@npmcli/fs" "^5.0.0" + fs-minipass "^3.0.0" + glob "^13.0.0" + lru-cache "^11.1.0" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^7.0.2" + ssri "^13.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + 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== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001809: + version "1.0.30001810" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz" + integrity sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg== + +chai@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz" + integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.6.2: + version "5.6.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + +chardet@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz" + integrity sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA== + +chart.js@^3.5.1: + version "3.9.1" + resolved "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz" + integrity sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w== + +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +chokidar@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz" + integrity sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== + dependencies: + readdirp "^5.0.0" + +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== + +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + +cli-spinners@^3.2.0: + version "3.4.0" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz" + integrity sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw== + +cli-truncate@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz" + integrity sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw== + dependencies: + slice-ansi "^8.0.0" + string-width "^8.2.0" + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +cliui@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz" + integrity sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w== + dependencies: + string-width "^7.2.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz" + integrity sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g== + +content-type@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +content-type@^2.0.0, content-type@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz" + integrity sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag== + +convert-source-map@^1.5.1: + 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== + +convert-source-map@^2.0.0: + 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== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie@^0.7.1: + version "0.7.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +cors@^2.8.5: + version "2.8.6" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz" + integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.2, cross-spawn@^7.0.5: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz" + integrity sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw== + dependencies: + boolbase "^1.0.0" + css-what "^7.0.0" + domhandler "^5.0.3" + domutils "^3.2.2" + nth-check "^2.1.1" + +css-tree@^3.1.0: + version "3.2.1" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz" + integrity sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA== + dependencies: + mdn-data "2.27.1" + source-map-js "^1.2.1" + +css-what@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz" + integrity sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ== + +cssstyle@^5.3.4: + version "5.3.7" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz" + integrity sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ== + dependencies: + "@asamuzakjp/css-color" "^4.1.1" + "@csstools/css-syntax-patches-for-csstree" "^1.0.21" + css-tree "^3.1.0" + lru-cache "^11.2.4" + +data-urls@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz" + integrity sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ== + dependencies: + whatwg-mimetype "^5.0.0" + whatwg-url "^15.1.0" + +date-fns@^2.16.1: + version "2.30.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +debug@4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decimal.js@^10.6.0: + version "10.6.0" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz" + integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-is@^0.1.3: + 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== + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +detect-libc@^2.0.1, detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.5.402: + version "1.5.416" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz" + integrity sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA== + +emoji-regex@^10.3.0: + version "10.6.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== + +encodeurl@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +end-of-stream@^1.1.0: + version "1.4.5" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.24.1: + version "5.24.5" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz" + integrity sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.3.3" + +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz" + integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA== + +entities@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz" + integrity sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^2.0.0: + version "2.3.2" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz" + integrity sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== + dependencies: + es-errors "^1.3.0" + +esbuild@0.28.1: + version "0.28.1" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz" + integrity sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.28.1" + "@esbuild/android-arm" "0.28.1" + "@esbuild/android-arm64" "0.28.1" + "@esbuild/android-x64" "0.28.1" + "@esbuild/darwin-arm64" "0.28.1" + "@esbuild/darwin-x64" "0.28.1" + "@esbuild/freebsd-arm64" "0.28.1" + "@esbuild/freebsd-x64" "0.28.1" + "@esbuild/linux-arm" "0.28.1" + "@esbuild/linux-arm64" "0.28.1" + "@esbuild/linux-ia32" "0.28.1" + "@esbuild/linux-loong64" "0.28.1" + "@esbuild/linux-mips64el" "0.28.1" + "@esbuild/linux-ppc64" "0.28.1" + "@esbuild/linux-riscv64" "0.28.1" + "@esbuild/linux-s390x" "0.28.1" + "@esbuild/linux-x64" "0.28.1" + "@esbuild/netbsd-arm64" "0.28.1" + "@esbuild/netbsd-x64" "0.28.1" + "@esbuild/openbsd-arm64" "0.28.1" + "@esbuild/openbsd-x64" "0.28.1" + "@esbuild/openharmony-arm64" "0.28.1" + "@esbuild/sunos-x64" "0.28.1" + "@esbuild/win32-arm64" "0.28.1" + "@esbuild/win32-ia32" "0.28.1" + "@esbuild/win32-x64" "0.28.1" + +"esbuild@^0.27.0 || ^0.28.0": + version "0.28.2" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz" + integrity sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.28.2" + "@esbuild/android-arm" "0.28.2" + "@esbuild/android-arm64" "0.28.2" + "@esbuild/android-x64" "0.28.2" + "@esbuild/darwin-arm64" "0.28.2" + "@esbuild/darwin-x64" "0.28.2" + "@esbuild/freebsd-arm64" "0.28.2" + "@esbuild/freebsd-x64" "0.28.2" + "@esbuild/linux-arm" "0.28.2" + "@esbuild/linux-arm64" "0.28.2" + "@esbuild/linux-ia32" "0.28.2" + "@esbuild/linux-loong64" "0.28.2" + "@esbuild/linux-mips64el" "0.28.2" + "@esbuild/linux-ppc64" "0.28.2" + "@esbuild/linux-riscv64" "0.28.2" + "@esbuild/linux-s390x" "0.28.2" + "@esbuild/linux-x64" "0.28.2" + "@esbuild/netbsd-arm64" "0.28.2" + "@esbuild/netbsd-x64" "0.28.2" + "@esbuild/openbsd-arm64" "0.28.2" + "@esbuild/openbsd-x64" "0.28.2" + "@esbuild/openharmony-arm64" "0.28.2" + "@esbuild/sunos-x64" "0.28.2" + "@esbuild/win32-arm64" "0.28.2" + "@esbuild/win32-ia32" "0.28.2" + "@esbuild/win32-x64" "0.28.2" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@^9.0.0: + version "9.1.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz" + integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== + dependencies: + "@types/esrecurse" "^4.3.1" + "@types/estree" "^1.0.8" + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + 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== + +eslint@^8.0.0: + version "8.57.1" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + 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" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.7.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz" + integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== + +eventsource-parser@^3.0.0, eventsource-parser@^3.0.1: + version "3.1.1" + resolved "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz" + integrity sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ== + +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== + +eventsource@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz" + integrity sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA== + dependencies: + eventsource-parser "^3.0.1" + +expect-type@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz" + integrity sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA== + +exponential-backoff@^3.1.1: + version "3.1.3" + resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz" + integrity sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA== + +express-rate-limit@^8.2.1: + version "8.6.2" + resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz" + integrity sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A== + dependencies: + debug "^4.4.3" + ip-address "^10.2.0" + +express@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/express/-/express-5.2.1.tgz" + integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== + dependencies: + accepts "^2.0.0" + body-parser "^2.2.1" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + depd "^2.0.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-glob@^3.2.9: + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + 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" + +fast-json-stable-stringify@^2.0.0: + 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== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-string-truncated-width@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz" + integrity sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g== + +fast-string-width@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz" + integrity sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg== + dependencies: + fast-string-truncated-width "^3.0.2" + +fast-uri@^3.0.1: + version "3.1.6" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz" + integrity sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q== + +fast-wrap-ansi@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz" + integrity sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q== + dependencies: + fast-string-width "^3.0.2" + +fastq@^1.6.0: + version "1.20.2" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.20.2.tgz" + integrity sha512-UpGiiODyCGprM8EPP6JodP6jC9Rws6TCuiDOD+nn0CJhR8guI3g/ozo4ugL0vJ+Yz1UtJuuRPqvQuybVOF1VQA== + dependencies: + reusify "^1.0.4" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +fetch-cookie@^2.0.3: + version "2.2.0" + resolved "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz" + integrity sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ== + dependencies: + set-cookie-parser "^2.4.8" + tough-cookie "^4.0.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz" + integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.4.4" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz" + integrity sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + 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== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1, get-east-asian-width@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz" + integrity sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA== + +get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + 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" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + 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== + +glob@^13.0.0: + version "13.0.6" + resolved "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== + dependencies: + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + 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" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +got@^11.5.2: + version "11.8.6" + resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + 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== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +hasown@^2.0.2: + version "2.0.4" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== + dependencies: + function-bind "^1.1.2" + +hono@^4.11.4: + version "4.13.5" + resolved "https://registry.npmjs.org/hono/-/hono-4.13.5.tgz" + integrity sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw== + +hosted-git-info@^9.0.0: + version "9.0.3" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz" + integrity sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg== + dependencies: + lru-cache "^11.1.0" + +html-encoding-sniffer@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz" + integrity sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg== + dependencies: + "@exodus/bytes" "^1.6.0" + +htmlparser2@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz" + integrity sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.2.2" + entities "^7.0.1" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== + +http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-proxy-agent@9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.0.0.tgz" + integrity sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g== + dependencies: + agent-base "9.0.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +iconv-lite@^0.7.2, iconv-lite@~0.7.0: + version "0.7.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz" + integrity sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore-walk@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz" + integrity sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A== + dependencies: + minimatch "^10.0.3" + +ignore@7.0.5: + version "7.0.5" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immutable@^5.1.5: + version "5.1.9" + resolved "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz" + integrity sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@6.0.0, ini@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz" + integrity sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ== + +ip-address@^10.1.1, ip-address@^10.2.0: + version "10.5.0" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-10.5.0.tgz" + integrity sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g== + +ipaddr.js@1.9.1: + 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== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^5.0.0, is-fullwidth-code-point@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz" + integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== + dependencies: + get-east-asian-width "^1.3.1" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + 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== + +is-potential-custom-element-name@^1.0.1: + 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== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-unicode-supported@^2.0.0, is-unicode-supported@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz" + integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isexe@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz" + integrity sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw== + +jiti@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz" + integrity sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ== + +jose@^6.1.3: + version "6.2.10" + resolved "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz" + integrity sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.3.2" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz" + integrity sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA== + dependencies: + argparse "^2.0.1" + +jsdom@^27.1.0: + version "27.4.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-27.4.0.tgz" + integrity sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ== + dependencies: + "@acemir/cssom" "^0.9.28" + "@asamuzakjp/dom-selector" "^6.7.6" + "@exodus/bytes" "^1.6.0" + cssstyle "^5.3.4" + data-urls "^6.0.0" + decimal.js "^10.6.0" + html-encoding-sniffer "^6.0.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.6" + is-potential-custom-element-name "^1.0.1" + parse5 "^8.0.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^6.0.0" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^8.0.0" + whatwg-mimetype "^4.0.0" + whatwg-url "^15.1.0" + ws "^8.18.3" + xml-name-validator "^5.0.0" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz" + integrity sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ== + +json-schema-traverse@^0.4.1: + 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== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema-typed@^8.0.2: + version "8.0.2" + resolved "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz" + integrity sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA== + +json-stable-stringify-without-jsonify@^1.0.1: + 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== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== + +jsonc-parser@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz" + integrity sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg== + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +just-clone@^6.0.0: + version "6.2.0" + resolved "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz" + integrity sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA== + +just-compare@^2.0.0, just-compare@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/just-compare/-/just-compare-2.3.0.tgz" + integrity sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg== + +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lightningcss-android-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" + integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== + +lightningcss-android-arm64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz#9a6841f88ae50fc83502903892b41af41bc2b907" + integrity sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg== + +lightningcss-darwin-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" + integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== + +lightningcss-darwin-arm64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz#c0f2c31c0bfd19fa4dd3f18e957a1f1a152097d6" + integrity sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg== + +lightningcss-darwin-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" + integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== + +lightningcss-darwin-x64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz#cb0705965acb538c6683949ce6925fb3cdf7c361" + integrity sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ== + +lightningcss-freebsd-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" + integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== + +lightningcss-freebsd-x64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz#763538828b26bab2680dadafcc84ee78b0eb502b" + integrity sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg== + +lightningcss-linux-arm-gnueabihf@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" + integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== + +lightningcss-linux-arm-gnueabihf@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz#6862e3176a331aedbdec1ed352b4d7d0dd0784de" + integrity sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ== + +lightningcss-linux-arm64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" + integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== + +lightningcss-linux-arm64-gnu@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz#c6a3a2ed15141daf6bdc2628930f8e39bdf473aa" + integrity sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg== + +lightningcss-linux-arm64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" + integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== + +lightningcss-linux-arm64-musl@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz#7fa1334971fc82845f9827df6ef8a0b20914bac6" + integrity sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ== + +lightningcss-linux-x64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6" + integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== + +lightningcss-linux-x64-gnu@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz#8b927862ea8c2bbc6831a46509244b50d9936e55" + integrity sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg== + +lightningcss-linux-x64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b" + integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== + +lightningcss-linux-x64-musl@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz#0c525bb077dfd94404c059cfe42dad797e96aeaf" + integrity sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw== + +lightningcss-win32-arm64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" + integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== + +lightningcss-win32-arm64-msvc@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz#850ee1103dac989cfab50e3ac22d1a69e394e63d" + integrity sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA== + +lightningcss-win32-x64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz" + integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== + +lightningcss-win32-x64-msvc@1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz" + integrity sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA== + +lightningcss@1.32.0: + version "1.32.0" + resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz" + integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-android-arm64 "1.32.0" + lightningcss-darwin-arm64 "1.32.0" + lightningcss-darwin-x64 "1.32.0" + lightningcss-freebsd-x64 "1.32.0" + lightningcss-linux-arm-gnueabihf "1.32.0" + lightningcss-linux-arm64-gnu "1.32.0" + lightningcss-linux-arm64-musl "1.32.0" + lightningcss-linux-x64-gnu "1.32.0" + lightningcss-linux-x64-musl "1.32.0" + lightningcss-win32-arm64-msvc "1.32.0" + lightningcss-win32-x64-msvc "1.32.0" + +lightningcss@^1.33.0: + version "1.33.0" + resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz" + integrity sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-android-arm64 "1.33.0" + lightningcss-darwin-arm64 "1.33.0" + lightningcss-darwin-x64 "1.33.0" + lightningcss-freebsd-x64 "1.33.0" + lightningcss-linux-arm-gnueabihf "1.33.0" + lightningcss-linux-arm64-gnu "1.33.0" + lightningcss-linux-arm64-musl "1.33.0" + lightningcss-linux-x64-gnu "1.33.0" + lightningcss-linux-x64-musl "1.33.0" + lightningcss-win32-arm64-msvc "1.33.0" + lightningcss-win32-x64-msvc "1.33.0" + +listr2@10.2.1: + version "10.2.1" + resolved "https://registry.npmjs.org/listr2/-/listr2-10.2.1.tgz" + integrity sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q== + dependencies: + cli-truncate "^5.2.0" + eventemitter3 "^5.0.4" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^10.0.0" + +lmdb@3.5.4: + version "3.5.4" + resolved "https://registry.npmjs.org/lmdb/-/lmdb-3.5.4.tgz" + integrity sha512-9FKQA6G1MMtqNxfxvSBNXD/axeG2QRjYbNh0/ykRL5xYcRbCm2vXq7B9bhc7nSuKdHzr8/BHIwfPuYYH1UsXXw== + dependencies: + "@harperfast/extended-iterable" "^1.0.3" + msgpackr "^1.11.2" + node-addon-api "^6.1.0" + node-gyp-build-optional-packages "5.2.2" + ordered-binary "^1.5.3" + weak-lru-cache "^1.2.2" + optionalDependencies: + "@lmdb/lmdb-darwin-arm64" "3.5.4" + "@lmdb/lmdb-darwin-x64" "3.5.4" + "@lmdb/lmdb-linux-arm" "3.5.4" + "@lmdb/lmdb-linux-arm64" "3.5.4" + "@lmdb/lmdb-linux-x64" "3.5.4" + "@lmdb/lmdb-win32-arm64" "3.5.4" + "@lmdb/lmdb-win32-x64" "3.5.4" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +log-symbols@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz" + integrity sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg== + dependencies: + is-unicode-supported "^2.0.0" + yoctocolors "^2.1.1" + +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^11.0.0, lru-cache@^11.1.0, lru-cache@^11.2.1, lru-cache@^11.2.4, lru-cache@^11.2.5, lru-cache@^11.2.6: + version "11.5.2" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz" + integrity sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +luxon@^3.0.0: + version "3.7.2" + resolved "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz" + integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== + +magic-string@0.30.21, magic-string@^0.30.21: + version "0.30.21" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + +make-fetch-happen@^15.0.0, make-fetch-happen@^15.0.1, make-fetch-happen@^15.0.4: + version "15.0.6" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz" + integrity sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw== + dependencies: + "@gar/promise-retry" "^1.0.0" + "@npmcli/agent" "^4.0.0" + "@npmcli/redact" "^4.0.0" + cacache "^20.0.1" + http-cache-semantics "^4.1.1" + minipass "^7.0.2" + minipass-fetch "^5.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^1.0.0" + proc-log "^6.0.0" + ssri "^13.0.0" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mdn-data@2.27.1: + version "2.27.1" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz" + integrity sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ== + +media-typer@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz" + integrity sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ== + +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^3.0.0, mime-types@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@^10.0.3, minimatch@^10.1.1, minimatch@^10.2.2: + version "10.2.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz" + integrity sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A== + dependencies: + brace-expansion "^5.0.8" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.9" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== + dependencies: + brace-expansion "^2.0.2" + +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== + dependencies: + minipass "^7.0.3" + +minipass-fetch@^5.0.0: + version "5.0.2" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz" + integrity sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ== + dependencies: + minipass "^7.0.3" + minipass-sized "^2.0.0" + minizlib "^3.0.1" + optionalDependencies: + iconv-lite "^0.7.2" + +minipass-flush@^1.0.5: + version "1.0.7" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz" + integrity sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz" + integrity sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA== + dependencies: + minipass "^7.1.2" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.2, minipass@^7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + +minizlib@^3.0.1, minizlib@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz" + integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw== + dependencies: + minipass "^7.1.2" + +mrmime@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz" + integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +msgpackr-extract@^3.0.2: + version "3.0.4" + resolved "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz" + integrity sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw== + dependencies: + node-gyp-build-optional-packages "5.2.2" + optionalDependencies: + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.4" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.4" + "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.4" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.4" + "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.4" + "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.4" + +msgpackr@^1.11.2: + version "1.12.1" + resolved "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz" + integrity sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ== + optionalDependencies: + msgpackr-extract "^3.0.2" + +mute-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz" + integrity sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw== + +nanoid@^3.3.17: + version "3.3.18" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz" + integrity sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz" + integrity sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg== + dependencies: + content-type "^2.1.0" + +ng-zorro-antd@~21.3.1: + version "21.3.3" + resolved "https://registry.npmjs.org/ng-zorro-antd/-/ng-zorro-antd-21.3.3.tgz" + integrity sha512-70zzTqc2MQI9W+uX+OGdXfT1azbum3X/cdJ1orxLY0grz+deKtH2zVW7bQytHiCWdRe9pP4KtdE5xLY6eYKssw== + dependencies: + "@angular/cdk" "^21.0.0" + "@ant-design/icons-angular" "^21.0.0" + "@ctrl/tinycolor" "^3.6.0" + date-fns "^2.16.1" + tslib "^2.3.0" + +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build-optional-packages@5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz" + integrity sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw== + dependencies: + detect-libc "^2.0.1" + +node-gyp@^12.1.0: + version "12.4.0" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz" + integrity sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + graceful-fs "^4.2.6" + nopt "^9.0.0" + proc-log "^6.0.0" + semver "^7.3.5" + tar "^7.5.4" + tinyglobby "^0.2.12" + undici "^6.25.0" + which "^6.0.0" + +node-releases@^2.0.53: + version "2.0.54" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz" + integrity sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ== + +nopt@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz" + integrity sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw== + dependencies: + abbrev "^4.0.0" + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz" + integrity sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw== + dependencies: + npm-normalize-package-bin "^5.0.0" + +npm-install-checks@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz" + integrity sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz" + integrity sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag== + +npm-package-arg@13.0.2, npm-package-arg@^13.0.0: + version "13.0.2" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz" + integrity sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA== + dependencies: + hosted-git-info "^9.0.0" + proc-log "^6.0.0" + semver "^7.3.5" + validate-npm-package-name "^7.0.0" + +npm-packlist@^10.0.1: + version "10.0.4" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz" + integrity sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng== + dependencies: + ignore-walk "^8.0.0" + proc-log "^6.0.0" + +npm-pick-manifest@^11.0.1: + version "11.0.3" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz" + integrity sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ== + dependencies: + npm-install-checks "^8.0.0" + npm-normalize-package-bin "^5.0.0" + npm-package-arg "^13.0.0" + semver "^7.3.5" + +npm-registry-fetch@^19.0.0: + version "19.1.1" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz" + integrity sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw== + dependencies: + "@npmcli/redact" "^4.0.0" + jsonparse "^1.3.1" + make-fetch-happen "^15.0.0" + minipass "^7.0.2" + minipass-fetch "^5.0.0" + minizlib "^3.0.1" + npm-package-arg "^13.0.0" + proc-log "^6.0.0" + +nth-check@^2.1.1: + 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== + dependencies: + boolbase "^1.0.0" + +object-assign@^4: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +obug@^2.1.1: + version "2.1.4" + resolved "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz" + integrity sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA== + +on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + 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" + +ora@9.3.0: + version "9.3.0" + resolved "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz" + integrity sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw== + dependencies: + chalk "^5.6.2" + cli-cursor "^5.0.0" + cli-spinners "^3.2.0" + is-interactive "^2.0.0" + is-unicode-supported "^2.1.0" + log-symbols "^7.0.1" + stdin-discarder "^0.3.1" + string-width "^8.1.0" + +ora@9.4.0: + version "9.4.0" + resolved "https://registry.npmjs.org/ora/-/ora-9.4.0.tgz" + integrity sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ== + dependencies: + chalk "^5.6.2" + cli-cursor "^5.0.0" + cli-spinners "^3.2.0" + is-interactive "^2.0.0" + is-unicode-supported "^2.1.0" + log-symbols "^7.0.1" + stdin-discarder "^0.3.2" + string-width "^8.1.0" + +ordered-binary@^1.5.3: + version "1.6.1" + resolved "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz" + integrity sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + 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== + dependencies: + p-limit "^3.0.2" + +p-map@^7.0.2: + version "7.0.7" + resolved "https://registry.npmjs.org/p-map/-/p-map-7.0.7.tgz" + integrity sha512-VaWRu2i4FJNRtiRWCuuQRgfQ1B7a6+gMSrO+3j0EQi/k0ULfS9kosRxGoiqwzIjZTDI02tGfk5mXXltLg6QtfQ== + +pacote@21.5.1: + version "21.5.1" + resolved "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz" + integrity sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg== + dependencies: + "@gar/promise-retry" "^1.0.0" + "@npmcli/git" "^7.0.0" + "@npmcli/installed-package-contents" "^4.0.0" + "@npmcli/package-json" "^7.0.0" + "@npmcli/promise-spawn" "^9.0.0" + "@npmcli/run-script" "^10.0.0" + cacache "^20.0.0" + fs-minipass "^3.0.0" + minipass "^7.0.2" + npm-package-arg "^13.0.0" + npm-packlist "^10.0.1" + npm-pick-manifest "^11.0.1" + npm-registry-fetch "^19.0.0" + proc-log "^6.0.0" + sigstore "^4.0.0" + ssri "^13.0.0" + tar "^7.4.3" + +parent-module@^1.0.0: + 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== + dependencies: + callsites "^3.0.0" + +parse5-html-rewriting-stream@8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.1.tgz" + integrity sha512-NaRku2aMpUN1Sh1Gyk1KWUh2A7EJx2c6qYzvwsPtqhoHoaURshdrceYK3LunVCm3WHhm6FS7Vcczbvdh3/UIVw== + dependencies: + entities "^8.0.0" + parse5 "^8.0.0" + parse5-sax-parser "^8.0.0" + +parse5-sax-parser@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz" + integrity sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw== + dependencies: + parse5 "^8.0.0" + +parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz" + integrity sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw== + dependencies: + entities "^8.0.0" + +parseurl@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + +path-to-regexp@^8.0.0: + version "8.4.2" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz" + integrity sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== + +picomatch@^2.3.1: + version "2.3.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== + +picomatch@^4.0.3, picomatch@^4.0.4, picomatch@^4.0.5: + version "4.0.7" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz" + integrity sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA== + +piscina@5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/piscina/-/piscina-5.2.0.tgz" + integrity sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA== + optionalDependencies: + "@napi-rs/nice" "^1.0.4" + +pkce-challenge@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz" + integrity sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ== + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + +postcss-safe-parser@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz" + integrity sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A== + +postcss@^8.4.49, postcss@^8.5.16, postcss@^8.5.26, postcss@^8.5.6: + version "8.5.26" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz" + integrity sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ== + dependencies: + nanoid "^3.3.17" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +proc-log@^6.0.0, proc-log@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz" + integrity sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ== + +proxy-addr@^2.0.7: + 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== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +psl@^1.1.33: + version "1.15.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" + +pump@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz" + integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@^6.14.0, qs@^6.15.2: + version "6.15.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz" + integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A== + dependencies: + es-define-property "^1.0.1" + side-channel "^1.1.1" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +range-parser@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz" + integrity sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw== + +raw-body@^3.0.0, raw-body@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz" + integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.7.0" + unpipe "~1.0.0" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +readdirp@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz" + integrity sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA== + +reflect-metadata@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +require-from-string@^2.0.2: + 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== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rolldown@~1.2.4: + version "1.2.6" + resolved "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz" + integrity sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA== + dependencies: + "@oxc-project/types" "=0.147.0" + "@rolldown/pluginutils" "^1.0.0" + optionalDependencies: + "@rolldown/binding-android-arm-eabi" "1.2.6" + "@rolldown/binding-android-arm64" "1.2.6" + "@rolldown/binding-darwin-arm64" "1.2.6" + "@rolldown/binding-darwin-x64" "1.2.6" + "@rolldown/binding-freebsd-x64" "1.2.6" + "@rolldown/binding-linux-arm-gnueabihf" "1.2.6" + "@rolldown/binding-linux-arm64-gnu" "1.2.6" + "@rolldown/binding-linux-arm64-musl" "1.2.6" + "@rolldown/binding-linux-ppc64-gnu" "1.2.6" + "@rolldown/binding-linux-s390x-gnu" "1.2.6" + "@rolldown/binding-linux-x64-gnu" "1.2.6" + "@rolldown/binding-linux-x64-musl" "1.2.6" + "@rolldown/binding-openharmony-arm64" "1.2.6" + "@rolldown/binding-win32-arm64-msvc" "1.2.6" + "@rolldown/binding-win32-x64-msvc" "1.2.6" + +rollup@4.60.2: + version "4.60.2" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz" + integrity sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.60.2" + "@rollup/rollup-android-arm64" "4.60.2" + "@rollup/rollup-darwin-arm64" "4.60.2" + "@rollup/rollup-darwin-x64" "4.60.2" + "@rollup/rollup-freebsd-arm64" "4.60.2" + "@rollup/rollup-freebsd-x64" "4.60.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.60.2" + "@rollup/rollup-linux-arm-musleabihf" "4.60.2" + "@rollup/rollup-linux-arm64-gnu" "4.60.2" + "@rollup/rollup-linux-arm64-musl" "4.60.2" + "@rollup/rollup-linux-loong64-gnu" "4.60.2" + "@rollup/rollup-linux-loong64-musl" "4.60.2" + "@rollup/rollup-linux-ppc64-gnu" "4.60.2" + "@rollup/rollup-linux-ppc64-musl" "4.60.2" + "@rollup/rollup-linux-riscv64-gnu" "4.60.2" + "@rollup/rollup-linux-riscv64-musl" "4.60.2" + "@rollup/rollup-linux-s390x-gnu" "4.60.2" + "@rollup/rollup-linux-x64-gnu" "4.60.2" + "@rollup/rollup-linux-x64-musl" "4.60.2" + "@rollup/rollup-openbsd-x64" "4.60.2" + "@rollup/rollup-openharmony-arm64" "4.60.2" + "@rollup/rollup-win32-arm64-msvc" "4.60.2" + "@rollup/rollup-win32-ia32-msvc" "4.60.2" + "@rollup/rollup-win32-x64-gnu" "4.60.2" + "@rollup/rollup-win32-x64-msvc" "4.60.2" + fsevents "~2.3.2" + +rollup@^4.43.0: + version "4.63.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz" + integrity sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg== + dependencies: + "@types/estree" "1.0.9" + optionalDependencies: + "@napi-rs/lzma-linux-x64-gnu" "1.5.1" + "@rollup/rollup-android-arm-eabi" "4.63.1" + "@rollup/rollup-android-arm64" "4.63.1" + "@rollup/rollup-darwin-arm64" "4.63.1" + "@rollup/rollup-darwin-x64" "4.63.1" + "@rollup/rollup-freebsd-arm64" "4.63.1" + "@rollup/rollup-freebsd-x64" "4.63.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.63.1" + "@rollup/rollup-linux-arm-musleabihf" "4.63.1" + "@rollup/rollup-linux-arm64-gnu" "4.63.1" + "@rollup/rollup-linux-arm64-musl" "4.63.1" + "@rollup/rollup-linux-loong64-gnu" "4.63.1" + "@rollup/rollup-linux-loong64-musl" "4.63.1" + "@rollup/rollup-linux-ppc64-gnu" "4.63.1" + "@rollup/rollup-linux-ppc64-musl" "4.63.1" + "@rollup/rollup-linux-riscv64-gnu" "4.63.1" + "@rollup/rollup-linux-riscv64-musl" "4.63.1" + "@rollup/rollup-linux-s390x-gnu" "4.63.1" + "@rollup/rollup-linux-x64-gnu" "4.63.1" + "@rollup/rollup-linux-x64-musl" "4.63.1" + "@rollup/rollup-openbsd-x64" "4.63.1" + "@rollup/rollup-openharmony-arm64" "4.63.1" + "@rollup/rollup-win32-arm64-msvc" "4.63.1" + "@rollup/rollup-win32-ia32-msvc" "4.63.1" + "@rollup/rollup-win32-x64-gnu" "4.63.1" + "@rollup/rollup-win32-x64-msvc" "4.63.1" + fsevents "~2.3.2" + +router@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/router/-/router-2.2.0.tgz" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@7.8.2, rxjs@~7.8.0: + version "7.8.2" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== + dependencies: + tslib "^2.1.0" + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass@1.99.0: + version "1.99.0" + resolved "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz" + integrity sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q== + dependencies: + chokidar "^4.0.0" + immutable "^5.1.5" + source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +semver@7.7.3: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + +semver@7.7.4: + version "7.7.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.5.3, semver@^7.6.0: + version "7.8.5" + resolved "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz" + integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== + +send@^1.1.0, send@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/send/-/send-1.2.1.tgz" + integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== + dependencies: + debug "^4.4.3" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.1" + mime-types "^3.0.2" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.2" + +serve-static@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz" + integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + +set-cookie-parser@^2.4.8: + version "2.7.2" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz" + integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== + +setprototypeof@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +should-quote@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/should-quote/-/should-quote-1.0.0.tgz" + integrity sha512-mQN5Meec3CTPmykzwXfDGWDpi75HUD8NT21wRWaJ7oqxpFIhXq80Hiy4ziccUNOwzhWeFkT9/kNSZbaugL9jsA== + +side-channel-list@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + +side-channel-map@^1.0.1: + 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== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + 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" + +side-channel@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/sigstore/-/sigstore-4.1.1.tgz" + integrity sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w== + dependencies: + "@sigstore/bundle" "^4.0.0" + "@sigstore/core" "^3.2.1" + "@sigstore/protobuf-specs" "^0.5.0" + "@sigstore/sign" "^4.1.1" + "@sigstore/tuf" "^4.0.2" + "@sigstore/verify" "^3.1.1" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz" + integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +slice-ansi@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz" + integrity sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg== + dependencies: + ansi-styles "^6.2.3" + is-fullwidth-code-point "^5.1.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^8.0.3: + version "8.0.5" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.9" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz" + integrity sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw== + dependencies: + ip-address "^10.1.1" + smart-buffer "^4.2.0" + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: + 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== + +source-map-support@0.5.21: + 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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.7.6: + version "0.7.6" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz" + integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.23" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz" + integrity sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw== + +ssri@^13.0.0: + version "13.0.1" + resolved "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz" + integrity sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ== + dependencies: + minipass "^7.0.3" + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +std-env@^4.0.0-rc.1: + version "4.2.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz" + integrity sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw== + +stdin-discarder@^0.3.1, stdin-discarder@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz" + integrity sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A== + +string-width@^7.0.0, string-width@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string-width@^8.1.0, string-width@^8.2.0, string-width@^8.2.1: + version "8.2.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz" + integrity sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg== + dependencies: + get-east-asian-width "^1.5.0" + strip-ansi "^7.1.2" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.1.0, strip-ansi@^7.1.2: + version "7.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== + dependencies: + ansi-regex "^6.2.2" + +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: + 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== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +symbol-tree@^3.2.4: + 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== + +tailwindcss@4.3.3, tailwindcss@^4.3.3: + version "4.3.3" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz" + integrity sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ== + +tapable@^2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz" + integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== + +tar@^7.4.3, tar@^7.5.4: + version "7.5.22" + resolved "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz" + integrity sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.1.0" + yallist "^5.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^1.0.2: + version "1.3.0" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz" + integrity sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ== + +tinyglobby@0.2.16: + version "0.2.16" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz" + integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + +tinyglobby@^0.2.12, tinyglobby@^0.2.15, tinyglobby@^0.2.17: + version "0.2.17" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz" + integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + +tinyrainbow@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz" + integrity sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw== + +tldts-core@^7.4.11: + version "7.4.11" + resolved "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz" + integrity sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg== + +tldts@^7.0.5: + version "7.4.11" + resolved "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz" + integrity sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw== + dependencies: + tldts-core "^7.4.11" + +to-regex-range@^5.0.1: + 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== + dependencies: + is-number "^7.0.0" + +toidentifier@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.1.4" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tough-cookie@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz" + integrity sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA== + dependencies: + tldts "^7.0.5" + +tr46@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz" + integrity sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw== + dependencies: + punycode "^2.3.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-api-utils@^1.3.0: + version "1.4.3" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== + +ts-api-utils@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz" + integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== + +ts-toolbelt@^9.0.0: + version "9.6.0" + resolved "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz" + integrity sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w== + +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.5.2, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tuf-js@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz" + integrity sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ== + dependencies: + "@tufjs/models" "4.1.0" + debug "^4.4.3" + make-fetch-happen "^15.0.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + 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== + +type-is@^2.0.1, type-is@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz" + integrity sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA== + dependencies: + content-type "^2.0.0" + media-typer "^1.1.0" + mime-types "^3.0.0" + +typescript@6.0.3, typescript@~6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz" + integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz" + integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== + +undici@^6.25.0: + version "6.28.0" + resolved "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz" + integrity sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.3.0: + version "1.3.2" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz" + integrity sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +validate-npm-package-name@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz" + integrity sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A== + +vary@^1, vary@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vite@7.3.6: + version "7.3.6" + resolved "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz" + integrity sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg== + dependencies: + esbuild "^0.27.0 || ^0.28.0" + fdir "^6.5.0" + picomatch "^4.0.3" + postcss "^8.5.6" + rollup "^4.43.0" + tinyglobby "^0.2.15" + optionalDependencies: + fsevents "~2.3.3" + +"vite@^6.0.0 || ^7.0.0 || ^8.0.0": + version "8.2.2" + resolved "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz" + integrity sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q== + dependencies: + lightningcss "^1.33.0" + picomatch "^4.0.5" + postcss "^8.5.26" + rolldown "~1.2.4" + tinyglobby "^0.2.17" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^4.0.0: + version "4.1.11" + resolved "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz" + integrity sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw== + dependencies: + "@vitest/expect" "4.1.11" + "@vitest/mocker" "4.1.11" + "@vitest/pretty-format" "4.1.11" + "@vitest/runner" "4.1.11" + "@vitest/snapshot" "4.1.11" + "@vitest/spy" "4.1.11" + "@vitest/utils" "4.1.11" + es-module-lexer "^2.0.0" + expect-type "^1.3.0" + magic-string "^0.30.21" + obug "^2.1.1" + pathe "^2.0.3" + picomatch "^4.0.3" + std-env "^4.0.0-rc.1" + tinybench "^2.9.0" + tinyexec "^1.0.2" + tinyglobby "^0.2.15" + tinyrainbow "^3.1.0" + vite "^6.0.0 || ^7.0.0 || ^8.0.0" + why-is-node-running "^2.3.0" + +w3c-xmlserializer@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz" + integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== + dependencies: + xml-name-validator "^5.0.0" + +watchpack@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz" + integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +weak-lru-cache@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz" + integrity sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^8.0.0: + version "8.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz" + integrity sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ== + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-mimetype@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz" + integrity sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw== + +whatwg-url@^15.1.0: + version "15.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz" + integrity sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g== + dependencies: + tr46 "^6.0.0" + webidl-conversions "^8.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/which/-/which-6.0.1.tgz" + integrity sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg== + dependencies: + isexe "^4.0.0" + +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wrap-ansi@^10.0.0: + version "10.0.1" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.1.tgz" + integrity sha512-M0N4xzyzosiIok3svYlEo1sdLZts/8FPgYH/GPC3wvlmPoRvnoManGMrE54waYj3tISA8w6lsdesfVv67qSr8Q== + dependencies: + ansi-styles "^6.2.3" + string-width "^8.2.0" + +wrap-ansi@^9.0.0: + version "9.0.2" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz" + integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.5.10: + version "7.5.13" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz" + integrity sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA== + +ws@^8.18.3: + version "8.21.3" + resolved "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz" + integrity sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw== + +xml-name-validator@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz" + integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + +yargs-parser@^22.0.0: + version "22.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz" + integrity sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== + +yargs@18.0.0: + version "18.0.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz" + integrity sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg== + dependencies: + cliui "^9.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + string-width "^7.2.0" + y18n "^5.0.5" + yargs-parser "^22.0.0" + +yargs@^18.0.0: + version "18.1.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz" + integrity sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg== + dependencies: + cliui "^9.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + string-width "^8.2.1" + y18n "^5.0.5" + yargs-parser "^22.0.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yoctocolors@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz" + integrity sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg== + +zod-to-json-schema@^3.25.1: + version "3.25.2" + resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz" + integrity sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA== + +zod@4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/zod/-/zod-4.4.2.tgz" + integrity sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw== + +"zod@^3.25 || ^4.0", zod@^4.0.10: + version "4.4.3" + resolved "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz" + integrity sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ== + +zone.js@~0.15.0: + version "0.15.1" + resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz" + integrity sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w== diff --git a/aspnet-core/.gitattributes b/aspnet-core/.gitattributes new file mode 100644 index 0000000..c941e52 --- /dev/null +++ b/aspnet-core/.gitattributes @@ -0,0 +1 @@ +**/wwwroot/libs/** linguist-vendored diff --git a/aspnet-core/.gitignore b/aspnet-core/.gitignore new file mode 100644 index 0000000..7f91b5f --- /dev/null +++ b/aspnet-core/.gitignore @@ -0,0 +1,265 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# newProjectConfigure +src/newProjectConfigure.Web/Logs/* +src/newProjectConfigure.Web.Host/Logs/* +src/newProjectConfigure.AuthServer/Logs/* +src/newProjectConfigure.HttpApi.Host/Logs/* +src/newProjectConfigure.HttpApi.Host/Logs/* +src/newProjectConfigure.DbMigrator/Logs/* +src/newProjectConfigure.Blazor.Server/Logs/* +src/newProjectConfigure.Blazor.Server.Tiered/Logs/* + +# Use abp install-libs to restore. +**/wwwroot/libs/* diff --git a/aspnet-core/.prettierrc b/aspnet-core/.prettierrc new file mode 100644 index 0000000..56af76b --- /dev/null +++ b/aspnet-core/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "useTabs": false, + "tabWidth": 4 +} diff --git a/aspnet-core/NuGet.Config b/aspnet-core/NuGet.Config new file mode 100644 index 0000000..bdc4519 --- /dev/null +++ b/aspnet-core/NuGet.Config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/aspnet-core/README.md b/aspnet-core/README.md new file mode 100644 index 0000000..1a182b9 --- /dev/null +++ b/aspnet-core/README.md @@ -0,0 +1,70 @@ +# newProjectConfigure + +## About this solution + +This is a layered startup solution based on [Domain Driven Design (DDD)](https://abp.io/docs/latest/framework/architecture/domain-driven-design) practises. All the fundamental ABP modules are already installed. + +### Pre-requirements + +* [.NET 10.0+ SDK](https://dotnet.microsoft.com/download/dotnet) +* [Node v20.11+](https://nodejs.org/en) + +### Configurations + +The solution comes with a default configuration that works out of the box. However, you may consider to change the following configuration before running your solution: + +* Check the `ConnectionStrings` in `appsettings.json` files under the `newProjectConfigure.HttpApi.Host` and `newProjectConfigure.DbMigrator` projects and change it if you need. + +### Before running the application + +#### Generating a Signing Certificate + +In the production environment, you need to use a production signing certificate. ABP Framework sets up signing and encryption certificates in your application and expects an `openiddict.pfx` file in your application. + +This certificate is already generated by ABP CLI, so most of the time you don't need to generate it yourself. However, if you need to generate a certificate, you can use the following command: + +```bash +dotnet dev-certs https -v -ep openiddict.pfx -p e3669ac2-a1b4-4ca1-a6b3-c1b9d189c7ab +``` + +> `e3669ac2-a1b4-4ca1-a6b3-c1b9d189c7ab` is the password of the certificate, you can change it to any password you want. + +It is recommended to use **two** RSA certificates, distinct from the certificate(s) used for HTTPS: one for encryption, one for signing. + +For more information, please refer to: https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios + +> Also, see the [Configuring OpenIddict](https://abp.io/docs/latest/deployment/configuring-openiddict#production-environment) documentation for more information. + +#### Install Client-Side Libraries + +Run the following command in the directory of your final application: + +```bash +abp install-libs +``` + +> This command installs all NPM packages for MVC/Razor Pages and Blazor Server UIs and this command is already run by the ABP CLI, so most of the time you don't need to run this command manually. + +#### Create the Database + +Run `newProjectConfigure.DbMigrator` to create the initial database. This should be done in the first run. It is also needed if a new database migration is added to the solution later. + +### Solution structure + +This is a layered monolith application that consists of the following applications: + +* `newProjectConfigure.DbMigrator`: A console application which applies the migrations and also seeds the initial data. It is useful on development as well as on production environment. +* `newProjectConfigure.HttpApi.Host`: ASP.NET Core API application that is used to expose the APIs to the clients. +* `angular`: Angular application. + +### Deploying the application + +Deploying an ABP application is not different than deploying any .NET or ASP.NET Core application. However, there are some topics that you should care about when you are deploying your applications. You can check ABP's [Deployment documentation](https://abp.io/docs/latest/deployment) before deploying your application. + +### Additional resources + +You can see the following resources to learn more about your solution and the ABP Framework: + +* [Web Application Development Tutorial](https://abp.io/docs/latest/tutorials/book-store/part-01?UI=Blazor&DB=EF) +* [Application Startup Template Structure](https://abp.io/docs/latest/solution-templates/layered-web-application) +* [Angular UI: Basic Theme](https://abp.io/docs/latest/framework/ui/angular/basic-theme) diff --git a/aspnet-core/common.props b/aspnet-core/common.props new file mode 100644 index 0000000..22d34c4 --- /dev/null +++ b/aspnet-core/common.props @@ -0,0 +1,19 @@ + + + latest + 1.0.0 + $(NoWarn);CS1591 + app + + + + + $(NoWarn);0436 + + + + + + + + \ No newline at end of file diff --git a/aspnet-core/newProjectConfigure.sln.DotSettings b/aspnet-core/newProjectConfigure.sln.DotSettings new file mode 100644 index 0000000..cb0b2c9 --- /dev/null +++ b/aspnet-core/newProjectConfigure.sln.DotSettings @@ -0,0 +1,23 @@ + + True + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + WARNING + Required + Required + Required + Required + False + True + False + False + True + False + False + SQL + \ No newline at end of file diff --git a/aspnet-core/newProjectConfigure.slnx b/aspnet-core/newProjectConfigure.slnx new file mode 100644 index 0000000..34a83eb --- /dev/null +++ b/aspnet-core/newProjectConfigure.slnx @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.Application.Contracts/Permissions/newProjectConfigurePermissionDefinitionProvider.cs b/aspnet-core/src/newProjectConfigure.Application.Contracts/Permissions/newProjectConfigurePermissionDefinitionProvider.cs new file mode 100644 index 0000000..c527243 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application.Contracts/Permissions/newProjectConfigurePermissionDefinitionProvider.cs @@ -0,0 +1,20 @@ +using newProjectConfigure.Localization; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; + +namespace newProjectConfigure.Permissions; + +public class newProjectConfigurePermissionDefinitionProvider : PermissionDefinitionProvider +{ + public override void Define(IPermissionDefinitionContext context) + { + var myGroup = context.AddGroup(newProjectConfigurePermissions.GroupName); + //Define your own permissions here. Example: + //myGroup.AddPermission(newProjectConfigurePermissions.MyPermission1, L("Permission:MyPermission1")); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/aspnet-core/src/newProjectConfigure.Application.Contracts/Permissions/newProjectConfigurePermissions.cs b/aspnet-core/src/newProjectConfigure.Application.Contracts/Permissions/newProjectConfigurePermissions.cs new file mode 100644 index 0000000..9e4edc5 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application.Contracts/Permissions/newProjectConfigurePermissions.cs @@ -0,0 +1,9 @@ +namespace newProjectConfigure.Permissions; + +public static class newProjectConfigurePermissions +{ + public const string GroupName = "newProjectConfigure"; + + //Add your own permission names. Example: + //public const string MyPermission1 = GroupName + ".MyPermission1"; +} diff --git a/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigure.Application.Contracts.csproj b/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigure.Application.Contracts.csproj new file mode 100644 index 0000000..1023afa --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigure.Application.Contracts.csproj @@ -0,0 +1,25 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigureApplicationContractsModule.cs b/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigureApplicationContractsModule.cs new file mode 100644 index 0000000..a5cddb0 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigureApplicationContractsModule.cs @@ -0,0 +1,28 @@ +using Volo.Abp.Account; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; + +namespace newProjectConfigure; + +[DependsOn( + typeof(newProjectConfigureDomainSharedModule), + typeof(AbpAccountApplicationContractsModule), + typeof(AbpFeatureManagementApplicationContractsModule), + typeof(AbpIdentityApplicationContractsModule), + typeof(AbpPermissionManagementApplicationContractsModule), + typeof(AbpSettingManagementApplicationContractsModule), + typeof(AbpTenantManagementApplicationContractsModule), + typeof(AbpObjectExtendingModule) +)] +public class newProjectConfigureApplicationContractsModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + newProjectConfigureDtoExtensions.Configure(); + } +} diff --git a/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigureDtoExtensions.cs b/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigureDtoExtensions.cs new file mode 100644 index 0000000..7352cff --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application.Contracts/newProjectConfigureDtoExtensions.cs @@ -0,0 +1,28 @@ +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace newProjectConfigure; + +public static class newProjectConfigureDtoExtensions +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + /* You can add extension properties to DTOs + * defined in the depended modules. + * + * Example: + * + * ObjectExtensionManager.Instance + * .AddOrUpdateProperty("Title"); + * + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Object-Extensions + */ + }); + } +} diff --git a/aspnet-core/src/newProjectConfigure.Application/Properties/AssemblyInfo.cs b/aspnet-core/src/newProjectConfigure.Application/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..983bc86 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application/Properties/AssemblyInfo.cs @@ -0,0 +1,2 @@ +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("newProjectConfigure.Application.Tests")] diff --git a/aspnet-core/src/newProjectConfigure.Application/newProjectConfigure.Application.csproj b/aspnet-core/src/newProjectConfigure.Application/newProjectConfigure.Application.csproj new file mode 100644 index 0000000..9cebec3 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application/newProjectConfigure.Application.csproj @@ -0,0 +1,25 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureAppService.cs b/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureAppService.cs new file mode 100644 index 0000000..ddbe06e --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureAppService.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; +using newProjectConfigure.Localization; +using Volo.Abp.Application.Services; + +namespace newProjectConfigure; + +/* Inherit your application services from this class. + */ +public abstract class newProjectConfigureAppService : ApplicationService +{ + protected newProjectConfigureAppService() + { + LocalizationResource = typeof(newProjectConfigureResource); + } +} diff --git a/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureApplicationMappers.cs b/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureApplicationMappers.cs new file mode 100644 index 0000000..9c89948 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureApplicationMappers.cs @@ -0,0 +1,12 @@ +using Riok.Mapperly.Abstractions; +using Volo.Abp.Mapperly; + +namespace newProjectConfigure; + +[Mapper] +public partial class newProjectConfigureApplicationMappers +{ + /* You can configure your Mapperly mapping configuration here. + * Alternatively, you can split your mapping configurations + * into multiple mapper classes for a better organization. */ +} diff --git a/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureApplicationModule.cs b/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureApplicationModule.cs new file mode 100644 index 0000000..050e35a --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Application/newProjectConfigureApplicationModule.cs @@ -0,0 +1,29 @@ +using Volo.Abp.Account; +using Volo.Abp.Mapperly; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; +using Microsoft.Extensions.DependencyInjection; + +namespace newProjectConfigure; + +[DependsOn( + typeof(newProjectConfigureDomainModule), + typeof(AbpAccountApplicationModule), + typeof(newProjectConfigureApplicationContractsModule), + typeof(AbpIdentityApplicationModule), + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpTenantManagementApplicationModule), + typeof(AbpFeatureManagementApplicationModule), + typeof(AbpSettingManagementApplicationModule) + )] +public class newProjectConfigureApplicationModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddMapperlyObjectMapper(); + } +} diff --git a/aspnet-core/src/newProjectConfigure.DbMigrator/DbMigratorHostedService.cs b/aspnet-core/src/newProjectConfigure.DbMigrator/DbMigratorHostedService.cs new file mode 100644 index 0000000..f4d37ee --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.DbMigrator/DbMigratorHostedService.cs @@ -0,0 +1,51 @@ +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using newProjectConfigure.Data; +using Serilog; +using Volo.Abp; +using Volo.Abp.Data; + +namespace newProjectConfigure.DbMigrator; + +public class DbMigratorHostedService : IHostedService +{ + private readonly IHostApplicationLifetime _hostApplicationLifetime; + private readonly IConfiguration _configuration; + + public DbMigratorHostedService(IHostApplicationLifetime hostApplicationLifetime, IConfiguration configuration) + { + _hostApplicationLifetime = hostApplicationLifetime; + _configuration = configuration; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + using (var application = await AbpApplicationFactory.CreateAsync(options => + { + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); + options.Services.AddLogging(c => c.AddSerilog()); + options.AddDataMigrationEnvironment(); + })) + { + await application.InitializeAsync(); + + await application + .ServiceProvider + .GetRequiredService() + .MigrateAsync(); + + await application.ShutdownAsync(); + + _hostApplicationLifetime.StopApplication(); + } + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/aspnet-core/src/newProjectConfigure.DbMigrator/Program.cs b/aspnet-core/src/newProjectConfigure.DbMigrator/Program.cs new file mode 100644 index 0000000..a1ef2ab --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.DbMigrator/Program.cs @@ -0,0 +1,41 @@ +using System.IO; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Events; + +namespace newProjectConfigure.DbMigrator; + +class Program +{ + static async Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Information() + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) +#if DEBUG + .MinimumLevel.Override("newProjectConfigure", LogEventLevel.Debug) +#else + .MinimumLevel.Override("newProjectConfigure", LogEventLevel.Information) +#endif + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .WriteTo.Async(c => c.Console()) + .CreateLogger(); + + await CreateHostBuilder(args).RunConsoleAsync(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .AddAppSettingsSecretsJson() + .ConfigureLogging((context, logging) => logging.ClearProviders()) + .ConfigureServices((hostContext, services) => + { + services.AddHostedService(); + }); +} diff --git a/aspnet-core/src/newProjectConfigure.DbMigrator/appsettings.json b/aspnet-core/src/newProjectConfigure.DbMigrator/appsettings.json new file mode 100644 index 0000000..353960c --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.DbMigrator/appsettings.json @@ -0,0 +1,17 @@ +{ + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=newProjectConfigure;Trusted_Connection=True;TrustServerCertificate=True" + }, + "OpenIddict": { + "Applications": { + "newProjectConfigure_App": { + "ClientId": "newProjectConfigure_App", + "RootUrl": "http://localhost:4200" + }, + "newProjectConfigure_Swagger": { + "ClientId": "newProjectConfigure_Swagger", + "RootUrl": "http://localhost:44355" + } + } + } +} diff --git a/aspnet-core/src/newProjectConfigure.DbMigrator/appsettings.secrets.json b/aspnet-core/src/newProjectConfigure.DbMigrator/appsettings.secrets.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.DbMigrator/appsettings.secrets.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/aspnet-core/src/newProjectConfigure.DbMigrator/newProjectConfigure.DbMigrator.csproj b/aspnet-core/src/newProjectConfigure.DbMigrator/newProjectConfigure.DbMigrator.csproj new file mode 100644 index 0000000..81c85cb --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.DbMigrator/newProjectConfigure.DbMigrator.csproj @@ -0,0 +1,45 @@ + + + + + + Exe + net10.0 + enable + + + + + + PreserveNewest + Always + + + + PreserveNewest + Always + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.DbMigrator/newProjectConfigureDbMigratorModule.cs b/aspnet-core/src/newProjectConfigure.DbMigrator/newProjectConfigureDbMigratorModule.cs new file mode 100644 index 0000000..70fb157 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.DbMigrator/newProjectConfigureDbMigratorModule.cs @@ -0,0 +1,14 @@ +using newProjectConfigure.EntityFrameworkCore; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace newProjectConfigure.DbMigrator; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(newProjectConfigureEntityFrameworkCoreModule), + typeof(newProjectConfigureApplicationContractsModule) + )] +public class newProjectConfigureDbMigratorModule : AbpModule +{ +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ar.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ar.json new file mode 100644 index 0000000..2623cb2 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ar.json @@ -0,0 +1,9 @@ +{ + "culture": "ar", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "الصفحة الرئيسية", + "Welcome": "مرحباً", + "LongWelcomeMessage": "مرحبا بكم في التطبيق. هذا مشروع بدء تشغيل يعتمد على إطار عمل ABP. لمزيد من المعلومات ، يرجى زيارة abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/cs.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/cs.json new file mode 100644 index 0000000..0edb42c --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/cs.json @@ -0,0 +1,9 @@ +{ + "culture": "cs", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Úvod", + "Welcome": "Vítejte", + "LongWelcomeMessage": "Vítejte v aplikaci. Toto je startovací projekt založený na ABP frameworku. Pro více informací, navštivte abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/de.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/de.json new file mode 100644 index 0000000..46ec6cf --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/de.json @@ -0,0 +1,9 @@ +{ + "culture": "de", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Home", + "Welcome": "Willkommen", + "LongWelcomeMessage": "Willkommen bei der Anwendung. Dies ist ein Startup-Projekt, das auf dem ABP-Framework basiert. Weitere Informationen finden Sie unter abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/en-GB.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/en-GB.json new file mode 100644 index 0000000..2832cbe --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/en-GB.json @@ -0,0 +1,9 @@ +{ + "culture": "en-GB", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Home", + "Welcome": "Welcome", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/en.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/en.json new file mode 100644 index 0000000..85aa5ac --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/en.json @@ -0,0 +1,9 @@ +{ + "culture": "en", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Home", + "Welcome": "Welcome", + "LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/es.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/es.json new file mode 100644 index 0000000..f64ba26 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/es.json @@ -0,0 +1,9 @@ +{ + "culture": "es", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Inicio", + "Welcome": "Bienvenido", + "LongWelcomeMessage": "Bienvenido a la aplicación, este es un proyecto base basado en el framework ABP. Para más información, visita abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/fi.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/fi.json new file mode 100644 index 0000000..6010dd4 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/fi.json @@ -0,0 +1,9 @@ +{ + "culture": "fi", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Koti", + "Welcome": "Tervetuloa", + "LongWelcomeMessage": "Tervetuloa sovellukseen. Tämä on ABP-kehykseen perustuva käynnistysprojekti. Lisätietoja on osoitteessa abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/fr.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/fr.json new file mode 100644 index 0000000..7e11ad8 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/fr.json @@ -0,0 +1,9 @@ +{ + "culture": "fr", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Accueil", + "Welcome": "Bienvenue", + "LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hi.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hi.json new file mode 100644 index 0000000..e2bee8f --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hi.json @@ -0,0 +1,9 @@ +{ + "culture": "hi", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "घर", + "Welcome": "स्वागत हे", + "LongWelcomeMessage": "आवेदन करने के लिए आपका स्वागत है। यह एबीपी ढांचे पर आधारित एक स्टार्टअप परियोजना है। अधिक जानकारी के लिए, abp.io पर जाएं।" + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hr.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hr.json new file mode 100644 index 0000000..2bc3f3c --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hr.json @@ -0,0 +1,9 @@ +{ + "culture": "hr", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Početna", + "Welcome": "Dobrodošli", + "LongWelcomeMessage": "Dobrodošli u aplikaciju. Ovo je startup projekt temeljen na ABP framework-u. Za više informacija posjetite abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hu.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hu.json new file mode 100644 index 0000000..98a7f36 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/hu.json @@ -0,0 +1,9 @@ +{ + "culture": "hu", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Kezdőlap", + "Welcome": "Üdvözlöm", + "LongWelcomeMessage": "Üdvözöljük az alkalmazásban. Ez egy ABP keretrendszeren alapuló startup projekt. További információkért látogasson el az abp.io oldalra." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/is.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/is.json new file mode 100644 index 0000000..68d8669 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/is.json @@ -0,0 +1,9 @@ +{ + "culture": "is", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Heim", + "Welcome": "Velkomin", + "LongWelcomeMessage": "Verið velkomin í forritið. Þetta er startup verkefni sem byggir á ABP. Nánari upplýsingar er að finna á abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/it.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/it.json new file mode 100644 index 0000000..5d71341 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/it.json @@ -0,0 +1,9 @@ +{ + "culture": "it", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Home", + "Welcome": "Benvenuto", + "LongWelcomeMessage": "Benvenuto nell'applicazione. Questo è un progetto di avvio basato sul framework ABP. Per ulteriori informazioni, visita abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/nl.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/nl.json new file mode 100644 index 0000000..989a9e0 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/nl.json @@ -0,0 +1,9 @@ +{ + "culture": "nl", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Home", + "Welcome": "Welkom", + "LongWelcomeMessage": "Welkom bij de applicatie. Dit is een startup-project gebaseerd op het ABP-framework. Bezoek abp.io voor meer informatie." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/pl-PL.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/pl-PL.json new file mode 100644 index 0000000..b32ecaa --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/pl-PL.json @@ -0,0 +1,9 @@ +{ + "culture": "pl-PL", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Home", + "Welcome": "Witaj", + "LongWelcomeMessage": "Witaj w aplikacji. To jest inicjalny projekt bazujący na ABP framework. Po więcej informacji odwiedź stronę abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/pt-BR.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/pt-BR.json new file mode 100644 index 0000000..81c4a1d --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/pt-BR.json @@ -0,0 +1,9 @@ +{ + "culture": "pt-BR", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Principal", + "Welcome": "Seja bem-vindo!", + "LongWelcomeMessage": "Bem-vindo a esta aplicação. Este é um projeto inicial baseado no ABP framework. Para mais informações, visite abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ro-RO.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ro-RO.json new file mode 100644 index 0000000..e20e4f5 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ro-RO.json @@ -0,0 +1,9 @@ +{ + "culture": "ro-RO", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Acasă", + "Welcome": "Bun venit", + "LongWelcomeMessage": "Bun venit la aplicaţie. Acesta este un proiect de pornire bazat pe framework-ul ABP. Pentru mai multe informaţii, vizitaţi, visit abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ru.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ru.json new file mode 100644 index 0000000..049cf63 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/ru.json @@ -0,0 +1,9 @@ +{ + "culture": "ru", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Главная", + "Welcome": "Добро пожаловать", + "LongWelcomeMessage": "Добро пожаловать в приложение. Этот запущенный проект основан на фреймворке ABP. Для получения дополнительной информации посетите сайт abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sk.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sk.json new file mode 100644 index 0000000..25f4894 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sk.json @@ -0,0 +1,9 @@ +{ + "culture": "sk", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Domov", + "Welcome": "Vitajte", + "LongWelcomeMessage": "Vitajte v aplikácii. Toto je štartovací projekt založený na ABP frameworku. Viac informácií nájdete na stránke abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sl.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sl.json new file mode 100644 index 0000000..b2dd8e3 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sl.json @@ -0,0 +1,9 @@ +{ + "culture": "sl", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Domov", + "Welcome": "Dobrodošli", + "LongWelcomeMessage": "Dobrodošli v aplikaciji. To je začetni projekt na osnovi okolja ABP. Za več informacij obiščite abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sv.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sv.json new file mode 100644 index 0000000..bd1eae4 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/sv.json @@ -0,0 +1,9 @@ +{ + "culture": "sv", + "texts": { + "AppName": "MittProjektNamn", + "Menu:Home": "Hem", + "Welcome": "Välkommen", + "LongWelcomeMessage": "Välkommen till applikationen. Detta är ett startup-projekt baserat på ABP-ramverket. För mer information, besök abp.io." + } +} \ No newline at end of file diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/tr.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/tr.json new file mode 100644 index 0000000..06164d8 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/tr.json @@ -0,0 +1,9 @@ +{ + "culture": "tr", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Ana sayfa", + "Welcome": "Hoşgeldiniz", + "LongWelcomeMessage": "Uygulamaya hoşgeldiniz. Bu, ABP framework'ü üzerine bina edilmiş bir başlangıç projesidir. Daha fazla bilgi için abp.io adresini ziyaret edebilirsiniz." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/vi.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/vi.json new file mode 100644 index 0000000..82fcc19 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/vi.json @@ -0,0 +1,9 @@ +{ + "culture": "vi", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "Trang chủ", + "Welcome": "Chào mừng bạn", + "LongWelcomeMessage": "Chào mừng bạn đến ứng dụng. Đây là một dự án khởi nghiệp dựa trên khung ABP. Để biết thêm thông tin, hãy truy cập abp.io." + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/zh-Hans.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/zh-Hans.json new file mode 100644 index 0000000..810d647 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/zh-Hans.json @@ -0,0 +1,9 @@ +{ + "culture": "zh-Hans", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "首页", + "Welcome": "欢迎", + "LongWelcomeMessage": "欢迎使用本应用程序。这是一个基于 ABP 框架的启动项目。更多信息,请访问 abp.io。" + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/zh-Hant.json b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/zh-Hant.json new file mode 100644 index 0000000..c36878d --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigure/zh-Hant.json @@ -0,0 +1,9 @@ +{ + "culture": "zh-Hant", + "texts": { + "AppName": "newProjectConfigure", + "Menu:Home": "首頁", + "Welcome": "歡迎", + "LongWelcomeMessage": "歡迎來到此應用程式. 這是一個基於ABP框架的起始專案. 有關更多訊息, 請瀏覽 abp.io." + } + } diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigureResource.cs b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigureResource.cs new file mode 100644 index 0000000..68d4984 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/Localization/newProjectConfigureResource.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Localization; + +namespace newProjectConfigure.Localization; + +[LocalizationResourceName("newProjectConfigure")] +public class newProjectConfigureResource +{ + +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs b/aspnet-core/src/newProjectConfigure.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs new file mode 100644 index 0000000..f0caa0d --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/MultiTenancy/MultiTenancyConsts.cs @@ -0,0 +1,10 @@ +namespace newProjectConfigure.MultiTenancy; + +public static class MultiTenancyConsts +{ + /* Enable/disable multi-tenancy easily in a single point. + * If you will never need to multi-tenancy, you can remove + * related modules and code parts, including this file. + */ + public const bool IsEnabled = true; +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigure.Domain.Shared.csproj b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigure.Domain.Shared.csproj new file mode 100644 index 0000000..61fec8f --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigure.Domain.Shared.csproj @@ -0,0 +1,32 @@ + + + + + + net10.0 + enable + newProjectConfigure + true + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureDomainErrorCodes.cs b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureDomainErrorCodes.cs new file mode 100644 index 0000000..a52b3b6 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureDomainErrorCodes.cs @@ -0,0 +1,6 @@ +namespace newProjectConfigure; + +public static class newProjectConfigureDomainErrorCodes +{ + /* You can add your business exception error codes here, as constants */ +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureDomainSharedModule.cs b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureDomainSharedModule.cs new file mode 100644 index 0000000..8009a5d --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureDomainSharedModule.cs @@ -0,0 +1,58 @@ +using newProjectConfigure.Localization; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; +using Volo.Abp.Validation.Localization; +using Volo.Abp.VirtualFileSystem; + +namespace newProjectConfigure; + +[DependsOn( + typeof(AbpAuditLoggingDomainSharedModule), + typeof(AbpBackgroundJobsDomainSharedModule), + typeof(AbpFeatureManagementDomainSharedModule), + typeof(AbpIdentityDomainSharedModule), + typeof(AbpOpenIddictDomainSharedModule), + typeof(AbpPermissionManagementDomainSharedModule), + typeof(AbpSettingManagementDomainSharedModule), + typeof(AbpTenantManagementDomainSharedModule) + )] +public class newProjectConfigureDomainSharedModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + newProjectConfigureGlobalFeatureConfigurator.Configure(); + newProjectConfigureModuleExtensionConfigurator.Configure(); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddBaseTypes(typeof(AbpValidationResource)) + .AddVirtualJson("/Localization/newProjectConfigure"); + + options.DefaultResourceType = typeof(newProjectConfigureResource); + }); + + Configure(options => + { + options.MapCodeNamespace("newProjectConfigure", typeof(newProjectConfigureResource)); + }); + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureGlobalFeatureConfigurator.cs b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureGlobalFeatureConfigurator.cs new file mode 100644 index 0000000..64619d0 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureGlobalFeatureConfigurator.cs @@ -0,0 +1,22 @@ +using Volo.Abp.Threading; + +namespace newProjectConfigure; + +public static class newProjectConfigureGlobalFeatureConfigurator +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + /* You can configure (enable/disable) global features of the used modules here. + * + * YOU CAN SAFELY DELETE THIS CLASS AND REMOVE ITS USAGES IF YOU DON'T NEED TO IT! + * + * Please refer to the documentation to lear more about the Global Features System: + * https://docs.abp.io/en/abp/latest/Global-Features + */ + }); + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureModuleExtensionConfigurator.cs b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureModuleExtensionConfigurator.cs new file mode 100644 index 0000000..8824b73 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain.Shared/newProjectConfigureModuleExtensionConfigurator.cs @@ -0,0 +1,73 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace newProjectConfigure; + +public static class newProjectConfigureModuleExtensionConfigurator +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + OneTimeRunner.Run(() => + { + ConfigureExistingProperties(); + ConfigureExtraProperties(); + }); + } + + private static void ConfigureExistingProperties() + { + /* You can change max lengths for properties of the + * entities defined in the modules used by your application. + * + * Example: Change user and role name max lengths + + AbpUserConsts.MaxNameLength = 99; + IdentityRoleConsts.MaxNameLength = 99; + + * Notice: It is not suggested to change property lengths + * unless you really need it. Go with the standard values wherever possible. + * + * If you are using EF Core, you will need to run the add-migration command after your changes. + */ + } + + private static void ConfigureExtraProperties() + { + /* You can configure extra properties for the + * entities defined in the modules used by your application. + * + * This class can be used to define these extra properties + * with a high level, easy to use API. + * + * Example: Add a new property to the user entity of the identity module + + ObjectExtensionManager.Instance.Modules() + .ConfigureIdentity(identity => + { + identity.ConfigureUser(user => + { + user.AddOrUpdateProperty( //property type: string + "SocialSecurityNumber", //property name + property => + { + //validation rules + property.Attributes.Add(new RequiredAttribute()); + property.Attributes.Add(new StringLengthAttribute(64) {MinimumLength = 4}); + + property.Configuration[IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit] = true; + + //...other configurations for this property + } + ); + }); + }); + + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Module-Entity-Extensions + */ + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain/Data/InewProjectConfigureDbSchemaMigrator.cs b/aspnet-core/src/newProjectConfigure.Domain/Data/InewProjectConfigureDbSchemaMigrator.cs new file mode 100644 index 0000000..f4e517a --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/Data/InewProjectConfigureDbSchemaMigrator.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace newProjectConfigure.Data; + +public interface InewProjectConfigureDbSchemaMigrator +{ + Task MigrateAsync(); +} diff --git a/aspnet-core/src/newProjectConfigure.Domain/Data/NullnewProjectConfigureDbSchemaMigrator.cs b/aspnet-core/src/newProjectConfigure.Domain/Data/NullnewProjectConfigureDbSchemaMigrator.cs new file mode 100644 index 0000000..1710557 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/Data/NullnewProjectConfigureDbSchemaMigrator.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace newProjectConfigure.Data; + +/* This is used if database provider does't define + * InewProjectConfigureDbSchemaMigrator implementation. + */ +public class NullnewProjectConfigureDbSchemaMigrator : InewProjectConfigureDbSchemaMigrator, ITransientDependency +{ + public Task MigrateAsync() + { + return Task.CompletedTask; + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain/Data/newProjectConfigureDbMigrationService.cs b/aspnet-core/src/newProjectConfigure.Domain/Data/newProjectConfigureDbMigrationService.cs new file mode 100644 index 0000000..57dddc8 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/Data/newProjectConfigureDbMigrationService.cs @@ -0,0 +1,218 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.TenantManagement; + +namespace newProjectConfigure.Data; + +public class newProjectConfigureDbMigrationService : ITransientDependency +{ + public ILogger Logger { get; set; } + + private readonly IDataSeeder _dataSeeder; + private readonly IEnumerable _dbSchemaMigrators; + private readonly ITenantRepository _tenantRepository; + private readonly ICurrentTenant _currentTenant; + + public newProjectConfigureDbMigrationService( + IDataSeeder dataSeeder, + IEnumerable dbSchemaMigrators, + ITenantRepository tenantRepository, + ICurrentTenant currentTenant) + { + _dataSeeder = dataSeeder; + _dbSchemaMigrators = dbSchemaMigrators; + _tenantRepository = tenantRepository; + _currentTenant = currentTenant; + + Logger = NullLogger.Instance; + } + + public async Task MigrateAsync() + { + var initialMigrationAdded = AddInitialMigrationIfNotExist(); + + if (initialMigrationAdded) + { + return; + } + + Logger.LogInformation("Started database migrations..."); + + await MigrateDatabaseSchemaAsync(); + await SeedDataAsync(); + + Logger.LogInformation($"Successfully completed host database migrations."); + + var tenants = await _tenantRepository.GetListAsync(includeDetails: true); + + var migratedDatabaseSchemas = new HashSet(); + foreach (var tenant in tenants) + { + using (_currentTenant.Change(tenant.Id)) + { + if (tenant.ConnectionStrings.Any()) + { + var tenantConnectionStrings = tenant.ConnectionStrings + .Select(x => x.Value) + .ToList(); + + if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) + { + await MigrateDatabaseSchemaAsync(tenant); + + migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); + } + } + + await SeedDataAsync(tenant); + } + + Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); + } + + Logger.LogInformation("Successfully completed all database migrations."); + Logger.LogInformation("You can safely end this process..."); + } + + private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) + { + Logger.LogInformation( + $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); + + foreach (var migrator in _dbSchemaMigrators) + { + await migrator.MigrateAsync(); + } + } + + private async Task SeedDataAsync(Tenant? tenant = null) + { + Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); + + await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) + .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, IdentityDataSeedContributor.AdminEmailDefaultValue) + .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, IdentityDataSeedContributor.AdminPasswordDefaultValue) + ); + } + + private bool AddInitialMigrationIfNotExist() + { + try + { + if (!DbMigrationsProjectExists()) + { + return false; + } + } + catch (Exception) + { + return false; + } + + try + { + if (!MigrationsFolderExists()) + { + AddInitialMigration(); + return true; + } + else + { + return false; + } + } + catch (Exception e) + { + Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message); + return false; + } + } + + private bool DbMigrationsProjectExists() + { + var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); + + return dbMigrationsProjectFolder != null; + } + + private bool MigrationsFolderExists() + { + var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); + return dbMigrationsProjectFolder != null && Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); + } + + private void AddInitialMigration() + { + Logger.LogInformation("Creating initial migration..."); + + string argumentPrefix; + string fileName; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + argumentPrefix = "-c"; + fileName = "/bin/bash"; + } + else + { + argumentPrefix = "/C"; + fileName = "cmd.exe"; + } + + var procStartInfo = new ProcessStartInfo(fileName, + $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\"" + ); + + try + { + Process.Start(procStartInfo); + } + catch (Exception) + { + throw new Exception("Couldn't run ABP CLI..."); + } + } + + private string? GetEntityFrameworkCoreProjectFolderPath() + { + var slnDirectoryPath = GetSolutionDirectoryPath(); + + if (slnDirectoryPath == null) + { + throw new Exception("Solution folder not found!"); + } + + var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); + + return Directory.GetDirectories(srcDirectoryPath) + .FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore")); + } + + private string? GetSolutionDirectoryPath() + { + var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); + + while (currentDirectory != null && Directory.GetParent(currentDirectory.FullName) != null) + { + currentDirectory = Directory.GetParent(currentDirectory.FullName); + + if (currentDirectory != null && Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) + { + return currentDirectory.FullName; + } + } + + return null; + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain/OpenIddict/OpenIddictDataSeedContributor.cs b/aspnet-core/src/newProjectConfigure.Domain/OpenIddict/OpenIddictDataSeedContributor.cs new file mode 100644 index 0000000..347493c --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/OpenIddict/OpenIddictDataSeedContributor.cs @@ -0,0 +1,350 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Localization; +using OpenIddict.Abstractions; +using Volo.Abp; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.OpenIddict.Applications; +using Volo.Abp.OpenIddict.Scopes; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Uow; + +namespace newProjectConfigure.OpenIddict; + +/* Creates initial data that is needed to property run the application + * and make client-to-server communication possible. + */ +public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + private readonly IConfiguration _configuration; + private readonly IOpenIddictApplicationRepository _openIddictApplicationRepository; + private readonly IAbpApplicationManager _applicationManager; + private readonly IOpenIddictScopeRepository _openIddictScopeRepository; + private readonly IOpenIddictScopeManager _scopeManager; + private readonly IPermissionDataSeeder _permissionDataSeeder; + private readonly IStringLocalizer L; + + public OpenIddictDataSeedContributor( + IConfiguration configuration, + IOpenIddictApplicationRepository openIddictApplicationRepository, + IAbpApplicationManager applicationManager, + IOpenIddictScopeRepository openIddictScopeRepository, + IOpenIddictScopeManager scopeManager, + IPermissionDataSeeder permissionDataSeeder, + IStringLocalizer l ) + { + _configuration = configuration; + _openIddictApplicationRepository = openIddictApplicationRepository; + _applicationManager = applicationManager; + _openIddictScopeRepository = openIddictScopeRepository; + _scopeManager = scopeManager; + _permissionDataSeeder = permissionDataSeeder; + L = l; + } + + [UnitOfWork] + public virtual async Task SeedAsync(DataSeedContext context) + { + await CreateScopesAsync(); + await CreateApplicationsAsync(); + } + + private async Task CreateScopesAsync() + { + if (await _openIddictScopeRepository.FindByNameAsync("newProjectConfigure") == null) + { + await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor { + Name = "newProjectConfigure", DisplayName = "newProjectConfigure API", Resources = { "newProjectConfigure" } + }); + } + } + + private async Task CreateApplicationsAsync() + { + var commonScopes = new List { + OpenIddictConstants.Permissions.Scopes.Address, + OpenIddictConstants.Permissions.Scopes.Email, + OpenIddictConstants.Permissions.Scopes.Phone, + OpenIddictConstants.Permissions.Scopes.Profile, + OpenIddictConstants.Permissions.Scopes.Roles, + "newProjectConfigure" + }; + + var configurationSection = _configuration.GetSection("OpenIddict:Applications"); + + + //Console Test / Angular Client + var consoleAndAngularClientId = configurationSection["newProjectConfigure_App:ClientId"]; + if (!consoleAndAngularClientId.IsNullOrWhiteSpace()) + { + var consoleAndAngularClientRootUrl = configurationSection["newProjectConfigure_App:RootUrl"]?.TrimEnd('/'); + await CreateApplicationAsync( + name: consoleAndAngularClientId!, + type: OpenIddictConstants.ClientTypes.Public, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Console Test / Angular Application", + secret: null, + grantTypes: new List { + OpenIddictConstants.GrantTypes.AuthorizationCode, + OpenIddictConstants.GrantTypes.Password, + OpenIddictConstants.GrantTypes.ClientCredentials, + OpenIddictConstants.GrantTypes.RefreshToken + }, + scopes: commonScopes, + redirectUri: consoleAndAngularClientRootUrl, + clientUri: consoleAndAngularClientRootUrl, + postLogoutRedirectUri: consoleAndAngularClientRootUrl + ); + } + + + + + // Swagger Client + var swaggerClientId = configurationSection["newProjectConfigure_Swagger:ClientId"]; + if (!swaggerClientId.IsNullOrWhiteSpace()) + { + var swaggerRootUrl = configurationSection["newProjectConfigure_Swagger:RootUrl"]?.TrimEnd('/'); + + await CreateApplicationAsync( + name: swaggerClientId!, + type: OpenIddictConstants.ClientTypes.Public, + consentType: OpenIddictConstants.ConsentTypes.Implicit, + displayName: "Swagger Application", + secret: null, + grantTypes: new List { OpenIddictConstants.GrantTypes.AuthorizationCode, }, + scopes: commonScopes, + redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html", + clientUri: swaggerRootUrl + ); + } + } + + private async Task CreateApplicationAsync( + [NotNull] string name, + [NotNull] string type, + [NotNull] string consentType, + string displayName, + string? secret, + List grantTypes, + List scopes, + string? clientUri = null, + string? redirectUri = null, + string? postLogoutRedirectUri = null, + List? permissions = null) + { + if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, + StringComparison.OrdinalIgnoreCase)) + { + throw new BusinessException(L["NoClientSecretCanBeSetForPublicApplications"]); + } + + if (string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Confidential, + StringComparison.OrdinalIgnoreCase)) + { + throw new BusinessException(L["TheClientSecretIsRequiredForConfidentialApplications"]); + } + + var client = await _openIddictApplicationRepository.FindByClientIdAsync(name); + + var application = new AbpApplicationDescriptor { + ClientId = name, + ClientType = type, + ClientSecret = secret, + ConsentType = consentType, + DisplayName = displayName, + ClientUri = clientUri, + }; + + Check.NotNullOrEmpty(grantTypes, nameof(grantTypes)); + Check.NotNullOrEmpty(scopes, nameof(scopes)); + + if (new[] { OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.Implicit }.All( + grantTypes.Contains)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken); + + if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeToken); + } + } + + if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.EndSession); + } + + var buildInGrantTypes = new[] { + OpenIddictConstants.GrantTypes.Implicit, OpenIddictConstants.GrantTypes.Password, + OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.ClientCredentials, + OpenIddictConstants.GrantTypes.DeviceCode, OpenIddictConstants.GrantTypes.RefreshToken + }; + + foreach (var grantType in grantTypes) + { + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Code); + } + + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || + grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Authorization); + } + + if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || + grantType == OpenIddictConstants.GrantTypes.ClientCredentials || + grantType == OpenIddictConstants.GrantTypes.Password || + grantType == OpenIddictConstants.GrantTypes.RefreshToken || + grantType == OpenIddictConstants.GrantTypes.DeviceCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Token); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Revocation); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Introspection); + } + + if (grantType == OpenIddictConstants.GrantTypes.ClientCredentials) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.ClientCredentials); + } + + if (grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Implicit); + } + + if (grantType == OpenIddictConstants.GrantTypes.Password) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Password); + } + + if (grantType == OpenIddictConstants.GrantTypes.RefreshToken) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.RefreshToken); + } + + if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) + { + application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization); + } + + if (grantType == OpenIddictConstants.GrantTypes.Implicit) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdToken); + if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken); + application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Token); + } + } + + if (!buildInGrantTypes.Contains(grantType)) + { + application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.GrantType + grantType); + } + } + + var buildInScopes = new[] { + OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Email, + OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Profile, + OpenIddictConstants.Permissions.Scopes.Roles + }; + + foreach (var scope in scopes) + { + if (buildInScopes.Contains(scope)) + { + application.Permissions.Add(scope); + } + else + { + application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.Scope + scope); + } + } + + if (redirectUri != null) + { + if (!redirectUri.IsNullOrEmpty()) + { + if (!Uri.TryCreate(redirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString()) + { + throw new BusinessException(L["InvalidRedirectUri", redirectUri]); + } + + if (application.RedirectUris.All(x => x != uri)) + { + application.RedirectUris.Add(uri); + } + } + } + + if (postLogoutRedirectUri != null) + { + if (!postLogoutRedirectUri.IsNullOrEmpty()) + { + if (!Uri.TryCreate(postLogoutRedirectUri, UriKind.Absolute, out var uri) || + !uri.IsWellFormedOriginalString()) + { + throw new BusinessException(L["InvalidPostLogoutRedirectUri", postLogoutRedirectUri]); + } + + if (application.PostLogoutRedirectUris.All(x => x != uri)) + { + application.PostLogoutRedirectUris.Add(uri); + } + } + } + + if (permissions != null) + { + await _permissionDataSeeder.SeedAsync( + ClientPermissionValueProvider.ProviderName, + name, + permissions, + null + ); + } + + if (client == null) + { + await _applicationManager.CreateAsync(application); + return; + } + + if (!HasSameRedirectUris(client, application)) + { + client.RedirectUris = JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().TrimEnd('/'))); + client.PostLogoutRedirectUris = JsonSerializer.Serialize(application.PostLogoutRedirectUris.Select(q => q.ToString().TrimEnd('/'))); + + await _applicationManager.UpdateAsync(client.ToModel()); + } + + if (!HasSameScopes(client, application)) + { + client.Permissions = JsonSerializer.Serialize(application.Permissions.Select(q => q.ToString())); + await _applicationManager.UpdateAsync(client.ToModel()); + } + } + + private bool HasSameRedirectUris(OpenIddictApplication existingClient, AbpApplicationDescriptor application) + { + return existingClient.RedirectUris == JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().TrimEnd('/'))); + } + + private bool HasSameScopes(OpenIddictApplication existingClient, AbpApplicationDescriptor application) + { + return existingClient.Permissions == JsonSerializer.Serialize(application.Permissions.Select(q => q.ToString().TrimEnd('/'))); + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain/Properties/AssemblyInfo.cs b/aspnet-core/src/newProjectConfigure.Domain/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0454ff9 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("newProjectConfigure.Domain.Tests")] +[assembly:InternalsVisibleToAttribute("newProjectConfigure.TestBase")] diff --git a/aspnet-core/src/newProjectConfigure.Domain/Settings/newProjectConfigureSettingDefinitionProvider.cs b/aspnet-core/src/newProjectConfigure.Domain/Settings/newProjectConfigureSettingDefinitionProvider.cs new file mode 100644 index 0000000..dc80b42 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/Settings/newProjectConfigureSettingDefinitionProvider.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Settings; + +namespace newProjectConfigure.Settings; + +public class newProjectConfigureSettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + //Define your own settings here. Example: + //context.Add(new SettingDefinition(newProjectConfigureSettings.MySetting1)); + } +} diff --git a/aspnet-core/src/newProjectConfigure.Domain/Settings/newProjectConfigureSettings.cs b/aspnet-core/src/newProjectConfigure.Domain/Settings/newProjectConfigureSettings.cs new file mode 100644 index 0000000..526118b --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/Settings/newProjectConfigureSettings.cs @@ -0,0 +1,9 @@ +namespace newProjectConfigure.Settings; + +public static class newProjectConfigureSettings +{ + private const string Prefix = "newProjectConfigure"; + + //Add your own setting names here. Example: + //public const string MySetting1 = Prefix + ".MySetting1"; +} diff --git a/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigure.Domain.csproj b/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigure.Domain.csproj new file mode 100644 index 0000000..b2e6b5b --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigure.Domain.csproj @@ -0,0 +1,28 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigureConsts.cs b/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigureConsts.cs new file mode 100644 index 0000000..9c988fd --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigureConsts.cs @@ -0,0 +1,8 @@ +namespace newProjectConfigure; + +public static class newProjectConfigureConsts +{ + public const string DbTablePrefix = "App"; + + public const string DbSchema = null; +} diff --git a/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigureDomainModule.cs b/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigureDomainModule.cs new file mode 100644 index 0000000..640e79d --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.Domain/newProjectConfigureDomainModule.cs @@ -0,0 +1,68 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using newProjectConfigure.MultiTenancy; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.Emailing; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.OpenIddict; +using Volo.Abp.PermissionManagement.Identity; +using Volo.Abp.PermissionManagement.OpenIddict; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; + +namespace newProjectConfigure; + +[DependsOn( + typeof(newProjectConfigureDomainSharedModule), + typeof(AbpAuditLoggingDomainModule), + typeof(AbpBackgroundJobsDomainModule), + typeof(AbpFeatureManagementDomainModule), + typeof(AbpIdentityDomainModule), + typeof(AbpOpenIddictDomainModule), + typeof(AbpPermissionManagementDomainOpenIddictModule), + typeof(AbpPermissionManagementDomainIdentityModule), + typeof(AbpSettingManagementDomainModule), + typeof(AbpTenantManagementDomainModule), + typeof(AbpEmailingModule) +)] +public class newProjectConfigureDomainModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); + options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); + options.Languages.Add(new LanguageInfo("en", "en", "English")); + options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)")); + options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); + options.Languages.Add(new LanguageInfo("hr", "hr", "Croatian")); + options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish")); + options.Languages.Add(new LanguageInfo("fr", "fr", "Français")); + options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi")); + options.Languages.Add(new LanguageInfo("it", "it", "Italiano")); + options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); + options.Languages.Add(new LanguageInfo("ru", "ru", "Русский")); + options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak")); + options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); + options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文")); + options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch")); + options.Languages.Add(new LanguageInfo("es", "es", "Español")); + }); + + Configure(options => + { + options.IsEnabled = MultiTenancyConsts.IsEnabled; + }); + +#if DEBUG + context.Services.Replace(ServiceDescriptor.Singleton()); +#endif + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCorenewProjectConfigureDbSchemaMigrator.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCorenewProjectConfigureDbSchemaMigrator.cs new file mode 100644 index 0000000..3f4dc21 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/EntityFrameworkCorenewProjectConfigureDbSchemaMigrator.cs @@ -0,0 +1,34 @@ +using System; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using newProjectConfigure.Data; +using Volo.Abp.DependencyInjection; + +namespace newProjectConfigure.EntityFrameworkCore; + +public class EntityFrameworkCorenewProjectConfigureDbSchemaMigrator + : InewProjectConfigureDbSchemaMigrator, ITransientDependency +{ + private readonly IServiceProvider _serviceProvider; + + public EntityFrameworkCorenewProjectConfigureDbSchemaMigrator( + IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public async Task MigrateAsync() + { + /* We intentionally resolve the newProjectConfigureDbContext + * from IServiceProvider (instead of directly injecting it) + * to properly get the connection string of the current tenant in the + * current scope. + */ + + await _serviceProvider + .GetRequiredService() + .Database + .MigrateAsync(); + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureDbContext.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureDbContext.cs new file mode 100644 index 0000000..0ef3f14 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureDbContext.cs @@ -0,0 +1,86 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.BackgroundJobs.EntityFrameworkCore; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Identity; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.TenantManagement; +using Volo.Abp.TenantManagement.EntityFrameworkCore; + +namespace newProjectConfigure.EntityFrameworkCore; + +[ReplaceDbContext(typeof(IIdentityDbContext))] +[ReplaceDbContext(typeof(ITenantManagementDbContext))] +[ConnectionStringName("Default")] +public class newProjectConfigureDbContext : + AbpDbContext, + IIdentityDbContext, + ITenantManagementDbContext +{ + /* Add DbSet properties for your Aggregate Roots / Entities here. */ + + #region Entities from the modules + + /* Notice: We only implemented IIdentityDbContext and ITenantManagementDbContext + * and replaced them for this DbContext. This allows you to perform JOIN + * queries for the entities of these modules over the repositories easily. You + * typically don't need that for other modules. But, if you need, you can + * implement the DbContext interface of the needed module and use ReplaceDbContext + * attribute just like IIdentityDbContext and ITenantManagementDbContext. + * + * More info: Replacing a DbContext of a module ensures that the related module + * uses this DbContext on runtime. Otherwise, it will use its own DbContext class. + */ + + //Identity + public DbSet Users { get; set; } + public DbSet Roles { get; set; } + public DbSet ClaimTypes { get; set; } + public DbSet OrganizationUnits { get; set; } + public DbSet SecurityLogs { get; set; } + public DbSet LinkUsers { get; set; } + public DbSet UserDelegations { get; set; } + public DbSet Sessions { get; set; } + // Tenant Management + public DbSet Tenants { get; set; } + public DbSet TenantConnectionStrings { get; set; } + + #endregion + + public newProjectConfigureDbContext(DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + + builder.ConfigurePermissionManagement(); + builder.ConfigureSettingManagement(); + builder.ConfigureBackgroundJobs(); + builder.ConfigureAuditLogging(); + builder.ConfigureIdentity(); + builder.ConfigureOpenIddict(); + builder.ConfigureFeatureManagement(); + builder.ConfigureTenantManagement(); + + /* Configure your own tables/entities inside here */ + + //builder.Entity(b => + //{ + // b.ToTable(newProjectConfigureConsts.DbTablePrefix + "YourEntities", newProjectConfigureConsts.DbSchema); + // b.ConfigureByConvention(); //auto configure for the base class props + // //... + //}); + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureDbContextFactory.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureDbContextFactory.cs new file mode 100644 index 0000000..c88659d --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureDbContextFactory.cs @@ -0,0 +1,33 @@ +using System; +using System.IO; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; + +namespace newProjectConfigure.EntityFrameworkCore; + +/* This class is needed for EF Core console commands + * (like Add-Migration and Update-Database commands) */ +public class newProjectConfigureDbContextFactory : IDesignTimeDbContextFactory +{ + public newProjectConfigureDbContext CreateDbContext(string[] args) + { + newProjectConfigureEfCoreEntityExtensionMappings.Configure(); + + var configuration = BuildConfiguration(); + + var builder = new DbContextOptionsBuilder() + .UseSqlServer(configuration.GetConnectionString("Default")); + + return new newProjectConfigureDbContext(builder.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../newProjectConfigure.DbMigrator/")) + .AddJsonFile("appsettings.json", optional: false); + + return builder.Build(); + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureEfCoreEntityExtensionMappings.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureEfCoreEntityExtensionMappings.cs new file mode 100644 index 0000000..53181d5 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureEfCoreEntityExtensionMappings.cs @@ -0,0 +1,44 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Identity; +using Volo.Abp.ObjectExtending; +using Volo.Abp.Threading; + +namespace newProjectConfigure.EntityFrameworkCore; + +public static class newProjectConfigureEfCoreEntityExtensionMappings +{ + private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); + + public static void Configure() + { + newProjectConfigureGlobalFeatureConfigurator.Configure(); + newProjectConfigureModuleExtensionConfigurator.Configure(); + + OneTimeRunner.Run(() => + { + /* You can configure extra properties for the + * entities defined in the modules used by your application. + * + * This class can be used to map these extra properties to table fields in the database. + * + * USE THIS CLASS ONLY TO CONFIGURE EF CORE RELATED MAPPING. + * USE newProjectConfigureModuleExtensionConfigurator CLASS (in the Domain.Shared project) + * FOR A HIGH LEVEL API TO DEFINE EXTRA PROPERTIES TO ENTITIES OF THE USED MODULES + * + * Example: Map a property to a table field: + + ObjectExtensionManager.Instance + .MapEfCoreProperty( + "MyProperty", + (entityBuilder, propertyBuilder) => + { + propertyBuilder.HasMaxLength(128); + } + ); + + * See the documentation for more: + * https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities + */ + }); + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreModule.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreModule.cs new file mode 100644 index 0000000..3819fe4 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreModule.cs @@ -0,0 +1,54 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Uow; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.BackgroundJobs.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.TenantManagement.EntityFrameworkCore; + +namespace newProjectConfigure.EntityFrameworkCore; + +[DependsOn( + typeof(newProjectConfigureDomainModule), + typeof(AbpIdentityEntityFrameworkCoreModule), + typeof(AbpOpenIddictEntityFrameworkCoreModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + typeof(AbpEntityFrameworkCoreSqlServerModule), + typeof(AbpBackgroundJobsEntityFrameworkCoreModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpTenantManagementEntityFrameworkCoreModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule) + )] +public class newProjectConfigureEntityFrameworkCoreModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + newProjectConfigureEfCoreEntityExtensionMappings.Configure(); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(options => + { + /* Remove "includeAllEntities: true" to create + * default repositories only for aggregate roots */ + options.AddDefaultRepositories(includeAllEntities: true); + }); + + Configure(options => + { + /* The main point to change your DBMS. + * See also newProjectConfigureMigrationsDbContextFactory for EF Core tooling. */ + options.UseSqlServer(); + }); + + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/20260828095937_Initial.Designer.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/20260828095937_Initial.Designer.cs new file mode 100644 index 0000000..4b0c0c6 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/20260828095937_Initial.Designer.cs @@ -0,0 +1,2162 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; +using newProjectConfigure.EntityFrameworkCore; + +#nullable disable + +namespace newProjectConfigure.Migrations +{ + [DbContext(typeof(newProjectConfigureDbContext))] + [Migration("20260828095937_Initial")] + partial class Initial + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "10.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogExcelFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("FileName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("FileName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpAuditLogExcelFiles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("CompletionTime") + .HasColumnType("datetime2"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("nvarchar(max)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastTryTime") + .HasColumnType("datetime2"); + + b.Property("NextTryTime") + .HasColumnType("datetime2"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("ApplicationName", "CompletionTime", "IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SignedIn") + .HasColumnType("datetime2"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LastSignInTime") + .HasColumnType("datetimeoffset"); + + b.Property("Leaved") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("Leaved"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasskey", b => + { + b.Property("CredentialId") + .HasMaxLength(1024) + .HasColumnType("varbinary(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("CredentialId"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserPasskeys", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("FrontChannelLogoutUri") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("nvarchar(max)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Settings") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("ManagementPermissionName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ResourceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("ResourceName", "Name") + .IsUnique() + .HasFilter("[ResourceName] IS NOT NULL"); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.ResourcePermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ResourceKey") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ResourceName", "ResourceKey", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpResourcePermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("bit"); + + b.Property("IsInherited") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasskey", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Passkeys") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("Volo.Abp.Identity.IdentityPasskeyData", "Data", b1 => + { + b1.Property("IdentityUserPasskeyCredentialId"); + + b1.Property("AttestationObject"); + + b1.Property("ClientDataJson"); + + b1.Property("CreatedAt"); + + b1.Property("IsBackedUp"); + + b1.Property("IsBackupEligible"); + + b1.Property("IsUserVerified"); + + b1.Property("Name"); + + b1.Property("PublicKey"); + + b1.Property("SignCount"); + + b1.PrimitiveCollection("Transports"); + + b1.HasKey("IdentityUserPasskeyCredentialId"); + + b1.ToTable("AbpUserPasskeys"); + + b1 + .ToJson("Data") + .HasColumnType("nvarchar(max)"); + + b1.WithOwner() + .HasForeignKey("IdentityUserPasskeyCredentialId"); + }); + + b.Navigation("Data"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + + b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) + .WithMany() + .HasForeignKey("AuthorizationId"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Passkeys"); + + b.Navigation("PasswordHistories"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/20260828095937_Initial.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/20260828095937_Initial.cs new file mode 100644 index 0000000..57c6df7 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/20260828095937_Initial.cs @@ -0,0 +1,1253 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace newProjectConfigure.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpAuditLogExcelFiles", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + FileName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogExcelFiles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorTenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "nvarchar(max)", nullable: true), + Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "int", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpBackgroundJobs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + JobName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + JobArgs = table.Column(type: "nvarchar(max)", maxLength: 1048576, nullable: false), + TryCount = table.Column(type: "smallint", nullable: false, defaultValue: (short)0), + CreationTime = table.Column(type: "datetime2", nullable: false), + NextTryTime = table.Column(type: "datetime2", nullable: false), + LastTryTime = table.Column(type: "datetime2", nullable: true), + IsAbandoned = table.Column(type: "bit", nullable: false, defaultValue: false), + CompletionTime = table.Column(type: "datetime2", nullable: true), + Priority = table.Column(type: "tinyint", nullable: false, defaultValue: (byte)15), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "int", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatures", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + DefaultValue = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + IsVisibleToClients = table.Column(type: "bit", nullable: false), + IsAvailableToHost = table.Column(type: "bit", nullable: false), + AllowedProviders = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatures", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLinkUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnits", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); + table.ForeignKey( + name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", + column: x => x.ParentId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGrants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGroups", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGroups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + GroupName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ResourceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ManagementPermissionName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ParentName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsEnabled = table.Column(type: "bit", nullable: false), + MultiTenancySide = table.Column(type: "tinyint", nullable: false), + Providers = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + StateCheckers = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpResourcePermissionGrants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ResourceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ResourceKey = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpResourcePermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpRoles", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + IsPublic = table.Column(type: "bit", nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSessions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SessionId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Device = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + DeviceInfo = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + IpAddresses = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + SignedIn = table.Column(type: "datetime2", nullable: false), + LastAccessed = table.Column(type: "datetime2", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSessions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettingDefinitions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + DisplayName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Description = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + DefaultValue = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + IsVisibleToClients = table.Column(type: "bit", nullable: false), + Providers = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true), + IsInherited = table.Column(type: "bit", nullable: false), + IsEncrypted = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettingDefinitions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettings", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpTenants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + NormalizedName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + IsActive = table.Column(type: "bit", nullable: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), + ShouldChangePasswordOnNextLogin = table.Column(type: "bit", nullable: false), + EntityVersion = table.Column(type: "int", nullable: false), + LastPasswordChangeTime = table.Column(type: "datetimeoffset", nullable: true), + LastSignInTime = table.Column(type: "datetimeoffset", nullable: true), + Leaved = table.Column(type: "bit", nullable: false, defaultValue: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictApplications", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ClientId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ClientSecret = table.Column(type: "nvarchar(max)", nullable: true), + ClientType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ConsentType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + DisplayName = table.Column(type: "nvarchar(max)", nullable: true), + DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), + JsonWebKeySet = table.Column(type: "nvarchar(max)", nullable: true), + Permissions = table.Column(type: "nvarchar(max)", nullable: true), + PostLogoutRedirectUris = table.Column(type: "nvarchar(max)", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + RedirectUris = table.Column(type: "nvarchar(max)", nullable: true), + Requirements = table.Column(type: "nvarchar(max)", nullable: true), + Settings = table.Column(type: "nvarchar(max)", nullable: true), + FrontChannelLogoutUri = table.Column(type: "nvarchar(max)", nullable: true), + ClientUri = table.Column(type: "nvarchar(max)", nullable: true), + LogoUri = table.Column(type: "nvarchar(max)", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictApplications", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictScopes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Description = table.Column(type: "nvarchar(max)", nullable: true), + Descriptions = table.Column(type: "nvarchar(max)", nullable: true), + DisplayName = table.Column(type: "nvarchar(max)", nullable: true), + DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + Resources = table.Column(type: "nvarchar(max)", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictScopes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogActions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ChangeTime = table.Column(type: "datetime2", nullable: false), + ChangeType = table.Column(type: "tinyint", nullable: false), + EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + EntityTypeFullName = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnitRoles", + columns: table => new + { + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpRoleClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpRoleClaims_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpTenantConnectionStrings", + columns: table => new + { + TenantId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); + table.ForeignKey( + name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", + column: x => x.TenantId, + principalTable: "AbpTenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpUserClaims_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserLogins", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); + table.ForeignKey( + name: "FK_AbpUserLogins_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserOrganizationUnits", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserPasskeys", + columns: table => new + { + CredentialId = table.Column(type: "varbinary(1024)", maxLength: 1024, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Data = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasskeys", x => x.CredentialId); + table.ForeignKey( + name: "FK_AbpUserPasskeys_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserPasswordHistories", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + Password = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreatedAt = table.Column(type: "datetimeoffset", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserPasswordHistories", x => new { x.UserId, x.Password }); + table.ForeignKey( + name: "FK_AbpUserPasswordHistories_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserRoles", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserTokens", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AbpUserTokens_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictAuthorizations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + Scopes = table.Column(type: "nvarchar(max)", nullable: true), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictAuthorizations", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityPropertyChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), + NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", + column: x => x.EntityChangeId, + principalTable: "AbpEntityChanges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictTokens", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), + AuthorizationId = table.Column(type: "uniqueidentifier", nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: true), + ExpirationDate = table.Column(type: "datetime2", nullable: true), + Payload = table.Column(type: "nvarchar(max)", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + RedemptionDate = table.Column(type: "datetime2", nullable: true), + ReferenceId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "nvarchar(150)", maxLength: 150, nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictTokens", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", + column: x => x.AuthorizationId, + principalTable: "OpenIddictAuthorizations", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_AuditLogId", + table: "AbpAuditLogActions", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", + table: "AbpAuditLogActions", + columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpBackgroundJobs_ApplicationName_CompletionTime_IsAbandoned_NextTryTime", + table: "AbpBackgroundJobs", + columns: new[] { "ApplicationName", "CompletionTime", "IsAbandoned", "NextTryTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_AuditLogId", + table: "AbpEntityChanges", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", + table: "AbpEntityChanges", + columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityPropertyChanges_EntityChangeId", + table: "AbpEntityPropertyChanges", + column: "EntityChangeId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureGroups_Name", + table: "AbpFeatureGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatures_GroupName", + table: "AbpFeatures", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatures_Name", + table: "AbpFeatures", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true, + filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", + table: "AbpOrganizationUnitRoles", + columns: new[] { "RoleId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_Code", + table: "AbpOrganizationUnits", + column: "Code"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_ParentId", + table: "AbpOrganizationUnits", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGrants_TenantId_Name_ProviderName_ProviderKey", + table: "AbpPermissionGrants", + columns: new[] { "TenantId", "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[TenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGroups_Name", + table: "AbpPermissionGroups", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_GroupName", + table: "AbpPermissions", + column: "GroupName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissions_ResourceName_Name", + table: "AbpPermissions", + columns: new[] { "ResourceName", "Name" }, + unique: true, + filter: "[ResourceName] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpResourcePermissionGrants_TenantId_Name_ResourceName_ResourceKey_ProviderName_ProviderKey", + table: "AbpResourcePermissionGrants", + columns: new[] { "TenantId", "Name", "ResourceName", "ResourceKey", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[TenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoleClaims_RoleId", + table: "AbpRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoles_NormalizedName", + table: "AbpRoles", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_Device", + table: "AbpSessions", + column: "Device"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_SessionId", + table: "AbpSessions", + column: "SessionId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSessions_TenantId_UserId", + table: "AbpSessions", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettingDefinitions_Name", + table: "AbpSettingDefinitions", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettings_Name_ProviderName_ProviderKey", + table: "AbpSettings", + columns: new[] { "Name", "ProviderName", "ProviderKey" }, + unique: true, + filter: "[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_Name", + table: "AbpTenants", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_NormalizedName", + table: "AbpTenants", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserClaims_UserId", + table: "AbpUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserLogins_LoginProvider_ProviderKey", + table: "AbpUserLogins", + columns: new[] { "LoginProvider", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", + table: "AbpUserOrganizationUnits", + columns: new[] { "UserId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserPasskeys_UserId", + table: "AbpUserPasskeys", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserRoles_RoleId_UserId", + table: "AbpUserRoles", + columns: new[] { "RoleId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_Email", + table: "AbpUsers", + column: "Email"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedEmail", + table: "AbpUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedUserName", + table: "AbpUsers", + column: "NormalizedUserName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_UserName", + table: "AbpUsers", + column: "UserName"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictApplications_ClientId", + table: "OpenIddictApplications", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", + table: "OpenIddictAuthorizations", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictScopes_Name", + table: "OpenIddictScopes", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", + table: "OpenIddictTokens", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_AuthorizationId", + table: "OpenIddictTokens", + column: "AuthorizationId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ReferenceId", + table: "OpenIddictTokens", + column: "ReferenceId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpAuditLogActions"); + + migrationBuilder.DropTable( + name: "AbpAuditLogExcelFiles"); + + migrationBuilder.DropTable( + name: "AbpBackgroundJobs"); + + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + + migrationBuilder.DropTable( + name: "AbpEntityPropertyChanges"); + + migrationBuilder.DropTable( + name: "AbpFeatureGroups"); + + migrationBuilder.DropTable( + name: "AbpFeatures"); + + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnitRoles"); + + migrationBuilder.DropTable( + name: "AbpPermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpPermissionGroups"); + + migrationBuilder.DropTable( + name: "AbpPermissions"); + + migrationBuilder.DropTable( + name: "AbpResourcePermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpRoleClaims"); + + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + + migrationBuilder.DropTable( + name: "AbpSessions"); + + migrationBuilder.DropTable( + name: "AbpSettingDefinitions"); + + migrationBuilder.DropTable( + name: "AbpSettings"); + + migrationBuilder.DropTable( + name: "AbpTenantConnectionStrings"); + + migrationBuilder.DropTable( + name: "AbpUserClaims"); + + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + + migrationBuilder.DropTable( + name: "AbpUserLogins"); + + migrationBuilder.DropTable( + name: "AbpUserOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpUserPasskeys"); + + migrationBuilder.DropTable( + name: "AbpUserPasswordHistories"); + + migrationBuilder.DropTable( + name: "AbpUserRoles"); + + migrationBuilder.DropTable( + name: "AbpUserTokens"); + + migrationBuilder.DropTable( + name: "OpenIddictScopes"); + + migrationBuilder.DropTable( + name: "OpenIddictTokens"); + + migrationBuilder.DropTable( + name: "AbpEntityChanges"); + + migrationBuilder.DropTable( + name: "AbpTenants"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpRoles"); + + migrationBuilder.DropTable( + name: "AbpUsers"); + + migrationBuilder.DropTable( + name: "OpenIddictAuthorizations"); + + migrationBuilder.DropTable( + name: "AbpAuditLogs"); + + migrationBuilder.DropTable( + name: "OpenIddictApplications"); + } + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/newProjectConfigureDbContextModelSnapshot.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/newProjectConfigureDbContextModelSnapshot.cs new file mode 100644 index 0000000..e5064aa --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Migrations/newProjectConfigureDbContextModelSnapshot.cs @@ -0,0 +1,2159 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; +using newProjectConfigure.EntityFrameworkCore; + +#nullable disable + +namespace newProjectConfigure.Migrations +{ + [DbContext(typeof(newProjectConfigureDbContext))] + partial class newProjectConfigureDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("ProductVersion", "10.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("nvarchar(max)"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogExcelFile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("FileName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("FileName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpAuditLogExcelFiles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AuditLogId") + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EntityChangeId") + .HasColumnType("uniqueidentifier"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("CompletionTime") + .HasColumnType("datetime2"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("nvarchar(max)"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastTryTime") + .HasColumnType("datetime2"); + + b.Property("NextTryTime") + .HasColumnType("datetime2"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint") + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasColumnType("smallint") + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("ApplicationName", "CompletionTime", "IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IpAddresses") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("LastAccessed") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SignedIn") + .HasColumnType("datetime2"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("bit") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + + b.Property("LastSignInTime") + .HasColumnType("datetimeoffset"); + + b.Property("Leaved") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("Leaved"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("bit"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasskey", b => + { + b.Property("CredentialId") + .HasMaxLength(1024) + .HasColumnType("varbinary(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("CredentialId"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserPasskeys", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("Password") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("CreatedAt") + .HasColumnType("datetimeoffset"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "Password"); + + b.ToTable("AbpUserPasswordHistories", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ClientUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("FrontChannelLogoutUri") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("nvarchar(max)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Settings") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("bit"); + + b.Property("ManagementPermissionName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ResourceName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("ResourceName", "Name") + .IsUnique() + .HasFilter("[ResourceName] IS NOT NULL"); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.ResourcePermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ResourceKey") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ResourceName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ResourceName", "ResourceKey", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[TenantId] IS NOT NULL"); + + b.ToTable("AbpResourcePermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique() + .HasFilter("[ProviderName] IS NOT NULL AND [ProviderKey] IS NOT NULL"); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("bit"); + + b.Property("IsInherited") + .HasColumnType("bit"); + + b.Property("IsVisibleToClients") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasskey", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Passkeys") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("Volo.Abp.Identity.IdentityPasskeyData", "Data", b1 => + { + b1.Property("IdentityUserPasskeyCredentialId"); + + b1.Property("AttestationObject"); + + b1.Property("ClientDataJson"); + + b1.Property("CreatedAt"); + + b1.Property("IsBackedUp"); + + b1.Property("IsBackupEligible"); + + b1.Property("IsUserVerified"); + + b1.Property("Name"); + + b1.Property("PublicKey"); + + b1.Property("SignCount"); + + b1.PrimitiveCollection("Transports"); + + b1.HasKey("IdentityUserPasskeyCredentialId"); + + b1.ToTable("AbpUserPasskeys"); + + b1 + .ToJson("Data") + .HasColumnType("nvarchar(max)"); + + b1.WithOwner() + .HasForeignKey("IdentityUserPasskeyCredentialId"); + }); + + b.Navigation("Data"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserPasswordHistory", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("PasswordHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + + b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) + .WithMany() + .HasForeignKey("AuthorizationId"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Passkeys"); + + b.Navigation("PasswordHistories"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Properties/AssemblyInfo.cs b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..20caef6 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/Properties/AssemblyInfo.cs @@ -0,0 +1,2 @@ +using System.Runtime.CompilerServices; +[assembly:InternalsVisibleToAttribute("newProjectConfigure.EntityFrameworkCore.Tests")] diff --git a/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/newProjectConfigure.EntityFrameworkCore.csproj b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/newProjectConfigure.EntityFrameworkCore.csproj new file mode 100644 index 0000000..b550d9a --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.EntityFrameworkCore/newProjectConfigure.EntityFrameworkCore.csproj @@ -0,0 +1,31 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Client/newProjectConfigure.HttpApi.Client.csproj b/aspnet-core/src/newProjectConfigure.HttpApi.Client/newProjectConfigure.HttpApi.Client.csproj new file mode 100644 index 0000000..8e908e7 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Client/newProjectConfigure.HttpApi.Client.csproj @@ -0,0 +1,29 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Client/newProjectConfigureHttpApiClientModule.cs b/aspnet-core/src/newProjectConfigure.HttpApi.Client/newProjectConfigureHttpApiClientModule.cs new file mode 100644 index 0000000..55a9a55 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Client/newProjectConfigureHttpApiClientModule.cs @@ -0,0 +1,38 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Account; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.TenantManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.VirtualFileSystem; + +namespace newProjectConfigure; + +[DependsOn( + typeof(newProjectConfigureApplicationContractsModule), + typeof(AbpAccountHttpApiClientModule), + typeof(AbpIdentityHttpApiClientModule), + typeof(AbpPermissionManagementHttpApiClientModule), + typeof(AbpTenantManagementHttpApiClientModule), + typeof(AbpFeatureManagementHttpApiClientModule), + typeof(AbpSettingManagementHttpApiClientModule) +)] +public class newProjectConfigureHttpApiClientModule : AbpModule +{ + public const string RemoteServiceName = "Default"; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddHttpClientProxies( + typeof(newProjectConfigureApplicationContractsModule).Assembly, + RemoteServiceName + ); + + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + } +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/Controllers/HomeController.cs b/aspnet-core/src/newProjectConfigure.HttpApi.Host/Controllers/HomeController.cs new file mode 100644 index 0000000..33e6c9f --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/Controllers/HomeController.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; + +namespace newProjectConfigure.Controllers; + +public class HomeController : AbpController +{ + public ActionResult Index() + { + return Redirect("~/swagger"); + } +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/Program.cs b/aspnet-core/src/newProjectConfigure.HttpApi.Host/Program.cs new file mode 100644 index 0000000..922a43b --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/Program.cs @@ -0,0 +1,56 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Serilog; +using Serilog.Events; + +namespace newProjectConfigure; + +public class Program +{ + public async static Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() +#if DEBUG + .MinimumLevel.Debug() +#else + .MinimumLevel.Information() +#endif + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning) + .Enrich.FromLogContext() + .WriteTo.Async(c => c.File("Logs/logs.txt")) + .WriteTo.Async(c => c.Console()) + .CreateLogger(); + + try + { + Log.Information("Starting newProjectConfigure.HttpApi.Host."); + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog(); + await builder.AddApplicationAsync(); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); + return 0; + } + catch (Exception ex) + { + if (ex is HostAbortedException) + { + throw; + } + + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/Properties/launchSettings.json b/aspnet-core/src/newProjectConfigure.HttpApi.Host/Properties/launchSettings.json new file mode 100644 index 0000000..af3a57e --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "https://localhost:44355", + "sslPort": 44355 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "newProjectConfigure.HttpApi.Host": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "http://localhost:44355", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/abp.resourcemapping.js b/aspnet-core/src/newProjectConfigure.HttpApi.Host/abp.resourcemapping.js new file mode 100644 index 0000000..4a2ad45 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/abp.resourcemapping.js @@ -0,0 +1,11 @@ +module.exports = { + aliases: { + + }, + clean: [ + + ], + mappings: { + + } +}; diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.Development.json b/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.Development.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.Development.json @@ -0,0 +1,2 @@ +{ +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.json b/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.json new file mode 100644 index 0000000..ce95e9f --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.json @@ -0,0 +1,19 @@ +{ + "App": { + "SelfUrl": "http://localhost:44355", + "ClientUrl": "http://localhost:4200", + "CorsOrigins": "https://*.newProjectConfigure.com,http://localhost:4200", + "RedirectAllowedUrls": "http://localhost:4200" + }, + "ConnectionStrings": { + "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=newProjectConfigure;Trusted_Connection=True;TrustServerCertificate=True" + }, + "AuthServer": { + "Authority": "http://localhost:44355", + "RequireHttpsMetadata": false, + "SwaggerClientId": "newProjectConfigure_Swagger" + }, + "StringEncryption": { + "DefaultPassPhrase": "AB4hqJTN2a5ttfOt" + } +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.secrets.json b/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.secrets.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/appsettings.secrets.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigure.HttpApi.Host.csproj b/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigure.HttpApi.Host.csproj new file mode 100644 index 0000000..66e92ee --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigure.HttpApi.Host.csproj @@ -0,0 +1,41 @@ + + + + + + net10.0 + enable + newProjectConfigure + true + newProjectConfigure-4681b4fd-151f-4221-84a4-929d86723e4c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigureBrandingProvider.cs b/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigureBrandingProvider.cs new file mode 100644 index 0000000..d9b15da --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigureBrandingProvider.cs @@ -0,0 +1,19 @@ +using Microsoft.Extensions.Localization; +using newProjectConfigure.Localization; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Ui.Branding; + +namespace newProjectConfigure; + +[Dependency(ReplaceServices = true)] +public class newProjectConfigureBrandingProvider : DefaultBrandingProvider +{ + private IStringLocalizer _localizer; + + public newProjectConfigureBrandingProvider(IStringLocalizer localizer) + { + _localizer = localizer; + } + + public override string AppName => _localizer["AppName"]; +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigureHttpApiHostModule.cs b/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigureHttpApiHostModule.cs new file mode 100644 index 0000000..792ee49 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/newProjectConfigureHttpApiHostModule.cs @@ -0,0 +1,226 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using newProjectConfigure.EntityFrameworkCore; +using newProjectConfigure.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling; +using Microsoft.OpenApi; +using OpenIddict.Validation.AspNetCore; +using Volo.Abp; +using Volo.Abp.Account; +using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Autofac; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.Security.Claims; +using Volo.Abp.Swashbuckle; +using Volo.Abp.UI.Navigation.Urls; +using Volo.Abp.VirtualFileSystem; + +namespace newProjectConfigure; + +[DependsOn( + typeof(newProjectConfigureHttpApiModule), + typeof(AbpAutofacModule), + typeof(AbpAspNetCoreMultiTenancyModule), + typeof(newProjectConfigureApplicationModule), + typeof(newProjectConfigureEntityFrameworkCoreModule), + typeof(AbpAspNetCoreMvcUiBasicThemeModule), + typeof(AbpAccountWebOpenIddictModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpSwashbuckleModule) +)] +public class newProjectConfigureHttpApiHostModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + options.AddAudiences("newProjectConfigure"); + options.UseLocalServer(); + options.UseAspNetCore(); + }); + }); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + ConfigureAuthentication(context); + ConfigureBundles(); + ConfigureUrls(configuration); + ConfigureConventionalControllers(); + ConfigureVirtualFileSystem(context); + ConfigureCors(context, configuration); + ConfigureSwaggerServices(context, configuration); + } + + private void ConfigureAuthentication(ServiceConfigurationContext context) + { + context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); + context.Services.Configure(options => + { + options.IsDynamicClaimsEnabled = true; + }); + } + + private void ConfigureBundles() + { + Configure(options => + { + options.StyleBundles.Configure( + BasicThemeBundles.Styles.Global, + bundle => + { + bundle.AddFiles("/global-styles.css"); + } + ); + }); + } + + private void ConfigureUrls(IConfiguration configuration) + { + Configure(options => + { + options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; + options.RedirectAllowedUrls.AddRange(configuration["App:RedirectAllowedUrls"]?.Split(',') ?? Array.Empty()); + + options.Applications["Angular"].RootUrl = configuration["App:ClientUrl"]; + options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password"; + }); + } + + private void ConfigureVirtualFileSystem(ServiceConfigurationContext context) + { + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + if (hostingEnvironment.IsDevelopment()) + { + Configure(options => + { + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine(hostingEnvironment.ContentRootPath, + $"..{Path.DirectorySeparatorChar}newProjectConfigure.Domain.Shared")); + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine(hostingEnvironment.ContentRootPath, + $"..{Path.DirectorySeparatorChar}newProjectConfigure.Domain")); + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine(hostingEnvironment.ContentRootPath, + $"..{Path.DirectorySeparatorChar}newProjectConfigure.Application.Contracts")); + options.FileSets.ReplaceEmbeddedByPhysical( + Path.Combine(hostingEnvironment.ContentRootPath, + $"..{Path.DirectorySeparatorChar}newProjectConfigure.Application")); + }); + } + } + + private void ConfigureConventionalControllers() + { + Configure(options => + { + options.ConventionalControllers.Create(typeof(newProjectConfigureApplicationModule).Assembly); + }); + } + + private static void ConfigureSwaggerServices(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddAbpSwaggerGenWithOAuth( + configuration["AuthServer:Authority"]!, + new Dictionary + { + {"newProjectConfigure", "newProjectConfigure API"} + }, + options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "newProjectConfigure API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + }); + } + + private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration) + { + context.Services.AddCors(options => + { + options.AddDefaultPolicy(builder => + { + builder + .WithOrigins(configuration["App:CorsOrigins"]? + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() ?? Array.Empty()) + .WithAbpExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); + }); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseAbpRequestLocalization(); + + if (!env.IsDevelopment()) + { + app.UseErrorPage(); + } + + app.UseCorrelationId(); + app.MapAbpStaticAssets(); + app.UseRouting(); + app.UseCors(); + app.UseAuthentication(); + app.UseAbpOpenIddictValidation(); + + if (MultiTenancyConsts.IsEnabled) + { + app.UseMultiTenancy(); + } + app.UseUnitOfWork(); + app.UseDynamicClaims(); + app.UseAuthorization(); + + app.UseSwagger(); + app.UseAbpSwaggerUI(c => + { + c.SwaggerEndpoint("/swagger/v1/swagger.json", "newProjectConfigure API"); + + var configuration = context.ServiceProvider.GetRequiredService(); + c.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); + c.OAuthScopes("newProjectConfigure"); + }); + + app.UseAuditing(); + app.UseAbpSerilogEnrichers(); + app.UseConfiguredEndpoints(); + } +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/package.json b/aspnet-core/src/newProjectConfigure.HttpApi.Host/package.json new file mode 100644 index 0000000..27e8232 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/package.json @@ -0,0 +1,8 @@ +{ + "version": "1.0.0", + "name": "my-app", + "private": true, + "dependencies": { + "@abp/aspnetcore.mvc.ui.theme.basic": "~10.6.0" + } +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/web.config b/aspnet-core/src/newProjectConfigure.HttpApi.Host/web.config new file mode 100644 index 0000000..1c63b48 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/web.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/wwwroot/global-styles.css b/aspnet-core/src/newProjectConfigure.HttpApi.Host/wwwroot/global-styles.css new file mode 100644 index 0000000..74db4bd --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/wwwroot/global-styles.css @@ -0,0 +1,6 @@ +/* Your Global Styles */ + +:root .lpx-brand-logo { + --lpx-logo: url('/images/logo/leptonx/logo-light.png'); + --lpx-logo-icon: url('/images/logo/leptonx/logo-light-thumbnail.png'); +} \ No newline at end of file diff --git a/aspnet-core/src/newProjectConfigure.HttpApi.Host/yarn.lock b/aspnet-core/src/newProjectConfigure.HttpApi.Host/yarn.lock new file mode 100644 index 0000000..f2b1e6b --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi.Host/yarn.lock @@ -0,0 +1,310 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@abp/aspnetcore.mvc.ui.theme.basic@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-10.6.0.tgz#2eacaf2fbd3f59ff312f7bc299a3411aa6e9fab5" + integrity sha512-Ia9u4/MnQzUT4hxDP+rF9KtfjD5IwzyV5F2DRON4FEUjrZK65WKjFfFklGUPeY3sMeWsrBERrtVg2fAwPzIWQg== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~10.6.0" + +"@abp/aspnetcore.mvc.ui.theme.shared@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-10.6.0.tgz#8ee561db513a70d8fcbf6e42b8adc9be76febfcd" + integrity sha512-woEPzKF8v4xtarCDpNLcTOgYzYuV5VYtA6Z03bCATZEsOK5LM7tqT/HbkbSXyevkPqyQD50GcqgQ4a4y7Py7gQ== + dependencies: + "@abp/aspnetcore.mvc.ui" "~10.6.0" + "@abp/bootstrap" "~10.6.0" + "@abp/bootstrap-datepicker" "~10.6.0" + "@abp/bootstrap-daterangepicker" "~10.6.0" + "@abp/datatables.net-bs5" "~10.6.0" + "@abp/font-awesome" "~10.6.0" + "@abp/jquery-validation-unobtrusive" "~10.6.0" + "@abp/lodash" "~10.6.0" + "@abp/luxon" "~10.6.0" + "@abp/malihu-custom-scrollbar-plugin" "~10.6.0" + "@abp/moment" "~10.6.0" + "@abp/select2" "~10.6.0" + "@abp/sweetalert2" "~10.6.0" + "@abp/timeago" "~10.6.0" + +"@abp/aspnetcore.mvc.ui@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-10.6.0.tgz#3af39eab4a39f6168070ac943580c2d6e04726d3" + integrity sha512-1Ga+rEPxhcrJAXTiIZGdrjnrwfFcO760DeKLRylRZXygnzfXlyKo9hupszBMPm6bWRp6a/blfWzZ19s1GgDv0w== + dependencies: + ansi-colors "^4.1.3" + +"@abp/bootstrap-datepicker@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-10.6.0.tgz#a4c469ed9180395ffbaef91cdf373adaf158105e" + integrity sha512-vSYpozkhK6fl+xa3e5wKJ4XPVETqVO68HfllPlP8B0+50jrFqyZXwAT9DeWdoOdzlDug67erWdH4zCbK5bFnuA== + dependencies: + bootstrap-datepicker "^1.10.1" + +"@abp/bootstrap-daterangepicker@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-10.6.0.tgz#13dd661fe496cc144265db3b75d2185597d80d31" + integrity sha512-H8k1JgobHh2FtrNqFN82Zu96h53pZ/ymbpkPH5a6ujcdilsu08U0hie3UmrPqzx+YwNebzroNDWsVEvPzG4IWw== + dependencies: + "@abp/moment" "~10.6.0" + bootstrap-daterangepicker "^3.1.0" + +"@abp/bootstrap@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-10.6.0.tgz#0c9beca3a264700656f71f8e1b814f0d0ba3d443" + integrity sha512-fuh/FVnHarEZEJ68loWMSKWwvzlxpEXGEedvyni+zUmgUNU3sjB6zt2nX5eBsVIVOAjMGO8LARCqWlYx2kbXqw== + dependencies: + "@abp/core" "~10.6.0" + "@abp/popper.js" "~10.6.0" + bootstrap "^5.3.8" + +"@abp/core@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-10.6.0.tgz#604018588e331db3e40d2179c6232b6918cc640e" + integrity sha512-iF175HkoSmD6j6qhdhDA/m5kd80YrdW06T+xsl/xo9K4U5zbpu3hR7uq1hpt8+CqBh6IYDsuaU6EB/b1MuUItg== + dependencies: + "@abp/utils" "~10.6.0" + +"@abp/datatables.net-bs5@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-10.6.0.tgz#af9b04a47eb8232c48df1cfb06c7e36c63303acf" + integrity sha512-2ci6GRll71ZOA/Qr8+w3LmmbDPuBySC0uZSCCw+MnRexRBoM5/vwe9Sy3O30XaAZzaefqcCy11UF8ZsUSAhFsA== + dependencies: + "@abp/datatables.net" "~10.6.0" + datatables.net-bs5 "^2.3.4" + +"@abp/datatables.net@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-10.6.0.tgz#5d438004468dbc22f01eeea89ebfdedee5c7ff6b" + integrity sha512-HDJ9yt7uFAM5z/a/kjiFixssdT/EJ1w2hO5lfY43qjAqL5dfFrUFqN9Cb4pkrdbryr4GAD4U8uW+zZCv1UT3gQ== + dependencies: + "@abp/jquery" "~10.6.0" + datatables.net "^2.3.4" + +"@abp/font-awesome@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-10.6.0.tgz#9043c1877101c126596dc1ac3153033d65ca375e" + integrity sha512-ZvqnVuEBxxSvpo1fM5M33nh3+xb/hBxrNLYvYmAJjqPgWRrHUXjXi1sUK6s+UV8p5SKkZ/gEyyO2Hq+PxLPHkA== + dependencies: + "@abp/core" "~10.6.0" + "@fortawesome/fontawesome-free" "^7.0.1" + +"@abp/jquery-validation-unobtrusive@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-10.6.0.tgz#999cf3b0137f72b101173ffafbd7241f9c4d72c7" + integrity sha512-PyydzHctaN1veYLX/Iq5w1jkIC+pJaNYXCdp/KpNj41cNrNWUmtOR5GyJaY3oyEi3K7FLhspVTrHqdLfdGm4Lw== + dependencies: + "@abp/jquery-validation" "~10.6.0" + jquery-validation-unobtrusive "^4.0.0" + +"@abp/jquery-validation@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-10.6.0.tgz#c53f5b04f1f7852130698d91f3896009a428be70" + integrity sha512-smXaken4ta5VPlD3qRtTHMdSrJlr7ARCm5bfJkFYucaiffuyPWW3t75/OmdNDLVKIzeQNDcjX8damuKVaEpYpA== + dependencies: + "@abp/jquery" "~10.6.0" + jquery-validation "^1.21.0" + +"@abp/jquery@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-10.6.0.tgz#86247d1c70d9c241c25f1aac5ac45b0f83acfff8" + integrity sha512-9BXhgoF2Je4/oP/XqrQSNA88tHl/nrTpgI6FS4mHvi1yCaK3n4IkpnUIry76UY32w4wy3M/edNWM1AcwJ93lJg== + dependencies: + "@abp/core" "~10.6.0" + jquery "~3.7.1" + +"@abp/lodash@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-10.6.0.tgz#37005bc5fd9f5e600274482bea06323246b1eef3" + integrity sha512-IXwfRqF0fDJG+W32tneDurjx4ddlvRON3lUj7YEq7zlap0byoK9qbXJPAKyMIILE1Jqq6xm95RvyNa/M0xCqbA== + dependencies: + "@abp/core" "~10.6.0" + lodash "^4.18.1" + +"@abp/luxon@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-10.6.0.tgz#613943060d438547bef6b843813e723315e4f97a" + integrity sha512-mU1QLcff3Q+rQ9kZ7fpPnc6r7pPcjYwBd9nHXiEQOIzFIPLXjnLC9OEZ4PuoHvBkYEV4mOTgdiCunU0KKqERiA== + dependencies: + "@abp/core" "~10.6.0" + luxon "^3.7.2" + +"@abp/malihu-custom-scrollbar-plugin@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-10.6.0.tgz#118436a2a643938c1432b0e11c9601fc02111997" + integrity sha512-0apbAT6UeDo8yuC72L/p9YfttP2xia9JdLO45/9iqDZ2eDW2YX4aBoDNwhh/SYTxA6xvqaZhKnUbjCVnPqVZdQ== + dependencies: + "@abp/core" "~10.6.0" + malihu-custom-scrollbar-plugin "^3.1.5" + +"@abp/moment@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-10.6.0.tgz#54049c3be271e1e40c630d2e66889dd2b939361c" + integrity sha512-SJZELm6DjDRJuxcZ+XhxoSEREPmCCv6uKWQoSJMIlclu513tSOLcus8GZoShAll28/SjIVsvDEhJfHDULeRa4Q== + dependencies: + moment "^2.30.1" + +"@abp/popper.js@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-10.6.0.tgz#11b1b3256d8edbc0dcb89aacdb64c6378aedfa6c" + integrity sha512-y9YNhTi8LMcFxhvzax1RFBzOw2KIwS61xp9VwAuMqAB1DeD4glp7itFFgSAREMtxlNeBVS/FVJxskloOmBTv+A== + dependencies: + "@abp/core" "~10.6.0" + "@popperjs/core" "^2.11.8" + +"@abp/select2@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-10.6.0.tgz#e2693b693a2f828f0291c76f8e446b923cd7a7d6" + integrity sha512-uwJP+A2uBUFirvujBcBe//pKDGt/qm+5A8ZkV4f24sErV/uZifC3sTBHB3smFH8tcOI5uGyILl7u+MW6ztzJ1A== + dependencies: + "@abp/core" "~10.6.0" + select2 "^4.0.13" + +"@abp/sweetalert2@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-10.6.0.tgz#c5c49adc4aaee4cdc8f6e068c84f911b05001153" + integrity sha512-RtgG1aSGF8NOzBmR7PX9Sa36UfSMMvDl9n7dNWIeDU0cxlEj5IQBWxjtFk1ssOVRoHza8sZbEqn7vs3PkWQqyg== + dependencies: + "@abp/core" "~10.6.0" + sweetalert2 "^11.23.0" + +"@abp/timeago@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-10.6.0.tgz#8ea8255b4ca480a180ae21a6cd037b2446e7fadb" + integrity sha512-IXK3bfqf7IQqqJy7cFffwVdH4eKyvU8tK2XNVLyAuhQLu60OnxP8EoICc8dfDdEl6XgOB28H3QsVzxutRaz9Ew== + dependencies: + "@abp/jquery" "~10.6.0" + timeago "^1.6.7" + +"@abp/utils@~10.6.0": + version "10.6.0" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-10.6.0.tgz#6ff03d75b7b22a1e83b7a0149a3f6ff54bf30b69" + integrity sha512-dQaHPKNKcsyeyCot28UOwOhU5ykS6tqVVNXqRvQrrQIvqj5tOAGtWMeXRP1eP47JRCmF4kOgOSZcMvVnuoUrUQ== + dependencies: + just-compare "^2.3.0" + +"@fortawesome/fontawesome-free@^7.0.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.3.1.tgz#9d7d7df8f850637e001d24e6cd901422b4b09099" + integrity sha512-wmglKKPDIkgV3aWlZzWECCPoGIkYCulzBwxG9+w7rc5BGapZ6cPMpoPOT8k36J0Ni7PPX6c/rsoMWfS4d1MUMg== + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +bootstrap-datepicker@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/bootstrap-datepicker/-/bootstrap-datepicker-1.10.1.tgz#0a8bec42957ea1ce1272b91bcf2b53696629fb86" + integrity sha512-GIe+fsLp9Hi30oW7L2v2Q9/a4+aojrIA2p4ZagtLuKw2lpfQgjJjM0L6vl/lYQydGXWUbpoKbEC/O5tzWIkEKQ== + dependencies: + jquery ">=3.4.0 <4.0.0" + +bootstrap-daterangepicker@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bootstrap-daterangepicker/-/bootstrap-daterangepicker-3.1.0.tgz#632e6fb2de4b6360c5c0a9d5f6adb9aace051fe8" + integrity sha512-oaQZx6ZBDo/dZNyXGVi2rx5GmFXThyQLAxdtIqjtLlYVaQUfQALl5JZMJJZzyDIX7blfy4ppZPAJ10g8Ma4d/g== + dependencies: + jquery ">=1.10" + moment "^2.9.0" + +bootstrap@^5.3.8: + version "5.3.8" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.8.tgz#6401a10057a22752d21f4e19055508980656aeed" + integrity sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg== + +datatables.net-bs5@^2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-2.3.8.tgz#7266636ff488429988ca664bc8cb0b7c5e48c563" + integrity sha512-TbFH99QSWm93Kn3teHLFKeyOqYbaiddlHvRFdXUwAvh/fjTMhACWmHG+I43ss8d23OEFHV0WIbN4lpPusZm5zw== + dependencies: + datatables.net "2.3.8" + jquery ">=1.7" + +datatables.net@2.3.8, datatables.net@^2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-2.3.8.tgz#55a8dbe3bd2196951c498ab79bf44602a2bf3229" + integrity sha512-uhViowhlDlheAuo5a8TrkQqADsjrtGeOyvrigvr4t0+K3MyAWqClORXWAYIcN9VLX6iIX0C8O9gwJNd01hITRg== + dependencies: + jquery ">=1.7" + +jquery-mousewheel@>=3.0.6: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.2.2.tgz#48c833f6260ee0c46d438a999e7d0060ec9eed0b" + integrity sha512-JP71xTAg08ZY3hcs9ZbYUZ5i+dkSsz4yRl/zpWkAmtzc+kMs5EfPkpkINSidiLYMaR0MTo3DfFGF9WIezMsFQQ== + dependencies: + jquery ">=1.2.6" + +jquery-validation-unobtrusive@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.0.tgz#dfcf25a558496a2c883db6021d10f5398d15f99d" + integrity sha512-1ervYFFv6LX/rp7ktuLnMakHNG0piNRDyROI8Ir3hL1vPIwylAehB1AY3BPrYJnzW3WmwWryZq+Bz4sazZK9iQ== + dependencies: + jquery "^3.6.0" + jquery-validation ">=1.19" + +jquery-validation@>=1.19, jquery-validation@^1.21.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/jquery-validation/-/jquery-validation-1.22.1.tgz#fc1ae3256110332c929245a44d69ee76fee0e481" + integrity sha512-ePLXLWK7Rh5eR652YsuIu7YPeGlCXrsJUteVw5iZopiU17yaMd3FaDggs6yyNMl56p8TYVeDRmKGK3fPZrMeQw== + +jquery@>=1.10, jquery@>=1.2.6, jquery@>=1.7: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-4.0.0.tgz#95c33ac29005ff72ec444c5ba1cf457e61404fbb" + integrity sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg== + +"jquery@>=1.5.0 <4.0", "jquery@>=3.4.0 <4.0.0", jquery@^3.6.0, jquery@~3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" + integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== + +just-compare@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/just-compare/-/just-compare-2.3.0.tgz#a2adcc1d1940536263275f5a1ef1298bcacfeda7" + integrity sha512-6shoR7HDT+fzfL3gBahx1jZG3hWLrhPAf+l7nCwahDdT9XDtosB9kIF0ZrzUp5QY8dJWfQVr5rnsPqsbvflDzg== + +lodash@^4.18.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== + +luxon@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba" + integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== + +malihu-custom-scrollbar-plugin@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-3.1.5.tgz#310cecc5e59415a1c29e9dfb5d2b6e01d66a29ef" + integrity sha512-lwW3LgI+CNDMPnP4ED2la6oYxWMkCXlnhex+s2wuOLhFDFGnGmQuTQVdRK9bvDLpxs10sGlfErVufJy9ztfgJQ== + dependencies: + jquery-mousewheel ">=3.0.6" + +moment@^2.30.1, moment@^2.9.0: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +select2@^4.0.13: + version "4.1.0" + resolved "https://registry.yarnpkg.com/select2/-/select2-4.1.0.tgz#8b037e02a3c025beda07fed7f9ecc7d298036e1a" + integrity sha512-i9KalWOP4/LRRGc8+rj2krNm0ZqP14cV+j1TRCEBSsOhCPkKH8rYZ2MCRXcgvqIqN+llqGci0hj9aVkCMvL0+g== + +sweetalert2@^11.23.0: + version "11.26.25" + resolved "https://registry.yarnpkg.com/sweetalert2/-/sweetalert2-11.26.25.tgz#ba24ffb79c67648ac51f834620baa15866a56e35" + integrity sha512-+hunCOJdJ6FLj04T9YSLvvZXRjsvIkTeTKP2e4VF8CaBias961BTnWiSFAy7F/CM5eq3QK2Rraoc5Gzftslvkg== + +timeago@^1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/timeago/-/timeago-1.6.7.tgz#afd467c29a911e697fc22a81888c7c3022783cb5" + integrity sha512-FikcjN98+ij0siKH4VO4dZ358PR3oDDq4Vdl1+sN9gWz1/+JXGr3uZbUShYH/hL7bMhcTpPbplJU5Tej4b4jbQ== + dependencies: + jquery ">=1.5.0 <4.0" diff --git a/aspnet-core/src/newProjectConfigure.HttpApi/Controllers/newProjectConfigureController.cs b/aspnet-core/src/newProjectConfigure.HttpApi/Controllers/newProjectConfigureController.cs new file mode 100644 index 0000000..6ce159e --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi/Controllers/newProjectConfigureController.cs @@ -0,0 +1,14 @@ +using newProjectConfigure.Localization; +using Volo.Abp.AspNetCore.Mvc; + +namespace newProjectConfigure.Controllers; + +/* Inherit your controllers from this class. + */ +public abstract class newProjectConfigureController : AbpControllerBase +{ + protected newProjectConfigureController() + { + LocalizationResource = typeof(newProjectConfigureResource); + } +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi/Models/Test/TestModel.cs b/aspnet-core/src/newProjectConfigure.HttpApi/Models/Test/TestModel.cs new file mode 100644 index 0000000..d73e90a --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi/Models/Test/TestModel.cs @@ -0,0 +1,10 @@ +using System; + +namespace newProjectConfigure.Models.Test; + +public class TestModel +{ + public string? Name { get; set; } + + public DateTime BirthDate { get; set; } +} diff --git a/aspnet-core/src/newProjectConfigure.HttpApi/newProjectConfigure.HttpApi.csproj b/aspnet-core/src/newProjectConfigure.HttpApi/newProjectConfigure.HttpApi.csproj new file mode 100644 index 0000000..816260c --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi/newProjectConfigure.HttpApi.csproj @@ -0,0 +1,24 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + + + + + diff --git a/aspnet-core/src/newProjectConfigure.HttpApi/newProjectConfigureHttpApiModule.cs b/aspnet-core/src/newProjectConfigure.HttpApi/newProjectConfigureHttpApiModule.cs new file mode 100644 index 0000000..955b669 --- /dev/null +++ b/aspnet-core/src/newProjectConfigure.HttpApi/newProjectConfigureHttpApiModule.cs @@ -0,0 +1,41 @@ +using Localization.Resources.AbpUi; +using newProjectConfigure.Localization; +using Volo.Abp.Account; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Identity; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.HttpApi; +using Volo.Abp.SettingManagement; +using Volo.Abp.TenantManagement; + +namespace newProjectConfigure; + +[DependsOn( + typeof(newProjectConfigureApplicationContractsModule), + typeof(AbpAccountHttpApiModule), + typeof(AbpIdentityHttpApiModule), + typeof(AbpPermissionManagementHttpApiModule), + typeof(AbpTenantManagementHttpApiModule), + typeof(AbpFeatureManagementHttpApiModule), + typeof(AbpSettingManagementHttpApiModule) + )] +public class newProjectConfigureHttpApiModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + ConfigureLocalization(); + } + + private void ConfigureLocalization() + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes( + typeof(AbpUiResource) + ); + }); + } +} diff --git a/aspnet-core/test/newProjectConfigure.Application.Tests/Samples/SampleAppServiceTests.cs b/aspnet-core/test/newProjectConfigure.Application.Tests/Samples/SampleAppServiceTests.cs new file mode 100644 index 0000000..def6465 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.Application.Tests/Samples/SampleAppServiceTests.cs @@ -0,0 +1,34 @@ +using Shouldly; +using System.Threading.Tasks; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Xunit; + +namespace newProjectConfigure.Samples; + +/* This is just an example test class. + * Normally, you don't test code of the modules you are using + * (like IIdentityUserAppService here). + * Only test your own application services. + */ +public abstract class SampleAppServiceTests : newProjectConfigureApplicationTestBase + where TStartupModule : IAbpModule +{ + private readonly IIdentityUserAppService _userAppService; + + protected SampleAppServiceTests() + { + _userAppService = GetRequiredService(); + } + + [Fact] + public async Task Initial_Data_Should_Contain_Admin_User() + { + //Act + var result = await _userAppService.GetListAsync(new GetIdentityUsersInput()); + + //Assert + result.TotalCount.ShouldBeGreaterThan(0); + result.Items.ShouldContain(u => u.UserName == "admin"); + } +} diff --git a/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigure.Application.Tests.csproj b/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigure.Application.Tests.csproj new file mode 100644 index 0000000..675731e --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigure.Application.Tests.csproj @@ -0,0 +1,20 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + diff --git a/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigureApplicationTestBase.cs b/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigureApplicationTestBase.cs new file mode 100644 index 0000000..11f1291 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigureApplicationTestBase.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Modularity; + +namespace newProjectConfigure; + +public abstract class newProjectConfigureApplicationTestBase : newProjectConfigureTestBase + where TStartupModule : IAbpModule +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigureApplicationTestModule.cs b/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigureApplicationTestModule.cs new file mode 100644 index 0000000..3210164 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.Application.Tests/newProjectConfigureApplicationTestModule.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Modularity; + +namespace newProjectConfigure; + +[DependsOn( + typeof(newProjectConfigureApplicationModule), + typeof(newProjectConfigureDomainTestModule) +)] +public class newProjectConfigureApplicationTestModule : AbpModule +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.Domain.Tests/Samples/SampleDomainTests.cs b/aspnet-core/test/newProjectConfigure.Domain.Tests/Samples/SampleDomainTests.cs new file mode 100644 index 0000000..0bbf5c6 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.Domain.Tests/Samples/SampleDomainTests.cs @@ -0,0 +1,46 @@ +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Identity; +using Volo.Abp.Modularity; +using Xunit; + +namespace newProjectConfigure.Samples; + +/* This is just an example test class. + * Normally, you don't test code of the modules you are using + * (like IdentityUserManager here). + * Only test your own domain services. + */ +public abstract class SampleDomainTests : newProjectConfigureDomainTestBase + where TStartupModule : IAbpModule +{ + private readonly IIdentityUserRepository _identityUserRepository; + private readonly IdentityUserManager _identityUserManager; + + protected SampleDomainTests() + { + _identityUserRepository = GetRequiredService(); + _identityUserManager = GetRequiredService(); + } + + [Fact] + public async Task Should_Set_Email_Of_A_User() + { + IdentityUser adminUser; + + /* Need to manually start Unit Of Work because + * FirstOrDefaultAsync should be executed while db connection / context is available. + */ + await WithUnitOfWorkAsync(async () => + { + adminUser = await _identityUserRepository + .FindByNormalizedUserNameAsync("ADMIN"); + + await _identityUserManager.SetEmailAsync(adminUser, "newemail@abp.io"); + await _identityUserRepository.UpdateAsync(adminUser); + }); + + adminUser = await _identityUserRepository.FindByNormalizedUserNameAsync("ADMIN"); + adminUser.Email.ShouldBe("newemail@abp.io"); + } +} diff --git a/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigure.Domain.Tests.csproj b/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigure.Domain.Tests.csproj new file mode 100644 index 0000000..17422aa --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigure.Domain.Tests.csproj @@ -0,0 +1,20 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + diff --git a/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigureDomainTestBase.cs b/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigureDomainTestBase.cs new file mode 100644 index 0000000..590bc25 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigureDomainTestBase.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Modularity; + +namespace newProjectConfigure; + +/* Inherit from this class for your domain layer tests. */ +public abstract class newProjectConfigureDomainTestBase : newProjectConfigureTestBase + where TStartupModule : IAbpModule +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigureDomainTestModule.cs b/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigureDomainTestModule.cs new file mode 100644 index 0000000..9345ec7 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.Domain.Tests/newProjectConfigureDomainTestModule.cs @@ -0,0 +1,12 @@ +using Volo.Abp.Modularity; + +namespace newProjectConfigure; + +[DependsOn( + typeof(newProjectConfigureDomainModule), + typeof(newProjectConfigureTestBaseModule) +)] +public class newProjectConfigureDomainTestModule : AbpModule +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs new file mode 100644 index 0000000..ca219e4 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfCoreSampleAppServiceTests.cs @@ -0,0 +1,10 @@ +using newProjectConfigure.Samples; +using Xunit; + +namespace newProjectConfigure.EntityFrameworkCore.Applications; + +[Collection(newProjectConfigureTestConsts.CollectionDefinitionName)] +public class EfCoreSampleAppServiceTests : SampleAppServiceTests +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs new file mode 100644 index 0000000..c632a43 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Domains/EfCoreSampleDomainTests.cs @@ -0,0 +1,10 @@ +using newProjectConfigure.Samples; +using Xunit; + +namespace newProjectConfigure.EntityFrameworkCore.Domains; + +[Collection(newProjectConfigureTestConsts.CollectionDefinitionName)] +public class EfCoreSampleDomainTests : SampleDomainTests +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs new file mode 100644 index 0000000..80d3576 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/Samples/SampleRepositoryTests.cs @@ -0,0 +1,44 @@ +using Microsoft.EntityFrameworkCore; +using Shouldly; +using System; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; +using Xunit; + +namespace newProjectConfigure.EntityFrameworkCore.Samples; + +/* This is just an example test class. + * Normally, you don't test ABP framework code + * (like default AppUser repository IRepository here). + * Only test your custom repository methods. + */ +[Collection(newProjectConfigureTestConsts.CollectionDefinitionName)] +public class SampleRepositoryTests : newProjectConfigureEntityFrameworkCoreTestBase +{ + private readonly IRepository _appUserRepository; + + public SampleRepositoryTests() + { + _appUserRepository = GetRequiredService>(); + } + + [Fact] + public async Task Should_Query_AppUser() + { + /* Need to manually start Unit Of Work because + * FirstOrDefaultAsync should be executed while db connection / context is available. + */ + await WithUnitOfWorkAsync(async () => + { + //Act + var adminUser = await (await _appUserRepository.GetQueryableAsync()) + .Where(u => u.UserName == "admin") + .FirstOrDefaultAsync(); + + //Assert + adminUser.ShouldNotBeNull(); + }); + } +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreCollection.cs b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreCollection.cs new file mode 100644 index 0000000..6b2afbc --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreCollection.cs @@ -0,0 +1,9 @@ +using Xunit; + +namespace newProjectConfigure.EntityFrameworkCore; + +[CollectionDefinition(newProjectConfigureTestConsts.CollectionDefinitionName)] +public class newProjectConfigureEntityFrameworkCoreCollection : ICollectionFixture +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreCollectionFixtureBase.cs b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreCollectionFixtureBase.cs new file mode 100644 index 0000000..d767c6c --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreCollectionFixtureBase.cs @@ -0,0 +1,9 @@ +using newProjectConfigure.EntityFrameworkCore; +using Xunit; + +namespace newProjectConfigure.EntityFrameworkCore; + +public class newProjectConfigureEntityFrameworkCoreCollectionFixtureBase : ICollectionFixture +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreFixture.cs b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreFixture.cs new file mode 100644 index 0000000..15071ea --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreFixture.cs @@ -0,0 +1,11 @@ +using System; + +namespace newProjectConfigure.EntityFrameworkCore; + +public class newProjectConfigureEntityFrameworkCoreFixture : IDisposable +{ + public void Dispose() + { + + } +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreTestBase.cs b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreTestBase.cs new file mode 100644 index 0000000..0bf2b91 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreTestBase.cs @@ -0,0 +1,8 @@ +using Volo.Abp; + +namespace newProjectConfigure.EntityFrameworkCore; + +public abstract class newProjectConfigureEntityFrameworkCoreTestBase : newProjectConfigureTestBase +{ + +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreTestModule.cs b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreTestModule.cs new file mode 100644 index 0000000..65f0543 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/EntityFrameworkCore/newProjectConfigureEntityFrameworkCoreTestModule.cs @@ -0,0 +1,71 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Sqlite; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement; +using Volo.Abp.SettingManagement; +using Volo.Abp.Uow; + +namespace newProjectConfigure.EntityFrameworkCore; + +[DependsOn( + typeof(newProjectConfigureApplicationTestModule), + typeof(newProjectConfigureEntityFrameworkCoreModule), + typeof(AbpEntityFrameworkCoreSqliteModule) + )] +public class newProjectConfigureEntityFrameworkCoreTestModule : AbpModule +{ + private AbpUnitTestSqliteDatabase _database; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.SaveStaticFeaturesToDatabase = false; + options.IsDynamicFeatureStoreEnabled = false; + }); + Configure(options => + { + options.SaveStaticPermissionsToDatabase = false; + options.IsDynamicPermissionStoreEnabled = false; + }); + Configure(options => + { + options.SaveStaticSettingsToDatabase = false; + options.IsDynamicSettingStoreEnabled = false; + }); + context.Services.AddAlwaysDisableUnitOfWorkTransaction(); + + ConfigureInMemorySqlite(context.Services); + } + + private void ConfigureInMemorySqlite(IServiceCollection services) + { + _database = new AbpUnitTestSqliteDatabase(); + _database.CreateTables( + new newProjectConfigureDbContext(new DbContextOptionsBuilder().UseSqlite(_database.ConnectionString).Options)); + + services.Configure(options => + { + options.ConnectionStrings.Default = _database.ConnectionString; + }); + + services.Configure(options => + { + options.Configure(context => + { + context.UseSqlite(); + }); + }); + } + + public override void OnApplicationShutdown(ApplicationShutdownContext context) + { + _database?.Dispose(); + } + +} diff --git a/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/newProjectConfigure.EntityFrameworkCore.Tests.csproj b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/newProjectConfigure.EntityFrameworkCore.Tests.csproj new file mode 100644 index 0000000..6c0e831 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.EntityFrameworkCore.Tests/newProjectConfigure.EntityFrameworkCore.Tests.csproj @@ -0,0 +1,21 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + + diff --git a/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs new file mode 100644 index 0000000..2f675c7 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/ClientDemoService.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Account; +using Volo.Abp.DependencyInjection; + +namespace newProjectConfigure.HttpApi.Client.ConsoleTestApp; + +public class ClientDemoService : ITransientDependency +{ + private readonly IProfileAppService _profileAppService; + + public ClientDemoService(IProfileAppService profileAppService) + { + _profileAppService = profileAppService; + } + + public async Task RunAsync() + { + var output = await _profileAppService.GetAsync(); + Console.WriteLine($"UserName : {output.UserName}"); + Console.WriteLine($"Email : {output.Email}"); + Console.WriteLine($"Name : {output.Name}"); + Console.WriteLine($"Surname : {output.Surname}"); + } +} diff --git a/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs new file mode 100644 index 0000000..d2d8558 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/ConsoleTestAppHostedService.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Hosting; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; + +namespace newProjectConfigure.HttpApi.Client.ConsoleTestApp; + +public class ConsoleTestAppHostedService : IHostedService +{ + private readonly IConfiguration _configuration; + + public ConsoleTestAppHostedService(IConfiguration configuration) + { + _configuration = configuration; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + using (var application = await AbpApplicationFactory.CreateAsync(options => + { + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); + })) + { + await application.InitializeAsync(); + + var demo = application.ServiceProvider.GetRequiredService(); + await demo.RunAsync(); + + await application.ShutdownAsync(); + } + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/Program.cs b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/Program.cs new file mode 100644 index 0000000..718a400 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/Program.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace newProjectConfigure.HttpApi.Client.ConsoleTestApp; + +class Program +{ + static async Task Main(string[] args) + { + await CreateHostBuilder(args).RunConsoleAsync(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .AddAppSettingsSecretsJson() + .ConfigureServices((hostContext, services) => + { + services.AddHostedService(); + }); +} diff --git a/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/appsettings.json b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/appsettings.json new file mode 100644 index 0000000..264d96b --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/appsettings.json @@ -0,0 +1,17 @@ +{ + "RemoteServices": { + "Default": { + "BaseUrl": "https://localhost:44355" + } + }, + "IdentityClients": { + "Default": { + "GrantType": "password", + "ClientId": "newProjectConfigure_App", + "UserName": "admin", + "UserPassword": "1q2w3E*", + "Authority": "https://localhost:44355", + "Scope": "newProjectConfigure" + } + } +} diff --git a/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/appsettings.secrets.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/newProjectConfigure.HttpApi.Client.ConsoleTestApp.csproj b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/newProjectConfigure.HttpApi.Client.ConsoleTestApp.csproj new file mode 100644 index 0000000..b0dde3f --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/newProjectConfigure.HttpApi.Client.ConsoleTestApp.csproj @@ -0,0 +1,33 @@ + + + + Exe + net10.0 + enable + + + + + + PreserveNewest + Always + + + + PreserveNewest + Always + + + + + + + + + + + + + + + diff --git a/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/newProjectConfigureConsoleApiClientModule.cs b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/newProjectConfigureConsoleApiClientModule.cs new file mode 100644 index 0000000..979637a --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.HttpApi.Client.ConsoleTestApp/newProjectConfigureConsoleApiClientModule.cs @@ -0,0 +1,30 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Polly; +using Volo.Abp.Autofac; +using Volo.Abp.Http.Client; +using Volo.Abp.Http.Client.IdentityModel; +using Volo.Abp.Modularity; + +namespace newProjectConfigure.HttpApi.Client.ConsoleTestApp; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(newProjectConfigureHttpApiClientModule), + typeof(AbpHttpClientIdentityModelModule) + )] +public class newProjectConfigureConsoleApiClientModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.ProxyClientBuildActions.Add((remoteServiceName, clientBuilder) => + { + clientBuilder.AddTransientHttpErrorPolicy( + policyBuilder => policyBuilder.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i))) + ); + }); + }); + } +} diff --git a/aspnet-core/test/newProjectConfigure.TestBase/Security/FakeCurrentPrincipalAccessor.cs b/aspnet-core/test/newProjectConfigure.TestBase/Security/FakeCurrentPrincipalAccessor.cs new file mode 100644 index 0000000..502b160 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.TestBase/Security/FakeCurrentPrincipalAccessor.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Security.Claims; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Security.Claims; + +namespace newProjectConfigure.Security; + +[Dependency(ReplaceServices = true)] +public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor +{ + protected override ClaimsPrincipal GetClaimsPrincipal() + { + return GetPrincipal(); + } + + private ClaimsPrincipal GetPrincipal() + { + return new ClaimsPrincipal(new ClaimsIdentity(new List + { + new Claim(AbpClaimTypes.UserId, "2e701e62-0953-4dd3-910b-dc6cc93ccb0d"), + new Claim(AbpClaimTypes.UserName, "admin"), + new Claim(AbpClaimTypes.Email, "admin@abp.io") + })); + } +} diff --git a/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigure.TestBase.csproj b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigure.TestBase.csproj new file mode 100644 index 0000000..a387553 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigure.TestBase.csproj @@ -0,0 +1,31 @@ + + + + + + net10.0 + enable + newProjectConfigure + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + diff --git a/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestBase.cs b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestBase.cs new file mode 100644 index 0000000..c617269 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestBase.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Modularity; +using Volo.Abp.Uow; +using Volo.Abp.Testing; + +namespace newProjectConfigure; + +/* All test classes are derived from this class, directly or indirectly. + */ +public abstract class newProjectConfigureTestBase : AbpIntegratedTest + where TStartupModule : IAbpModule +{ + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + + protected virtual Task WithUnitOfWorkAsync(Func func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func action) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + await action(); + + await uow.CompleteAsync(); + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func> func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func> func) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + var result = await func(); + await uow.CompleteAsync(); + return result; + } + } + } +} diff --git a/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestBaseModule.cs b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestBaseModule.cs new file mode 100644 index 0000000..17a58f1 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestBaseModule.cs @@ -0,0 +1,47 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Authorization; +using Volo.Abp.Autofac; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.Data; +using Volo.Abp.Modularity; +using Volo.Abp.Threading; + +namespace newProjectConfigure; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(AbpTestBaseModule), + typeof(AbpAuthorizationModule), + typeof(AbpBackgroundJobsAbstractionsModule) + )] +public class newProjectConfigureTestBaseModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.IsJobExecutionEnabled = false; + }); + + context.Services.AddAlwaysAllowAuthorization(); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + SeedTestData(context); + } + + private static void SeedTestData(ApplicationInitializationContext context) + { + AsyncHelper.RunSync(async () => + { + using (var scope = context.ServiceProvider.CreateScope()) + { + await scope.ServiceProvider + .GetRequiredService() + .SeedAsync(); + } + }); + } +} diff --git a/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestConsts.cs b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestConsts.cs new file mode 100644 index 0000000..e6cc58d --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestConsts.cs @@ -0,0 +1,6 @@ +namespace newProjectConfigure; + +public static class newProjectConfigureTestConsts +{ + public const string CollectionDefinitionName = "newProjectConfigure collection"; +} diff --git a/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestDataSeedContributor.cs b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestDataSeedContributor.cs new file mode 100644 index 0000000..c43a9f5 --- /dev/null +++ b/aspnet-core/test/newProjectConfigure.TestBase/newProjectConfigureTestDataSeedContributor.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace newProjectConfigure; + +public class newProjectConfigureTestDataSeedContributor : IDataSeedContributor, ITransientDependency +{ + public Task SeedAsync(DataSeedContext context) + { + /* Seed additional test data... */ + + return Task.CompletedTask; + } +}